2013-02-22 86 views
1

我已经成功实现了自定义协议的urlHandling。如何防止iOS应用程序在定义协议处理时启动

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

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

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

回答

0

终于我找到了适合我的解决方案。 ;)然而,这是一种不同的方法。

第一:你可能想看看WebViewJavascriptBridge,这是一个双向沟通桥梁,可以实现回调和你可能需要的所有东西。但是,这是与iframes ...我想用阿贾克斯。

我没有实现我的应用程序要听的协议。我现在所做的是实现一个NSURLProtocol,这将通过返回NOcanInitWithRequest。我正在使用一个独特的路径(如/!anythingUnique)来识别我的JS调用。通过设置,我可以调用ajax并在Obj-C代码中执行一些操作。

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

我希望这会有所帮助。

0

如何实现UIApplicationDelegate协议方法:

application:openURL:sourceApplication:annotation: 

和检查sourceApplication

+0

我目前使用这种方法,但我的问题是,我的应用程序无论如何开始。我不希望我的应用程序开始,因为可能的社交黑客和钓鱼。 =) 我试过返回'NO',但应用程序无论如何都启动了。 – Senad 2013-02-22 12:16:21

0

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

建议答:
您可以设置在您的应用程序委托一个布尔变量来存储,如果openURL从您的应用程序或启动了另一个,在如果这个变量设置为NO和交流的rootViewController您的视图控制器检查您的应用程序'window带有空白屏幕或信息屏幕,告诉用户应用程序未从可信来源或其他任何应用程序打开。

建议B:
如果你真的不希望你的应用程序打开,你可以把它application:openURL:sourceApplication:annotation:崩溃。

只要检查sourceApplication是否是一个值得信赖的来源,如果不使用类似NSAssert(YES == NO, @"Bad bad boy")之类的东西来使其崩溃。

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

+0

哦......这听起来太糟糕了:(建议A:我会更进一步,将这些操作绑定到安全令牌上;或者像trojanfoe所暗示的那样执行它。建议B:这听起来像是黑客,我不认为我会这样实施。无论如何感谢您的回答! :) – Senad 2013-02-22 13:28:43

相关问题