2016-09-20 8 views
1

Я перемещаю свое строение кода Swift 2.2 и отлично работаю на xcode 7/ios 8 и ios 9. С the answer to this question Swift 3 совместим с iOS 8 и новее. И я также знаю, что я не смогу использовать новые API.Быстро ли 3 не совместим с классами NSURL на iOS 9?

В моем приложении я создаю некоторые запросы HTTPS, загрузка некоторых файлов и т.д.

Мое предположение, что я должен быть в состоянии использовать классы NSURL, URLSessionDownloadDelegate, NSMutableURLRequest и т.д. все доступные от прошивкой (8,0 и позже).

Но либо я (по ошибке) столкнулся с крахом, запускающим мой перенесенный код на iOS 8.1, потому что я использую класс URL (доступный из iOS 10) или компилятор жалуется, что NSURL не неявно конвертируется в «URL» (см. тоже this question).

Поэтому я не могу использовать класс URL, если я хочу, чтобы быть совместимым с прошивкой 9.

Вот код, чтобы сделать вещи яснее:

Swift 2:

class ServerCom: NSObject, NSURLSessionDownloadDelegate { 
    private var fileURL: NSURL = NSURL() 
    [...]  
      guard let urlString: NSURL = 
     NSURL(string: params, 
      relativeToURL: NSURL(string: dcParam.baseURL)) else { 
       let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)" 
       throw fetchAppXmlError.FAILED_URL_GENERATION(failed) 
    } 
    [...] 
    let request = NSMutableURLRequest(URL: urlString) 
    request.timeoutInterval = 10 
    request.HTTPMethod = "GET" 

} 

Свифта 3

class ServerCom: NSObject, URLSessionDownloadDelegate { 

fileprivate var localFileURL: NSURL = NSURL() 

[...] 

     guard let urlString: NSURL = 
      NSURL(string: params, 
       relativeTo: NSURL(string: dcParam.baseURL)) else { 
        let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)" 
        throw fetchAppXmlError.failed_URL_GENERATION(failed) 
     } 

let request = NSMutableURLRequest(url: urlString) 
request.timeoutInterval = 10 
request.httpMethod = "GET" 
[...] 

} 

В стремительном 3 кода я получаю следующие ошибки:

  1. На линии с: пусть запрос = ...: «NSURL» не неявно конвертируются в «URL»; вы хотели использовать «как» для явного преобразования?
  2. В строке с let urlString = ...: Невозможно преобразовать значение типа «NSURL?»? к ожидаемому типу аргумента 'URL?'

Я не могу использовать localFileURL с URL-адресом типа, потому что это будет только iOS 10. Я также не могу использовать URLRequest вместо NSMutableURLRequest, потому что он также доступен только для iOS (10.0 и новее). Кажется, что я всегда использую URL-адреса типа URL, а не «старые» NSURL.

Так что мой вопрос: есть ли любой способ использования NSURL et. и др. с быстрым 3 и iOS 9?

Или, в общем, есть ли способ делать фоновые загрузки с быстрым 3, который будет работать на iOS 9 и iOS 10?

Это несоответствие происходит от моста NSURLComponents до URLComponents?

+0

Вы можете легко невесты типа Foundation и Swift, например. 'urlString as URL' без восклицания/вопросительного знака после' as' – vadian

+1

Это неверно: _I не могу использовать localFileURL с URL-адресом типа, потому что это будет только iOS 10._ Приложения с использованием 'URL' или' URLRequest' запускаются на iOS 9 устройства без проблем. Заметки «Доступность» несколько запутанны, но если вы правильно установите «Цель развертывания», Xcode/Swift предупредит вас о фактически недоступных вещах. Попробуйте использовать 'URL' и' URLRequest' и протестируйте его на самом устройстве iOS 9. – OOPer

+0

Спасибо OOPer! Ваш намек привел меня в правильное направление! Эти записи о доступности действительно сбивают с толку. Теперь я могу ответить на свой вопрос. –

ответ

0

Благодаря OOPer я могу ответить на мой собственный вопрос:

код прекрасно работает с классом URL, но только тогда, когда вы установите Deplyoment Target на же IOS версии в качестве тренажера!

XCode 8 обновил мою версию IOS 9 SDK до версии 10, и поэтому у меня был только выбор для использования симулятора на iOS 10 или iOS 8.1. Однако для цели развертывания был установлен iOS 9 (я был уверен, что это было до обновления, установленного на iOS 8.1).

Так я бег в ошибку во время выполнения с IOS 8.1 тренажером и развертывание Target установлен прошивкой 9.

Но это делает работы с прошивкой 8.1 тренажером и Target Deployment установлен на прошивку 8.1!

Вот Swift 3 код работает также с прошивкой 8.1:

class ServerCom: NSObject, URLSessionDownloadDelegate { 

fileprivate var localFileURL: URL = URL(string: "dummy")! 

[...] 

     guard let urlString: URL = 
      URL(string: params, 
       relativeTo: URL(string: dcParam.baseURL)) else { 
        let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)" 
        throw fetchAppXmlError.failed_URL_GENERATION(failed) 
     } 

     var request = URLRequest(url: urlString) 
     request.timeoutInterval = 10 
     request.httpMethod = "GET" 
[...] 

} 

Спасибо!