SlideShare une entreprise Scribd logo
1  sur  37
Télécharger pour lire hors ligne
경험의 연속?
Handoff
idiel@osxdev.org
Agenda
• 나는 왜 짤방경쟁에 참여하지 않았는가
• Handoff가 뭔가요?
• 어떻게해요?
• 되긴 하는겁니까?
• 시간이 남으면…
미안하다
Continuity
• Handoff
• Phone call / Messages
• Hotspot
Handoff
Handoff
Handoff
지금은 어떻게?
• 데이터 동기화
• iCloud
• 서드파티 클라우드
• 커스텀 클라우드
• URL, AppLink
iCloud
써드파티 솔루션
• DropBox
• Box
• N드라이브
• 다음 클라우드
• Google Drive
• One Drive
• …
직접 구현
Missing Link
Demo
• Mail
• Safari
Handoff Interactions
Handoff
• 사용자 요구사항
• 근접 위치 기반
• Bluetooth LE
• 동일한 iCloud 계정
• 개발 요구사항
• 동일한 개발자 인증
• 액티비티 타입
사용자 활동
• 사용자는 내 앱에서 무엇을 하는가?
• 메일을 읽는다/작성한다/목록에서 선택한다
• 웹사이트를 브라우징한다
• 글을 작성한다
• MCArmory
• 장비를 고른다
NSUserActivity
• 클래스 하나
• activityType
• userInfo
• 메서드
• becomeCurrent
• invalidate
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
NSUserActivity
• activityType
• 역 도메인명 + 액티비티 명
• “org.osxdev.demoApp.demo-began”
• 동일한 개발자
• 액티비티 생성 / 액티비티 소비 다를 수 있음
액티비티 만들기
• NSDocument, UIDocument, NSResponder UIResponder
• 문서기반
• userActivity 자동 생성 (iCloud)
• 문서/리스폰더 기반
• becomeCurrent
• invalidate
@property (strong) NSUserActivity *userActivity;
액티비티 만들기
• 문서기반
액티비티 만들기
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];
}
• Mail.app
Info.plist
• Safari.app
Info.plist
액티비티 처리하기
• 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
액티비티 처리하기
- (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;
}
액티비티 처리하기
- (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];

}
액티비티 처리하기
• 복원
- (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];
}
액티비티 처리하기
• NSUserActivityDelegate
- (void)userActivityWasContinued:(NSUserActivity *)userActivity
- (void)userActivityWillSave:(NSUserActivity *)userActivity
- (void)userActivity:(NSUserActivity *)userActivity

didReceiveInputStream:(NSInputStream *)inputStream

        outputStream:(NSOutputStream *)outputStream
데모
버저닝
- (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”,}];

}
웹사이트 핸드오프
• App to Web
• userActivity.webpageURL
웹사이트 핸드오프
• 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
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;
}
주의사항
• 전송 데이터(userInfo)는 최소화
• 큰 데이터가 필요하다면 Continuation Stream 사용
• 버전, 플랫폼, Mac/iOS 앱 차이
• com.<company>.<app>.<activity type>
• needSave / userActivityWillSave: 사용
• application:willContinueUserActivityWithType: 구현
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/
[Osxdev]7.handoff

Contenu connexe

Tendances

Tendances (8)

22 j query1
22 j query122 j query1
22 j query1
 
jQuery
jQueryjQuery
jQuery
 
Introduction to React and MobX
Introduction to React and MobXIntroduction to React and MobX
Introduction to React and MobX
 
Time to React!
Time to React!Time to React!
Time to React!
 
Javascript libraries
Javascript librariesJavascript libraries
Javascript libraries
 
Grails Views
Grails ViewsGrails Views
Grails Views
 
Week 4 - jQuery + Ajax
Week 4 - jQuery + AjaxWeek 4 - jQuery + Ajax
Week 4 - jQuery + Ajax
 
Mvc - Model: the great forgotten
Mvc - Model: the great forgottenMvc - Model: the great forgotten
Mvc - Model: the great forgotten
 

En vedette (7)

Handover Microsoft
Handover MicrosoftHandover Microsoft
Handover Microsoft
 
Vertical handoff and TCP performance optimizations using cross layer approach
Vertical handoff and TCP performance optimizations using cross layer approachVertical handoff and TCP performance optimizations using cross layer approach
Vertical handoff and TCP performance optimizations using cross layer approach
 
An efficient vertical handoff mechanism for future mobile network
An efficient vertical handoff mechanism for future mobile networkAn efficient vertical handoff mechanism for future mobile network
An efficient vertical handoff mechanism for future mobile network
 
3gwireless
3gwireless3gwireless
3gwireless
 
Getting started with Handoff
Getting started with HandoffGetting started with Handoff
Getting started with Handoff
 
