空空应用程序的网址(通过UIApplicationDelegate的handleOpenURL)下工作iOS4,但不iOS下3.2
-
26-09-2019 - |
题
我已经实现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
文档:
我开始写的应用程序,它使用的文件管理.理解的概念,我跑的样本应用程序使用我的钥匙/秘密的提及后开发 文档.一旦样品应用程序开始工作,我使用相同的密钥/秘密的价值为我应用程序。
对样本应用程序,执行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之后。
由于去基督徒投入这一努力。