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