Не удалось загрузить изображение URL-адреса HTTP

Я пытаюсь преобразовать приложение watchOS 1 в watchOS 2. Но я увидел ошибку при попытке загрузить изображение с URL-адреса с помощью этого кода:

let url:NSURL = NSURL(string: "http://www.xxxxxxxx.com/xxx/xyz.jpg")!
let data:NSData = try! NSData(contentsOfURL:url, options:[])
imageone.setImage(UIImage(data: data))

Ошибка:

Домен ошибки = NSCocoaErrorDomain Code = 256 «Не удалось открыть файл «xyz.jpg». UserInfo={NSURL=http://www.xxxxxxxx.com/xxx/xyz.jpg}

Я читал в Интернете, что это связано с новым протоколом Application Transport Security. Я также читал, чтобы поставить

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

в info.plist в расширении Watchkit, но появляется та же ошибка. То же самое, если я использую изображение в домене HTTPS.

ВНИМАНИЕ: На симуляторе работает отлично!

Я использую XCode 7 бета 5.

Кто-нибудь знает, как это решить?

ОБНОВЛЕНИЕ Просматривая Интернет, я обнаружил, что, возможно, с помощью NSURLSession я решу проблему, но я не нашел ничего полезного в этом. Может ли кто-нибудь помочь мне преобразовать мой код в синтаксис NSURLSession? Спасибо!


person Gualty    schedule 20.08.2015    source источник
comment
Вы уверены, что изображение существует? Я чувствую, что это проблема конкретно с URL-адресом...   -  person Idris    schedule 21.08.2015
comment
@Idris Да, я пробовал с разными изображениями по HTTP или HTTPS, и в браузере Mac работает, а также в моем проекте, выполненном в симуляторе, он работает   -  person Gualty    schedule 21.08.2015
comment
я только что столкнулся с этим, убедитесь, что NSAllowsArbitraryLoads как в info.plist (приложение и расширение Watchki...), так и в чистом проекте   -  person Jeremy Luisetti    schedule 21.08.2015
comment
@Jeremy Luisetti Я только что попробовал, но это не сработало. Люди говорят, что его нужно добавлять только на расширение. В симуляторе работает отлично   -  person Gualty    schedule 21.08.2015
comment
Кто-нибудь еще знает, как решить эту проблему? А может это известный баг?   -  person Gualty    schedule 25.08.2015
comment
Кажется, в watchOS 2 Beta 5 есть большая ошибка. Все исходящие соединения TCP блокируются. надо дождаться следующей беты   -  person Gualty    schedule 26.08.2015


Ответы (2)


Это простой способ добиться этого с помощью NSSession в Objective-C. Это не должно быть сложно перевести на Swift.

NSString *dataUrl = @"http://www.xxxxxxxx.com/xxx/xyz.jpg";
NSURL *url = [NSURL URLWithString:dataUrl];

NSURLSessionDataTask *downloadTask = [[NSURLSession sharedSession]
dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
UIImage *downloadedImage = [UIImage initWithData:data];
    // Do what you like with your image
}];

[downloadTask resume];
person Dree    schedule 03.09.2015

Я решил создать функцию:

func imageRequest(urlweb:NSURL) {

    let requestURL: NSURL = urlweb
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
    let session = NSURLSession.sharedSession()
    let task = session.dataTaskWithRequest(urlRequest) {
        (data, response, error) -> Void in

        if error == nil {

            NSLog("Success!")
            self.imagename?.setImage(UIImage(data:data!))

        } else {

            NSLog("Fail")

        }

    }

    task.resume()

}
person Gualty    schedule 24.08.2015