2015-09-22 146 views
12

UIWebViewでOAuth2を使用してUber APIで認証するiOSアプリケーションがあります。 iOS 9にアップグレードするとき、ログインページのhttpsリクエストをブロックするATSの問題にぶつかります。その後、Uberログインページの例外を追加しましたが、ログインページがFacebook、Amazon Web Services、およびその他のWebサイトへの他のリクエストをいくつか作成し、すべてがATSによってブロックされていることがわかりました。SFSafariViewController OAuth2 Cookieを削除する

Uberのログインページの例外リストを維持する必要はありません.Uberは簡単にページを変更でき、アプリケーションには正しい例外はありません。だから私はSFSafariViewControllerをショットにすることに決めました。

私はでOAuth2プロセスを完了することができますが、認証が完了するとUberから何らかのタイプのクッキーが保存されるという問題があります。別のアカウントを認証してもう一度SFSafariViewControllerを呼び出すと、以前の認証からCookieが取得され、別のアカウントを認証する機会はありません。 NSHTTPCookieStorageでクッキーを削除してUIWebViewで解決しましたが、SFSafariViewControllerからクッキーを削除する方法はありません。 iOSの9以降最良の選択のために

+0

これを解決できましたか?私は同じ問題を経験しています。 – goldengil

+0

クッキーを削除する解決策が見つかりませんでした。私は基本的に、ログアウト時にOAuthトークンを取り消すようにアプリを変更したため、保存されたOAuth Cookieはもう有効ではありませんでした。 – duncanc4

答えて

0

は、例を参照のWebViewが使用するクッキー/キャッシュを削除するために使用することができますWKWebsiteDataStoreを提供WebKit Framework

で利用可能WKWebViewクラスを使用することです:https://stackoverflow.com/a/31803708/313113かドキュメントによるとhttps://stackoverflow.com/a/32491271/313113

:サファリとSFSafariViewController株式クッキーや他のウェブサイトのデータを、それが(セキュリティ上の理由で)、アプリケーションのプロセス外で実行されるため、あなたアプリの中から、それの状態を変更することはできません。 この回答を参照してください:アップルの顧客サポートに連絡し、以下の回答を得た人からhttps://stackoverflow.com/a/34136074/313113を:

SFSafariViewControllerは私のアプリのプロセスの外で、私のアプリケーションはSFSafariViewControllerの状態を変更することはできません確保するため で実行されます。 他の言葉では、私のアプリケーションは SFSafariViewControllerによって保存された資格情報をクリアできません。

+2

「WKWebView」は動作しません。なぜなら、Uberログインページで作成された各HTTP要求に対してドメインを指定する必要があるからです。ページが私によって維持されておらず、ATS例外を使用すると簡単に故障してしまう可能性が最も高いと考えられます。これが私が 'SFSafariViewController'に切り替えなければならなかった理由です。 – duncanc4

0

私はこの同じ問題に遭遇し、これを解決する方法を探すときにあなたの質問を見ました。私の場合、私が思いついた最善の解決策は、アプリでログアウトの作業をしてから、ログアウトURLを指すSFSafariViewControllerを提示することでした。私はその後、すぐにそれがロードが行われたとしてSFSafariViewControllerを閉じるために、これを使用:

extension AlertsTableViewController: SFSafariViewControllerDelegate { 

    public func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) { 
     if controller == logoutSVC { 
      controller.dismiss(animated: false) 
     } 
    } 

} 

私はlogoutSVCにSFSafariViewControllerを格納し、これはログアウトSFSafariViewControllerであれば私はこれだけのコードを実行します。あなたのケースでは、OAuthトークンを取り消すためのAPIコールを行ったようですが、これはユーザには全く表示されないので少しうれしいですが、このようなアクセス権がないインスタンスには適しています。もう1つ、何らかの理由で実際の現在のUIViewControllerの代わりに何らかの理由でSFSafariViewControllerのdismiss(animated:false)メソッドを呼び出さなければならなかった。なぜ私のために働いていないのか分かりませんでした。

関連する問題