我正在尝试使用我的iPhone和iPad之间的NSUserActivity测试iOS 8.1切换功能。为此,我尝试了实现自己的解决方案,并使用Apple的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应用程序)
答案 0 :(得分:4)
我希望你已经找到了解决方案,但是如果有人偶然发现这个问题,这里有一个解决方案。 (实际上与之前的答案没有太大差别)
创建没有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。
希望这有帮助。
答案 1 :(得分:2)
要更新活动对象的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 }];
}
答案 2 :(得分:1)
FWIW,我遇到了这个问题。我很幸运,我的一个活动类型有效,另一个没有:
Activity: Walking
(UserInfo x1,y1)
(UserInfo x2,y2)
(UserInfo x3,y3)
Activity: Standing
(UserInfo x4,y4)
Activity: Walking
etc.
如果在站立但没有走路时发生切换,我得到了userInfo。在所有情况下我都有其他属性,例如webpageURL;只是userInfo来自null。
对我来说,解决方法是使&每次重新创建NSUserActivity对象(例如,当从x1 / y1步行到x2 / y2时),而不是仅在活动类型改变时(例如从步行到站立)。这与编写doc的方式不同,但修复了iOS 9上的问题。
更新:此解决方法在iOS 8上不起作用。您需要通过userActivityWillSave委托实现此目的,如gregoryM指定的那样。根据Apple的文档:
要有效地更新活动对象的userInfo字典, 配置其委托并将其needsSave属性设置为YES userInfo需要更新。在适当的时候,Handoff会调用 委托的userActivityWillSave:回调,委托可以更新 活动状态。
这不是最佳做法",这是必需的!
[注意:运行在Xcode 6.x上构建的代码的iOS 9设备上出现问题。 Haven尚未对Xcode 7进行测试,iOS 8上可能不会出现问题。]