2015-09-22 1 views
3

Как и многие разработчики, я получаю некоторые данные с веб-сервера через http. Поскольку XCOde7/iOS9 мне нужно отмечать используемые домены как исключение в моем приложении plist. Это было разработано для всех моих доменов, кроме одного.NSAppTransportSecurity: не работает с правильными настройками

Важно: Это не решение для принятия всех доменов с помощью NSAllowsArbitraryLoads. Сначала я попытался следующие записи в PLIST:

<key>cc.mydomain.de</key> 
     <dict> 
      <key>NSIncludesSubdomains</key> 
      <true/> 
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
      <true/> 
     </dict> 

Эта конфигурация работала для всех других доменов, но не для этого, поэтому я добавил следующие записи в PLIST:

<key>NSThirdPartyExceptionRequiresForwardSecrecy</key> 
    <false/> 
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> 
    <true/> 
<key>NSExceptionRequiresForwardSecrecy</key> 
    <false/> 

Но я до сих пор возникла ошибка при попытке доступа к домену.

Приложение Transport Security заблокировало загрузку ресурса HTTP (http: //), так как небезопасно. Временные исключения могут быть настроены через файл Info.plist вашего приложения.

Если эти записи исключений не работают, то что работает? Какова минимальная конфигурация для такого исключения. Какую запись мне не хватает?

ответ

1

Я связался со службой поддержки разработчиков компании Apple для этой проблемы, и они сказали мне, что проблема заключается в том, что один из моих адресов перенаправляет на другой адрес, который, конечно, должен быть указан в качестве исключения в моем plist, тоже. Вы можете легко определить перенаправления с помощью метода делегата URL сеанса для перенаправления:

self.session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), delegate: self, delegateQueue: NSOperationQueue.mainQueue()) 

let url = NSURL(string: "yoururl")! 

self.session.dataTaskWithURL(url) { (data, response, error) in 
    if let error = error { 
     NSLog("error %@/%d", error.domain, error.code) 
    } else if let response = response as? NSHTTPURLResponse { 
     NSLog("response %d", response.statusCode) 
    } else { 
     fatalError() 
    } 
}.resume() 

func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse, newRequest request: NSURLRequest, completionHandler: (NSURLRequest?) -> Void) { 
     NSLog("direct to %@", request.URL!) 
     completionHandler(request) 
} 

Swift 3 версия:

class ViewController: UIViewController, URLSessionTaskDelegate { 

    var session: URLSession! = nil 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.session = URLSession(configuration: URLSessionConfiguration.default, delegate: self, delegateQueue: OperationQueue.main) 

     let url = NSURL(string: "yoururl")! 

     self.session.dataTask(with: url as URL) { (data, response, error) in 
      if let error = error { 
       NSLog("error %@/%d", (error as NSError).domain, (error as NSError).code) 
      } else if let response = response as? HTTPURLResponse { 
       NSLog("response %d", response.statusCode) 
      } else { 
       fatalError() 
      } 
      }.resume() 
    } 

    func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) { 
     print("direct to %@", request.url!) 
     completionHandler(request) 
    } 
} 
0

Попробуйте это:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <!-- .......................... --> 
    <!-- Other keys already present --> 
    <!-- .......................... --> 

    <key>NSAppTransportSecurity</key> 
    <dict> 

     <key>NSExceptionDomains</key> 
     <dict> 

      <key>mydomain.de</key> 
      <dict> 
       <key>NSExceptionAllowsInsecureHTTPLoads</key> 
       <true/> 
       <key>NSIncludesSubdomains</key> 
       <true/> 
      </dict> 

     </dict> 
    </dict> 

</dict> 
</plist> 
+0

Эй. Спасибо за ваш ответ. К сожалению, он тоже не работает.На данный момент я думаю, что проблема заключается не в настройке plist, а в url или самом веб-сервисе, потому что это относится к службе рендеринга изображений ASP.NET. –

0

Чтобы получить доступ к ресурсу из HTTP: //, вам необходимо добавить следующие строки в info.plist файле

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

. Пожалуйста, прочтите мой вопрос, где я сказал: Важно: это не решение для меня принимать все домены с помощью NSAllowsArbitraryLoads. –

0

Я добавил App транспорта Параметры безопасности но ошибка продолжает появляться в консоль.

Мое приложение показывало эту ошибку, когда я запустил URL-адрес сети в UIWebView. Если на вашей странице есть внутренний url/frame, который добавлен в ваш info.plist как Exception Domains, тогда ошибка появится в консоли.

В моем случае я звонил на веб-страницу в UIWebView, и на этой странице был плагин facebook. Эта веб-страница правильно загружалась, но также отображала эту ошибку и в консоли. Когда я тщательно проверил, я обнаружил, что в своем приложении я использовал вход в Facebook, и для этого учебника Facebook мне было предложено добавить facebook.com как Exception Domains в info.plist.

enter image description here

Когда я удалил этот Exception Domains, исчезла ошибка.

Смежные вопросы