背景:
來源于一個需求停撞,在app中用SFSafariViewController調(diào)用第三方的網(wǎng)頁支付后,拿到支付結果通知原生跳轉到對應的界面悼瓮。
為什么要用 SFSafariViewController
呢, 因為 SFSafariViewController
中可以保存著用戶的賬號和密碼戈毒,用戶支付過一次之后,下次用戶進來就不用蛋疼的再重新輸入賬號密碼了横堡。
所以就引發(fā)了另外一個問題: SFSafariViewController
怎么跟原生交互呢埋市,查了一遍SFSafariViewController
的API,然并卵命贴,只首幀才有那么幾個相應的回調(diào)道宅。并沒有WKWebview
和UIWebView
那么多強大的與原生交互的方法。
Google了一波之后胸蛛,找到了一個比較奇葩的方法來交互污茵。那就通過 CFBundleURLType
來實現(xiàn)的
在打開第三方的支付網(wǎng)頁支付完成后,回調(diào)到指定的url
, 指定的 url 頁面一般都是自己公司的葬项,所以在上面觸發(fā)一個偽協(xié)議泞当, 該偽協(xié)議scheme
就是項目中info.plist
中CFBundleURLType
指定的。之后就會觸發(fā)
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options
在該方法中拿到回調(diào) url
就可以為所欲為了民珍。
當然 SFSafariViewController
也會可以獲取到對應網(wǎng)頁的一些Cookie信息 對應可以參考一下
在app內(nèi)拿到用戶安裝app前信息的解決方案(支持iOS11)
SafariViewController: How to grab OAuth token from URL?
最終 : Demo