使用URL(通过UIApplicationDelegate的handleOpenURL)在iOS 4下工作但不在iOS 3.2下工作

Chr*_*ies 11 iphone ipad iphone-sdk-3.2 ios

我已经实现了UIApplicationDelegate

application:didFinishLaunchingWithOptions:
Run Code Online (Sandbox Code Playgroud)

application:handleOpenURL:
Run Code Online (Sandbox Code Playgroud)

根据规范,即

application:didFinishLaunchingWithOptions:
returns YES 
Run Code Online (Sandbox Code Playgroud)

application:handleOpenURL: opens the URL. 
Run Code Online (Sandbox Code Playgroud)

该代码在iOS 4下运行(在两种情况下,即,当应用程序启动时以及从暂停状态变为活动状态时).但是,代码在iOS 3.2下不起作用.

Chr*_*ies 33

我回答了自己的问题.找出解决方案花了我一段时间,非常令人沮丧.如果你进行互联网搜索,你会找到一些部分答案,但是我还需要一段时间才能找到以下解决方案,我希望它能增加一些清晰度.

首先,您的应用程序的推荐行为似乎如下(请参阅在iOS Ref Lib中打开支持的文件类型):

  • 不要实现applicationDidFinishLaunching:(参见UIApplicationDelegate的注释).
  • 实现application:didFinishLaunchingWithOptions:并检查URL,如果可以打开则返回YES,否则返回NO,但不要打开它.
  • 实现application:handleOpenURL:并打开URL,如果成功则返回YES,否则返回NO.

在iOS 4中,将URL传递给应用程序会导致以下两种行为之一:

  • 如果应用程序已启动,则application:didFinishLaunchingWithOptions:调用并application:handleOpenURL:调用if并application:didFinishLaunchingWithOptions:返回YES.
  • 如果应用程序从挂起状态变为活动状态,则application:didFinishLaunchingWithOptions:不会被调用但会application:handleOpenURL:被调用.

但是,在iOS 3.2中,它似乎application:handleOpenURL:从未被调用过!可以在处理URL请求中找到iOS 3.2下行为不同的提示.在那里你会发现,application:handleOpenURL:如果application:didFinishLaunchingWithOptions:没有实现,则被调用,但是applicationDidFinishLaunching:已经实现.但application:handleOpenURL:如果application:didFinishLaunchingWithOptions:实施则不会被调用.

因此,使代码在3.2和4.0下工作的一个解决方案是:

  • 打开URL application:didFinishLaunchingWithOptions:,但然后返回NO以防止application:handleOpenURL:被调用.
  • application:handleOpenURL:如果您的版本低于4.0且应用程序处于挂起状态,请打开URL .

我在另一篇文章中找到了这个解决方案,但我很困惑,因为它与iOS Ref Lib文档中的建议相矛盾(即我们应该返回YES application:didFinishLaunchingWithOptions:).(那时我没有意识到文件与它自相矛盾).

我相信当前的iOS 4.0行为将是未来的行为我更喜欢以下解决方案:

  • 不执行applicationDidFinishLaunching:.
  • 实现application:didFinishLaunchingWithOptions:并检查URL,如果可以打开则返回YES,否则返回NO,但不要打开它.如果我们在3.2上,请打开URL.
  • 实现application:handleOpenURL:并打开URL,如果成功则返回YES,否则返回NO.

总而言之,我实现了iOS 4的行为并添加了以下行 application:didFinishLaunchingWithOptions:

    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
        [self application:application handleOpenURL:url];
    }

__PRE__
applicationDidFinishLaunching:

这使代码在3.2下工作.


pow*_*old 7

application:handleOpenURL: 现已弃用.

从iOS 4.2开始,您可以使用它来打开URL:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
Run Code Online (Sandbox Code Playgroud)

文档:

https://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html