Tìm hiểu handoff iOS

1. Giới thiệu

Handoff được giới thiệu từ ios8 và OSX 10.10, cho phép user tiếp tục các thao tác của mình trên nhiều device khác nhau. Ví dụ User đang mải xem 18+ nhưng đến 12h thì đi ngủ, hôm sau quên máy đến công ty dùng máy của công ty muốn xem tiếp ở link đó, hoặc muốn về nhà xem lại. HandOff cho phép liền mạch các thao tác của người dùng, giảm thời gian phải bật app và làm lại các thao tác từ đầu. Nếu các devices có cùng tài khoản iCloud và các app cùng 1 developer Team ID có thể sử dụng tính năng này.

2. Handoff Requirement

Để sử dụng được handoff device và apps phải đáp ứng các yêu cầu sau:

  • Hệ điều hành từ ios 8 trở lên
  • Device phải cùng tài khoản iCloud
  • Device hỗ trợ HandOff từ iphone 5 trở lên
  • Devices hỗ trợ Bluetooth LE4.0 và đang On.

thumb_IMG_1561_1024.jpg

  • Các app muốn share activity phải cùng developer team ID
  • Khai báo Activity trong file info.plist.

3. Handoff Example

Để đóng gói thao tác của user ios sử dụng class NSUserActivity. Class UIResponder có sẵn 1 property là userActivity do đó subclass của class UIResponsder như UIController, UIView ... có sẵn 1 user activity. Chúng ta hãy làm 1 ví dụ: Tạo 1 Project với 1 UITextView. Ứng dụng này cho phép người dùng tiếp tục type text trên nhiều device khác nhau.

  • Send activity:

Trong viewDidLoad bạn khởi tạo userActivity của controller:

self.userActivity = [[NSUserActivity alloc]initWithActivityType:@"com.dang.typ3e"];
self.userActivity.title = @"text";
[self.userActivity becomeCurrent];

Để app có thể nhận dạng được activity bạn khởi tạo activity với activity type là "com.dang.typ3e", đồng thời trong file info.plist bạn phải khai báo activity type mà app support. Screen Shot 2016-05-23 at 10.59.52 PM.png

Để xác định NSUserActivity nào hiện tại đang hoạt động bạn set becomeCurrent.

Add thêm data transfer vào activity:

 [self.userActivity addUserInfoEntriesFromDictionary:@{@"text":self.textView.text}];
  • Receive activity: Để device có thể nhận được activity thì device phải bị khoá ở ios hoặc với mac thì app phải close. Bạn handle receive activity ở app delegate:

      - (BOOL)application:(UIApplication *)application
           continueUserActivity: (NSUserActivity *)userActivity
            restorationHandler: (void (^)(NSArray *))restorationHandler {
               restorationHandler(@[self.window.rootViewController]);
               return YES;
            }
    
       - (BOOL)application:(UIApplication *)application willContinueUserActivityWithType:(NSString *)userActivityType {
           return YES;
           }
    

Bạn có thể tuỳ chọn controller hoặc UIResponder subclass tuỳ ý receive activity bằng việc thêm vào restorationHandler. Bằng việc override lại hàm:

     - (void)restoreUserActivityState:(NSUserActivity *)activity {
         self.textView.text = activity.userInfo[@"text"];
        }

4. Kết luận