2017-11-11 11 views
0

私はほとんど位置ベースのナビゲーションアプリを作っています。アラートを受信すると音が鳴ります。また、Googleマップに行くとバックグラウンドで開いたままにしておくことで、長時間または長時間旅行した後、アプリに戻り、途中で中断した部分を拾うことができます。しかし、私はLocation UsageLocation Always Usageが定義され要求されているにもかかわらず、これは動作しません。バックグラウンドに入ると、Xcodeデバッガでサーバーからの指定されたJSONの一部が受信されたことがわかりますが、サウンドは再生されません。また、ユーザーが十分に長くなっている場合、座標がfunc locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])からコンソールに出力されている場合でも、アプリは終了して、ユーザーを最初のView Controllerに戻します。どうすればそれを止めることができますか?私は他のアプリがバックグラウンドで開かれているのを見て、「[このアプリはあなたの所在地を使用しています]」という青いステータスバーをiOSに表示します。私のアプリが180秒以上開いたままになることができない場合、その現在のデータを保存して、ユーザーがどこで中断したかを再開できるようにするにはどうすればよいですか?バックグラウンドでの位置の更新は、バックグラウンドで実行されたアプリを維持しません

var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid 
var locationManager = CLLocationManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 

    navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 
    mapView.showsUserLocation = true 
    mapView.delegate = self 

    if let userLocation = mapView.userLocation.location { // because sometimes there is no coordinate and it will unwrap nil. 
     mapView.centerCoordinate = userLocation.coordinate 
     let region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 9484.1, 9484.1) 
     mapView.setRegion(region, animated: true) 
    } 

    UIApplication.shared.isIdleTimerDisabled = true 

    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestAlwaysAuthorization() 

} 

func mapView(_ mapView: MKMapView, didUpdate: MKUserLocation) { 
    let userLocation = mapView.userLocation 
    mapView.centerCoordinate = userLocation.location!.coordinate 
    //let region = MKCoordinateRegionMakeWithDistance(frontedUserLocation, 1855, 1855) 
    let region = MKCoordinateRegionMakeWithDistance(mapView.centerCoordinate, 9484.1, 9484.1) 
    mapView.setRegion(region, animated: true) 
} 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    guard let mostRecentLocation = locations.last else { 
     return 
    } 

    // Add another annotation to the map. 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = mostRecentLocation.coordinate 

    // Also add to our map so we can remove old values later 

    // Remove values if the array is too big 

    if UIApplication.shared.applicationState == .active { 

    } else { 
     print("App is backgrounded. New location is %@", mostRecentLocation) 
     print("Background time remaining = \(UIApplication.shared.backgroundTimeRemaining) seconds") 
     if (UIApplication.shared.backgroundTimeRemaining < 175.2) { 
      print("Time low. Re-registering...") 
      locationManager.stopUpdatingLocation() 
      locationManager.startUpdatingLocation() 
      self.registerBackgroundTask() 
     } 
    } 
} 

/*func operate() { 
    //call endBackgroundTask() on completion.. 
    switch UIApplication.shared.applicationState { 
    case .active: 
     print("App is active.") 
    case .background: 
     print("App is in background.") 
     print("Background time remaining = \(UIApplication.shared.backgroundTimeRemaining) seconds") 
     if (UIApplication.shared.backgroundTimeRemaining < 175.2) { 
      print("Time low. Re-registering...") 
      self.registerBackgroundTask() 
     } 
    case .inactive: 
     endBackgroundTask() 
     self.registerBackgroundTask() 
     break 
    } 
}*/ 

func updateCoords() { 
    let updateCoordinates = CloudOperation() // edit this to accept a different parameter 
    let userLocation = self.mapView.userLocation.location!.coordinate 
    updateCoordinates.latit = userLocation.latitude 
    updateCoordinates.longi = userLocation.longitude 
    locationManager.allowsBackgroundLocationUpdates = true 
    locationManager.pausesLocationUpdatesAutomatically = false 
    locationManager.startUpdatingLocation() 

    /*backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in 
     self?.endBackgroundTask() 
    } 
    assert(backgroundTask != UIBackgroundTaskInvalid)*/ 

    //self.registerBackgroundTask() 
    print("Trying to update...") 

    dump(self.phase) 
} 

ありがとう!

Capabilities Capabilities 2

+0

あなたはこれがiPhone 7上で動作しますあなたの場所のマネージャー – Paulw11

答えて

1

あなたCLLocationManagerにバックグラウンドモードが有効になっていることを確認してください:

locationManager.allowsBackgroundLocationUpdates = true 
+0

を設定するコードを表示する必要があり、 iPhone 6ではiOS 10では使用できません。 –

関連する問題