当来自 NSUserActivity 时,我使用了 UIAlertView 来获取 launchOptions 的描述:
NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"alert"
message:[userActivityDictionary description]
delegate:nil
cancelButtonTitle:@"Okay"
otherButtonTitles:nil];
[alertView show];
显然,这本字典带有几个我似乎找不到文档的键:
UIApplicationLaunchOptionsUserActivityIdentifierKey
UIApplicationLaunchOptionsUserActivityKey
UIApplicationLaunchOptionsUserActivityTypeKey // there is documentation for this key
似乎 NSUserActivity 对象在此字典中,但从 Apple 的角度来看,尝试访问此对象(例如,可能循环访问字典键并寻找 NSUserActivity 对象)。
**** 解决方案 ****
编辑:这里有一些关于如何从 launchOptions 访问 NSUserActivity 对象的实现:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (userActivityDictionary) {
[userActivityDictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[NSUserActivity class]]) {
NSLog(@"found NSUserActivity object!");
}
}];
}
}
使用此方法,您无需知道未记录的键 UIApplicationLaunchOptionsUserActivityKey 的值。
如果你对上面的解决方案感到不舒服,另一种方法可能是在你的应用进入该方法时,捕捉 NSUserActivity 对象,
- (BOOL)application:continueUserActivity:restorationHandler:
然后,将此用户活动设置为 AppDelegate 的属性以供以后检索。
注意:在测试 Core Spotlight(iOS 9 功能)时,我能够验证是否在冷应用启动时调用了上述方法。