Background execution - update user location

Background Execution

Khi user không sử dụng app, hệ thống sẽ tự động chuyển app của chúng ta về trạng thái chạy background. Với nhiều app, trạng thái background chỉ là một bước chuyển tiếp trước khi nó bị chuyển về trạng thái suspended (không thực thi code nữa). Việc dừng các app khi không active trên screen là một cách để cải thiện thời lượng pin cũng như cho phép các ứng dụng đang chạy trên màn hình có nhiều resource của máy hơn (cpu, ram, bandwidth, ...), giúp cho ứng dụng trên screen hoạt động mượt mà với một cấu hình phần cứng không phải là vượt trội so với các máy android. Hầu hết các app sẽ bị chuyển về trạng thái suspended ngoại trừ một số tính năng mà apple cho phép chạy ở background. Ví dụ các app về tracking hoạt động của user như chạy bộ, đạp xe có thể tracking được location, quãng đường đã di chuyển, số bước chân đã đi để đưa ra được các thống kê cho người dùng. Các audio app có thể tiếp tục chơi nhạc khi chúng ta lướt facebook hoặc ở lock screen. Nếu bạn thấy app cần thiết phải chạy ở background thì apple cung cấp cho chúng ta 1 số cách để có thể thực hiện việc đó mà không tốn nhiều tài nguyên hệ thống cũng như pin. Kỹ thuật background execution được chia làm 3 nhóm chính:

  • App cần thực hiện 1 đoan code ở background có thể yêu cầu thêm thời gian trước khi app bị chuyển về trạng thái suspended khi app được chuyển về trạng thái background.
  • App đang download một nội dung ở foreground có thể quản lý các lượt tải xuống được tiếp tục cho đến khi download xong.
  • App cần thực thi background để chạy một số tính năng. Một điều cần lưu ý là chỉ đưa background mode vào app nếu nó thực sự cần thiết, tăng trải nhiệm người dùng. Một app được move vào background khi người dùng mở app khác lên hoặc lock screen và không sử dụng điện thoại nữa. Trong cả hai tình huống, người dùng sẽ nghĩ rằng app của bạn không cần làm việc gì nữa. Tiếp tục thực hiện các task sẽ chỉ làm tiêu tốn pin và tạo thói quen xấu là người dùng sẽ force close app của bạn. Trong bài viết này mình sẽ đề cập chủ yếu vào location update ở background.

Tracking user's location

Có một số cách để tracking vị trí người dùng ở background, phần lớn các cách đó không yêu cầu app phải chạy ở background liên tục.

The significant-change location service

Significant-change location service đây là cách tốt nhất để tracking user location nếu app của bạn không yêu cầu độ chính xác quá cao. Với dịch vụ này, vị trí nguòi dùng sẽ được update chỉ khi người dùng di chuyển một khoảng cách đáng kể. Nếu app bị suspended khi location update được system gởi về, system sẽ chuyển app của chúng ta về chế độ background để nhận update location mới. Nếu app đã bị terminated, hệ thống sẽ khởi động lại app một cách tự động để nhận update location. Dịch vụ này được apple giới thiệu từ iOS4 và chỉ có trên các device có sóng cellular.

Background location services

Bạn có thể enable location support từ các dịch vụ cho phép chạy background mode trong tab Capabilities ở Xcode. Việc enable chế độ này không có nghĩa là system sẽ ko suspended app của bạn, nó sẽ thông báo cho hệ thống rằng nên bật app của bạn lên khi có location update khi có dữ liệu location được ghi nhận. Vì vậy, key này cho phép app chạy ở background để nhận được các update về location khi có location mới.

Using the Standard Location Service in the Background

Bảng dưới đây sẽ list ra các API hỗ trợ background update. System sẽ gởi các location update đến app của chúng ta khi app chạy foreground, background hoặc suspended. Trong trường hợp app bị suspended, system sẽ khởi động app lên, gởi location update và chuyển app về trạng thái suspended sớm nhất có thể. Trong trường hợp app đang chạy ở background, chúng ta có thể thực hiện 1 số bước xử lý location mới. Khi location service được bật, hệ thống phải tốn năng lượng cho dịch vụ location chạy liên tục để lấy các dữ liệu location mới. Việc giữ service như vậy có thể làm pin tiêu hao nhanh, chúng ta nên stop location service khi nào không cần dùng đến nó nữa. Khi giữ location server chạy nền, chúng ta có thể config để system sẽ tự động quản lý location để tiết kiệm pin hơn bằng một số bước như sau:

  • Set pausesLocationUpdatesAutomatically property của location manager là true. Khi property này được set true thì Core Location sẽ tự động dừng location update khi có thể, như là người dùng không di chuyển.
  • Gán acctivityType, điều này cho phép location manager biết được khi nào nên pause location update một cách chính xác. Ví dụ một app dẫn dường, setting CLActivityTypeAutomotiveNavigation sẽ cho phép location manager tạm dừng location update chỉ khi người dùng không di chuyển một cách đáng kể trong 1 khoản thời gian.
  • Gọi method allowDeferredLocationUpdatesUntilTraveled:timeout: cho phép trì hoãn location update cho đến khi người dùng di chuyển 1 khoản cách nhất định hoặc sau 1 mốc thời gian.Khi location manager tạm dừng location update, 2 delegates sau sẽ được gọi locationManagerDidPauseLocationUpdates:, locationManagerDidResumeLocationUpdates: . Chúng ta có thể dùng 2 delegate này để điều chỉnh hành vi của app cho phù hợp với yêu cầu.

Tổng kết

Việc thực thiện background ở iOS rất hạn chế và chỉ hỗ trợ một số chức năng. Trong quá trình phát triển app chúng ta cần lựa chọn các giải pháp phù hợp với yêu cầu đặt ra cũng như follow theo quy chuẩn mà apple đã đặt ra. Các bạn có thể tham khảo thêm tại https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html