1

我已经成功实现了一个自定义协议的urlHandling。

当其他应用程序尝试调用此 url 以解决安全问题时,我需要阻止该应用程序启动。只有执行 JavaScript 代码的回调才需要该协议,因此只允许在应用程序内调用。

使用的响应UIWebView:stringByEvaluatingJavascriptFromString不是一个选项,因为 JS 代码必须在多个平台上工作。

我想在我的应用程序中拦截呼叫本身(这可以通过使用来工作UIWebViewDelegate:shouldStartLoadWithRequest),但我无法弄清楚这是否可以使用 WP8。(在 Android 中,这适用于WebViewClient:shouldOverideUrlLoading

4

3 回答 3

0

如何实现UIApplicationDelegate协议方法:

application:openURL:sourceApplication:annotation:

并检查sourceApplication

于 2013-02-22T12:09:40.323 回答
0

据我所知,iOS 上没有标准 API 有类似“白名单”的东西,允许应用程序调用您的自定义 URL 方案并以这种方式打开您的应用程序。使用此 URL 方案时,您只能拥有整个蛋糕,而不仅仅是一小块。

建议 A:
如果从您的应用程序或其他应用程序启动,您可以在您的应用程序委托中设置一个布尔变量来存储openURL,在您的视图控制器中检查此变量是否设置为并将您的应用程序与空白屏幕或信息屏幕NO交换告诉用户该应用程序不是从受信任的来源或其他任何地方打开的。rootViewControllerwindow

建议B:
如果你真的不想让你的应用打开,你可以让它在application:openURL:sourceApplication:annotation:.

只需检查它是否sourceApplication是受信任的来源,如果不使用类似NSAssert(YES == NO, @"Bad bad boy")使其崩溃的东西。

B只会是一个黑客,我不会认为它是最佳实践。尝试建议 A,这是一种更加用户友好的方式,您应该能够实现您的目标。

于 2013-02-22T13:08:12.067 回答
0

最后我找到了适合我的解决方案。;) 不过,这是一种不同的方法。

首先:您可能想查看WebViewJavascriptBridge,这是双向通信的桥梁,实现回调和您可能需要的一切。但这适用于 iframe... 我想使用 ajax。

我没有实现我的应用程序要监听的协议。我现在要做的是实现一个NSURLProtocol,它总是会返回NOfor canInitWithRequest。我正在使用唯一路径(如/!anythingUnique)来识别我的 JS 调用。有了这个设置,我可以调用 ajax 并在 Obj-C 代码中做一些事情。

  1. 实现 NSURLProtocol。
  2. 通过注册 NSURLProtocol [NSURLProtocol registerClass:[SFJURLProtocol class]];
  3. 您将需要设置一个 baseURL... 通过加载任何页面或通过webView:loadHTMLSString. 在初始化控制器时执行此操作。
  4. 来自 JavaScript 的触发请求
  5. canInitWithRequest在你的函数中捕捉它们。为了干净的代码,您可能想在 Controller 中做一些事情,所以考虑一下回调机制或其他东西。;)
  6. ???
  7. 利润!

我希望这有帮助。

于 2013-03-21T18:44:58.980 回答