2016-08-02 32 views
2

私は10分ごとに自分の位置を取得し、CoreDataで救済するコードを開発しています。私がconectavoアプリをxcodeにバックグラウンドで歩いているときに、サービスが実行されているログを見ることができませんが、私が通りを歩いて行くとき、彼は単に保存しなかったり、バックグラウンドでの位置が正しく動作しない

これは、このfunction.Seeがコードデータに保存しないはずです私のコードの一部です:私は解決できない私のコードで

var saveLocationInterval = 60.0 

func applicationDidEnterBackground(application: UIApplication) { 
     UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler(nil) 
     self.timer = NSTimer.scheduledTimerWithTimeInterval(saveLocationInterval, target: self, selector: #selector(AppDelegate.saveLocation), userInfo: nil, repeats: true) 
     NSRunLoop.currentRunLoop().addTimer(self.timer, forMode: NSRunLoopCommonModes) 

     locationController.startUpdatingLocation() 
    } 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     saveLocation() 
    } 

func saveLocation(){ 
     print("======") 
     let logUser = NSEntityDescription.insertNewObjectForEntityForName("LOG_GPS", inManagedObjectContext: self.managedObjectContext) as! LOG_GPS 

     if locationController.location == nil{ 
      logUser.latitude = "" 
      logUser.longitude = "" 
     } else { 
      logUser.latitude = "\(locationController.location!.coordinate.latitude)" 
      logUser.longitude = "\(locationController.location!.coordinate.longitude)" 
     } 

     logUser.velocidade = userSpeed > 0 ? Int(userSpeed) : 0 
     logUser.address = "\(userSpeed)" 

     if _usuario.chave != nil { 
      logUser.chave_usuario = "\(_usuario.chave!)" 
     } 
     if _empresa.chave != nil { 
      logUser.chave_licenca = "\(_empresa.chave!)" 
     } 

     print("localizaçao salva no bd \(logUser.latitude)") 
     let date = NSDate() 
     let dateFormatter = NSDateFormatter() 
     dateFormatter.dateFormat = "dd/MM/yy HH:mm:ss" 
     let dateString = dateFormatter.stringFromDate(date) 
     logUser.data = dateString 
     do { 
      try self.managedObjectContext.save() 
     } catch { 
     } 
    } 

もう一つの主要なエラーがユーザーの速度です。

func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) { 
     var speed: CLLocationSpeed = CLLocationSpeed() 
     speed = newLocation.speed 
     print(speed * 3.6) 
     userSpeed = speed * 3.6 
    } 

this is my background mode

+0

UIBackgroundModesを設定しましたか? –

+0

はい、私はこれを行います! – breno

+0

私はスクリーンショットを投稿 – breno

答えて

4

解決策1

:メソッド低いで、私は変数にあなたの速度を保存して、しかし、これは私が常に負の値を返すことであるCoreDataを保存しようとしています

Info.plistに、アプリがバックグラウンドの場所を必要とする理由を説明するキーが必要です。

Info.plistに移動し、Bundle Versionというキーを見つけて、その上にマウスを置いたときに表示される+をクリックします。次に、キーNSLocationAlwaysUsageDescriptionを追加し、それを文字列に設定し、「友人とあなたの場所を共有するためにあなたの場所をバックグラウンドで必要とする」のように、説明を希望する値を設定します。

これでアプリが機能します。そうでない場合は....

解決策2物理デバイス上のアプリケーションが必要とするので、iOSの9で

が、Appleはそれを作った(可能性が高いソリューションあなたは何をやっている知っている場合)バックグラウンドで位置情報サービスを実行する特別なコード行。変更は広く報告されていませんでしたが、私はこれをもう少し前に把握することができました。

if #available(iOS 9.0, *) { 
    locationManager.allowsBackgroundLocationUpdates = true 
} else { 
    // You don't need anything else on earlier versions. 
} 

これは(神秘的に十分に)可能性が高くなります...あなたのメインの位置追跡View ControllerのViewDidLoadプットで

:ここでは、再び物理デバイスのバックグラウンドで作業ロケーションサービスを取得するために何をする必要があるかですあなたの問題を解決するために必要なのはすべてです。

+0

ありがとう、私はこれをして、今私はいくつかのテストを行います。それが働くなら私はここに住んでいます。とにかくありがとう。 – breno

+0

@breno素晴らしいそれが動作するかどうかを教えてください。問題が解決したら、チェックマークを必ず押してください。 – owlswipe

+0

私に任せてください。ありがとう= D – breno

関連する問題