2016-10-17 22 views
0

この質問に関連するアプリは、GPS座標と加速度計の読み取り値を含む高度な精度でユーザーの位置を追跡しますユーザーがスリープ・ボタンを押した場合でも、30分の時間が必要です。アプリでバックグラウンドでGPSを有効にしたり、フォアグラウンドまたはバックグラウンドでアプリを使用して位置を読み取ることはできません

この目的のために、plistファイルとapp機能の設定は、常にナビゲーションアクセスの理由を反映し、ロケーションベースのサービスの提供のためのバックグラウンドプロセスを有効にするように変更されました。

実行時にアプリケーションにGPSアクセス権があるかどうかを確認し、許可されている場合は、このビューコントローラ(次のコードを含むビューコントローラ)をアクティブにするとGPS /ナビゲーションアイコンが表示されますiPhone。

問題は、以下に示す4つの「印刷」コマンドのいずれも印刷メッセージを生成しないため、「newLocation」および「myLocation」変数はどちらもデータを生成しません。このコードが、最初の文で概説された目的を果たすことに遠隔に近い場合は、「どのように修正できますか?」という質問があります。これがゴールを達成するための悪い方法である場合、より良い答えは、これがどのように行われるべきかを説明するだろう。

import UIKit 
import CoreMotion 
import MapKit 
import CoreLocation 

class ActiveSession: UIViewController, CLLocationManagerDelegate { 
     lazy var locationManager: CLLocationManager! = { 
     let manager = CLLocationManager() 
     manager.desiredAccuracy = kCLLocationAccuracyBest 
     manager.delegate = self 
     return manager 
    }() 

    func locationManager(_manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) { 
     let myLocation:CLLocationCoordinate2D=CLLocationCoordinate2DMake(oldLocation.coordinate.latitude, oldLocation.coordinate.longitude) 
     print(myLocation) 

     if UIApplication.shared.applicationState == .active { 
      print("at least it's active at all") 
     } else { 
      print(newLocation) 
      print("it's active when the app isn't") 
     } 
    } 

    func getPermission() { 
     locationManager = CLLocationManager() 

     switch CLLocationManager.authorizationStatus() { 
     case .denied, .restricted: 
      return 
     case .notDetermined: 
      locationManager!.requestAlwaysAuthorization() 
      break 
     case .authorizedAlways, .authorizedWhenInUse: 
      break 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.getPermission() 
     locationManager = CLLocationManager() 
     locationManager!.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager?.startUpdatingLocation() 
    } 
} 
+1

ロケーションマネージャの「allowsBackgroundLocationUpdates」プロパティを忘れないでください。 – ohr

+1

私は、ビューコントローラから位置マネージャを移動して、AppDelegateまたはそれ自身のオブジェクトにシングルトンまたはAppDelegateで保持されている参照を持つオブジェクトのいずれかを配置することをお勧めします。また、 'getPermission'コードを単純化することができます。単に' requestAlwaysAuthorization'を呼び出します。もしパーミッションがまだ与えられていない、または拒否されていなければ、パーミッションを要求します。ダイアログにすでに回答があった場合は何も表示されません。 – Paulw11

答えて

0

さらに指摘されているように、追加の許可が必要でした。次の行は、この省略を是正するために怠惰なlocationManager初期化子に追加されました:

manager.allowsBackgroundLocationUpdates = true 

ノアとPaulw11のアドバイスに従い、getPermission機能が削除された、およびライン:

locationManager = CLLocationManager() 

をから削除されましたviewDidLoad、多くの冗長性が存在するためです。これだけでは問題を解決するが、そうのように、最近の地図データは、配列に格納されていたようにlocationManagerのFUNCにロジックを追加しませんでした:

let annotation = MKPointAnnotation() 
annotation.coordinate = newLocation.coordinate  
locations.append(annotation) 
while locations.count > 100 { 
    let annotationToRemove = locations.first! 
    locations.remove(at: 0) 
} 

がコードを作業しました。このソリューションは、こちらのコードから派生した:https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial (おかげで、レイ)

最終的にはコードは、クラスから何かを削除するか、appdelegateで何かを実装せず、フォアグラウンドとバックグラウンドで機能しました。

+1

バッテリの寿命を延ばすために遅延位置更新を許可することを検討してください。 https://developer.apple.com/reference/corelocation/cllocationmanager/1620547-allowdeferredlocationupdates – MirekE

+0

このコードに関連付けられているapp関数では、時間に関するユーザーの位置を30分以上の時間間隔で正確に記録する必要があります。私がドキュメンテーションを誤解しない限り、その情報は遅延アップデートによって利用できません。30分の録画時間は、結果として生じるバッテリの消耗を許容できるほど短くすることを前提としています。 –

+1

これはタイムスタンプを含む正確なデータを提供しますが、唯一の違いは、アプリの外で記録され、(あなたの指示に基づいて)しばらくの間あなたにダンプされるということです。 – MirekE

1

あなたが3ヶ所、怠惰locationManager初期化子、getPermission、およびviewDidLoadに - およびこれらの後者の二つの新しいCLLocationManagerのインスタンスを作成している、あなたはどちらの所望の精度もデリゲートを設定しています。 locationManager = CLLocationManager()行を削除すると、より良い結果が得られます。

関連する問題