2014-08-28 66 views
1

我有一个应用程序将从其他应用程序,这是我的也启动。但我的目的是启动我的应用程序,并不对URL做任何事情。它只是一种让用户在不需要任何数据交换的情况下在应用之间切换的方式。自定义URL计划IOS

我需要实现handleOpenURL或类似的方法来处理URL过滤掉不需要的命令,如苹果Secure Coding guidelines提到,或者只是指定在info.plist中的方案(用URL标识和查看文档的角色一起)考虑到我没有对网址做任何事情的事实足够安全吗?

+1

如果你的应用程序什么都不做,没有什么可以破解的。但我建议你实现'openURL:'进一步扩展和代码透明。 – kelin 2014-08-28 13:38:55

+0

@kelin感谢您的评论。那么,你是在暗示我实现了'openURL:'然后在这个方法中什么也不做? – 2014-08-28 13:44:50

+1

只是返回NO,它会没事的。 – kelin 2014-08-28 14:04:33

回答

5

是的,您需要执行application:handleOpenURL: application:openURL:sourceApplication:annotation:,并返回YES。根据Apple的文档,第二种方法是优选的。

-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 
    return YES; 
} 

您可以另外检查方案,源应用程序或其他条件,并相应地返回YES或NO。如果您有多个应用程序进行通信,则可以检查源应用程序或使用注释传递数据。

NSString* myappScheme = @"anindya"; // or even better read it from your plist 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ 
    return [url.scheme isEqualToString: myappScheme]; 
} 

就安全性而言,您对网址没有做任何其他操作,所以没有任何问题。苹果在这方面的建议意味着如果你从另一个应用程序获得一个URL,你必须仔细解析它,并认为它可能是恶意的。如果您还检查了源应用程序,那么您只能从自己的应用程序获取数据。

+1

谢谢你的答案。一个问题:如果该方案是错误的,那么我认为该应用程序不会首先启动。所以如果我的方案是anindya并且某些应用程序试图以anindya123启动,我的应用程序将无法启动。那么我们为什么要做这个检查,你能解释一下吗? – 2014-08-28 14:43:21

+1

当我们在这里返回NO时,URL不会被执行。即该方法“要求代理人打开由URL标识的资源。”因此,“如果您不回答YES,您的应用程序将无法打开” - 似乎不正确。 – 2014-08-28 16:05:57

+1

检查URL方案是没有必要的,你是对的。操作系统只会调用其“info.plist”中支持URL方案的应用程序。您也可以在不做任何检查的情况下返回YES。 – orkoden 2014-08-29 09:17:44