iFrame、JSBridge 升级Xcode8和iOS 10之

作者: 马修王 | 来源:发表于2016-09-19 01:37 被阅读1499次

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

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

    相关文章

      网友评论

      • QihuaZhou:同样碰到了shouldStartLoadWithRequest里面拿到的url是about:blank,看来是url写得不规范。😂
        马修王:@周鶏 :smile:坑很多啊,哈哈
      • 子达如何:收下,持续继续填坑:)
        马修王:@子达如何 :smile:

      本文标题:iFrame、JSBridge 升级Xcode8和iOS 10之

      本文链接:https://www.haomeiwen.com/subject/svigettx.html