3

我的一个项目有一个 Web 视图,用于托管 HTML5 网络游戏(包含在应用程序包中)。我遇到了一个奇怪的问题。游戏通过开放的 URL 调用与宿主应用程序进行通信(详见以下问题:UINavigationController 和加载在 UIWebView 中的网页之间是否可以通信?)。我在 Web 视图的委托中覆盖了以下方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
  NSURL *requestURL = [request URL];
  NSString *host = [requestURL host];

  if([host isEqualToString: @"printHello"])
  {
    NSLog(@"Hello!");
    return NO;
  }
  return YES;
}

这适用于第一次调用(例如 document.location(my-app-scheme://printHello)),然后是 Hello!确实已登录到应用程序的运行控制台。但是,尝试立即调用完全相同的第二个加载 URL 将被忽略。

我已经通过确保 webview 和应用程序之间的任何通信仅在单个调用中发生来解决这个问题,但这被证明是非常严格的 - 有没有更好的策略来解决这个问题?

4

1 回答 1

2

当我通过 URL 进行这种通信时,我在使用document.location("someURL"). 相反,我已经开始这样做了:

var iframe = document.createElement("iframe");
iframe.setAttribute("src", "my-app-scheme://doSomething/");
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);

这将创建一个新的 iframe,它将加载您指定的 url,然后立即将其删除。这足够长以使消息被传递,但是由于每个 URL 都在新的“文档”中打开,因此它永远不会对它应该加载的不断变化的 URL 感到困惑。

还是试试吧。

于 2013-05-13T16:30:34.200 回答