具有自定义应用行为的自定义URL方案

时间:2012-10-13 01:24:02

标签: iphone ios5 url-scheme deep-linking appdelegate

我正在制作一个包含多个使用案例的应用。它具有主要功能(通过按app图标激活),然后是主要功能的其他子集,这些子集由自定义URL方案激活。

为了解释我的问题,我应该解释一下我目前如何告诉我的应用程序表现不同。

我一直在使用: - (BOOL)应用中:didFinishLaunchingWithOptions:

从选项中抓取网址: [launchOptions objectForKey:[keyArray objectAtIndex:0]]

现在我解析urlString并获取所有的launchType参数,将它们放在NSUserDefaults中。然后我等待我的启动画面出现,然后它会告诉我的应用程序如何表现。

这一开始似乎没问题,但后来我意识到:如果我深入链接到应用程序,并且呈现功能B,那么应用程序进入后台,下次应用程序占据前景(无论是以哪种方式),它将显示功能B.

我想知道是否有人对标准练习有所了解,人们通常使用哪种方法?

FYI, 我将通过告诉我的navigationcontroller到popToRootViewController来解决这个问题 - (BOOL)应用程序:application handleOpenURL: 被称为,UNLESS didFinishLaunchingWithOptions在它之前调用,在这种情况下,只做我以前实现的。

1 个答案:

答案 0 :(得分:2)

在我看来,对于这种方法,您需要考虑几件事情。

首先来看看UIApplicationDelegate文档。 -application:willFinishLaunchingWithOptions:警告:

  

如果您的应用程序已启动以打开URL,则应检查该值   UIApplicationLaunchOptionsURLKey键并返回一个布尔值   指明您的应用是否可以实际打开该网址。你不应该   尝试在此方法中打开URL。相反,实现   应用程序:openURL:sourceApplication:annotation:应用程序中的方法   委托并使用该方法打开URL。

我们看到-application:openURL:sourceApplication:annotation:

  

如果您的应用必须启动才能打开网址,应用就会调用   应用程序:willFinishLaunchingWithOptions:和   application:didFinishLaunchingWithOptions:方法首先,然后是   这种方法。这些方法的返回值可用于防止   这种方法被称为。 (如果应用程序已在运行,   只调用此方法。

其次,听起来你正在使用NSUserDefaults持久存储应该是一个临时状态(如果应用程序是通过网址启动的话)。你有没有重置你在那里设置的值,或者通过网址启动应用程序,一旦留下它始终遵循该路径。

最后,用户可以合理地期望应用会从中断的地方恢复。用户将离开您的应用以响应电话,短信,通知,外部干扰,其他应用的需求以及任何其他原因。当他们恢复/重新启动应用程序(而不是通过网址)时,拒绝让他们返回他们中断的地方可能会产生糟糕的用户体验。