Programming/Mac & iOS

[iOS] NSUserActivity 활용 방법 (Hand-off)

MB Brad KWON 2015. 12. 22. 15:13

    NSUserActivity는 검색 결과나 핸드오프를 통하여 사용자가 앱을 사용하던 상태를 저장 복원하기 위해 사용하는 간편한 방법이다. 핸드오프 기능이 처음으로 제공된 iOS8에서부터 지원한다. 처음엔 iOS8에서는 핸드오프를 지원하기 위해서 추가되었다. 그런데 iOS9부터 각 상태를 indexing하여 spotlight 검색결과로 활용할 수 있도록 개선되었다. 먼저 핸드오프에서 사용하는 방법에 대해 말하고, spotlight를 통한 indexing은 다음 포스팅에서 다루겠다.



Hand-off

    핸드오프는 Mac OS X과 iOS 기기간 지속적인 작업이 가능하도록 해주는 기능이다. 하지만 지속적인 작업을 가능하게 하기 위해서 사용자가 작업하던 환경을 저장했다가 복구하는 수단이 필요하다. 그리고 저장하고 복원하는 데이터의 저장과 전송이 가벼워 사용자 사용환경을 해치지 않고 기기간의 부하를 줄여야 한다. 이를 위해 사용하는 것이 위에서 언급한 NSUserActivity이다. 


    핸드오프 기능을 구현하기에 앞서, 핸드오프를 사용하기 위한 조건이 있다. 같은 아이클라우드 계정으로 로그인된 기기가 2개 이상이 있어야 하며 해당 기기는 모두 Bluetooth LE 4.0 규격을 지원해야한다.


    먼저, 핸드오프를 구현하기 위해서 NSUserActivity 객체를 생성한다. 생성된 NSUserActivity 객체는 UIResponder의 '-(void)updateUserActivityState:(NSUserActivity *)activity'를 오버라이딩하여 user activity를 등록한다. OS에서 주기적으로 위의 메소드를 호출하게되고 호출할 때, 개발자가 등록한 user activity를 갱신하면서 Bluetooth LE를 통해 브로드캐스팅을 한다. 브로드캐스팅한 activity는 AppDelegate 메소드인 '-(void)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:'에서 수신한다. 수신한 NSUserActivity를 사용하여 사용자의 작업 환경을 복원해 핸드오프 기능을 완성한다.



Activity Types

    각 NSUserActivity는 activityType을 가진다. 핸드오프 기능을 사용하는 각 앱은  자신이 수신해 사용할 userActivity의 activityType을 info pilist에 등록을 해야한다. info plist에 등록할 때는 'NSUserActivityTypes'라는 키를 사용하여 array로 등록한다.