티스토리 뷰

iOS

iOS ) Task Management - Activity Sharing

Zedd0202 2019. 1. 19. 16:57
반응형


안녕하세요 :) Zedd입니다. 

요새 잠을 통 못잤는데..역시 주말...너무 좋아...

토요일이 거의 날아갔네요...



암튼 NSUserActivity를 공부해보도록 합시다.

제가 iOS ) Task Management - Undo - UndoManager에서 iOS에는 Task Management라는 것들이..있구나..라는 것을 알았는데요,



이렇게 말했었죠? NSUserActivity도 이 Task Management에 속하는 애였어요.


바로 Activity Sharing.


암튼 봅시다. NSUserActivity.

NSUserActivitys는 특정 시점의 앱 상태를 나타내는 표현?인데요.


NSUserActivity객체는 앱의 상태를 캡쳐(capture)하여 나중에 사용하도록 배치하는 간단한 방법을 제공합니다.

user activity 객체를 생성하고, 이를 사용하여 앱 content보기, 문서 편집, 웹페이지 보기 또는 비디오 시청과 같이 사용자가 수행한 작업에 대한 정보를 캡쳐합니다.

시스템이 앱을 실행하고, activity객체를 사용 할 수 있게 되면, 앱은 해당 객체를 사용하여 자기자신을 적절한 상태로 복원(restore)할 수 있습니다. 


key moments(중요한 순간)에 NSUserActivity객체를 만들고 이를 시스템에 등록합니다. 예를들어, 사용자가 웹페이지를 열거나, 앱이 백그라운드로 이동하거나, 사용자가 앱에서 다른 중요한 작업을 수행 할 때, user activity객체를 만들 수 있습니다. user activity객체는 앱의 모든 작업을 추적할 수 있는 방법이 아니므로, 작은 편집이나 기타 사소한 변경작업에는 사용하지 말아야 합니다. 대신, 사용자가 나중에 또는 다른 디바이스에서 계속 진행 할 수 있는 중요한 체크 포인트에 사용하세요.

그것들을 사용하여 더 나은 Spotlight검색 결과를 제공 할 수도 있습니다.


user activity객체를 만들 때, 다음을 수행하세요.


1. 적절한 user activity객체를 생성하고 초기화하세요. (앱이 지원한는 activity 타입을 정의합니다.)


2. user activity 객체의 타이틀을 설정합니다.


3. 다음 프로퍼티 하나 이상을 활성화 하여 객체를 사용 할 수 있는 작업을 구성합니다.

 

4. 사용자의 현재 작업과 관련된 객체의 프로퍼티를 구성(Configure) 합니다.


5. 검색 또는 public indexing을 위해 구성된 user activity객체의 경우, keywords 또는 webpageURL프로퍼티를 구성하여 Spotlight에서 객체를 인덱싱 할 수 있도록 합니다.


6. user activity객체를 시스템에 등록하려면, becomeCurrent()메소드를 호출하세요.



NSUserActivity객체를 만들 때, activity타입을 식별하는 문자열을 지정합니다. Activity type strings은 일반적으로 reverse-DNS 포맷입니다. 예를들어, 사용자가 웹페이지를 열면com.myCompany.myApp.OpenWebPage와 같은 Activity type strings을 지정 할 수 있습니다.

info.plist파일에 NSUserActivityTypes 키를 포함하여 앱이 지원하는 Activity type을 선언해야 합니다. 시스템은 해당 키의 정보를 사용하여, 앱이 주어진 user activity객체를 전달 할 수 있는지 여부를 결정합니다.


시스템은 user activity 객체를 만든 개발자의 ID와 연관시킵니다. activity를 계속 할 때, 시스템은 주어진 Activity type을 지원하고, Activity의 source 앱과 동일한 개발자 ID를 갖는 앱을 찾습니다. 

developer Team ID에 activity객체를 입력하면, 경쟁업체의 앱에서 생성한 활동을 가로채지(intercepted) 못하게 됩니다. 

