2016-06-01 20 views
3

アプリがバックグラウンドにある場合や画面がロックされている場合でも、ユーザーの場所を追跡するアプリを作成しました。私はiOS 9.2のiPhone 5sデバイスでそれをテストしたところ、すべてうまくいきました。 iOS 9.3.1にアップデートした後、アプリはバックグラウンドで約10分間実行され、その後アプリは自動的に停止することに気付きました。私はこの問題の修正があることを願って、昨日iOS 9.3.2に電話を更新しました。しかし、この問題は依然として続く。iOS 9.3.1以降にアップデートした後で、iphoneアプリがバックグラウンドで動作しない

私は

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 
    private static var backgroundService : BackgroundService? = nil 
    var startServices : Bool = false 
    public static var bgTask = UIBackgroundTaskIdentifier() 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
    print("didFinishLaunchingWithOptions") 

    AppDelegate.bgTask = beginBackgroundUpdateTask() 
    startBackgroundService() 
    return true 
    } 

    internal func startBackgroundService(){ 
    if AppDelegate.backgroundService == nil{ 
     AppDelegate.backgroundService = BackgroundService.getBackgroundService() 
    } 
    AppDelegate.backgroundService!.startService(self) 
    } 

    internal func stopBackgroundService(){ 
    AppDelegate.backgroundService!.stopService() 
    } 

    func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier { 
    return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({}) 
    } 

    func applicationDidEnterBackground(application: UIApplication) { 
    self.startBackgroundService() 
    print("applicationDidEnterBackground") 
    } 
} 

AppDelegateクラスに次のコードを持っているアプリのバックグラウンド更新と位置サービスは、iPhone上のアプリのために有効になっています。背景モードが有効になり、Info.plistにその他の必要な権限が追加されました。

問題は、iOS 9.2搭載の別の携帯電話でコードをテストしても問題なく動作しています。 2番目の携帯電話をiOS 9.3.2にアップデートした後、同じ問題が発生しました。この問題の原因となっている9.3に変更がありましたか?私は、変更履歴とドキュメントを調べたが、何か有用なものを見つけることができなかった。誰も似たような問題に遭遇しましたか? iOS 9.3でアプリが動作するようにするために必要な変更はありますか?あなたのLocationManagerあなたはしかしallowsBackgroundLocationUpdates使用することができますから、あなたのデータへの常時アクセスを持っているしたい場合は

+1

アップルがバックグラウンド処理を強化していると思う。 'backgroundTaskWithExpirationHandler'を使うことは、バックグラウンドで位置更新を得る正しい方法ではありません。 – Paulw11

+0

@ Paulw11 - バックグラウンドでアップデートを入手する正しい方法は何ですか?私はiOSの開発には新しく、backgroundTaskWithExpirationHandlerはバックグラウンドで動作させるための唯一の方法でした。 – Joyson

+0

ロケーションの更新に背景モードを使用していますか? –

答えて

2

最終的に問題を解決することができました。提案通りにlocationManager.allowsBackgroundLocationUpdates = trueを追加した後も、問題は解決しません。それはバックグラウンドで長時間実行されましたが、特定のポイントの後、アプリは位置データの取得を停止しました。私はこの行を追加する

locationManager.pausesLocationUpdatesAutomatically = false 

を設定し、この出くわしもう少しオンラインで検索した後

は、問題を解決し、場所フェッチが突然停止することなく、バックグラウンドで動作します。デフォルト値はtrueです。 @Ahmedと@Chajmz allowsBackgroundLocationUpdatesにより述べたよう

は、iOS 9で必要以降

IOSの9以降では、関係なく、デプロイメント・ターゲットの、またにロケーションマネージャオブジェクトのallowsBackgroundLocationUpdatesプロパティを設定する必要がありますされていますバックグラウンドの位置更新を受信するためにYESを選択します。デフォルトでは、このプロパティはNOです。アプリがバックグラウンドでの位置情報の更新を積極的に要求するまでは、この方法のままにしておく必要があります。マニュアル位置データを犠牲にすることなく、ターゲット・デバイスのバッテリ寿命を向上させることができる更新を一時停止する位置管理を許可約 CLLocationManager - pausesLocationUpdatesAutomatically

1として

。このプロパティがtrueに設定されていると、位置情報が変更されない可能性があるときに、ロケーションマネージャは更新を一時停止し(適切なハードウェアの電源を落とす)たとえば、ナビゲーションアプリを使用している間にユーザーが食べ物を停止した場合、ロケーションマネージャは一定期間更新を一時停止することがあります。

このプロパティのデフォルト値はtrueです。

+1

@Nilesh - locationManagerを初期化しているところで、この2行を追加する必要があります。 – Joyson

+0

ありがとう@Joyson。 – Nilesh

0

iOSの9ので、あなたがバックグラウンドであなたのLocationManagerを停止する場合は、からそれを再起動することはできません、backgroundTaskWithExpirationHandlerの使用を避けることができますバックグラウンド。

if #available(iOS 9.0, *) { 
    manager.allowsBackgroundLocationUpdates = true 
} else { 
     // Fallback on earlier versions 
} 
+0

もう一度やり直すことができますフォアグラウンドで重要なロケーション更新を開始したので、 – Paulw11

関連する問題