Contenu connexe Similaire à [Osxdev]7.handoff (20) [Osxdev]7.handoff2. Agenda
• 나는 왜 짤방경쟁에 참여하지 않았는가
• Handoff가 뭔가요?
• 어떻게해요?
• 되긴 하는겁니까?
• 시간이 남으면…
16. 사용자 활동
• 사용자는 내 앱에서 무엇을 하는가?
• 메일을 읽는다/작성한다/목록에서 선택한다
• 웹사이트를 브라우징한다
• 글을 작성한다
• MCArmory
• 장비를 고른다
18. NSUserActivity
NSUserActivity* myActivity = [[NSUserActivity alloc]
initWithActivityType:@"com.myCompany.myBrowser.browsing"];
myActivity.userInfo = @{ ... };
myActivity.title = @"Browsing";
[myActivity becomeCurrent];
• userInfo
• NSArray, NSData, NSDate, NSDictionary, NSNull,
NSNumber, NSSet, NSString, NSUUID, NSURL
20. 액티비티 만들기
• NSDocument, UIDocument, NSResponder UIResponder
• 문서기반
• userActivity 자동 생성 (iCloud)
• 문서/리스폰더 기반
• becomeCurrent
• invalidate
@property (strong) NSUserActivity *userActivity;
22. 액티비티 만들기
NSUserActivity *currentActivity = [self userActivity];
NSString *bundleName = [[NSBundle mainBundle] bundleIdentifier];
NSString *myActivityType =
[bundleName stringByAppendingString:@".selected-list"];
if(![[currentActivity activityType] isEqualToString:myActivityType]) {
[currentActivity invalidate];
currentActivity = [[NSUserActivity alloc] initWithActivityType:myActivityType];
[currentActivity setDelegate:self];
[currentActivity setNeedsSave:YES];
[self setUserActivity:currentActivity];
} else {
[currentActivity setNeedsSave:YES];
}
25. 액티비티 처리하기
• AppDelegate (NS/UIApplicationDelegate)
- (BOOL)application:(NSApplication *)application
willContinueUserActivityWithType:(NSString *)userActivityType
- (BOOL)application:(NSApplication *)application continueUserActivity:
(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray
*restorableObjects))restorationHandler
- (void)application:(NSApplication *)application
didFailToContinueUserActivityWithType:(NSString *)userActivityType error:(NSError
*)error
- (void)application:(NSApplication *)application didUpdateUserActivity:
(NSUserActivity *)userActivity
26. 액티비티 처리하기
- (BOOL)application:(NS/UIApplication *)application
willContinueUserActivityWithType:(NSString *)activityType {
if ([activityType isEqual:@“com.company.viewing-message”]) {
id vc = [[MessageViewController alloc] init];
vc.showLoadingIndicator = YES;
[self showMessageViewController:vc];
return YES;
}
return NO;
}
27. 액티비티 처리하기
- (BOOL)application:continueUserActivity:restorationHandler: {
NSString *activityType = activity.activityType;
if ([activityType isEqual:@“com.company.viewing-message”]) {
id vc = [[MessageViewController alloc] init];
...
restorationHandler(@[vc]);
return YES;
}
return NO;
}
- (void)restoreUserActivityState:(NSUserActivity *)activity {
[super restoreUserActivityState:activity];
[self setMessageID:activity.userInfo[@“messageID”]];
...
id cvc = [[ConversationViewController alloc] init];
...
[cvc restoreUserActivityState:activity];
}
28. 액티비티 처리하기
• 복원
- (void)restoreUserActivityState:(NSUserActivity *)activity
- (void)restoreUserActivityState:(NSUserActivity *)activity {
[super restoreUserActivityState:activity];
NSString *version = activity.userInfo[@“handoffVersion”]
BOOL isOldVersion = [self isOldVersion:version];
NSString *recipientKey = isOldVersion ? @“to” : @“rcptID”;
self.recipient = activity.userInfo[recipientKey];
[self updateRecipientImage];
}
29. 액티비티 처리하기
• NSUserActivityDelegate
- (void)userActivityWasContinued:(NSUserActivity *)userActivity
- (void)userActivityWillSave:(NSUserActivity *)userActivity
- (void)userActivity:(NSUserActivity *)userActivity
didReceiveInputStream:(NSInputStream *)inputStream
outputStream:(NSOutputStream *)outputStream
31. 버저닝
- (void)restoreUserActivityState:(NSUserActivity *)activity {
[super restoreUserActivityState:activity];
NSString *version = activity.userInfo[@“handoffVersion”]
BOOL isOldVersion = [self isOldVersion:version];
NSString *recipientKey = isOldVersion ? @“to” : @“rcptID”;
self.recipient = activity.userInfo[recipientKey];
[self updateRecipientImage];
}
- (void)application:(NS/UIApplication *)application
didUpdateUserActivity:(NSUserActivity *)userActivity {
[userActivity addUserInfoEntriesFromDictionary:@{@“handoffVersion”:
@“2.0”,}];
}
33. 웹사이트 핸드오프
• Web to App
• activityType:
“url” (NSUserActivityTypeBrowsingWeb)
• com.apple.developer.associated-domains
entitlement
• Signed web credentials in JSON file > https://
example.com/apple-app-site-association
34. Continuation Stream
activity.supportsContinuationStreams = YES;
- (BOOL)application:(UIApplication *)application
continueUserActivity: (NSUserActivity *)userActivity
restorationHandler: (void(^)(NSArray
*restorableObjects))restorationHandler
{
[userActivity getContinuationStreamsWithCompletionHandler:^(
NSInputStream *inputStream,
NSOutputStream *outputStream, NSError *error) {
// Do something with the streams
}];
return YES;
}
35. 주의사항
• 전송 데이터(userInfo)는 최소화
• 큰 데이터가 필요하다면 Continuation Stream 사용
• 버전, 플랫폼, Mac/iOS 앱 차이
• com.<company>.<app>.<activity type>
• needSave / userActivityWillSave: 사용
• application:willContinueUserActivityWithType: 구현
36. Q&A
• Handoff Programming Guide
• https://developer.apple.com/library/prerelease/
ios/documentation/UserExperience/Conceptual/
Handoff/Introduction/Introduction.html
• WWDC 2014 Videos
• https://developer.apple.com/videos/wwdc/2014/