Team ID를 사용하면, 앱이 App Store를 통해 배포되거나 개발자 ID로 서명되어야 한다는 의미입니다.


Supporting Handoff

Handoff 사용자가 activity 시작하고, 다른 activity 계속 있게 해주는 기술입니다. Handoff 경우, user activity객체가 컨텍스트에서 사용되려고 합니다. (? 뭔뜻) 예를들어, iPad에서 비디오를 보고 있는 사용자는 Mac에서 같은 지점의 비디오를 계속 있습니다. 예제에서, user activity객체에는 사용자가 보았던 비디오 iPad에서 시청을 중단한 지점에 대한 정보가 포함됩니다.

Handoff 지원하려면 isEligibleForHandoff프로퍼티를 true 설정해야합니다.

근데 true 안했는데 됐지..?


디폴트 값이 true군요.


Supporting SiriKit

이건 걍 넘어갈게요. SiriKit Programming Guide.참고. 

Supporting Improved Search Results

NSUserActivity객체에 나중에 사용자가 검색하려는 정보가 들어있게 하려면, isEligibleForSearch프로퍼티를 true로 설정합니다. (기본값은 역시나 true) 검색을 활성화 하면, Spotlight는 user activity객체를 인덱싱하고, 이후의 디바이스 검색시 이를 고려합니다.
예를들어, 사용자가 앱에서 특정 레스토랑에 대한 정보를 본 경우, 해당 user activity를 검색 할 수 있습니다. Spotlight를 사용하여 레스토랑을 검색하면, user activity에서 얻은 결과가 포함 될 수 있습니다.
on-device검색 이외에도 앱에서 접근한 URL을 전체 Spotlight검색 엔진으로 제공 할 수 있습니다. URL을 공유하면 Spotlight가 다른 사용자의 검색 결과를 향상시키는 데 도움이 됩니다. URL을 contribute하려면 activity객체의 webpageURL프로퍼티에 URL을 넣고 isEligibleForPublicIndexing프로퍼티를 true로 설정합니다. (isEligibleForPublicIndexing의 디폴트값은 false입니다.)
중요 : 앱은 검색 결과에 사용하는 모든 activity객체에 대한 strong reference를 유지해야합니다.

User activity객체는 사용자가 시작한 활동을 기록하기 위한 것입니다. 앱의 데이터를 위한 범용 인덱싱 생성 매커니즘으로 사용하기 위한것은 아닙니다. 사용자가 touch한 content뿐만 아니라, 앱의 모든 content를 인덱싱하려면 Core Spotlight 프레임 워크의 API를 사용하세요. 

아니 저는 Spotlight관련해서 user activity가 어떻게 동작하는ㄷ지 감이 안오네요..
그럼 일단 만들어봅시다.
Handoff는 이미..해봤으니  Handoff 사용해보기 글을 참고해주세요.
그래도 일단 한번 같이 봅시다.
위에 순서가 나왔죠? 

1. 적절한 user activity객체를 생성하고 초기화하세요. (앱이 지원한는 activity 타입을 정의합니다.)

2. user activity 객체의 타이틀을 설정합니다.

3. 다음 프로퍼티 하나 이상을 활성화 하여 객체를 사용 있는 작업을 구성합니다.

4. 사용자의 현재 작업과 관련된 객체의 프로퍼티를 구성(Configure) 합니다.

5. 검색 또는 public indexing 위해 구성된 user activity객체의 경우, keywords 또는 webpageURL프로퍼티를 구성하여 Spotlight에서 객체를 인덱싱 있도록 합니다.

6. user activity객체를 시스템에 등록하려면, becomeCurrent()메소드를 호출하세요.




제가 옆에 번호를 적어놔봤어요.

Handoff 사용해보기에 있던 예제코드인데, 3번이 추가되었습니다. 디폴트값이...true긴 하지만 명시적으로 다시 한번 해줍시다. 그래야 뭐에 관한 코드인지 알 수 있을 것 같으니까요. 

