[iOS] Giới thiệu về CMMotionActivity

Giới thiệu

Trong bài giới thiệu mới nhất về chiếc Apple Watch Series 4, Apple đã nhấn mạnh rất rõ việc đồng hồ thông minh phục vụ cho nhu cầu sức khỏe của người dùng thì cảm biến chính là phần quan trọng nhất. Apple Watch cảm biến con quay hồi chuyển phát hiện ra các chuyển động và phân tích được nhiều mức độ lực. Nhờ vậy mà nó có thể phân tích chính xác các động tác chuyển động, bộ môn thể thao mà bạn đang chơi. Trong bài viết này tôi sẽ giới thiệu đến các bạn một API trong framework mà Apple cung cấp để chúng ta có thể sử dụng cảm biến này. Đó chính là CMMotionActivity trong framework Core Motion.

CMMotionActivityManager

Trên iOS và watchOS, CMMotionActivityManager lấy dữ liệu cảm biến từ thiết bị và cho chúng ta biếtngười dùng hiện có đang di chuyển hay không và liệu họ có đang đi bộ, chạy, đi xe đạp hoặc lái xe ô tô hay không?

Để sử dụng API này, bạn tạo một CMMotionActivityManager và bắt đầu lắng nghe các hoạt động bằng cách sử dụng phương thức startActivityUpdates. Mỗi khi thiết bị cập nhật hoạt động chuyển động, nó sẽ thực hiện trả về giá trị qua một closure, passing thông qua một đối tượng CMMotionActivity.

let manager = CMMotionActivityManager()
manager.startActivityUpdates(to: .main) { (activity) in
    guard let activity = activity else {
        return
    }

    var modes: Set<String> = []
    if activity.walking {
        modes.insert("🚶‍")
    }

    if activity.running {
        modes.insert("🏃‍")
    }

    if activity.cycling {
        modes.insert("🚴‍")
    }

    if activity.automotive {
        modes.insert("🚗")
    }

    print(modes.joined(separator: ", "))
}

CMMotionActivityManager được cung cấp bởi framework Core Motion. Các thiết bị hỗ trợ Core Motion được trang bị bộ xử lý với cảm biến chuyển động. Bằng cách sử dụng phần cứng chuyên dụng, hệ thống có thể giảm tải tất cả xử lý cảm biến từ CPU và giảm thiểu mức sử dụng năng lượng.

Bộ xử lý cảm biến chuyển động dòng M đầu tiên là M7, được đưa ra thị trường vào tháng 9 năm 2013 với iPhone 5S. Điều này trùng hợp với việc phát hành iOS 7Core Motion APIs.

Một trong những hoạt động được sử dụng phổ biến nhất là trình điều khiển lái xe (Feature Drivers), được thêm vào iOS 11 với tính năng Không làm phiền khi đang lái xe để đảm bảo tối đa sự an toàn của người dùng khi đang lái xe.

Du lịch không di chuyển (Traveling Without Moving)

CMMotionActivity có các thuộc tính Boolean cho từng loại chuyển động khác nhau cũng như một cho dù thiết bị có dừng hay không. Điều này có vẻ không đúng, vì logic quy định rằng bạn có thể đi bộ hoặc lái xe tại một thời điểm cụ thể, nhưng không phải cả hai. Điều này được quy định rõ trong document:

Các thuộc tính liên quan đến chuyển động của class này không loại trừ lẫn nhau. Nói cách khác, có thể có nhiều hơn một thuộc tính liên quan đến chuyển động để chứa giá trị đúng. Ví dụ: nếu người dùng đang lái xe trong ô tô và xe dừng lại ở đèn đỏ, sự kiện cập nhật được kết hợp với thay đổi chuyển động đó sẽ có cả thuộc tính đạp xe (cycling)đứng im (stationary) được đặt thành true.

Dưới đây là một số ví dụ cụ thể về cách API này hoạt động trong các tình huống khác nhau:

Ví dụ 1: Bạn đang ở trong xe dừng lại ở đèn đỏ

https://images.viblo.asia/8f9e6f54-c1f8-4f3b-8683-1cc300ba4c39.png

Ví dụ 2: Bạn đang ở trong một phương tiện di chuyển

https://images.viblo.asia/8a6d0f6e-cf0a-4c71-b7a6-009f4c6cabc0.png

Ví dụ 3: Thiết bị đang chuyển động, nhưng bạn không đi bộ hoặc đang di chuyển

https://images.viblo.asia/6d9194bb-1029-402e-81cf-6bfcb50f6c95.png

Ví dụ 4: : Bạn là một thám tử nổi tiếng thế giới, người đang trong quá trình đuổi một kẻ tình nghi xuống hành lang của một chuyến tàu di chuyển, đã đến chiếc xe cuối cùng và dừng lại để nhìn xung quanh để phỏng đoán nơi họ đang ẩn nấp ~ tóm lại là rượt đuổi 1 kẻ đình nghi ở nhiều vị trí khác nhau

Nói tóm lại, trong các tình huống cụ thể chúng ta có thể có 2 hoạt động, còn việc xử lý tính toán các hoạt động như thế nào thì phụ thuộc vào developer. Apple cũng cung cấp cho mỗi đối tượng CMMotionActivity bao gồm một thuộc tính tin cậy với các giá trị có thể có .low, .medium.high.

Kết hợp với Truy vấn Location

Tùy thuộc vào tình huống sử dụng, bạn có thể phối hợp các giữa Core Motion với * Core Location* có thể đem lại kết quả tốt hơn.

Bạn có thể kết hợp các thay đổi về vị trí theo thời gian với các hoạt động chuyển động có độ tin cậy thấp để tăng độ chính xác. Dưới đây là một số nguyên tắc chung cho phạm vi tốc độ điển hình cho từng phương thức:

Tốc độ đi bộ thường cao nhất là 2,5 mét / giây (5,6 mph, 9 km / h)

Tốc độ chạy dao động từ 2,5 đến 7,5 mét mỗi giây (5,6 - 16,8 mph, 9 - 27 km / h)

Tốc độ đi xe đạp dao động từ 3 đến 12 mét / giây (6,7 - 26,8 mph, 10,8 - 43,2 km / h)

Tốc độ ô tô có thể vượt quá 100 mét trên giây (220 mph, 360 km / h)

Ngoài ra, bạn có thể sử dụng dữ liệu vị trí để thay đổi giao diện người dùng tùy thuộc vào việc vị trí hiện tại có nằm trong vùng nước hay không với cách xử lý như sau:

if currentLocation.intersects(waterRegion) {
    if activity.walking {
        print("🏊‍")
    } else if activity.automotive {
        print("🚢")
    }
}

Kết luận

Có thể nói CMMotionActivityManager là một trong những API tuyệt vời trong Core Motion mà bạn có thể sử dụng để xây dựng các ứng dụng về hoạt động.

Và nó một API tuyệt vời mà Apple cung cấp cho chúng ta, nếu bạn có thể áp dụng API này vào trong ứng dụng của bạn, có thể kết quả khiến bạn phải ngạc nhiên :v.

Nguồn