WatchKitによって呼び出されたバックグラウンドで位置情報サービスが機能しない

ウェル

私のAppleWatchアプリはいくつかのデータを必要とし、対応するiPhoneアプリからそれを要求します。リクエストを満たすには、iPhoneアプリにユーザーの場所が必要です。実際のAppleWatchを受信して​​テストした後、バックグラウンドで実行しているときにiPhoneアプリが位置情報の更新を受信しないことがわかりました。iPhoneアプリがフォアグラウンドでアクティブになっている場合は、問題なく動作します。シミュレーターを使用すると、どちらの場合も機能しました。

どちらの場合(アクティブおよびバックグラウンド)でも、WatchKit拡張機能はiPhoneアプリを正常に呼び出して起動し、iPhoneアプリでstartUpdatingLocationが呼び出されるまでずっと続きます。ただし、アプリがバックグラウンドで実行されている場合、didUpdateLocationsは呼び出されません。

requestAlwaysAuthorizationとrequestWhenInUseAuthorizationを試してみました。変わりはない。また、機能内で「ロケーション更新」バックグラウンドモードをアクティブにしました。しかし、ここでも違いはありません。

他の誰かが同じ問題に直面し、バックグラウンドでも場所を受け取る方法を見つけましたか?

ここにいくつかのコードがあります。まず、認証が必要かどうかを確認します。

// iOS 8 check to avoid crash on older iOS
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
    {
        [self requestLocationAlwaysAuthorization];
    }
    else
    {
        [self runLocationUpdate];
    }

ここで、適切なLocationManagerの権限を確認します。

- (void)requestLocationAlwaysAuthorization
{
CLAuthorizationStatus currentAuthStatus = [CLLocationManager authorizationStatus];

if (currentAuthStatus == kCLAuthorizationStatusDenied)
{
    //request user to change setting
}
else if (currentAuthStatus == kCLAuthorizationStatusRestricted)
{
    //request user to change setting
}
else if (currentAuthStatus == kCLAuthorizationStatusNotDetermined)
{
    [self.locationManager requestAlwaysAuthorization];

    [self runLocationUpdate];
}
else if (currentAuthStatus == kCLAuthorizationStatusAuthorizedWhenInUse)
{
    //maybe when in use is also enough?
    [self runLocationUpdate];
}
else if (currentAuthStatus == kCLAuthorizationStatusAuthorizedAlways)
{
    //all ok
    [self runLocationUpdate];
}

}

ここでは、startUpdatingLocationの呼び出しです。didUpdateLocationsデリゲートは、iPhoneアプリがアクティブな場合にのみ呼び出されます。

-(void)runLocationUpdate
{
    [self.locationManager startUpdatingLocation];
}
rmp

チェックして注意する3つのこと:

  1. のようなロケーション権限[self.locationManager requestAlwaysAuthorization];は、OSによって一度だけ確認されます。すでに許可をリクエストしている場合は、レベルに関係なく、OSはユーザーにリクエストを表示しません。OSはリクエストを渡すだけで、アクセス許可レベルはそのままになります。OSがユーザーにリクエストを表示することを保証できるのは、が[CLLocationManager authorizationStatus]返された場合のみですkCLAuthorizationStatusNotDeterminedそれ以外の場合は、アラートまたは他の形式のUI表示を表示して、手動で許可を要求する必要があります。また、アプリを削除して再インストールしても、OSはリクエストがすでに表示されているかどうかを保持することに注意してください。したがって、テストするには、シミュレータのコンテンツまたはiPhoneのロケーションプライバシーをリセットする必要があります。

  2. NSLocationAlwaysUsageDescriptionANDのplistキーが追加されていることを確認NSLocationWhenInUseUsageDescriptionしてください。これをplistに追加しない場合、OSはロケーション許可要求を無視します。

  3. requestAlwaysAuthorization電話アプリがバックグラウンドにあるときに(時計アプリの拡張機能ではなく)電話から位置データを取得するために使用する場合は、[プロジェクト]> [ターゲット]> [機能]でバックグラウンドモードの位置更新に登録する必要もあります。

更新バックグラウンドタスクを使用して、バックグラウンドでアプリが応答する時間を与えます。このようなもの:

-(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *replyInfo))reply{

    UIApplication *app = [UIApplication sharedApplication];

    UIBackgroundTaskIdentifier bgTask __block = [app beginBackgroundTaskWithName:@"watchAppRequest" expirationHandler:^{

        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;

    }];

//make your calls here to your tasks, when finished, send the reply then terminate the background task

//send reply back to watch
reply(replyInfo);

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [app endBackgroundTask:bgTask];
        bgTask=UIBackgroundTaskInvalid;
    });
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Androidの位置情報サービスがバックグラウンドで機能しませんでした

分類Dev

バックグラウンドで位置情報サービスが更新されない

分類Dev

requestLocationUpdatesを呼び出した後、少なくとも1つの場所が位置情報サービスによって送信されていますか?

分類Dev

バックグラウンドサービスでLocationManagerを使用して位置情報を取得できない

分類Dev

バックグラウンドのリモートアクション可能な通知Webサービス呼び出しが機能していませんか?

分類Dev

アクティビティが破棄されてから再作成されると、オブザーバーが呼び出されず、ポストバリューがバックグラウンドスレッドから機能しない

分類Dev

Androidでアプリが強制終了された後にバックグラウンドサービスが機能しない

分類Dev

アプリがバックグラウンドから戻ってきたときにviewWillAppearが呼び出されないのはなぜですか?

分類Dev

