前提・実現したいこと
iOSアプリ開発初心者です。
QiitaのAPIを利用した、OAuth認証機能のあるアプリの実装で詰まっています。
①WKWebViewで認証画面を表示
↓
②許可画面を押下
↓
③アクセストークンを取得し、WKWebViewを閉じて画面遷移
を行いたいのですが、②の許可画面を押したところでクラッシュし、以下のメッセージが表示されます。
※QiitaのアカウントページでのリダイレクトURL、及びXcode内「info.plist」ファイルでのURL Schemeの設定はしている状態です。
発生している問題・エラーメッセージ
WebPageProxy::didFailProvisionalLoadForFrame: frameID = 3, domain = WebKitErrorDomain, code = 102
該当のソースコード(認証ページを表示する
SWift
1 2import UIKit 3import WebKit 4import Foundation 5import Alamofire 6import SwiftyJSON 7 8class OauthPageViewController: UIViewController, WKNavigationDelegate { 9 10 @IBOutlet weak var authWebView: WKWebView! 11 12 var code: String = "" 13 var myClientId: String = "" 14 var mySecretKey: String = "" 15 16 override func viewDidLoad() { 17 super.viewDidLoad() 18 setProperty() 19 showOauthWebView() 20 } 21 22 //settings.plistからclientID,clientSecretの取得 23 func setProperty() { 24 var oauthproperty: Dictionary<String, String> = [:] 25 guard let propertypath = Bundle.main.path(forResource: "settings", ofType: "plist") else { 26 return 27 } 28 let configurations = NSDictionary(contentsOfFile: propertypath) 29 if let datasourceDictionary: [String : String] = configurations as? [String : String] { 30 oauthproperty = datasourceDictionary 31 } 32 if let clientId: String = oauthproperty["qiitaClientId"] { 33 myClientId = clientId 34 } 35 36 if let secretKey: String = oauthproperty["qiitaSecretKey"] { 37 mySecretKey = secretKey 38 } 39 print(mySecretKey) 40 print(myClientId) 41 } 42 //認証画面表示処理 43 func showOauthWebView() { 44 guard let qiitaOauthUrl = URL(string: "https://qiita.com/api/v2/oauth/authorize?client_id=(myClientId)&scope=read_qiita") else { return } 45 let qiitaOauthRequest = URLRequest(url: qiitaOauthUrl) 46 authWebView.load(qiitaOauthRequest) 47 } 48 49 //URLからのコード取得処理 50 func getQueryStringParameter(url: String, param: String) -> String? { 51 guard let url = URLComponents(string: url) else { 52 return nil 53 } 54 return url.queryItems?.first(where: { $0.name == param })?.value 55 } 56 57 //ログイン後、コールバックURLの処理。 58 func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping(WKNavigationActionPolicy) -> Void) { 59 if navigationAction.request.url?.scheme == "cm-pgqiita" { 60 self.dismiss(animated: true, completion: nil) 61 62 let code = getQueryStringParameter(url: (navigationAction.request.url?.absoluteString)!, param: "code") 63 64 getAccessToken(code: code, completion: nil) 65 66 decisionHandler(WKNavigationActionPolicy.allow); 67 } 68 } 69 70 71// アクセストークン取得処理 72 func getAccessToken(code: String!, completion: (() -> Void)?) { 73 self.code = code 74 let url = "https://qiita.com/api/v2/access_tokens" 75 76 let headers = [ 77 "Content-Type": "application/json" 78 ] 79 80 let parameters: Parameters = [ 81 "client_id": myClientId, 82 "client_secret": mySecretKey, 83 "code": self.code 84 ] 85 86 Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default, headers: headers).responseJSON { response in 87 switch response.result { 88 case .success: 89 let json = JSON(response.result.value!) 90 guard let accessToken = json["token"].string else { return } 91 print(accessToken) 92 UserDefaults.standard.setValue(accessToken, forKey: "ACCESS_TOKEN") 93 completion?() 94 case .failure(let error): 95 print(error) 96 } 97 } 98 } 99 100} 101
試したこと
参考にしたのは以下のページです。
https://qiita.com/yyokii/items/87d4975716f1a6ed620c

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。