Iphone 使用URL(通过UIApplicationLegate';的HandleOpeUrl)在iOS 4下启动应用程序,但不在iOS 3.2下运行

Iphone 使用URL(通过UIApplicationLegate';的HandleOpeUrl)在iOS 4下启动应用程序,但不在iOS 3.2下运行,iphone,ipad,ios,iphone-sdk-3.2,Iphone,Ipad,Ios,Iphone Sdk 3.2,我已经实现了EMC的 application:didFinishLaunchingWithOptions: 及 根据规范,即: application:didFinishLaunchingWithOptions: returns YES 及 该代码在iOS 4下工作(在这两种情况下,即当应用程序启动时和从暂停状态变为活动状态时)。但是,该代码在iOS 3.2下不起作用。我回答了自己的问题。找到解决办法花了我一段时间,非常令人沮丧。如果你在网上搜索,你会找到一些部分答案,但我还是花了一段时间

我已经实现了EMC的

application:didFinishLaunchingWithOptions:

根据规范,即:

application:didFinishLaunchingWithOptions:
returns YES 


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

我回答了自己的问题。找到解决办法花了我一段时间,非常令人沮丧。如果你在网上搜索,你会找到一些部分答案,但我还是花了一段时间才找到下面的解决方案,我真的希望它能增加一些清晰度

因此,首先,推荐的应用程序行为如下(请参见iOS参考库中的内容):

  • 请勿实施
    ApplicationIDFinishLaunching:
    (请参阅中的注释)
  • 实现
    应用程序:使用选项完成启动:
    并检查URL,如果可以打开它,则返回YES,否则返回NO,但不要打开它
  • 实现
    应用程序:handleOpenURL:
    并打开URL,如果成功则返回YES,否则返回NO
在iOS 4中,向应用程序传递URL会导致以下两种行为之一:

  • 如果启动应用程序,则调用
    应用程序:didFinishLaunchingWithOptions:
    ,如果且
    应用程序:DidFinishLaunchWithOptions:
    返回YES,则调用
    应用程序:HandleOnUrl:
  • 如果应用程序从挂起状态变为活动状态,则不会调用
    application:didfishlaunchwithoptions:
    ,但会调用
    application:handleOpenURL:
然而,在iOS 3.2中,似乎从未调用过
application:handleopeanurl:
!可以在中找到iOS 3.2下行为不同的提示。您会发现,如果未实现
application:didfishlaunchingwithoptions:
,但实现了
applicationdifinishlaunching:
,则调用
application:handleOpenURL:
。但是,如果实现了
application:didfishlaunchingwithoptions:
,则不会调用
application:handleopeanurl:

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

  • 应用程序:didFinishLaunchingWithOptions:
    中打开URL,然后返回NO以防止调用
    应用程序:handleAppUrl:
  • 应用程序:handleOpenURL:
    中打开URL,以防您处于4.0以下且应用程序处于挂起状态
我在另一篇文章中发现了这个解决方案,但我感到困惑,因为它与iOS Ref Lib文档中的建议相矛盾(即我们应该在
应用程序:didfishlaunchingwithoptions:
中返回YES)。(在那一点上,我没有意识到文档与之相矛盾)

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

  • 不要实现
    ApplicationIDFinishLaunching:
  • 实现
    应用程序:使用选项完成启动:
    并检查URL,如果可以打开它,则返回YES,否则返回NO,但不要打开它。如果我们使用的是3.2,请打开URL
  • 实现
    应用程序:handleOpenURL:
    并打开URL,如果成功则返回YES,否则返回NO
总之,我实现了iOS4行为,并在
应用程序中添加了以下行:didFinishLaunchingWithOptions:


如果([[[UIDevice currentDevice]systemVersion]hasPrefix:@“3.2”]){
[自应用程序:应用程序句柄url:url];
}


使代码在3.2下工作。

我开始编写使用Dropbox api的应用程序。为了理解这个概念,我使用dropbox/developer中提到的密钥/秘密运行了一个示例应用程序。 一旦示例应用程序开始工作,我就为我的应用程序使用相同的密钥/秘密值

对于示例应用程序,handleOpenURL(或iOS 4.2上的openURL)的实现按预期执行。出于某种奇怪的原因,我的应用程序并非如此。我的应用程序进入后台以显示dropbox的登录屏幕和身份验证页面。成功登录和身份验证后,我的应用程序从未进入前台。平台模拟器和设备(iPad)都是如此

我尝试了互联网上列出的几乎所有东西,包括这篇文章。谢谢但是没有成功

最后,当我执行以下操作时,它开始为我的应用程序工作:

  • 在模拟器上,选择“iOS模拟器-->重置内容和设置”,然后重置
  • 在设备上,我删除了与示例应用程序相关的可执行文件,而该可执行文件又删除了与其关联的缓存

应用程序:handleOpenURL:
现在已不推荐使用

从iOS 4.2开始,您可以使用此选项打开URL:

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


将以下内容添加到
应用程序的末尾:DidFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
其中mvc是我的主视图控制器,nc是我的导航控制器

然后在MainViewController中,执行以下操作:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (url != nil && [url isFileURL]) {
        return YES;
    }  else return NO;
} // End of application:didFinishLaunchingWithOptions:

// New method starts 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    mvc = [nc.viewControllers objectAtIndex:0];
    if (url != nil && [url isFileURL]) {
        [mvc handleOpenURL:url];
    }
    return YES;
}
当然,在.h中声明handleOpenURL之后


感谢Christian为此付出的努力

3.2中的问题是什么?错误消息?它中断的代码行?如果代理回答消息didFinishLaunchingWithOptions,则该代理似乎根本没有收到消息HandleOnUrl,即使该方法返回YES。API文档向我建议了一种不同的行为。谢谢,我遇到了同样的问题,这个答案为我节省了很多时间。直到我意识到我的项目是用3.2的基本SDK编译的,但运行在4.0模拟器上,我仍然无法实现这一点。结果如何?激活时,不会调用上述任何方法。一旦我将基本SDK切换到4.0,一切都正常了。不知道如何让它在3.2 ipad tho中工作。很好。也:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (url != nil && [url isFileURL]) {
        return YES;
    }  else return NO;
} // End of application:didFinishLaunchingWithOptions:

// New method starts 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    mvc = [nc.viewControllers objectAtIndex:0];
    if (url != nil && [url isFileURL]) {
        [mvc handleOpenURL:url];
    }
    return YES;
}
- (void)handleOpenURL:(NSURL *)url {
    [self.navigationController popToRootViewControllerAnimated:YES];

    // Next bit not relevant just left in as part of the example
    NSData *jsonData = [NSData dataWithContentsOfURL:url];        
    NSError *error;
    NSDictionary *dictionary = [[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error] objectAtIndex:0];
    [self managedObjectFromStructure:dictionary withManagedObjectContext:self.context];
    ...
}