2015-09-18 9 views
5

私はMediaWikiのサーバにiOSアプリを認証するために、次のコードを持っている:iOSの8日iOS 8とiOS 9のNSURLセッションの違いは?

let task = NSURLSession.sharedSession() 
     task.configuration.HTTPAdditionalHeaders = ["Authorization": "Basic " + base64EncodedCredentials] 

     task.dataTaskWithURL(url!) {(data, response, error) in 
      dispatch_async(dispatch_get_main_queue(), { 

       if data != nil { 
        let result = NSString(data: data!, encoding: NSUTF8StringEncoding) 
        if resultIsValid(result) { 
         //Do authentication stuff 
        } else { 
         self.showLoginErrorMessage() 
        } 
       } else { 
        self.showLoginErrorMessage() 
       } 
      }) 
      }.resume() 

これは完璧に動作し、私はHTTP 200 OKレスポンスを受信します。しかし、iOS 9では401が不正なものになります。残念ながら、実際に受信した情報を見るためにサーバにアクセスすることはできず、内部ネットワーク上にあるため、サーバにリンクすることはできません。 HTTP基本アクセス認証を使用しているため、認証タイプが他のどのサーバーと同じである必要があると想定します。

iOS 8から9のAPIに変更があり、このような問題が発生する可能性がありますか?たとえば、コンテンツタイプやユーザエージェントのような他のデフォルトヘッダを変更/削除/追加することはできますか?

編集: 私は、Content-Typeを追加することで、これがiOS 8のヘッダーの一部であることを発見しましたが、iOS 9では検出されませんでした。 Content-Typeを設定しなくても、iOS 9のリクエストには存在しないというのはまだ奇妙です。

+0

が、これは[アプリケーションのトランスポート・セキュリティ](httpsの問題である可能性があります。同じ問題を抱えている人のため

は、ここで私は両方のiOS 8とiOS 9のために働いて、私の認証を持っているために使用される最終的なコードです: //developer.apple.com/library/prerelease/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html#//apple_ref/doc/uid/TP40016198-SW14)? –

+0

残念なことに、私は401を無許可に戻すことはありません。さらに、私はInfo.plistに例外を追加しました。 – Jorn

+0

両方のバージョンで同じです。私はまた、問題なくサーバーに認証するAndroidアプリを持っています。問題が発生したのはiOS 9のみです。 – Jorn

答えて

3

私はついにそれを理解することができました! iOS 9では、NSURLSessionConfigurationのHTTPAdditionalHeadersプロパティは読み取り専用であり、NSURLSessionConfigurationへの変更は現在のNSURLSessionに反映されないことがわかりました。その上に、4つのヘッダーAuthorisation,ConnectionHostおよびWWW-Authenticateは変更できません。したがって、iOS 9で基本アクセス認証を行う唯一の方法は、quellishが提案したNSURLCredentialを使用することです。

let url = NSURL(string: "https://subdomain2.subdomain1.example.com") 

let credential = NSURLCredential(user: username, password: password, persistence: NSURLCredentialPersistence.ForSession) 
let protectionSpace = NSURLProtectionSpace(host: url!.host!, port: 443, `protocol`: url!.scheme, realm: "subdomain2.example.com", authenticationMethod: NSURLAuthenticationMethodHTTPBasic) 
NSURLCredentialStorage.sharedCredentialStorage().setCredential(credential, forProtectionSpace: protectionSpace) 

let task = NSURLSession.sharedSession() 

task.dataTaskWithURL(url!) {(data, response, error) in 
    if data != nil { 
     if responseIsValid(response) { 
      //Do authenticated stuff 
     } else { 
      self.showLoginErrorMessage() 
     }   
    } else { 
     self.showLoginErrorMessage() 
    } 
}.resume() 
+1

将来、http://www.charlesproxy.comのようなツールを見て、双方向ウェブトラフィックの解読を助けるかもしれません。会話の両面を見ることができて便利ですし、https://www.wireshark.org/よりもワイヤレススニッフィングの方がはるかに簡単です – fullofsquirrels

関連する問題