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

时间:2014-11-03 13:38:07

标签: ios objective-c ios8.1 handoff nsuseractivity

我正在尝试使用我的iPhone和iPad之间的NSUserActivity测试iOS 8.1切换功能。为此,我尝试了实现自己的解决方案,并使用Apple的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" ] }];

(我也无法使用具有相应活动类型的Mac应用程序)

3 个答案:

答案 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上可能不会出现问题。]