ios 在启动选项中切换缺少 NSUserActivity?
ios Handoff missing NSUserActivity in launchOptions?
我已经在我们的应用程序中实现了切换,当应用程序 运行 在前台或后台时,它可以很好地用于网络到应用程序的切换,反之亦然。
但是,如果应用不是 运行,那么如果用户启动应用从 Web 到应用的切换,在 launchOptions 字典中,我得到 UIApplicationLaunchOptionsUserActivityDictionaryKey
,但对activity 缺失。
见截图:
如您所见,我只获得了 NSUserActivity
的 ID。
这是 iOS 9 中的错误吗?
有没有办法通过使用 id 获取对 activity 的引用?
编辑,这是代码,虽然我认为这不相关
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions && [[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsUserActivityDictionaryKey]) {
__block NSUserActivity *activity;
NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (userActivityDictionary) {
[userActivityDictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[NSUserActivity class]]) {
activity = obj;
}
}];
}
//app was started by URL (deep linking), check parameters
if (activity) {
NSURL *url = activity.webpageURL;
//resume from URL
}
}
return YES;
}
好的,
我已经向 Apple 提交了关于此的 TSI,看来这不是错误,而是设计使然。
您可以在 application:continueUserActivity:restorationHandler
委托中恢复您的 activity,在我的例子中,委托没有被调用。
好吧,我的错误是您需要在 application:didFinishLaunchingWithOptions:
方法中 return YES,否则如果您 return NO,则不会调用 application:continueUserActivity:restorationHandler
。
我们已经在我们的应用程序中实现了 FB,所以我们 returning [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]
将 return 否。
我已将 application:didFinishLaunchingWithOptions:
函数中的代码更改为此
if (launchOptions && [[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsUserActivityDictionaryKey]) {
return YES;
}
else {
return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
}
这样 application:continueUserActivity:restorationHandler
委托被成功调用并且 activity 可以成功恢复。
我已经在我们的应用程序中实现了切换,当应用程序 运行 在前台或后台时,它可以很好地用于网络到应用程序的切换,反之亦然。
但是,如果应用不是 运行,那么如果用户启动应用从 Web 到应用的切换,在 launchOptions 字典中,我得到 UIApplicationLaunchOptionsUserActivityDictionaryKey
,但对activity 缺失。
见截图:
如您所见,我只获得了 NSUserActivity
的 ID。
这是 iOS 9 中的错误吗?
有没有办法通过使用 id 获取对 activity 的引用?
编辑,这是代码,虽然我认为这不相关
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions && [[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsUserActivityDictionaryKey]) {
__block NSUserActivity *activity;
NSDictionary *userActivityDictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsUserActivityDictionaryKey];
if (userActivityDictionary) {
[userActivityDictionary enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[NSUserActivity class]]) {
activity = obj;
}
}];
}
//app was started by URL (deep linking), check parameters
if (activity) {
NSURL *url = activity.webpageURL;
//resume from URL
}
}
return YES;
}
好的,
我已经向 Apple 提交了关于此的 TSI,看来这不是错误,而是设计使然。
您可以在 application:continueUserActivity:restorationHandler
委托中恢复您的 activity,在我的例子中,委托没有被调用。
好吧,我的错误是您需要在 application:didFinishLaunchingWithOptions:
方法中 return YES,否则如果您 return NO,则不会调用 application:continueUserActivity:restorationHandler
。
我们已经在我们的应用程序中实现了 FB,所以我们 returning [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]
将 return 否。
我已将 application:didFinishLaunchingWithOptions:
函数中的代码更改为此
if (launchOptions && [[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsUserActivityDictionaryKey]) {
return YES;
}
else {
return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];
}
这样 application:continueUserActivity:restorationHandler
委托被成功调用并且 activity 可以成功恢复。