iFrame、JSBridge 升级Xcode8和iOS 10之后的解决方案

iOS又升级了!!!各种适配、兼容性的工作量一下子就过来了,中秋这个假期相信很多iOS开发者都在考虑的是尽快的完成新系统的兼容。朋友圈里的一份《兼容iOS 10资料整理笔记》博文很多人都在转发阅读,其中已经包含了主要的兼容点和解决方案。比较头疼的就是UILabel的改变,会带来一些体力劳动。其实总结下来苹果只是规范化了很多地方,如果平时使用没有很规范的话可能会比较麻烦了,由于笔者开发的是Hybrid App,所以说一下自己遇到的关于Hybrid的兼容性问题

1.UIWebViewDelegate回调方法中参数类型的改变

刚使用Xocde8编译项目时报了好的关于- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error;方法的error参数的类型错误,原来新的API中将error参数的nullable修饰去掉了,可是尴尬的是,如果单纯的去掉了Xcode7又编译不过了,所以只能先加一个系统版本的宏判断一下了。

2.keychain导致程序运行crash

好不容易改完了上面的编译错误,刚运行程序然后就crash了,crash的地方就是在keychain的存储那里,感觉摸不着头脑啊,后来在Stackoverflow上面找到了解决方法原文链接解决方法就是添加“keychain entitlements” 如下图:

keychai entitlements

3.一直使用的JSBridge不能用了

开发Hybrid App的同学应该都知道,其实js和native通信关键的就是<iframe>标签,通常的bridge.js会用如下的代码添加和删除<iframe>标签:

var iFrame = document.createElement("IFRAME");  
iFrame.setAttribute("src","JSBridge://ActionId=" + id);    
document.documentElement.appendChild(iFrame);    
iFrame.parentNode.removeChild(iFrame);

然后会在UIWebView的回调方法-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;中去解析截获的src属性中的ActionId值,但是很不幸在Xcode8打包到iOS 10的设备中,在UIWebView的回调方法中request参数中的URL是空的,什么也没有。这个问题的根本原因是上面动态添加的<iframe>src属性不符合URL格式规范,正确的URL格式规范应该是协议://host?args,所以上面明显是不符合规范的,只要添加一个自定义的host字符串就可以了,代码改动如下:

iFrame.setAttribute("src","JSBridge://customeHost?ActionId=" + id);  

相信目前遇到只是一部分的问题,希望有新的问题可以一起讨论研究

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容