Iphone 使用URL(通过UIApplicationLegate';的HandleOpeUrl)在iOS 4下启动应用程序,但不在iOS 3.2下运行
我已经实现了EMC的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下不起作用。我回答了自己的问题。找到解决办法花了我一段时间,非常令人沮丧。如果你在网上搜索,你会找到一些部分答案,但我还是花了一段时间
application:didFinishLaunchingWithOptions:
及
根据规范,即:
application:didFinishLaunchingWithOptions:
returns YES
及
该代码在iOS 4下工作(在这两种情况下,即当应用程序启动时和从暂停状态变为活动状态时)。但是,该代码在iOS 3.2下不起作用。我回答了自己的问题。找到解决办法花了我一段时间,非常令人沮丧。如果你在网上搜索,你会找到一些部分答案,但我还是花了一段时间才找到下面的解决方案,我真的希望它能增加一些清晰度 因此,首先,推荐的应用程序行为如下(请参见iOS参考库中的内容):
- 请勿实施
(请参阅中的注释)ApplicationIDFinishLaunching:
- 实现
并检查URL,如果可以打开它,则返回YES,否则返回NO,但不要打开它应用程序:使用选项完成启动:
- 实现
并打开URL,如果成功则返回YES,否则返回NO应用程序:handleOpenURL:
- 如果启动应用程序,则调用
,如果且应用程序:didFinishLaunchingWithOptions:
返回YES,则调用应用程序:DidFinishLaunchWithOptions:
应用程序:HandleOnUrl:
- 如果应用程序从挂起状态变为活动状态,则不会调用
,但会调用application:didfishlaunchwithoptions:
application:handleOpenURL:
application:handleopeanurl:
!可以在中找到iOS 3.2下行为不同的提示。您会发现,如果未实现application:didfishlaunchingwithoptions:
,但实现了applicationdifinishlaunching:
,则调用application:handleOpenURL:
。但是,如果实现了application:didfishlaunchingwithoptions:
,则不会调用application:handleopeanurl:
因此,使代码在3.2和4.0下工作的一个解决方案是:
- 在
中打开URL,然后返回NO以防止调用应用程序:didFinishLaunchingWithOptions:
应用程序:handleAppUrl:
- 在
中打开URL,以防您处于4.0以下且应用程序处于挂起状态应用程序:handleOpenURL:
应用程序:didfishlaunchingwithoptions:
中返回YES)。(在那一点上,我没有意识到文档与之相矛盾)
我相信当前的iOS 4.0行为将是未来的行为我更喜欢以下解决方案:
- 不要实现
ApplicationIDFinishLaunching:
- 实现
并检查URL,如果可以打开它,则返回YES,否则返回NO,但不要打开它。如果我们使用的是3.2,请打开URL应用程序:使用选项完成启动:
- 实现
并打开URL,如果成功则返回YES,否则返回NO应用程序:handleOpenURL:
应用程序中添加了以下行: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];
...
}