背景:
来源于一个需求,在app中用SFSafariViewController调用第三方的网页支付后,拿到支付结果通知原生跳转到对应的界面。
为什么要用 SFSafariViewController
呢, 因为 SFSafariViewController
中可以保存着用户的账号和密码,用户支付过一次之后,下次用户进来就不用蛋疼的再重新输入账号密码了。
所以就引发了另外一个问题: SFSafariViewController
怎么跟原生交互呢,查了一遍SFSafariViewController
的API,然并卵,只首帧才有那么几个相应的回调。并没有WKWebview
和UIWebView
那么多强大的与原生交互的方法。
Google了一波之后,找到了一个比较奇葩的方法来交互。那就通过 CFBundleURLType
来实现的
在打开第三方的支付网页支付完成后,回调到指定的url
, 指定的 url 页面一般都是自己公司的,所以在上面触发一个伪协议, 该伪协议scheme
就是项目中info.plist
中CFBundleURLType
指定的。之后就会触发
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options
在该方法中拿到回调 url
就可以为所欲为了。
当然 SFSafariViewController
也会可以获取到对应网页的一些Cookie信息 对应可以参考一下
在app内拿到用户安装app前信息的解决方案(支持iOS11)
SafariViewController: How to grab OAuth token from URL?
最终 : Demo
网友评论