Background Mode iOS

1. Overview

  • Năm 2010 với iOS 4 thì Apple đã giới thiệu về multitasking
  • Các developer hay người dùng thường bị nhầm lẫn nó như hệ đa nhiệm của iOS. Apple chỉ cho phép ứng dụng của bạn có thể chạy ở background mode với một số trường hợp cụ thể với mục đích cải thiện trải nghiệm người dùng và đồng thời vẫn giữ mục đích tiết kiệm pin
  • Một số trường hợp cụ thể có thể sử dụng background mode đó bao gồm
    • Audio and airplay
    • Location updates
    • Voice over ip
    • Newsstand download
    • External accessory communication
    • Uses bluetooth LE accessory
    • Background fetch
    • Remote notifications

Tham khảo: Develop Apple

2. Bắt đầu

  • Để enable background mode các bạn có thể tham khảo hình vẽ dưới đây

    • Chọn project
    • Chọn target
    • Chọn Capabilities
    • Bật chế độ background

Picture1.png

  • Như bên trên có đề cập Apple giới hạn một số trường hợp cụ thể có thể sử dụng background mode (tham khảo hình vẽ)

    • Play audio: app của bạn có thể play/record khi về background
    • Receive location updates: app vẫn tiếp tục callback khi location thay đổi
    • Background – fetch: update nội dung mới nhất theo iOS schedule
  • Để bắt đầu các bạn có thể tải project tại Start Project

  • Trước khi chạy project các bạn cần set development team (tham khảo hình ảnh)

Picture1.png

  • Kết quả run project sẽ gồm 4 tab

Picture1.png

2.1. Playing audio

  • Đầu tiên bắt đầu với audio with background mode. Có nhiều cách để có thể play một file audio và một trong số chúng là cần phải implementing callback để cung cấp dữ liệu audio để play.
  • Nếu như bạn muốn play audio từ data streaming thì bạn cần kết nối network và cung cấp audio data tại callback
  • Khi background mode activate thì iOS sẽ tiếp tục có callback even nếu như app hiện tại không active. Khi đó ở chế độ background thì âm thanh hầu như là tự động, bạn chỉ cần xử lý nó một cách hợp lý
  • Trong mục này chúng ta chỉ cần test ở background khi chưa enable background mode thì không play và khi enable background mode thì play
  • App sử dụng AVQueuePlayer để đẩy các audio data vào queue và play chúng. View controller sẽ giám sát currentItem để update. Trong app này start từ file incompetech.com. Khi app active, music title label sẽ được show và khi ở background mode thì print ra console.

Picture1.png

  • Run project và click vào play -> app play audio. Để test background thì bạn hãy ấn home, khi đó ứng dụng được chuyển qua chế độ background, lúc này app sẽ stop music.

  • Tiếp theo để có thể chạy được background thì bạn cần enable audio in background mode. Tham khảo hình ảnh sau:

    • Project navigator
    • TheBackgrounder target
    • Capabilities tab
    • Background mode
    • Check audio, airplay and picture in picture

Picture1.png

  • Build, run and press home button để kiểm tra

2.2. Receiving location updates

  • Khi ở background mode, app của bạn vẫn có thể nhập được location delegate với method updatedLocation mặc dù app của bạn có chuyển sang background mode.
  • Tab thứ 2 của ứng dụng cho vấn đề location update, bạn có thể mở LocationViewController.swift để xem. Trong controller này bạn sẽ thấy CLLocationManager để nhận thông tin location sau khi bạn khởi tạo và cấu hình cho nó. Khi location được update thì nó sẽ pin map. Khi chuyển sang background mode thì log ra console.
  • Một điều quan trọng ở đây là requestAlwaysAuthorization() trong CLLocationManager. Nó được yêu cầu từ iOS 8, show popup để yêu cầu quyền sử dụng location.

Picture1.png

  • Bạn cần add Privacy – Location always usage description

Picture1.png

2.3. Chúng ta cùng nói một chút về việc thực hiện một task lớn

  • Apple có cung cấp cho chúng ta NSURLSession
  • Chúng ta cùng follow WhateverViewController
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
//Đươc sử dụng để định danh cho request khi chạy ỏ background

func registerBackgroundTask() {
  backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
    self?.endBackgroundTask()
  }
  assert(backgroundTask != UIBackgroundTaskInvalid)
}
 
func endBackgroundTask() {
  print("Background task ended.")
  UIApplication.shared.endBackgroundTask(backgroundTask)
  backgroundTask = UIBackgroundTaskInvalid
}
  • Register để thông báo với iOS rằng tôi cần thời gian để hoàn thành task và thực hiện nó trong background. Khi đó, khi chuyển sang background mode thì CPU sẽ dành thời gian cho task của bạn mãi cho tới khi endBackgroundTask() được call.

Tóm tắt: Trên đây tôi đã giới thiệu về background mode và cách có thể sử dụng background mode đề thực hiện task trong một số trường hợp cụ thể. Các bạn có thể tham khảo project tại Done

All Rights Reserved