[swift] バックグラウンドで位置情報を取得

目次

バックグラウンドで位置情報を取得

検証環境

xcode Version 7.3
iOS9.0(実機)

Location UpdateをON

xcodeの「capability」->「background modes」->「Location Update」をONにする
ss
*自動で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で取得時間を制御してもよい

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です