背景
别问我为什么微信登录的时候在客户端获取access token,如果要问,那就继续往下看吧 😄
需求来源
从xx渠道接到的一个活,人家出价300我就接了,毕竟是做iOS的,虽然不懂Cordova,但是网络问题只要叨咕叨咕还是很好解决的,因为他说安卓的没问题,只有iOS的请求失败(我好像从业生涯9年中,每天都听到这句话,我的回答是:不知道啊,没人改过啊。O(∩_∩)O哈哈~)
流程
- 首先,我让他把源码先发我(一分钟能跑起来的工程,一看就是微小小工程,对我来说顶多算个demo(▼へ▼メ)
- 然后,我就开始复现问题,还真看到了网络失败,看了下提示”网络错误“。。。这种错误提示真想掐死他,为什么没有详细错误原因。。
- 再然后,浏览器大杀器开始用起来,”iOS访问api.weixin.qq.com/sns/oauth2/… ”ios cordova微信登录snsapi_userinfo“ ”cordova iOS没网“,一通搜索,最后看起来像是微信配置问题,还像h5的登录拿到iOS里来用?最终看到了一个关键词叫重定向,跨域
- 目前为止,解决方案有一个了,就是让他做服务器做个接口去获取,但是这么说,总是那么不专业
- 再就是为什么安卓可以?为什么安卓可以?
- 安卓可以访问,重定向?跨域?那么是不是WKWebview的问题?关键问题来了,webview支持跨域是不是能解决?
- 浏览器搜索”ios wkwebview支持跨域“,真相浮出水面
解决方案
iOS开发 WKWebView 解决跨域问题
WKUserContentController *userContentController = [[WKUserContentController alloc] init];
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.userContentController = userContentController;
config.preferences.javaScriptEnabled = YES;
config.preferences.javaScriptCanOpenWindowsAutomatically = YES;
config.suppressesIncrementalRendering = YES; // 是否支持记忆读取
[config.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];
if (@available(iOS 10.0, *)) {
[config setValue:@YES forKey:@"allowUniversalAccessFromFileURLs"];
}
从项目里搜索WKUserContentController,把上面关键点插进去,成功了,一共七行代码 😄
总结
技术点有俩:
- 接口失败是因为跨域,正常是做服务端做,安卓可以重定向所以没问题,关键点是:跨域 2,iOS解决方案也有俩,一个是做服务端做请求,再就是让iOS的webview支持重定向,关键点:重定向