iOS9で位置情報を使う定期バックグラウンド処理が止まる
iOS9で位置情報を使う定期バックグラウンド処理を行い、自分の位置情報をサーバに情報をアップロードしようとしています。3点問題・疑問点があります。
- 位置情報更新の定期バックグランド処理がいつからか止まる原因は?(いつから何がきっかけで止まっているのか不明)
- AppDelegateのSingletonを使えばというコメントをいただいたが、位置情報定期バックグランド処理がいつからか止まる原因がSingletonを使っていないことに起因するのか不明。
- そもそも位置情報定期バッググランド処理の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をインポート
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")
}
}