2015-07-09 14 views
8

Miałem szybkie pytanie dotyczące właściwości userInfo NSUserActivity.iOS 9 - Właściwość userInfo NSUserActivity wyświetlana null

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

Mam powyższy fragment zaimplementowany w jednym z kontrolerów widoku viewDidLoad(). Kiedy mój przedmiot pojawia się w ramach wyszukiwania spotlight, wywołuje metodę delegowania continueUserActivity.

Próbuję uzyskać dostęp do właściwości userActivity.userInfo, ale zwracana jest wartość null, mimo że została ustawiona powyżej.

Oto urywek 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; 

}

EDIT: Zmieniłem położenie obiektu, aby powrócić jako prymitywne typu, ale nadal jestem coraz zerowy na metodzie delegata.

Czy ktoś inny ma ten problem w iOS 9 beta 3?

Odpowiedz

9

pracuję w iOS 9 beta 5, i kolejny sposób, który może być nil userInfo w application:continueUserActivity:restorationHandler: jest jeśli masz również ustawić NSUserActivity „s webPageURL nieruchomości. Jeśli ustawisz właściwość webPageURL i chcesz, aby userInfo nie było zerowe, musisz podać odpowiednie klucze w usłudze NSUserActivity o wartości. Zajęło mi to na zawsze, aby dowiedzieć się, ale wstyd mi, że brakuje mi tego w dokumentach.

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]; 
+1

Zrobiłem prawie dokładnie to i nie wydaje się, że działa dla mnie w Xcode 7 beta 6, ani na symulatorze, ani na urządzeniu. Słownik userInfo jest zawsze pusty. To działa dla ciebie? – bdmontz

2

Hi można sprawdzić w swoim continueUserActivity fragmencie:

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

Jeśli nie tam Zakładam, że masz Rdzeń Reflektor wbudowany w aplikacji, a otrzymasz w Spotlight dokładnie tych elementów z jądra Spotlight .

Mam nadzieję, że było pomocne.

P.S. W tej chwili (Xcode 7 beta 3) wielu programistów nie może uzyskać interfejsu API wyszukiwania przez NSUserActivity do pracy, w tym mnie.

0

To był problem z wersją beta 3, która spowodowała ten błąd. Wszystko działa dobrze, jak beta 5.

0

Zobacz na to pytanie: NSUserActivity handoff not working for custom data

userinfo jest niezerowe, jeśli obserwować tą wytyczną od Apple:

Aby skutecznie aktualizować słownik userinfo obiektu Aktywność, skonfiguruj jego delegata i ustawić jego potrzebyZapisz właściwość TAK, gdy potrzebna jest aktualizacja userInfo. Odpowiednio, Handoff wywołuje callo użytkownika userActivityWillSave: delegowanie, a delegat może zaktualizować stan aktywności.

Dokument mówi, że ustawienie strony internetowejURL wymaga również ustawienia requireUserInfoKeys. Jednak (a) przełączanie działa dobrze bez requiredUserInfoKeys, pod warunkiem, że zestaw userActivityWillSave userInfo i (b) webURL jest parametrem iOS 8, podczas gdy requiredUserInfoKeys to iOS 9. Tak więc metoda delegatów pozwala na przekazywanie połączenia w systemie iOS 8/Xcode 6.

0

zauważyłem (w symulatorze), które można ustawić albo:

  • strony internetowej URL
  • userinfo i requiredUserInfoKeys

ale nie jednocześnie! Jeśli ustawisz zarówno pagepURURL, jak i userInfo z requiredUserInfoKeys, twoja aktywność nie pojawi się nawet w centrum uwagi na iOS. Sądzę, że dzieje się tak dlatego, że Apple zakłada, że ​​ustawia adres URL strony, która obsługuje łącza uniwersalne, i dlatego nie potrzebuje żadnych dodatkowych informacji o użytkowniku.

Jest jednak OK, aby ustawić zarówno stronę internetową, jak i po prostu userInfo, ale w delegacie aplikacji nie otrzymasz informacji UserInfo.

0

Miałem ten sam problem, że UserInfo było zerowe (na iOS 9.2). Problem polegał na tym, że wynik wyszukiwania nie był najnowszą wartością NSUserActivity, którą wybrałem (starszą bez UserInfo). Zmieniłem nazwę tytułu, aby jasno zidentyfikować poprawny wynik wyszukiwania.

Może to też pomaga komuś.

Powiązane problemy