Firebasechildeventlistenerを使用したバックグラウンドサービスが数分後に機能しない

分類Dev

RunWorkerCompletedイベントの呼び出しによってスローされたバックグラウンドワーカーの例外

分類Dev

Alamofireネットワーク呼び出しがバックグラウンドスレッドで実行されていない

分類Dev

onCreate()およびonResume()のAndroidでバックグラウンドサービスがランダムに機能しなくなる

分類Dev

Android O:バックグラウンドの実行制限によってサービスが停止しない

分類Dev

グーグルサービスアカウントとoauthを使用して、呼び出しをグーグルクラウド機能に制限するにはどうすればよいですか?

分類Dev

オレオから位置情報サービスが呼び出されない

分類Dev

バックグラウンドサービスが機能しない-Android

分類Dev

GoogleロケーションサービスAPIを使用して、バックグラウンドでも位置情報の更新を取得するにはどうすればよいですか?

分類Dev

C#でバックグラウンドでデータを更新しているときに、virtualmodedatagridviewがcellvalueneededを呼び出さないようにする方法

分類Dev

Angular2タイプスクリプトが機能しないイベントによって呼び出されたメソッドを介してクラス変数値またはクラスプロパティ値を変更する

分類Dev

Androidバックグラウンドサービスエラー:呼び出されていないスレッド内にハンドラーを作成できません

分類Dev

サービスによって入力されたときに角度クラスメソッドが機能しない

分類Dev

ブートストラップモーダルで呼び出された場合、「クリップボードにコピー」機能が機能しない

分類Dev

バックグラウンドでサービスが機能しないのはなぜですか?

分類Dev

PowerShellがWindowsサービスによって呼び出されたスクリプト内のコマンドレットを認識しないのはなぜですか?

分類Dev

呼び出しが検出されたときに停止するには、Android Java バックグラウンド サービスでサポートが必要です。

分類Dev

RailsのバックグラウンドジョブでShopifyAPI呼び出しが機能しない

分類Dev

iOS7のバックグラウンド位置情報サービスが停止します

分類Dev

設定でバックグラウンドアプリの更新が無効になっている場合、application:performFetchWithCompletionHandler:が呼び出されますか?

分類Dev

ajax呼び出しによって開かれたブートストラップ4モーダル-閉じるボタンが機能しない

Related 関連記事

  1. 1

    Androidの位置情報サービスがバックグラウンドで機能しませんでした

  2. 2

    バックグラウンドで位置情報サービスが更新されない

  3. 3

    requestLocationUpdatesを呼び出した後、少なくとも1つの場所が位置情報サービスによって送信されていますか?

  4. 4

    バックグラウンドサービスでLocationManagerを使用して位置情報を取得できない

  5. 5

    バックグラウンドのリモートアクション可能な通知Webサービス呼び出しが機能していませんか?

  6. 6

    アクティビティが破棄されてから再作成されると、オブザーバーが呼び出されず、ポストバリューがバックグラウンドスレッドから機能しない

  7. 7

    Androidでアプリが強制終了された後にバックグラウンドサービスが機能しない

  8. 8

    アプリがバックグラウンドから戻ってきたときにviewWillAppearが呼び出されないのはなぜですか?

  9. 9

    Firebasechildeventlistenerを使用したバックグラウンドサービスが数分後に機能しない

  10. 10

    RunWorkerCompletedイベントの呼び出しによってスローされたバックグラウンドワーカーの例外

  11. 11

    Alamofireネットワーク呼び出しがバックグラウンドスレッドで実行されていない

  12. 12

    onCreate()およびonResume()のAndroidでバックグラウンドサービスがランダムに機能しなくなる

  13. 13

    Android O:バックグラウンドの実行制限によってサービスが停止しない

  14. 14

    グーグルサービスアカウントとoauthを使用して、呼び出しをグーグルクラウド機能に制限するにはどうすればよいですか?

  15. 15

    オレオから位置情報サービスが呼び出されない

  16. 16

    バックグラウンドサービスが機能しない-Android

  17. 17

    GoogleロケーションサービスAPIを使用して、バックグラウンドでも位置情報の更新を取得するにはどうすればよいですか?

  18. 18

    C#でバックグラウンドでデータを更新しているときに、virtualmodedatagridviewがcellvalueneededを呼び出さないようにする方法

  19. 19

    Angular2タイプスクリプトが機能しないイベントによって呼び出されたメソッドを介してクラス変数値またはクラスプロパティ値を変更する

  20. 20

    Androidバックグラウンドサービスエラー:呼び出されていないスレッド内にハンドラーを作成できません

  21. 21

    サービスによって入力されたときに角度クラスメソッドが機能しない

  22. 22

    ブートストラップモーダルで呼び出された場合、「クリップボードにコピー」機能が機能しない

  23. 23

    バックグラウンドでサービスが機能しないのはなぜですか?

  24. 24

    PowerShellがWindowsサービスによって呼び出されたスクリプト内のコマンドレットを認識しないのはなぜですか?

  25. 25

    呼び出しが検出されたときに停止するには、Android Java バックグラウンド サービスでサポートが必要です。

  26. 26

    RailsのバックグラウンドジョブでShopifyAPI呼び出しが機能しない

  27. 27

    iOS7のバックグラウンド位置情報サービスが停止します

  28. 28

    設定でバックグラウンドアプリの更新が無効になっている場合、application:performFetchWithCompletionHandler:が呼び出されますか?

  29. 29

    ajax呼び出しによって開かれたブートストラップ4モーダル-閉じるボタンが機能しない

ホットタグ

アーカイブ