The Six Highest Performing B2B Blog Post Formats
The Six Highest Performing B2B Blog Post FormatsThe Six Highest Performing B2B Blog Post Formats
The Six Highest Performing B2B Blog Post Formats
 
The Outcome Economy
The Outcome EconomyThe Outcome Economy
The Outcome Economy
 

Similaire à [Osxdev]7.handoff

Cross platform mobile development in c#
Cross platform mobile development in c#Cross platform mobile development in c#
Cross platform mobile development in c#
danhermes
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
Anton Narusberg
 

Similaire à [Osxdev]7.handoff (20)

Mobile optimization
Mobile optimizationMobile optimization
Mobile optimization
 
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
GDG GeorgeTown Devfest 2014 Presentation: Android Wear: A Developer's Perspec...
 
Android101
Android101Android101
Android101
 
Introduction to Handoff
Introduction to HandoffIntroduction to Handoff
Introduction to Handoff
 
Activities, Fragments, and Events
Activities, Fragments, and EventsActivities, Fragments, and Events
Activities, Fragments, and Events
 
Parse London Meetup - Cloud Code Tips & Tricks
Parse London Meetup - Cloud Code Tips & TricksParse London Meetup - Cloud Code Tips & Tricks
Parse London Meetup - Cloud Code Tips & Tricks
 
Mini-Training: AngularJS
Mini-Training: AngularJSMini-Training: AngularJS
Mini-Training: AngularJS
 
Cross platform mobile development in c#
Cross platform mobile development in c#Cross platform mobile development in c#
Cross platform mobile development in c#
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
 
Angularjs Basics
Angularjs BasicsAngularjs Basics
Angularjs Basics
 
Medium TechTalk — iOS
Medium TechTalk — iOSMedium TechTalk — iOS
Medium TechTalk — iOS
 
Distributing information on iOS
Distributing information on iOSDistributing information on iOS
Distributing information on iOS
 
Android app development basics
Android app development basicsAndroid app development basics
Android app development basics
 
Tools and practices for rapid application development
Tools and practices for rapid application developmentTools and practices for rapid application development
Tools and practices for rapid application development
 
Mobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve MobileMobile Developers Talks: Delve Mobile
Mobile Developers Talks: Delve Mobile
 
Android rest client applications-services approach @Droidcon Bucharest 2012
Android rest client applications-services approach @Droidcon Bucharest 2012Android rest client applications-services approach @Droidcon Bucharest 2012
Android rest client applications-services approach @Droidcon Bucharest 2012
 
Angular 4 Introduction Tutorial
Angular 4 Introduction TutorialAngular 4 Introduction Tutorial
Angular 4 Introduction Tutorial
 
Ios development 2
Ios development 2Ios development 2
Ios development 2
 
How We Built a Mobile Electronic Health Record App Using Xamarin, Angular, an...
How We Built a Mobile Electronic Health Record App Using Xamarin, Angular, an...How We Built a Mobile Electronic Health Record App Using Xamarin, Angular, an...
How We Built a Mobile Electronic Health Record App Using Xamarin, Angular, an...
 
Building API in the cloud using Azure Functions
Building API in the cloud using Azure FunctionsBuilding API in the cloud using Azure Functions
Building API in the cloud using Azure Functions
 

Plus de NAVER D2

Plus de NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

Dernier

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 

Dernier (20)

Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 

[Osxdev]7.handoff

  • 2. Agenda • 나는 왜 짤방경쟁에 참여하지 않았는가 • Handoff가 뭔가요? • 어떻게해요? • 되긴 하는겁니까? • 시간이 남으면…
  • 4. Continuity • Handoff • Phone call / Messages • Hotspot
  • 8. 지금은 어떻게? • 데이터 동기화 • iCloud • 서드파티 클라우드 • 커스텀 클라우드 • URL, AppLink
  • 10. 써드파티 솔루션 • DropBox • Box • N드라이브 • 다음 클라우드 • Google Drive • One Drive • …
  • 15. Handoff • 사용자 요구사항 • 근접 위치 기반 • Bluetooth LE • 동일한 iCloud 계정 • 개발 요구사항 • 동일한 개발자 인증 • 액티비티 타입
  • 16. 사용자 활동 • 사용자는 내 앱에서 무엇을 하는가? • 메일을 읽는다/작성한다/목록에서 선택한다 • 웹사이트를 브라우징한다 • 글을 작성한다 • MCArmory • 장비를 고른다
  • 17. NSUserActivity • 클래스 하나 • activityType • userInfo • 메서드 • becomeCurrent • invalidate
  • 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
  • 19. NSUserActivity • activityType • 역 도메인명 + 액티비티 명 • “org.osxdev.demoApp.demo-began” • 동일한 개발자 • 액티비티 생성 / 액티비티 소비 다를 수 있음
  • 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”,}];
 }
  • 32. 웹사이트 핸드오프 • App to Web • userActivity.webpageURL
  • 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/