11

我正在尝试在我的 iPhone 和 iPad 之间使用 NSUserActivity 测试 iOS 8.1 的切换功能。为此,我尝试实施自己的解决方案,并使用 Apple 的PhotoHandoff项目。但是,它不起作用。

如果我提供 a 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 应用程序一起使用)

4

3 回答 3

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。

希望这可以帮助。

于 2015-04-16T14:40:15.867 回答
2

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

此过程在采用切换指南的最佳实践部分中进行了描述。

例如,使用简单的 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 }];
}
于 2014-11-07T00:48:40.087 回答
2

FWIW,我遇到了这个问题。我很幸运,我的一种 Activity 类型有效,而另一种则没有:

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 时),而不是仅在 Activity 类型更改时(例如从步行到站立)。这与文档的编写方式非常不同,但在 iOS 9 上解决了该问题。

更新:此解决方法不适用于 iOS 8。您需要通过 userActivityWillSave 委托来实现此功能,如 gregoryM 指定的那样。根据 Apple 的文档:

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

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

[注意:在运行基于 Xcode 6.x 的代码的 iOS 9 设备上出现问题。尚未测试 Xcode 7,iOS 8 上可能不会出现问题。]

于 2015-08-30T16:12:16.460 回答