Странно (ошибка?) С Xcode 7 / iOS 9 b5 с dataWithContentsOfURL

У меня есть часть кода, которая работает должным образом на всех версиях iOS, но не на iOS 9:

NSData *response = [NSData dataWithContentsOfURL: [NSURL URLWithString: url] options:NSDataReadingUncached error:&error];

Это простой текст в формате json.

У меня такая ошибка:

Error Domain = NSCocoaErrorDomain Code = 256 «Не удалось открыть файл xxx.php». UserInfo = {NSURL = http://xxx.xxx.com/xxx/xxx.php?lang=fr}

Как этот URL можно интерпретировать как файл? Ответ = ноль ...

Спасибо.


person skrew    schedule 09.08.2015    source источник
comment
Задайте вопрос на форумах Apple.   -  person David H    schedule 09.08.2015
comment
Я прошу убедиться, что я что-то не упустил (например: https обязателен с iOS 9)   -  person skrew    schedule 09.08.2015


Ответы (2)


Технически это из-за изменений NSURLSession сети в iOS9. Чтобы решить эту проблему, вам нужно перейти в info.plist приложения, NSAppTransportSecurity [Dictionary] должен иметь ключ NSAllowsArbitraryLoads [Boolean], который должен быть установлен на YES или вызывать URL-адреса с https.

Вы можете увидеть больше об изменениях NSURLSession сети в iOS9 в http://devstreaming.apple.com/videos/wwdc/2015/711y6zlz0ll/711/711_networking_with_nsurlsession.pdf?dl=1

person AmeenD    schedule 09.08.2015
comment
Версия C&P: <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - person bk138; 10.09.2015
comment
Не делайте этого! Если вы сделаете это, вы по существу побежите дополнительные функции безопасности App Transport Security, представленные в iOS9. Вместо этого посмотрите этот ответ: stackoverflow.com/a/30836686/505093 - person kwahn; 22.09.2015

После отладки в течение 3 часов я полностью избежал ошибки, используя асинхронный NSMutableURLRequest, который, как я заметил, намного быстрее, чем синхронный NSData.

let requestURL: NSURL = NSURL(string: url)!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
    (data, response, error) -> Void in
    if error == nil {
        var response = UIImage(data:data!)
    } else {
        NSLog("Fail")
    }
}
task.resume()
person Nicoara Talpes    schedule 19.08.2016