2014-11-03 5 views
9

내 iPhone과 iPad간에 NSUserActivity로 iOS 8.1 핸드 오프 기능을 테스트하려고합니다. 이를 위해 내 솔루션을 구현하고 Apple의 PhotoHandoff 프로젝트를 사용하려고 시도했습니다. 그러나 작동하지 않습니다.NSUserActivity handoff가 사용자 정의 데이터에 대해 작동하지 않습니다.

나는 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" ] }]; 

활동 객체의 사용자 정보 사전을 업데이트하려면

+0

중첩 된 NSArray가 없으면 시도해 보셨습니까? 또는 NSData로 직렬화 해 볼 수 있습니까? 그리고,'self.userActivity = activity'와'becomeCurrent'를 호출하기 전에 userInfo를 설정해 보셨습니까? – brandonscript

+0

여기에도 같은 문제가 있습니다. 특별한 것은 보내지지 않습니다. 모든 것은 Apple dev 가이드를 준수하도록 구성됩니다. 제목 및 유형은 정확하지만 userInfo가 누락되었습니다. – GregoryM

답변

2

(I는 또한 해당 활동 유형과 맥 응용 프로그램과 함께 작동하도록 드릴 수 없습니다), 당신은 구성해야 대리자를 호출하고 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 }]; 
} 
+0

그것이 작동하지 않는 것을 제외하고. Apple 자체 샘플로도. –

+0

그러면 다른 앱의 수신단에 뭔가 있어야합니다. 위의 예가 제대로 작동하고 있습니다. 두 기기가 물리적으로 근접해 있고 동일한 iCloud 계정에 로그인되어 있다고 가정합니다. application : willContinueUserActivityWithType :을 구현합니까? 응용 프로그램 : continueUserActivity : restorationHandler : called? userInfo 딕셔너리를 포함한 activity 객체는이 마지막 호출 이전에 사용할 수 없습니다. – HiDeo

4

이미 해결책을 찾았 으면 좋겠지 만, 누군가이 문제에 너무 어려움을 겪는 경우에 대비하여 해결책이 있습니다. 사용자 정보없이 사용자 활동을 만들기

(이전의 대답에서 실제로 매우 다른되지 않음), 무시됩니다

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가 업데이트됩니다.

희망이 도움이됩니다.

+0

이것이 iOS 8에서 작동하는지 확인합니다. iOS 9에서는 이미 수정되었으므로'.userInfo'를 직접 설정하고'.needsSave'를 YES로 설정하십시오. – Tricertops

+0

@Tricertops 당신이 설명하는 것처럼 iOS 9에서도 제대로 작동하지 못했습니다. 데이터를 성공적으로 캡처 할 수있는 유일한 방법은'userActivityWillSave :'를 구현하고'userInfo'를 거기에 설정하는 것입니다. – aapierce

1

FWIW,이 문제가 발생했습니다. 나는 나의 활동 유형 중 하나 일 운이었고, 다른 하나는하지 않았다 : 서 있지만 걷고하지 않을 경우 핸드 오프가 발생하는 경우

Activity: Walking 
(UserInfo x1,y1) 
(UserInfo x2,y2) 
(UserInfo x3,y3) 
Activity: Standing 
(UserInfo x4,y4) 
Activity: Walking 
etc. 

나는 사용자 정보를 얻었다. 모든 경우에 webpageURL과 같은 다른 속성이 있습니다. userInfo는 null을 통해 왔습니다.

해결 방법은 활동 유형이 바뀌었을 때 (예 : 도보에서 서기까지)가 아닌 & NSUserActivity 객체를 무효화하는 것입니다 (예 : x1/y1에서 x2/y2로 걷는 경우). 이는 문서가 작성된 방식과 많이 다르지만 iOS 9에서 문제가 해결되었습니다.

업데이트 :이 해결 방법은 iOS 8에서 작동하지 않습니다. gregoryM이 지정되어 있으므로 userActivityWillSave 대리인을 통해 구현해야합니다. 애플의 문서 당 :

는 활동 객체의 사용자 정보 사전 효율적으로 가 대리자를 구성 업데이트하려면 및 사용자 정보 업데이트가 필요할 때마다 YES로의 needsSave 속성을 설정합니다.적절한 시간에 핸드 오프는 대리자의 userActivityWillSave : callback을 호출하고 대리인은 활동 상태를 업데이트 할 수 있습니다.

"권장 사항"이 아닙니다.

[참고 : Xcode 6.x 기반의 iOS 9 기기에서 문제가 발생했습니다. 아직 Xcode 7을 테스트하지 않았으므로 iOS 8에서는 문제가 발생하지 않을 수 있습니다.]

관련 문제