创建iOS货币汇率小部件:逐步指南
#ios #swift #widget

介绍:

小部件是一种有力的方法,可以在其iPhone的主屏幕或今天查看中为用户提供可查看应用程序信息的视图。使用iOS 14及以后,您可以创建自己的自定义小部件,以浏览一下提供有用的信息。在本教程中,我们将带您创建一个货币汇率小部件,该货币汇率小部件从API获取数据并将其显示在小部件上。我们将使用PrivatBank的端点来检索UHAH的汇率和EUR的汇率。

先决条件:

  • Xcode(最新版本)
  • MacOS具有最新版本的Swiftui
  • 对Swiftui和Swift编程语言的基本理解
  • 活跃的Apple开发人员帐户

让我们开始!

1。创建一个新的Xcode项目:

打开Xcode并使用“ iOS”下的“应用”模板创建一个新项目。给您的项目一个名称,例如“私人交换”,然后选择“ swiftui”作为界面,而“ swift”作为语言。将最小部署目标设置为iOS 14或更晚,因为在早期版本中不支持小部件。

2添加新的小部件扩展名:

在Xcode项目导航器中,单击“文件”>“ new”>“ Target”。选择“小部件扩展”模板,然后单击“下一步”。给您的小部件扩展名称,例如“ PrivateExchangeWidget”,并确保“语言”设置为“ Swift”。单击“完成”以创建小部件扩展名。

3。为货币利率创建数据模型:

在窗口小部件扩展文件夹中,创建一个名为“ crurineRate.swift”的新快文件,并定义符合Decodable协议的CurrencyRate struct。该结构将代表从API获取的货币利率数据。

   struct CurrencyRate: Decodable {
       let ccy: String
       let base_ccy: String
       let buy: String
       let sale: String
   }

4。创建一个数据fetcher从API获取货币率:

在同一文件夹中,创建另一个称为“ CurrenceRateFetcher.swift”的Swift文件,并使用共享Singleton实例定义CurrencyRateFetcher类。该课程将负责从API获取货币利率。

   import Foundation

   class CurrencyRateFetcher {
       static let shared = CurrencyRateFetcher()
       private let apiUrl = "https://api.privatbank.ua/p24api/pubinfo?exchange&coursid=5"

       func fetchRates(completion: @escaping ([CurrencyRate]?) -> Void) {
           guard let url = URL(string: apiUrl) else {
               completion(nil)
               return
           }

           let task = URLSession.shared.dataTask(with: url) { data, response, error in
               guard let data = data, error == nil else {
                   completion(nil)
                   return
               }

               let decoder = JSONDecoder()
               let currencyRates = try? decoder.decode([CurrencyRate].self, from: data)
               completion(currencyRates)
           }

           task.resume()
       }
   }

5。修改小部件的时间轴提供商以获取数据(续):

更新getTimeline(for:in:completion:)方法以从API获取货币利率并将其传递给SimpleEntry

   func getTimeline(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
       CurrencyRateFetcher.shared.fetchRates { currencyRates in
           let currentDate = Date()
           let entry = SimpleEntry(date: currentDate, currencyRates: currencyRates)
           let refreshDate = Calendar.current.date(byAdding: .hour, value: 1, to: currentDate)!
           let timeline = Timeline(entries: [entry], policy: .after(refreshDate))
           completion(timeline)
       }
   }

此代码获取货币利率,并以当前日期和获取费率创建时间轴条目。时间轴策略设置为.after(refreshDate),该策略每小时都会刷新数据。

6。更新小部件的视图以显示货币汇率:

打开小部件的主要Swift文件(例如“ Private_exchange.swift”),然后修改Private_ExchangeEntryView以在SwiftUI视图中显示货币汇率。

   struct Private_ExchangeEntryView : View {
       var entry: Provider.Entry

       private func currencySymbol(for code: String) -> String {
           switch code {
           case "EUR":
               return "€"
           case "USD":
               return "$"
           case "UAH":
               return "₴"
           default:
               return code
           }
       }

       var body: some View {
           VStack {
               if let currencyRates = entry.currencyRates {
                   ForEach(currencyRates, id: \.ccy) { rate in
                       HStack {
                           Text("\(currencySymbol(for: rate.ccy))")
                           Spacer()
                           Text("\(Double(rate.buy)?.rounded(toPlaces: 2) ?? 0) / \(Double(rate.sale)?.rounded(toPlaces: 2) ?? 0)")
                       }
                   }
               } else {
                   Text("Loading...")
               }
           }
           .padding()
       }
   }

此代码定义了currencySymbol(for:)函数,该功能返回给定货币代码的适当货币符号。该视图显示使用VStackForEach的货币汇率列表,或“加载...”文本(如果尚不可用)。

7。测试小部件:

在iOS模拟器或物理设备上构建并运行项目,以查看货币汇率小部件的行动。您可以通过遵循在iOS上添加小部件的标准过程。

,将小部件添加到主屏幕或今天查看。

结论:

在本教程中,我们带领您通过使用SwiftUI和API为iOS创建自定义货币汇率小部件。现在,您可以扩展此基本实现,以添加更多功能,例如用户可配置的货币对或小部件的不同显示样式。愉快的编码!