這一節(jié)寺鸥,我們根據(jù)之前設(shè)計的UI滤港,設(shè)計對應(yīng)的Model眯勾。
DarkSky API
首先湃番,來了解一個簡單好用的天氣API服務(wù):DarkSky。簡單注冊登錄之后赌结,打開Console頁面就會看到一個Secret Key捞蛋,以及對應(yīng)的獲取天氣信息的方法:
在圖中可以看到,我們只要發(fā)送GET請求到:https://api.darksky.net/forecast/your_secret_key/latitude,longitude
柬姚,就可以請求到天氣信息了拟杉。當然,這個API還支持一些可選的參數(shù)量承,大家可以在這里找到詳細的API參數(shù)搬设。
而DarkSky返回的數(shù)據(jù)格式,大體是這樣的:
{
"latitude": 37.8267,
"longitude": -122.4233,
"timezone": "America/Los_Angeles",
"currently": {
"time": 1506417757,
"summary": "Clear",
"icon": "clear-night",
"nearestStormDistance": 482,
"nearestStormBearing": 29,
"precipIntensity": 0,
"precipProbability": 0,
"temperature": 61.23,
"apparentTemperature": 61.23,
"dewPoint": 48.81,
"humidity": 0.64,
"pressure": 1010.41,
"windSpeed": 1.76,
"windGust": 2.97,
"windBearing": 287,
"cloudCover": 0,
"uvIndex": 0,
"visibility": 10,
"ozone": 293.28
},
"minutely": {
"summary": "Clear for the hour.",
"icon": "clear-night",
"data": [...]
},
"hourly": {
"summary": "Clear throughout the day.",
"icon": "clear-day",
"data": [...]
},
"daily": {
"summary": "Light rain on Monday, with temperatures falling to 69°F on Monday.",
"icon": "rain",
"data": [...]
},
"flags": {
"sources": [...],
"isd-stations": [...],
"units": "us"
},
"offset": -7
}
大家可以在這里每個參數(shù)的詳細說明宴合。這里焕梅,我們簡單說一下會用到的部分:
-
currently / minutely / hourly / daily
節(jié)點包含的內(nèi)容,分別表示當前卦洽,按分鐘、按小時以及按天統(tǒng)計的天氣數(shù)據(jù)斜棚。我們的App首頁上半部分阀蒂,就會用到currently
中的內(nèi)容;在稍后弟蚀,我們實現(xiàn)首頁下半部分的內(nèi)容時蚤霞,就會用到daily
中的內(nèi)容; - 在
currently
中义钉,我們需要以下字段的內(nèi)容:-
time
:當前時間昧绣; -
summary
:當前天氣簡述; -
icon
:天氣圖標名稱捶闸,在Xcode的Assets里夜畴,我們使用的每一個圖片,都和這里的圖標名稱是一一對應(yīng)的删壮; -
temperature
:當前溫度(默認采用華氏度單位)贪绘; -
humidity
:濕度;
-
因此央碟,簡單來說税灌,我們需要的JSON暫時是這樣的:
{
"latitude": 37.8267,
"longitude": -122.4233,
"timezone": "America/Los_Angeles",
"currently": {
"time": 1506417757,
"summary": "Clear",
"icon": "clear-night",
"temperature": 61.23,
"humidity": 0.64
}
}
添加API配置信息
了解了DarkSky的API格式之后,為了使用這個API,我們要添加一些接口信息菱涤。為此苞也,在Sky group里,新建一個Configuration group粘秆,所有第三方服務(wù)的配置如迟,都會添加在這里。現(xiàn)在翻擒,我們先在其中創(chuàng)建一個Configuratioin.swift文件氓涣,并添加下面的代碼:
struct API {
static let key = "your_secret_key_here"
static let baseUrl = URL(string: "https://api.darksky.net/forecast")!
static let authenticatedUrl = baseUrl.appendingPathComponent(key)
}
這樣,我們就能在整個項目里陋气,用統(tǒng)一的訪問訪問DarkSky的API了劳吠。
設(shè)計Model
添加好配置之后,我們就可以設(shè)計對應(yīng)的Model了巩趁。在項目的Sky group中痒玩,新建一個Models group,我們需要創(chuàng)建兩個models议慰。
一個model表示當前的位置和地區(qū)名稱蠢古。我們可以通過CoreLocation獲取到。新建一個Location.swift文件别凹,并添加下面的代碼:
struct Location {
var name: String
var latitude: Double
var longitude: Double
}
由于稍后草讶,我們會用到定位功能,因此記得在Info.plist中添加下面的內(nèi)容向用戶申請權(quán)限:
<key>NSLocationWhenInUseUsageDescription</key>
<string>Sky needs your location to fetch the weather data.</string>
另一個model則表示天氣數(shù)據(jù)炉菲,這是DarkSky的返回值堕战。新建一個WeatherData.swift
文件,并添加下面的代碼:
struct WeatherData: Codable {
let latitude: Double
let longitude: Double
let currently: CurrentWeather
struct CurrentWeather: Codable {
let time: Date
let summary: String
let icon: String
let temperature: Double
let humidity: Double
}
}