1

次のアプリは、ユーザーの現在地を取得し、OpenWeatherMap を使用してその場所の名前と気温を表示する必要があります。

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var location: UILabel!
    @IBOutlet weak var temperature: UILabel!

    var locationManager: CLLocationManager = CLLocationManager()
    var startLocation: CLLocation!

    func extractData(weatherData: NSData) {
        let json = try? NSJSONSerialization.JSONObjectWithData(weatherData, options: []) as! NSDictionary

        if json != nil {
            if let name = json!["name"] as? String {
                location.text = name
            }

            if let main = json!["main"] as? NSDictionary {
                if let temp = main["temp"] as? Double {
                    temperature.text = String(format: "%.0f", temp)
                }
            }
        }
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let latestLocation: AnyObject = locations[locations.count - 1]

        let lat = latestLocation.coordinate.latitude
        let lon = latestLocation.coordinate.longitude

        // Put together a URL With lat and lon
        let path = "http://api.openweathermap.org/data/2.5/weather?lat=\(lat)&lon=\(lon)&appid=2854c5771899ff92cd962dd7ad58e7b0"
        print(path)            

        let url = NSURL(string: path)

        let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, response, error) in
            dispatch_async(dispatch_get_main_queue(), {
                self.extractData(data!)
            })
        }

        task.resume()
    }

    func locationManager(manager: CLLocationManager,
        didFailWithError error: NSError) {

    }

    override func viewDidLoad() {
        super.viewDidLoad()

        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
        startLocation = nil
    }
}

このチュートリアルに従って、OpenWeatherMap からデータを取得する方法を学習しています: https://www.youtube.com/watch?v=r-LZs0De7_U

アプリは次の場所でクラッシュします。

self.extractData(data!)

data は nil に等しいため、印刷されたパスをコピーして Web ブラウザーに貼り付けると、データがそこにあるため、これは発生しないはずです。チュートリアルに正しく従ったと確信していますが、何が問題で、どうすれば修正できますか?

4

1 に答える 1

3

問題は Transport Security にあり、多くの人に問題を引き起こしています。これを解決する方法を説明するSOの回答の1つを次に示しますトランスポートセキュリティはクリアテキストHTTPをブロックしました

plist で設定を行う場合 - .plist ファイルの NSAppTransportSecurity ディクショナリで NSallowArbitraryLoads キーを YES に設定すると、機能します。

于 2016-03-02T17:57:04.437 に答える