2015-07-09 9 views
8

Ich hatte eine kurze Frage über NSUserActivity UserInfo Eigenschaft.iOS 9 - NSUserActivity Benutzerinfo-Eigenschaft zeigt 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]; 

Ich habe das obige Snippet in einem der View-Controller ViewDidLoad() implementiert. Wenn mein Element in der Spotlight-Suche angezeigt wird, ruft es die continueUserActivity-Delegate-Methode auf.

Ich versuche, auf die userActivity.userInfo -Eigenschaft zugreifen, aber es gibt null zurück, obwohl es oben festgelegt wurde.

Hier ist der continueUserActivity Schnipsel:

-(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: Ich habe die Lage Objekt geändert als Urtyp zurückzukehren, aber ich bin immer noch null auf der Delegatmethode bekommen.

Hat jemand anderes dieses Problem in iOS 9 Beta 3?

Antwort

9

Ich arbeite in iOS 9 Beta 5, und eine andere Art und Weise, dass userInfo nil im application:continueUserActivity:restorationHandler: sein kann, ist, wenn Sie auch NSUserActivity gesetzt haben ‚s webPageURL Eigenschaft. Wenn Sie die Eigenschaft webPageURL festlegen und möchten, dass userInfo nicht null ist, müssen Sie die entsprechenden Schlüssel in NSUserActivitys requiredUserInfoKeys Eigenschaft einfügen. Das hat mich für immer gekümmert, aber es ist mir eine Schande, dass ich das in der Dokumentation verpasst habe.

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

Ich mache fast genau das, und es scheint nicht für mich in Xcode 7 Beta 6, entweder auf dem Simulator oder einem Gerät zu arbeiten. Das userInfo-Wörterbuch ist immer leer. Das funktioniert für dich? – bdmontz

2

Hallo könnten Sie in Ihrem continueUserActivity Schnipsel überprüfen:

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

Wenn es dort nicht gehe ich davon aus, dass Sie in Ihrer App Core-Spotlight integriert haben, und Sie bekommen in Spotlight genau durch diese Elemente von Core-Spotlight .

Ich hoffe, es war hilfreich.

P.S. Im Moment (Xcode 7 beta 3) können viele Entwickler die Such-API über NSUserActivity nicht aufrufen, um zu arbeiten, einschließlich mir.

0

Es war ein Problem mit Beta 3, das diesen Fehler verursachte. Alles funktioniert gut, wie der Beta 5.

0

Sehen Sie diese Frage: NSUserActivity handoff not working for custom data

userinfo ist nicht null, wenn Sie diese Richtlinie von Apple folgen:

der Aktivität Objekts userinfo Wörterbuch effizient zu aktualisieren, deren Beauftragten konfigurieren und festlegen Seine needsSave -Eigenschaft auf YES, wenn die userInfo aktualisiert werden muss. Zu geeigneten Zeiten ruft Handoff den BenutzerActivityWillSave: delegant auf, und der Delegat kann den Aktivitätsstatus aktualisieren.

Das Dokument sagt, dass das Festlegen von webpageURL erfordert, dass requiredUserInfoKeys auch festgelegt werden. Allerdings funktioniert (a) die Handover-Funktion ohne requiredUserInfoKeys, solange 'userActivityWillSave' userInfo setzt und (b) webURL ein iOS 8-Parameter ist, während requiredUserInfoKeys iOS 9 ist. So ermöglicht die Delegate-Methode die Übergabe in iOS 8/Xcode 6.

0

bemerkte ich (im Simulator), dass Sie setzen entweder:

URL
  • Webseite
  • userinfo und requiredUserInfoKeys

Aber nicht beides! Wenn Sie sowohl webpageURL als auch userInfo mit requiredUserInfoKeys festlegen, wird Ihre Aktivität unter iOS nicht angezeigt. Ich denke, das liegt daran, dass Apple davon ausgeht, wenn Sie die Webseiten-URL so einstellen, dass Sie universelle Links unterstützen und somit keine zusätzlichen Benutzerinformationen benötigen.

Es ist jedoch OK, sowohl die Webseite als auch nur userInfo festzulegen, aber in Ihrem Anwendungsdelegaten erhalten Sie die userInfo nicht.

0

Ich hatte das gleiche Problem, dass UserInfo war Nil (auf iOS 9.2). Das Problem war, dass das Suchergebnis nicht die letzte NSUserActivity war, die ich angetippt habe (älteres ohne UserInfo). Also habe ich den Titel umbenannt, um das korrekte Suchergebnis eindeutig zu identifizieren.

Vielleicht hilft das auch jemandem.