空空应用程序的网址(通过UIApplicationDelegate的handleOpenURL)下工作iOS4,但不iOS下3.2

StackOverflow https://stackoverflow.com/questions/3612460

我已经实现UIApplicationDelegate的

application:didFinishLaunchingWithOptions:

application:handleOpenURL:

根据说明书,即,

application:didFinishLaunchingWithOptions:
returns YES 

application:handleOpenURL: opens the URL. 

代码的工作iOS下4(在这两种情况,即,当应用程序启动时就变成活动暂停状态)。然而,该代码不下的工作iOS3.2.

有帮助吗?

解决方案

我得到回答我自己的问题。找出解决方案花了我一段时间并且是相当令人沮丧。如果你这样做的一个网络搜索你发现某些部分的答案,但它仍然花了我一段时间的工作出以下解决方案,我希望它增加了一些澄清。

因此,首先,建议的行为的程序似乎是以下(见 开支持的文件类型 在iOS Ref Lib):

  • 不执行 applicationDidFinishLaunching: (请参阅在注意 UIApplicationDelegate).
  • 实施 application:didFinishLaunchingWithOptions: 和检查的网址,返回是的如果你可以打开它,否则没有,但是不要打开它。
  • 实施 application:handleOpenURL: 和打开的网址,返回是否成功,否则没有。

在iOS4,通过一个网址,以一个程序,结果在下面两个行为:

  • 如果程序启动后 application:didFinishLaunchingWithOptions: 被称为和 application:handleOpenURL: 被称为如果和 application:didFinishLaunchingWithOptions: 返回是的。
  • 如果应用程序越来越活跃于暂停状态然后 application:didFinishLaunchingWithOptions: 不叫,但是 application:handleOpenURL: 被称为。

然而,在iOS3.2看来,如果 application:handleOpenURL: 是从来没有叫!一个暗示的行为是不同的iOS下3.2中可以找到 处理URL请求.还有你找到的 application:handleOpenURL: 被称为如果 application:didFinishLaunchingWithOptions: 没有实现,但是 applicationDidFinishLaunching: 实施。但 application:handleOpenURL: 不是如果 application:didFinishLaunchingWithOptions: 实施。

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

  • 打开URL application:didFinishLaunchingWithOptions:, 但随后没有返回,以防止 application:handleOpenURL: 被称为。
  • 打开URL application:handleOpenURL:, 你是下的4.0和应用程序在暂停状态。

我发现这个方案在另一个职位,但我很困惑,因为它相矛盾的建议iOS Ref Lib文件(即,我们应该返回是在 application:didFinishLaunchingWithOptions:).(在这一点上,我并没有意识到的文件违背了它自我).

我认为,目前的iOS4.0行为将是未来的行为我更喜欢以下方案:

  • 不执行 applicationDidFinishLaunching:.
  • 实施 application:didFinishLaunchingWithOptions: 和检查的网址,返回是的如果你可以打开它,否则没有,但是不要打开它。如果我们在3.2、开放的网址。
  • 实施 application:handleOpenURL: 和打开的网址,返回是否成功,否则没有。

因此,在总结时,我实现的iOS4行,添加下面一行 application:didFinishLaunchingWithOptions:

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

这使代码下的工作3.2.

其他提示

application:handleOpenURL:现在已经过时。

的iOS 4.2的如,可以使用这个用于打开网址:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

文档:

https://developer.apple的.com /库/ IOS /#文档/ UIKit的/参考/ UIApplicationDelegate_Protocol /参考/的reference.html

我开始写的应用程序,它使用的文件管理.理解的概念,我跑的样本应用程序使用我的钥匙/秘密的提及后开发 文档.一旦样品应用程序开始工作,我使用相同的密钥/秘密的价值为我应用程序。

对样本应用程序,执行handleOpenURL(或openURL iOS4.2)得到执行,如预期的那样。对于一些奇怪的原因,它没有的情况下对我的应用程序。我的应用程序进入的背景,以便登录显示屏和认证页上的序。成功后的登录名和认证,我的应用程序从来没有进入前台。这是真正的平台模拟器和设备(iPad)

我想几乎所有列出在互联网上包括这一员额。谢谢。没有成功,虽然。

最后,它 开始 作为我的应用程序时我做了如下:

  • 在模拟器,选择"iOS模拟器-->复的内容和设置",并重置。
  • 在设备中,我已删除的样本应用程序相关的执行和其中转删除缓相关联。

添加以下application:DidFinishLaunchingWithOptions的末尾:

- (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;
}

其中MVC是我的主视图控制器和NC我的导航控制器。

然后,在MainViewController,做这样的事:

- (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];
    ...
}

当然在.H声明handleOpenURL之后。

由于去基督徒投入这一努力。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top