그리고 지금 보니까, 1번의 activity type string이 너무 general하네요.. 그리고 reverse-DNS format를 권장하니..뭐 이건 알아서. 


참고로 activityType 이라는 프로퍼티가 있어서 나중에 string을 주면 될 것 같지만, get only라 불가능합니다.

title은 참고로 optional입니다. Handoff시에는 이 title이 도통 어디에 쓰이는지 모르겠네요.


뭔가 여기서 같이 떠야할 것 같지만....안뜨니까...

하지만 Search시에는 이 title을 항상 지정하라고 권장하고 있습니다. 그 문자열이 검색 결과에 표시된다고 해요.


6번의 becomeCurrent() 메소드. 그니까 사용자가 associated activity를 수행중임을 시스템에 알리는 메소드에요.

becomeCurrent()와 반대의 메소드도 있는데요, resignCurrent()입니다. 

이 resignCurrent()를 호출하면 user activity가 전체적으로 invalidate(무효화) 된다고 합니다. 


자. Handoff는 해봤으니까.. 

 

Search랑 PublicIndexing만 좀 보면 될 것 같은데요, 일단 저는 Search먼저 보겠습니다.

자, 아까 Handoff코드에서 딱 한줄만 바꿔보겠습니다. 


자, isEligibleForSearch를 true로 지정해주도록만 바꿔보았습니다. 참고로 isEligibleForSearch는 디폴트값이 false입니다. 

그리고 실행해보면, 


역시나 이게 뜨구요, 왜냐? isEligibleForHandoff는 디폴트값이 true니까..


이제 홈버튼을 눌러줍니다. 헉 쓰고보니..이제 홈버튼..안누르는 사람이 더 많을지도....

하지만 제가 유튜브 영상에서도 말씀드렸다시피....

Face ID > 도플갱어가 폰 뺐어감 > 열림 > 내 정보와 돈이 탈탈 털릴 수 있음

즉, 지문이 짱이다.....

네 다음 정신승리


네 암튼..어떻게든 홈화면만 가면 됩니다.

홈화면 가서 밑으로 제스쳐 하면



이 화면(Spotlight)이 보일텐데요, 

여기서 저희가 입력해준 title의 일부를 검색해보겠습니다. 위에서 "안녕하세요 안녕하세요"  였죠?



즉 여기서 알 수 있는 사실은..title프로퍼티의 값이..저기 뜨게 된다...


여기서..제가 겪은 이슈. 


title을 "안녕하세요 :) Zedd입니다"로 바꾼다 > 다시 검색 한다 

> 이 전에꺼가 나옴 (나의 경우에는 "안녕하세요 안녕하세요"


를 겪었는데요, 이럴때는...앱 삭제를 하고 다시 설치를 하고, 다시 검색하면 이제 title이 잘 바뀌어서 나와있습니다. 


오늘은 여기까지. 

더 할 기운이 없음. NSUserActivity이 쪽도 결코 적은 내용이 아니네요. 



얘네끼리 뭐 어케어케 엮여있음..



+ ) 추가

위에서 


6. user activity객체를 시스템에 등록하려면, becomeCurrent()메소드를 호출하세요.


라고 했는데요, 이 코드가 없어도 잘 동작하네요. resignCurrent() 메소드 없이도 Handoff를 지원 안하는 view로 가면 잘 없어집니다. 
이 이유는 userActivity를 설정하면 UIKit에서 자동으로 이를 처리한다고 해요. 그래서 userActivity를 set하고 나서 becomeCurrent가 자동으로 불리고, view를 떠나면 activity가 자동으로 resign된다고 합니다. 


반응형

'iOS' 카테고리의 다른 글

iOS ) UIView > Configuring the Event-Related Behavior  (2) 2019.01.30
iOS ) Peek and Pop  (2) 2019.01.26
iOS ) Handoff 사용해보기  (1) 2019.01.17
iOS ) available  (0) 2018.12.21
iOS ) Text Input Traits  (3) 2018.12.10