iPhone お天気Widget を作成する参考サイト | とっても暇なブログw

とっても暇なブログw

ニコニコ動画の「踊ってみた」カテゴリーで活動する素敵な女の娘(こ)達を中心に、その文化?の展開を楽しく見守っていきたいと思います。
元気をもらえる彼女達のパワーは、本当に頼もしいですねw

やっと、iPhone 版の Widget にも対応した「 リンク集付きのお天気アプリ」が完成しましたw

OpenWeatherMap の API の反応が遅いのが、ちょっとあれですが、無料なので文句は言えないですねw


「今日のお知らせ」での表示内容
3時間ごとの天気予報の3回分を表示します。アプリ本体へのリンクボタンも付けましたw

MOA-01


「お天気アプリ」
3時間ごとの天気予報を5回分表示します。「リンク」へのボタン付き

MOA-02


「関連サイトへのリンク」
天気予報のページへのボタン付き

MOA-04



こちらで紹介するサイトの情報を参考に作成しました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

su01
su02 su03





iPhone4sでは、こんな風な表示になりますw

MOA-11

MOA-12

MOA-13