[swift] バックグラウンドで位置情報を取得
目次
バックグラウンドで位置情報を取得
検証環境
xcode Version 7.3
iOS9.0(実機)
Location UpdateをON
xcodeの「capability」->「background modes」->「Location Update」をONにする

*自動でInfo.plistにも「Required device capabilities」->「location-services」が入る
plistにgps追加
Info.plistにも「Required device capabilities」->「gps」を追加
plistにdescription追加
Info.plistのInformation Property ListにNSLocationAlwaysUsageDescriptionを追加して、許可を求めるダイアログに表示する文字列を入力:「このアプリは位置情報を利用します」など
サンプルコード:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate,CLLocationManagerDelegate {
var window: UIWindow?
var backgroundTaskID : UIBackgroundTaskIdentifier = 0 //実機で実行するために必要なコード
var lm: CLLocationManager! = nil
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
lm = CLLocationManager()
lm.delegate = self
lm.requestAlwaysAuthorization() //バックグラウンドで位置取得するのであればalwaysを選択しておく
lm.allowsBackgroundLocationUpdates = true //位置情報をバックグラウンドで取得する iOS9より
lm.pausesLocationUpdatesAutomatically = false //trueにするとバックグラウンドに入ってから15分でstopするので注意。pauseするとupdate通知は受け取れない
lm.lm.distanceFilter = 100.00 //100m移動するとlocationUpdate
lm.activityType = CLActivityType.Fitness //pausesLocationUpdatesAutomaticallyがtrueの時の判断材料。通常は不要
lm.desiredAccuracy = kCLLocationAccuracyBest //最高精度->その他オプションはこちら参照
//lm.allowDeferredLocationUpdatesUntilTraveled(100.0, timeout: 5*60) //LocationをUpdateする距離と時間の間隔の両方を設定:例:100m進むか、5分経過後にlocationUpdate
lm.startUpdatingLocation() //位置情報取得スタート
return true
}
func applicationWillResignActive(application: UIApplication) {
self.backgroundTaskID = application.beginBackgroundTaskWithExpirationHandler(){
[weak self] in
application.endBackgroundTask((self?.backgroundTaskID)!)
self?.backgroundTaskID = UIBackgroundTaskInvalid
}
}
func applicationDidEnterBackground(application: UIApplication) {
print("applicationDidEnterBackground")
}
func applicationWillEnterForeground(application: UIApplication) {
print("applicationWillEnterForeground")
}
// MARK: locationManagerDelegate/////////////////////////////////////////
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let newLocation = locations.last
let latitude = newLocation!.coordinate.latitude
let longitude = newLocation!.coordinate.longitude
.....other update method
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("Error: %@",error)
}
}
バッテリー消費量
バックグラウンドでも位置情報を取得できるようになるとバッテリー消費が激しくなる
*移動しているとiPhoneもかなり温かくなる
distanceFilterで判定距離を長くし、desiredAccuracyで位置精度を低くしたりと工夫が必要
lm.allowDeferredLocationUpdatesUntilTraveledで取得時間を制御してもよい