やっと、iPhone 版の Widget にも対応した「 リンク集付きのお天気アプリ」が完成しましたw
OpenWeatherMap の API の反応が遅いのが、ちょっとあれですが、無料なので文句は言えないですねw
「今日のお知らせ」での表示内容
3時間ごとの天気予報の3回分を表示します。アプリ本体へのリンクボタンも付けましたw
「お天気アプリ」
3時間ごとの天気予報を5回分表示します。「リンク」へのボタン付き
「関連サイトへのリンク」
天気予報のページへのボタン付き
こちらで紹介するサイトの情報を参考に作成しましたw
(結果編)
OpenWeatherMap の利用
http://qiita.com/nownabe/items/aeac1ce0977be963a740
http://qiita.com/kubotaku1119/items/7e5eaa30fee0a25f70d0
ユーザ登録をして、利用するための ID を取得すると無料でお天気情報の API が利用できますw
位置情報の取得
http://qiita.com/ftsan/items/b3a04d30cd91c11aeea1
コード自体はとてもシンプルですw
但し、次に紹介する対策をしないと、上手くいきませんw
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
longitude = 0.0
latitude = 0.0
lonLabel.text = String(longitude)
latLabel.text = String(latitude)
lm = CLLocationManager()
lm.delegate = self
lm.requestAlwaysAuthorization()
lm.desiredAccuracy = kCLLocationAccuracyBest
lm.distanceFilter = 300
}
/** 位置情報取得成功時 */
func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!){
longitude = newLocation.coordinate.logitude
latitude = newLocation.coordinate.latitude
self.lonLabel.text = String(longitude)
self.latLabel.text = String(latitude)
}
/** 位置情報取得失敗時 */
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
NSLog("Error")
}
}
位置情報の取得の注意事項
http://swift-salaryman.com/cllocationmanager.php
info.plist に以下を追加
KeyがNSLocationAlwaysUsageDescriptionで値は何でも可
非同期通信
https://teratail.com/questions/30313
コードは難しくありませんが、次に説明するセキュリティ対策の回避処理が必要ですw
let url = NSURL(string: "http://www.apple.com")!
let request = NSMutableURLRequest(URL: url)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request) { data, response, error in
// 通信終了後に呼ばれる
if let response = response, data = data {
// 通信成功
print(NSString(data: data, encoding: NSUTF8StringEncoding))
} else {
// エラーの場合
print(error)
}
}
task.resume()
非同期通信が失敗する時の対処方法
(info.plist への追記)
http://qiita.com/tukiyo3/items/b55667d3cd31610837f1
info.plist ファイルをテキストエディタで開いて、下記のコードを直接追加しちゃいますw
同じ「key」がないかは、要注意ですねw
Info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>api.tiqav.com</key> //[対象とするURL]
<dict>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
SwiftyJSON 使い方
http://dev.classmethod.jp/smartphone/iphone/swiftyjson/
http://qiita.com/yonell/items/c5432207868fa2d5cfc9
JSON の処理(パース)を用意にするために、 Swiftyjson などを利用しますw
今回程度の使い方であれば、非常に簡単にパースできて楽ちんですねw
// Initialization
let json = JSON(data: data!)
// 各セルに情報を突っ込む
for var i = 0; i < self.cellNum; i++ {
let dt_txt = json["list"][i]["dt_txt"]
let weatherMain = json["list"][i]["weather"][0]["main"]
let weatherDescription = json["list"][i]["weather"][0]["description"]
let info = "\(dt_txt), \(weatherMain), \(weatherDescription)"
print(info)
self.cellItems[i] = info
}
extension の活用
(複数の種類の継承を行う場合)
http://swift.swift-studying.com/entry/2015/07/11/015913
複数の継承が必要なときには、 extension を利用しますw
import UIKit
import CoreLocation
class ViewController: UIViewController {
//ここに必要なコードを記入
extension ViewController: CLLocationManagerDelegate{
//ここに必要なコードを記入
}
App Extensions #4(Today)
http://swift-salaryman.com/appextensions4.php
こちらのサイトには、Widget の画面から、アプリを起動する方法の情報があり、これを利用させて頂きました。
Loading マークの表示
http://swift-salaryman.com/uiactivityindicatorview.php
こんなマークが画面の中央で出ますw
この簡易方法を利用して、更新中のマークをお天気情報のダウンロード中に表示する様にしましたw
iPhone4sでは、こんな風な表示になりますw