2016-07-03 8 views
1

OAuth2トークンリクエストを送信する際に問題が発生しました。サーバーが正常に機能し、302リダイレクトを返す 'com.myapp:// OAuthの/コールバック#TOKEN_TYPE =ベアラー& access_tokenは= WPtSq5oFW0moitYabRmymbVxgZTGnc & expires_in = 3600 &範囲をレジスタ=' しかし、私のアプリは= -1002「サポートされていないNSURLErrorDomainコードをスローしますURL "アプリケーションが自分自身へのリダイレクトを受信したときにサポートされていないURL

そして、はい、私は含まれてい私のInfo.plistファイルにURLスキームを登録しました:

<key>CFBundleURLTypes</key> 
    <array> 
      <dict> 
        <key>CFBundleURLSchemes</key> 
        <array> 
          <string>com.myapp</string> 
        </array> 
        <key>CFBundleURLName</key> 
        <string>com.mycompany.myapp</string> 
      </dict> 
    </array> 

は誰もが、これは適切にリダイレクトされていませんし、私AppDelegateに送信されたばかり理由についてどのような考えを持っています。迅速?それは私に少し怒っている!私は喜んでSafariにリダイレクトURLを置くことができ、それは私のアプリを正常に開きます。私はコンソールに表示完全なエラーは次のとおりです。

Error: Optional(Error Domain=NSURLErrorDomain Code=-1002 "unsupported URL" UserInfo={NSUnderlyingError=0x1357e1c80 {Error Domain=kCFErrorDomainCFNetwork Code=-1002 "(null)"}, NSErrorFailingURLStringKey=com.myapp://oauth/callback#token_type=Bearer&access_token=WPtSq5oFW0moitYabRmymbVxgZTGnc&expires_in=3600&scope=anonymous_view, NSErrorFailingURLKey=com.myapp://oauth/callback#token_type=Bearer&access_token=WPtSq5oFW0moitYabRmymbVxgZTGnc&expires_in=3600&scope=anonymous_view, NSLocalizedDescription=unsupported URL}) 

私は、私は以下のようにNSURLSessionを使用してリクエストを送信しています追加する必要があります:

let defaultSession = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
let url = NSURL(string: authoriseUrl) 
let dataTask = defaultSession.dataTaskWithURL(url!) {data, response , error in 
    print("Data: \(data)") 
    print("Response: \(response)") 
    print("Error: \(error)") 
} 

dataTask.resume() 

答えて

1

はそれを動作させることができました。 NSURLSessionは、Safariのようにinfo.plistに登録されているURLスキームを使用しないことがわかります。つまり、あなたのURLスキームを扱うことができるNSURLProtocolサブクラスを記述する必要があります。

class MyUrlProtocol: NSURLProtocol { 

override class func canInitWithRequest(request: NSURLRequest) -> Bool { 
    if request.URL?.scheme == "myapp" { 
     return true 
    } 
    return false 
} 

override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest { 
    return request 
} 

override class func requestIsCacheEquivalent(aRequest: NSURLRequest, 
              toRequest bRequest: NSURLRequest) -> Bool { 
    return super.requestIsCacheEquivalent(aRequest, toRequest:bRequest) 
} 

override func startLoading() { 
    // Do your work here 
} 

override func stopLoading() { 
} 

は、その後、あなたのNSURLSessionに、あなたはあなたの要求を行う前に、ご使用の構成に追加する必要があります。

var protocolClasses = [AnyClass]() 
    protocolClasses.append(MyUrlProtocol) 

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.protocolClasses = protocolClasses 

    let defaultSession = NSURLSession(configuration: configuration) 
    let url = NSURL(string: authoriseUrl) 
    let dataTask = defaultSession.dataTaskWithURL(url!) {data, response , error in 
     print("Data: \(data)") 
     print("Response: \(response)") 
     print("Error: \(error)") 
    } 

    dataTask.resume() 
関連する問題