NSUserActivity越区切换不适用于自定义数据

我试图用我的iPhone和iPad之间的NSUserActivity来testingiOS 8.1的越区切换function。 为此,我试图实现我自己的解决scheme,并使用苹果的PhotoHandoff项目。 但是,它不工作。

如果我提供了一个webpageURL ,切换工作正常,但是当我尝试使用userDataaddUserInfoEntriesFromDictionary没有任何效果,而且我不能为了生活而弄清楚数据是如何工作的。

示例代码:

 NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"com.company.MyTestApp.activity"]; activity.title = @"My Activity"; activity.userInfo = @ {}; // activity.webpageURL = [NSURL URLWithString:@"http://google.com"]; self.userActivity = activity; [self.userActivity becomeCurrent]; [self.userActivity addUserInfoEntriesFromDictionary:@ { @"nanananan": @[ @"totoro", @"monsters" ] }]; 

(我也无法使它与具有相应活动types的Mac应用程序一起工作)

我希望你已经find了解决scheme,但如果有人也在这个问题上绊倒,这里是一个解决scheme。 (其实和以前的回答没有什么不同)

创build没有userInfo的用户活动,它将被忽略:

 NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"..."]; activity.title = @"Test activity"; activity.delegate = self; activity.needsSave = YES; self.userActivity = activity; [self.userActivity becomeCurrent]; 

实现委托来响应needSave事件:

 - (void)userActivityWillSave:(NSUserActivity *)userActivity { userActivity.userInfo = @{ @"KEY" : @"VALUE" }; } 

当needsSave设置为YES时,将调用此方法,并更新userActivity。

希望这可以帮助。

要更新活动对象的userInfo字典,只要userInfo需要更新,就需要configuration其委托并将其needsSave属性设置为YES。

此过程在“采用切换指南”的“ 最佳做法”部分进行了描述。

例如,使用简单的UITextView,您需要在NSUserActivityTypes数组的Info.plist属性列表文件中指定活动types(“com.company.app.edit”)标识符,然后:

 - (NSUserActivity *)customUserActivity { if (!_customUserActivity) { _customUserActivity = [[NSUserActivity alloc] initWithActivityType:@"com.company.app.edit"]; _customUserActivity.title = @"Editing in app"; _customUserActivity.delegate = self; } return _customUserActivity; } - (void)textViewDidBeginEditing:(UITextView *)textView { [self.customUserActivity becomeCurrent]; } - (void)textViewDidChange:(UITextView *)textView { self.customUserActivity.needsSave = YES; } - (BOOL)textViewShouldEndEditing:(UITextView *)textView { [self.customUserActivity invalidate]; return YES; } - (void)userActivityWillSave:(NSUserActivity *)userActivity { [userActivity addUserInfoEntriesFromDictionary:@{ @"editText" : self.textView.text }]; } 

FWIW,我有这个问题。 我很幸运,我的一个活动types工作,其他没有:

 Activity: Walking (UserInfo x1,y1) (UserInfo x2,y2) (UserInfo x3,y3) Activity: Standing (UserInfo x4,y4) Activity: Walking etc. 

如果切换发生在站立但不行走,我得到了userInfo。 在所有情况下,我都获得了其他属性,例如webpageURL。 只是userInfo来通过null。

对我来说,解决方法是每次都无效化和重新创buildNSUserActivity对象(例如,当从x1 / y1步行到x2 / y2时),而不是仅当活动types改变时(例如从走到站)。 这不是文档的写法,但解决了iOS 9上的问题。

更新:这种解决方法不适用于iOS 8.您需要通过userActivityWillSave委托来执行此操作,如gregoryM指定的。 每个苹果的文档:

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

这不是一个“最佳实践”,它是必需的!

[注意:运行在Xcode 6.x上的代码的iOS 9设备上发生了问题。 还没有testingXcode 7,并且在iOS 8上可能不会发生问题。]