我正在尝试使用NSUserActivity在我的iPhone和iPad之间测试iOS 8.1切换功能。为此,我尝试实现自己的解决方案,并使用苹果的PhotoHandoff项目。然而,它并不起作用。
如果我提供一个webpageURL,交接就能正常工作,但当我尝试使用userData或addUserInfoEntriesFromDictionary时,什么都不能用,而且我永远也搞不清楚让数据工作的关键是什么。
示例代码:
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" ] }];(我也无法让它在具有相应活动类型的Mac应用程序上工作)
发布于 2015-04-16 22:40:16
我希望你已经找到了解决方案,但如果有人也遇到了这个问题,这里有一个解决方案。(实际上与之前的答案没有太大区别)
创建不带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。
希望这能有所帮助。
发布于 2014-11-07 08:48:40
要更新activity对象的userInfo字典,您需要配置其委托,并在每次需要更新userInfo时将其needsSave属性设置为YES。
此过程在best practices section of the Adopting Handoff guide中进行了描述。
例如,对于一个简单的UITextView,您需要在NSUserActivityTypes数组的Info.plist属性列表文件中指定活动类型("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 }];
}发布于 2015-08-31 00:12:16
顺便说一句,我遇到了这个问题。我很幸运,我的一种活动类型可以工作,另一种则不能:
Activity: Walking
(UserInfo x1,y1)
(UserInfo x2,y2)
(UserInfo x3,y3)
Activity: Standing
(UserInfo x4,y4)
Activity: Walking
etc.如果在站立而不是行走时发生切换,我会得到userInfo。我在所有情况下都获得了其他属性,比如webpageURL;只有userInfo是通过null实现的。
我的解决方法是每次(例如,从x1/y1步行到x2/y2时)无效并重新创建NSUserActivity对象,而不是仅在活动类型更改时(例如,从步行到站立)。这在很大程度上不是文档的编写方式,但修复了iOS 9上的问题。
更新:这个变通方法在iOS 8上不起作用。你需要按照gregoryM的规定,通过userActivityWillSave委托来实现它。根据苹果公司的文档:
要高效地更新activity对象的userInfo字典,请配置其委托,并在每次需要更新userInfo时将其needsSave属性设置为YES。在适当的时候,Handoff调用委托的userActivityWillSave: callback,并且委托可以更新活动状态。
这不是“最佳实践”,它是必需的!
注意:在运行基于Xcode6.x构建的代码的iOS 9设备上出现问题。还没有测试Xcode7,问题可能不会出现在iOS 8上。
https://stackoverflow.com/questions/26715531
复制相似问题