Javascript 使用自定义URL方案将数据从UIWebView发送回iOS应用程序与Xcode 8/iOS 10中断

Javascript 使用自定义URL方案将数据从UIWebView发送回iOS应用程序与Xcode 8/iOS 10中断,javascript,html,ios,uiwebview,ios10,Javascript,Html,Ios,Uiwebview,Ios10,在10之前的iOS版本中,我能够通过在文档上创建iFrame或将document.location.href设置为web视图尝试加载的自定义URL,将加载到UIWebView中的JavaScript/HTML信息发送回我的应用程序: <html> <body><input id="clickMe" type="button" value="clickme" onclick="changeWindow();" /></body> <script

在10之前的iOS版本中,我能够通过在文档上创建iFrame或将
document.location.href
设置为web视图尝试加载的自定义URL,将加载到
UIWebView
中的JavaScript/HTML信息发送回我的应用程序:

<html>
<body><input id="clickMe" type="button" value="clickme" onclick="changeWindow();" /></body>
<script type="text/javascript">
    function changeWindow() {
        //create temp frame
        iFrame = this.createIFrame('onStatusChange://eyJ1c2VyTmFtZSI6IkpBTCIsLCJwcm92aWRlciI6IkVtYWlsIn0=');
        //remove the frame now
        iFrame.parentNode.removeChild(iFrame);
    }

    function createIFrame(src) {
      var rootElm = document.documentElement;
      var newFrameElm = document.createElement('IFRAME');
      newFrameElm.setAttribute('src', src);
      rootElm.appendChild(newFrameElm);
      return newFrameElm;
    }
</script>
</html>

函数changeWindow(){
//创建临时帧
iFrame=this.createIFrame('onStatusChange://eyJ1c2VyTmFtZSI6IkpBTCIsLCJwcm92aWRlciI6IkVtYWlsIn0=');
//现在拆下框架
iFrame.parentNode.removeChild(iFrame);
}
函数createIFrame(src){
var rootElm=document.documentElement;
var newFrameElm=document.createElement('IFRAME');
setAttribute('src',src);
appendChild(newFrameElm);
返回newFrameElm;
}
然后在客户端上,我只需侦听
UIWebViewDelegate
回调
webView:shouldStartLoadWithRequest:navigationType:
,然后检查
request.URL.scheme
是否等于我的自定义方案(在本例中为
onStatusChange

这是JavaScript和iOS应用程序之间的一种流行通信方式,如常见问题中所示

这适用于iOS 9和10设备上使用Xcode 7(Objective-C或Swift)构建的任何应用程序。我遇到了一个问题,在使用Xcode 8构建的任何应用程序上都不会调用委托方法。这就好像web视图甚至没有尝试加载URL,而URL又没有触发委托回调


是否对
UIWebView
或WebKit从Xcode 7更改为8或从iOS 9更改为10导致此功能无法工作?真正让我困惑的是,我在针对iOS 8的Xcode 7中使用Objective-C构建的生产应用程序可以在iOS 10设备上运行,但使用完全相同的代码库的Xcode 8构建的调试应用程序无法运行。

这是因为iOS现在默认情况下会阻止http请求。您必须在info.plist中重新启用它


好的,长话短说,我们使用一个特殊的URL方案
onStatusChange://
将Base64编码的数据从web视图发送回iOS应用程序。我相信iOS 10上的
UIWebView
在尝试加载以一个或多个等号字符结尾的URL时会阻塞,并加载
about:blank
而不是实际的URL

由于这在iOS 9上运行得很好,我假设这是iOS 10的一个缺陷,并且已经打开了。该雷达的主体中提供了该问题的完整可复制示例

我正在阅读,以确定是否可以删除数据字符串末尾的填充
=
字符,或者是否需要在解码数据之前将其从web上删除并添加到客户端


我最终实现的解决方案是%转义Base64编码的数据,并在客户端上取消转义。这不是最优雅的解决方案,但可能是最安全的解决方案。

这不是HTTP请求(此测试文件在本地运行),而且我已经将ATS配置为允许从白名单域加载。有没有rdar更新?我看到它仍然在iOS 10.2.1上发生,在没有特殊字符的情况下也发生在我们身上。@Aviel遗憾的是没有什么要报告的,我的雷达仍然标记为“打开”,没有更新或排名。你可以考虑复制bug报告并提交一个新的雷达来向苹果显示不止一个人有这个问题。@ Aviel:你复制了bug报告,也张贴在OpenRADAR上,所以其他开发者可以看到报告吗?是的,我的队友添加了一个雷达:@ JAL,你如何调用你的自定义URL方案(OnStasuStchange://)?从web视图中?JS方式最适合我,因为我正在动态构建我的url。