iOS 9 - NSUserActivity 用户信息 属性 显示为空

iOS 9 - NSUserActivity userinfo property showing null

我有一个关于 NSUserActivity 的 userInfo 的快速问题 属性。

NSString *activity = @"com.test.activity";  
NSUserActivity *userActivity = [[NSUserActivity alloc] initWithActivityType:activity];  
userActivity.title = @"Test";  
userActivity.keywords = [NSSet setWithArray:@[@"Test"];  
userActivity.userInfo = @{@"location": location};  

userActivity.eligibleForSearch = YES;    
self.userActivity = userActivity;  
[self.userActivity becomeCurrent];  

我在其中一个视图控制器 viewDidLoad() 中实现了上述片段。当我的项目出现在 Spotlight 搜索中时,它会调用 continueUserActivity 委托方法。

我正在尝试访问 userActivity.userInfo 属性,但它 return 为 null,即使它已在上面设置。

这是 continueUserActivity 片段:

-(BOOL)application:(nonnull UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * __nullable))restorationHandler {

NSString *locationName = [[userActivity.userInfo objectForKey:@"location"] valueForKey: @"name"];

// Do stuff with locationName

return NO;

}

编辑:我将位置对象更改为 return 作为原始类型,但我在委托方法上仍然得到 null。

在 iOS 9 beta 3 中还有其他人遇到这个问题吗?

您好,您能检查一下您的 continueUserActivity 片段吗:

if ([userActivity.activityType isEqualToString:@"com.test.activity"])
{
      NSString *locationName = [[userActivity.userInfo objectForKey:@"location"] valueForKey: @"name"];
}

如果它没有出现,我假设您已将 Core Spotlight 集成到您的应用程序中,并且您完全通过 Core Spotlight 中的这些元素进入了 Spotlight。

希望对您有所帮助。

P.S。目前(Xcode 7 beta 3) 许多开发人员无法通过 NSUserActivity 使搜索 API 工作,包括我。

导致此错误的是 Beta 3 的问题。从 Beta 5 开始一切正常。

我在 iOS 9 beta 5 工作,另一种 userInfoapplication:continueUserActivity:restorationHandler: 中可能为零的方法是,如果您还设置了 NSUserActivity' s webPageURL 属性。如果您设置 webPageURL 属性 并希望 userInfo 不为零,那么您需要在 NSUserActivityrequiredUserInfoKeys 属性。这花了我很长时间才弄清楚,但我很遗憾在文档中遗漏了这一点。

NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:activityType];
activity.title = @"title";
activity.webpageURL = [NSURL URLWithString:webLinkUrlString];
activity.userInfo = @{@"id": webLinkUrlString, @"deep_link": deepLinkUrl};
// set requiredUserInfoKeys if you're also setting webPageURL !!
// otherwise, userInfo will be nil !!
activity.requiredUserInfoKeys = [NSSet setWithArrays:@[@"id", @"deep_link"]];
activity.eligibleForSearch = YES;
activity.eligibleForPublicIndexing = YES;
activity.contentAttributeSet = attributeSet;
activity.keywords = [NSSet setWithArray:keywordsArray];
self.activity = activity;
[self.activity becomeCurrent];

看到这个问题: NSUserActivity handoff not working for custom data

如果您遵循 Apple 的此指南,则 userInfo 不为空:

To update the activity object’s userInfo dictionary efficiently, configure its delegate and set its needsSave property to YES whenever the userInfo needs updating. At appropriate times, Handoff invokes the delegate’s userActivityWillSave: callback, and the delegate can update the activity state.

文档确实说设置 webpageURL 需要同时设置 requiredUserInfoKeys。但是,(a) 在没有 requiredUserInfoKeys 的情况下也能正常工作,只要 'userActivityWillSave' 设置了 userInfo,并且 (b) webURL 是一个 iOS 8 参数,而 requiredUserInfoKeys 是 iOS 9。所以委托方法允许在 iOS 8 / Xcode 6.

中支持切换

我注意到(在模拟器中)您可以设置:

  • 网页URL
  • userInfo 和 requiredUserInfoKeys

但不是两者!如果您同时使用 requiredUserInfoKeys 设置网页 URL 和 userInfo,您的 activity 甚至不会出现在 iOS 的聚光灯下。 我认为这是因为 Apple 假设如果您设置网页 URL,您就支持通用链接,因此不需要任何额外的用户信息。

但是,可以同时设置网页和用户信息,但在您的应用委托中您不会收到用户信息。

我遇到了同样的问题,UserInfo 为 nil(在 iOS 9.2 上)。问题是搜索结果不是我点击的最新 NSUserActivity(没有 UserInfo 的旧版本)。所以我重命名了标题以清楚地识别正确的搜索结果。

也许这对某人也有帮助。

对我来说 iOS 14 通过将 userInfo 中的 NSNumber 值更改为 String 解决了这个问题。我在一个简单的测试项目中复制了它。也许这只发生在 Swift 代码中,我没有检查 Objective-C.