iOS 9 – 显示null的NSUserActivity userinfo属性

我有一个关于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()实现上面的代码片段。 当我的项目出现在Spotlightsearch中时,它会调用continueUserActivity委托方法。

我试图访问userActivity.userInfo属性,但它返回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; 

}

编辑:我改变了位置对象作为原始types返回,但我仍然在委托方法上为null。

是否有其他人在iOS 9testing版3有这个问题?

我正在使用iOS 9 beta 5,另一种方式是userInfo可能在application:continueUserActivity:restorationHandler:为零application:continueUserActivity:restorationHandler:如果您还设置了NSUserActivitywebPageURL属性。 如果你设置了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]; 

你好,你可以检查你的continueUserActivity片段:

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

如果它不去那里,我假设你已经在你的应用程序中集成了Core Spotlight,并且你完全通过Core Spotlight中的这些元素进入Spotlight。

希望这是有帮助的。

PS目前( Xcode 7 beta 3 )许多开发人员无法通过NSUserActivity获得searchAPI,包括我在内。

这是beta 3引起这个错误的问题。 从testing版5开始,一切正常。

看到这个问题: NSUserActivity越区切换不适用于自定义数据

如果您遵循Apple的这个指导原则,userInfo是非空的:

要有效地更新活动对象的userInfo字典,请configuration其委托,并在userInfo需要更新时将其needsSave属性设置为YES。 在适当的时候,Handoff调用委托的userActivityWillSave:callback,委托可以更新活动状态。

该文件确实说,设置webpageURL需要requiredUserInfoKeys也被设置。 然而,(a)handoff工作正常,不需要用户密钥,只要'userActivityWillSave'设置userInfo,和(b)webURL是一个iOS 8的参数,而requiredUserInfoKeys是iOS 9.所以委托方法允许在iOS 8 / Xcode 6。

我注意到(在模拟器),你可以设置:

  • 网页url
  • userInfo和requiredUserInfoKeys

但不是两个! 如果您将webpageURL和userInfo都设置为requiredUserInfoKeys,那么您的活动甚至不会在iOS上成为焦点。 我认为这是因为苹果公司假设你设置的网页url,你支持通用链接,因此不需要任何额外的用户信息。

但是,可以同时设置网页和userInfo,但在您的应用程序委托中,您将不会收到userInfo。

我有同样的问题,UserInfo是零(在iOS 9.2)。 问题是search结果不是最新的NSUserActivity(我没有UserInfo)。 所以我重新命名了标题以清楚地标识正确的search结果。

也许这对别人也有帮助