11

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 アプリでも動作させることができません)

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

FWIW、私はこの問題を抱えていました。私のアクティビティ タイプの 1 つが機能し、もう 1 つが機能しなかったことは幸運でした。

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 デリゲートを介してこれを実装する必要があります。Appleのドキュメントによると:

アクティビティ オブジェクトの userInfo ディクショナリを効率的に更新するには、そのデリゲートを構成し、userInfo の更新が必要になるたびにその needsSave プロパティを YES に設定します。適切なタイミングで、Handoff はデリゲートの userActivityWillSave: コールバックを呼び出し、デリゲートはアクティビティの状態を更新できます。

これは「ベスト プラクティス」ではなく、必須です。

[注: Xcode 6.x でビルドされたコードを実行している iOS 9 デバイスで問題が発生しました。Xcode 7 はまだテストしておらず、iOS 8 では問題が発生しない可能性があります。]

于 2015-08-30T16:12:16.460 に答える
2

アクティビティ オブジェクトの userInfo ディクショナリを更新するには、デリゲートを構成し、userInfo の更新が必要になるたびに needsSave プロパティを YES に設定する必要があります。

このプロセスは、ハンドオフの導入ガイドのベスト プラクティスのセクションで説明されています。

たとえば、単純な 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 に答える