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

字数 660阅读 1748

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);  

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

推荐阅读更多精彩内容