

iOS9で位置情報を使う定期バックグラウンド処理を行い、自分の位置情報をサーバに情報をアップロードしようとしています。3点問題・疑問点があります。

  1. 位置情報更新の定期バックグランド処理がいつからか止まる原因は？（いつから何がきっかけで止まっているのか不明）
  2. AppDelegateのSingletonを使えばというコメントをいただいたが、位置情報定期バックグランド処理がいつからか止まる原因がSingletonを使っていないことに起因するのか不明。
  3. そもそも位置情報定期バッググランド処理のSingleton化のやり方がわかりません。  
func locationManager(manager: CLLocationManager, didUpdateToLocation
newLocation: CLLocation, fromLocation oldLocation: CLLocation){}  
のSingleton?コード方法がわかりません。

参考までに私が書いたプログラムを添付しておきます。必要がないと思われる関数などは適当に削除しています。  
すべての疑問に一度の回答でなくてもかまいません。部分的にもご存知の方、何卒ご教示お願いします。

<追記ですが、バックグランドで動かすために設定(+位置情報を使うための)した内容です>  
・CapabilityesのBackground ModesでLocation updatesをチェック  
・info.plistに  
NSLocationAlwaysUsageDescriptionの設定  
Required background modes -> Item 0 でApp registers for location updatesを設定  
・CoreLocation.frameworkをインポート

[code]

    import UIKit
    import CoreLocation
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
    
        var window: UIWindow?
    
        var keido: String!
        var ido:String!    
        var lm: CLLocationManager! = nil
        var longitude: CLLocationDegrees!
        var latitude: CLLocationDegrees!
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            longitude = CLLocationDegrees()
            latitude = CLLocationDegrees()
            keido = String(stringInterpolationSegment: longitude)
            ido = String(stringInterpolationSegment: latitude)
    
            lm = CLLocationManager()
            lm.delegate = self
            lm.requestAlwaysAuthorization()
            lm.desiredAccuracy = kCLLocationAccuracyHundredMeters // 100m
            lm.distanceFilter = 100.0 // 100m移動したら位置情報更新
            lm.pausesLocationUpdatesAutomatically = false // 更新頻度が低いと止まることを抑制(false)
            lm.startUpdatingLocation()
            return true
        }
    
        // 位置情報アップデート
        func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation){
            longitude = newLocation.coordinate.longitude
            latitude = newLocation.coordinate.latitude
            keido = String(stringInterpolationSegment: longitude)
            ido = String(stringInterpolationSegment: latitude)
            let myUrl:NSURL = NSURL(string: NSString(format:"http://(*mask*)/location/locationget.php?id=(mask)&longitude=%@&latitude=%@",String(stringInterpolationSegment: longitude),String(stringInterpolationSegment: latitude)) as String)!
            let myRequest:NSURLRequest  = NSURLRequest(URL: myUrl)
            NSURLConnection.sendAsynchronousRequest(myRequest, queue: NSOperationQueue.mainQueue(), completionHandler: self.getHttp)
        }
    
        func getHttp(res:NSURLResponse?,data:NSData?,error:NSError?){
            // 帰ってきたデータを文字列に変換.
            let myData:NSString = NSString(data: data!, encoding: NSUTF8StringEncoding)!
            NSLog(myData as String)
        }
    
        func locationManager(manager: CLLocationManager, didFailWithError error: NSError){
            NSLog("Error")
        }
    }
    
[/code]


CC BY-SA 3.0
2016-02-27T02:30:03.250
22583
2020-03-29T03:15:01.797
2020-03-29T03:15:01.797
19110
8593
question
swift
iOS9で位置情報を使う定期バックグラウンド処理が止まる


解決につながるかどうかわかりませんが、部分的にもということなので、回答の形で書かせていただきます。

_1\. 位置情報更新の定期バックグランド処理がいつからか止まる原因は？（いつから何がきっかけで止まっているのか不明）_  
様々な要因で位置情報更新の通知は停止します。詳しくはできるだけ公式のドキュメントを当たって調べてください。  
[位置情報とマップ
プログラミングガイド](https://developer.apple.com/jp/documentation/LocationAwarenessPG.pdf)  
[Location and Maps Programming
Guide](https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html)  
(日本語版のタイムスタンプはかなり古いので、できれば英語版を当たってください。)  
[iOSアプリケーション
プログラミングガイド](https://developer.apple.com/jp/documentation/iPhoneAppProgrammingGuide.pdf)  
[App Programming Guide for
iOS](https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html)  
(「バックグラウンド実行」に関して独立した章で説明されており、「ユーザの位置情報の追跡」についても説明されています。その他の章にも関連事項が記載されています。)

詳細なチェックリストは持ち合わせていないので、ざっくりとした記述になりますが、

  * バックグラウンドのアプリケーションはいつでもシステムから停止させられる可能性がある  
(標準位置情報サービスでは停止しているアプリケーションの起動まではやってくれません。)

  * 必要な宣言をしていれば、簡単には停止しないはずなので各種の設定を再度見直す必要がある
  * NSURLConnectionはバックグラウンドでの動作は保証されていない

と言ったところでしょうか。

2.と3.については、Singleton化とバックグラウンド実行については全く関係がないので、あなたが根拠にされているコメントの前後の文脈を示していただかないと、なんとも言えません。


CC BY-SA 3.0
2016-02-27T06:08:45.773
22590
2016-02-27T06:14:22.440
2016-02-27T06:14:22.440
13972
13972
22583
answer