2016-07-22 7 views
2

ウェブサイトのコンテンツを読み込む(まだ起動されていない)ウェブビューラッパーアプリを設定しようとしています。現在のところ、Webサイトは開発モードにあり、Webサイトの唯一のエンドポイントはhttp認証の背後に保護されています。Swift - WebView HTTP Auth - Cleanestソリューション

私は、このソリューションを見てきた:Swift webview xcode post data

しかし、私は、POSTリクエストごとに作成する必要はありませんが、私はむしろ、かつてのウェブサイトに対して認証し、接続を維持したいと思います。

私が探しているのは、きれいで安定したソリューションです。私は、不正な資格情報などのエッジのケースを制御できるようにしています。

NSURLConnectionの使用が快適でない理由は、iOS9ではそのソリューションが廃止されているためです。私はNSURLSessionで解決策が必要です。

上記のリンクされたソリューションの中に何かが見つからない場合は教えてください。誰かがこの問題を抱えていると確信しています。さらに、WebサイトにはSSL保護機能があります。

種類は、あなたがPOSTまたは接続またはセッションを使用する必要はありません

+0

あなたの認証はどのように機能しますか、リクエストにヘッダーを指定できますか?それはUIかWKのウェブビューですか? – Wain

+0

私はUIWebViewを使用しています。 Webから見ると、認証は基本的なHTTP認証ポップアップです。適切な認証情報なしでアクセスしようとすると、401認証応答コード/ステータスが表示されます。 – Armin

答えて

5

私はこの中で、あなたの要求を満たし、完全にわからないんだけどただし、WKWebViewを使用できる場合は、単に認証チャレンジの委任方法に頼ることができますか? 、リンクから生じるので、追加の要求をする必要があり、私はまだ自分自身を試していませんが、ドキュメントは資格情報がセッションのために使用すべきであると言う

func webView(webView: WKWebView, didReceiveAuthenticationChallenge 
      challenge: NSURLAuthenticationChallenge, 
    completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { 

    let creds = NSURLCredential(user:"username", password:"password", persistence: NSURLCredentialPersistence.ForSession) 
    completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, creds) 
} 

:関連するコードスニペットは次のようになり、同様に私の答えhereを参照してください。作業。そうでなくても、メソッドが再度呼び出されるだけで、資格情報をもう一度提供することができます。

アラートなどから名前とパスワードを取得する必要があります(デリゲートメソッドの後続呼び出しをよりエレガントにするために、より優雅に資格情報を保存することもできます)。

また、SSLを使用していると書いてありますので、質問のタイトルに「HTTPS」が含まれていて「HTTPS」がないため、App Transport Securityフラグをよく知っていますそれはスムーズに動作する、そうでなければリンク先の質問を参照してください)。

+0

はい、WKWebViewを使用すると簡単になります。この質問をしている瞬間、私はWKWebViewが私の選択肢であるかどうかはわかりませんでしたが、問題は解決しました。これはおそらく最もクリーンな解決策です。 – Armin

+0

うれしい私は助けることができます。私の "エレガントな"文章スタイルにも注意してください: "それをもっと上品に* *エレガントにするために..." ...あなたは英語でアドバイスを求めなかったことは間違いありません。 :) – Gero

+0

心配しないで、私にとってもエレガントな作品です。 :) – Armin

0

について。変更可能なURLリクエストを作成し、認証ヘッダーを設定するだけです。次に、Webビューにリクエストをロードするよう依頼します。ウィキペディアから

認証ヘッダーの詳細:

  1. ユーザー名とパスワードは1つのコロンと結合されています。
  2. 結果の文字列は、Base64のRFC2045-MIMEバリアントを使用してエンコードされます(ただし、76文字/行に限定されません)。
  3. 許可メソッドとスペース、つまり「基本」が、エンコードされた文字列の前に置かれます。

例えば、ユーザエージェントは、フィールドのように形成されているパスワードとユーザー名およびOpenSesameとしてアラジンを使用する場合は、次のとおりです。

Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l 
+0

悲しいことに、これは最初のリクエストでしか動作しないようです。 Webビュー内の新しいリクエスト(メニューリンクなど)は、承認がないために失敗します。あなたはセッションが必須ではないと確信していますか? – Armin

+0

セッションはWebセッションと同じではありません。サーバーはそれに認証トークンをいくつか入れて、それを使ってクッキーを返さなければなりません。それはWebセッション(URLセッションではなく、非常に異なっています) – Wain

0

ここでSwift 3コードです。

extension MyController: WKNavigationDelegate { 
    func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
     guard let u = self.webuser, let p = self.webp else { 
      completionHandler(.cancelAuthenticationChallenge, nil) 
      return 
     } 

     let creds = URLCredential.init(user: u, password: p, persistence: .forSession) 
     completionHandler(.useCredential, creds) 
    } 
}