重要なロケーションの変更監視を使用しています。シミュレータでコードを実行し、Freewayオプションをチェックすると、私は定期的な位置更新を取得します。これらの更新を取得してNSUserDefaultsに保存し、10秒ごとに更新するようにしたので、更新があるかどうか確認できます。私が実際のデバイスでアプリを実行すると、私はゼロ更新を得る。私は携帯電話をポケットに入れて、80km以上旅行し、2都市にいた。ゼロ更新。私は何かを台無しにしたかどうかは分かりません。私はコードを添付しています。コードはコピー貼り付けですので、自由にテストしてください。ストーリーボードでTableViewControllerを使用し、セルIDをIDに設定してください。私は何が欠けていますか?重要なロケーションの変更がデバイスでトリガーされない
編集:リンゴのドキュメントでこれを見つけた私は、iPhone上で5
するinfo.plistをテストしています。 locationManager
を別様に作成する必要がありますか? willFinishLaunchingWithOptions:または アプリケーション:didFinishLaunchingWithOptions:メソッドが UIApplicationLaunchOptionsLocationKeyキーが含まれているアプリがあるため、位置更新のリニューアルされた場合
、打ち上げ のオプションは、あなたの アプリケーションに渡される辞書です。そのキーが存在すると、新しい場所データがアプリに配信されるのを待っていることが通知されます。 は、そのデータを取得するには、新しいCLLocationManagerオブジェクト を作成して、あなたの アプリの終了に先立って実行していた場所のサービスを再起動する必要があります。これらのサービスを再起動すると、位置 は、保留中のすべてのロケーション更新をそのデリゲートに配信します。
EDIT2:
これに基づき、場所は、少なくともすべての15分を更新する必要があります。私のコードのバグが確認されました。
GPSレベルの精度はアプリの重要ではなく、あなたが 連続追跡を必要としない場合は、大幅な変更位置 サービスを使用することができます。あなたはそれを停止するまで、それは継続的に 実行し、それは何の場所の変更が生じていない場合でも、15分ごとに少なくとも システム、アプリを目覚めるので、あなたは正しく大幅変更位置 サービスを使用することが重要だし、それ。
edit3:このコードをAppDelegate didFinishLaunchingWithOptions:
に追加して、アプリが起動するかどうかを確認します。それは目を覚まさない - 私はテーブルビューで200 200エントリを参照してください。怪しいものが起こっている。
if let options = launchOptions {
print("options")
if (launchOptions![UIApplicationLaunchOptionsLocationKey] != nil){
locationManager.startUpdatingLocation()
self.lat.append(Double(200))
self.lon.append(Double(200))
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}
CODE: // AppDelegate:
import UIKit
import CoreLocation
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {
var lat:[CLLocationDegrees]!
var lon:[CLLocationDegrees]!
var times:[String]!
var distances: [String]!
var window: UIWindow?
var locationManager: CLLocationManager!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
locationManager=CLLocationManager()
locationManager.delegate=self
locationManager.requestAlwaysAuthorization()
let isFirstLaunch = NSUserDefaults.standardUserDefaults().objectForKey("lat")
if isFirstLaunch == nil{
lat = [CLLocationDegrees]()
lon = [CLLocationDegrees]()
times = [String]()
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}else{
lat = NSUserDefaults.standardUserDefaults().arrayForKey("lat") as! [CLLocationDegrees]
lon = NSUserDefaults.standardUserDefaults().arrayForKey("lon") as! [CLLocationDegrees]
times = NSUserDefaults.standardUserDefaults().objectForKey("time") as! [String]
// distances = NSUserDefaults.standardUserDefaults().objectForKey("distance") as! [String]
}
return true
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
print("location updated")
self.lat.append(locations[0].coordinate.latitude)
self.lon.append(locations[0].coordinate.longitude)
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
print("Location: \(locations[0].coordinate.latitude) \(locations[0].coordinate.longitude)")
}
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
print("did change AS")
switch status {
case .AuthorizedWhenInUse:
locationManager.startMonitoringSignificantLocationChanges()
case .AuthorizedAlways:
print("to always")
locationManager.startMonitoringSignificantLocationChanges()
if lat.count==0{
self.lat.append((locationManager.location?.coordinate.latitude)!)
self.lon.append((locationManager.location?.coordinate.longitude)!)
self.times.append(NSDateFormatter.localizedStringFromDate(NSDate(), dateStyle: .NoStyle, timeStyle: .ShortStyle))
NSUserDefaults.standardUserDefaults().setObject(lat, forKey: "lat")
NSUserDefaults.standardUserDefaults().setObject(lon, forKey: "lon")
NSUserDefaults.standardUserDefaults().setObject(times, forKey: "time")
}
// locationManager.startUpdatingLocation()
break
default:
locationManager.stopMonitoringSignificantLocationChanges()
break
}
}
}
//ビューコントローラ
import UIKit
class TableViewController: UITableViewController {
let appDel = UIApplication.sharedApplication().delegate as! AppDelegate
override func viewDidLoad() {
super.viewDidLoad()
NSTimer.scheduledTimerWithTimeInterval(10, target: self, selector: "updateTableView", userInfo: nil, repeats: true)
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return appDel.lon.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("ID", forIndexPath: indexPath)
cell.textLabel?.text = "\(appDel.lat[indexPath.row]) \(appDel.lon[indexPath.row]) \(appDel.times[indexPath.row])"
cell.textLabel?.font = UIFont.systemFontOfSize(9)
return cell
}
func updateTableView(){
self.tableView.reloadData()
}
}
実際に承認のリクエストが表示されますか?そうでなければ、plistにNSLocationAlwaysUsageDescriptionがありますか? –
はいリクエストがポップアウトします。また、NSLocationAlwaysUsageDescription文字列はinfo.plistに設定されています。 – brumbrum
ホームボタンを2回タップしてアプリを殺して、アプリをスワップアップしていますか?そうした方法でアプリを削除すると、重要な変更サービスがバックグラウンドで実行されることはありません。 – Rob