【问题标题】:iOS 9 - NSUserActivity userinfo property showing nulliOS 9 - NSUserActivity 用户信息属性显示为空
【发布时间】:2015-07-09 20:54:40
【问题描述】:

我有一个关于 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() 中实现了上述 sn-p。当我的项目出现在聚光灯搜索中时,它会调用 continueUserActivity 委托方法。

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

这是 continueUserActivity sn-p:

-(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;

}

编辑:我将位置对象更改为作为原始类型返回,但委托方法仍然为 null。

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

【问题讨论】:

    标签: ios objective-c ios9


    【解决方案1】:

    我正在使用 iOS 9 beta 5,如果您还设置了 NSUserActivitywebPageURL 属性,userInfoapplication:continueUserActivity:restorationHandler: 中可能为零。如果您设置了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];
    

    【讨论】:

    • 我正在做几乎完全一样的事情,它似乎不适用于 Xcode 7 beta 6,无论是在模拟器还是设备上。 userInfo 字典始终为空。这对你有用吗?
    【解决方案2】:

    您好,您能否检查一下您的 continueUserActivity sn-p:

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

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

    希望对您有所帮助。

    附:目前(Xcode 7 beta 3)很多开发者都无法通过 NSUserActivity 让 Search API 工作,包括我在内。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我也遇到过这个问题。 NSURL 也不保存,改成 String 后保存了。
      【解决方案4】:

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

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

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

      文档确实说设置webpageURL 要求还设置requiredUserInfoKeys。然而 (a) 没有 requiredUserInfoKeys 的切换工作正常,只要 'userActivityWillSave' 设置 userInfo,并且 (b) webURL 是 iOS 8 参数,而 requiredUserInfoKeys 是 iOS 9。所以委托方法允许在 iOS 8 中支持切换/ Xcode 6.

      【讨论】:

        【解决方案5】:

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

        • 网页网址
        • userInfo 和 requiredUserInfoKeys

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

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

        【讨论】:

          【解决方案6】:

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

          也许这对某人也有帮助。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-09-13
              • 2017-04-21
              • 1970-01-01
              • 1970-01-01
              • 2014-05-25
              • 2012-01-12
              • 1970-01-01
              相关资源
              最近更新 更多