iOS 9 - свойство userinfo NSUserActivity показывает значение 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, но оно возвращает значение 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;

}

РЕДАКТИРОВАТЬ: я изменил объект местоположения, чтобы он возвращался как примитивный тип, но я все еще получаю значение null в методе делегата.

У кого-нибудь еще есть эта проблема в iOS 9 beta 3?


person Jason Ngo    schedule 09.07.2015    source источник


Ответы (7)


Я работаю в iOS 9 beta 5, и еще один способ, которым userInfo может быть нулевым в application:continueUserActivity:restorationHandler:, заключается в том, что вы также установили свойство NSUserActivity webPageURL. Если вы установили свойство webPageURL и хотели бы, чтобы userInfo не было равным нулю, вам нужно будет включить соответствующие ключи в свойство requiredUserInfoKeys NSUserActivity. Мне потребовалась целая вечность, чтобы понять это, но мне стыдно за то, что я пропустил это в документах.

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];
person markckim    schedule 28.08.2015
comment
Я делаю почти именно это, и, похоже, это не работает для меня в Xcode 7 beta 6 ни на симуляторе, ни на устройстве. Словарь userInfo всегда пуст. Это работает для вас? - person bdmontz; 31.08.2015

Привет, не могли бы вы проверить свой фрагмент continueUserActivity:

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

Если это не так, я предполагаю, что у вас есть Core Spotlight, интегрированный в ваше приложение, и вы попадаете в Spotlight именно по этим элементам из Core Spotlight.

Надеюсь, это было полезно.

P.S. На данный момент (Xcode 7 beta 3) многие разработчики не могут заставить работать Search API через NSUserActivity, в том числе и я.

person Richard Mazkewich    schedule 15.07.2015

Это была проблема с бета-версией 3, которая вызывала эту ошибку. Все работает нормально с бета 5.

person Jason Ngo    schedule 11.08.2015
comment
Я также столкнулся с этой проблемой. NSURL также не сохраняется и после перехода на String сохраняется. - person holahola; 14.05.2021

См. этот вопрос: передача NSUserActivity не работает для пользовательских данных

userInfo не равно нулю, если вы следуете этому руководству Apple:

Чтобы эффективно обновлять словарь userInfo объекта действия, настройте его делегат и задайте для его свойства needSave значение YES всякий раз, когда требуется обновление userInfo. В соответствующее время Handoff вызывает функцию обратного вызова userActivityWillSave: делегата, и делегат может обновить состояние активности.

В документе говорится, что для настройки URL-адреса веб-страницы требуется, чтобы также были установлены обязательные UserInfoKeys. Однако (а) передача обслуживания отлично работает без requiredUserInfoKeys, если «userActivityWillSave» устанавливает userInfo, и (б) webURL является параметром iOS 8, тогда как requiredUserInfoKeys — iOS 9. Таким образом, метод делегата позволяет поддерживать передачу обслуживания в iOS 8/ Хкод 6.

person Richard    schedule 04.09.2015

Я заметил (в симуляторе), что вы можете установить:

  • URL-адрес веб-страницы
  • userInfo и requiredUserInfoKeys

Но не оба! Если вы установите URL-адрес веб-страницы и информацию о пользователе с помощью requiredUserInfoKeys, ваша активность даже не будет отображаться в центре внимания на iOS. Я думаю, это потому, что Apple предполагает, что если вы установите URL-адрес веб-страницы, вы поддерживаете универсальные ссылки и, следовательно, не нуждаетесь в дополнительной информации о пользователе.

Однако можно установить как веб-страницу, так и только userInfo, но в вашем делегате приложения вы не получите userInfo.

person edwardmp    schedule 10.10.2015

У меня была та же проблема, что UserInfo была нулевой (в iOS 9.2). Проблема заключалась в том, что результат поиска не был последним NSUserActivity, который я использовал (более старый без UserInfo). Поэтому я переименовал заголовок, чтобы четко определить правильный результат поиска.

Может, это тоже кому-то поможет.

person Fabian    schedule 02.03.2016

Для меня в iOS 14 проблема была устранена путем изменения значений NSNumber внутри userInfo на String. Я воспроизвел это в простом тестовом проекте. Возможно, это происходит только в коде Swift, на Objective-C я не проверял.

person kolyuchiy    schedule 23.12.2020