【问题标题】:Custom URL Scheme IOS自定义 URL 方案 IOS
【发布时间】:2014-10-22 09:00:08
【问题描述】:

我有一个应用程序,它将从我的其他应用程序启动。但我的目的是启动我的应用程序并且对 URL 不做任何事情。它只是一种使用户无需任何数据交换即可在应用程序之间切换的方式。

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

【问题讨论】:

  • 如果你的应用什么都不做,就没有什么可破解的。但我建议您实现openURL: 以进一步扩展和代码透明。
  • @kelin 感谢您的评论。那么,您是否建议我实现openURL: 然后在方法内部什么也不做?
  • 直接回NO就好了。
  • @kelin 感谢您的意见。

标签: ios objective-c cocoa url-scheme info.plist


【解决方案1】:

是的,你需要实现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 做任何其他事情,所以没有问题。 Apple 在这方面的建议意味着,如果您从另一个应用程序获取 URL,您必须仔细解析它并假设它可能是恶意的。如果您还检查源应用程序,则可以确保只从您自己的应用程序中获取数据。

【讨论】:

  • 非常感谢您的回答。一个问题:如果方案是错误的,那么我认为应用程序不会首先启动。因此,如果我的方案是 anindya 并且某些应用程序尝试以 anindya123 启动,我的应用程序将不会启动。那么我们为什么要进行检查,请您解释一下吗?
  • 当我们在这里返回 NO 时,URL 不会被执行。即此方法“要求委托打开由 URL 标识的资源。”因此,“如果您不返回 YES,您的应用将无法打开”——似乎不正确。
  • 没有必要检查 URL 方案,你是对的。操作系统只会调用在其info.plist 中记录对 URL 方案支持的应用程序。您也可以直接返回 YES 而无需进行任何检查。
  • 谢谢@orkoden。如果您更新答案,我可以将其标记为“答案”。因为,return [url.scheme isEqualToString: myappScheme]; 似乎毫无意义,正如你稍后所说,我们可以在这里返回 YES(或 NO),因为这里没有对 URL 进行任何操作。