ユーザーの場所を更新するために、バックグラウンドタスクを使用してタイマーをバックグラウンドで実行しています。次のように宣言されています。
UIBackgroundTaskIdentifier bgTask;
ヘッダーファイルで、次のように初期化します。
bgTask = UIBackgroundTaskInvalid;
しかし、それでも、gdbに次のメッセージが表示されます。
EndBackgroundTaskを終了できません:識別子23dcのバックグラウンドタスクが存在しないか、すでに終了している可能性があります。デバッグするには、UIApplicationEndBackgroundTaskError()で中断します。
どうして?そして、どうすればこれを解決できますか?
BgTask = UIBackgroundTaskInvalidを設定する必要があります
二瞬で
私はあなたがそれらの2つの瞬間のいずれかを逃していると信じています、そしてそれがあなたがそのエラーを得ている理由です。
Appleサンプルコードを参照:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithName:@"MyTask" expirationHandler:^{
// Clean up any unfinished task business by marking where you
// stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}
位置情報更新をバックグラウンドで使用していますか?
はいの場合、ユーザーから位置認証を取得するときに以下のコードを追加します-AppleはiOS 9以降からallowsBackgroundLocationUpdates
のデフォルトをNO
に変更しました。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
locationManager.allowsBackgroundLocationUpdates = YES;
}
プロジェクトの「署名と機能」でバックグラウンドモードの「場所の更新」をアクティブにしたことを確認してください。それ以外の場合はクラッシュします。
Xcodeで、ブレークポイントナビゲーターに切り替え([表示]> [ナビゲーター]> [ブレークポイントナビゲーターの表示])、左下の[+]ボタンを押して、[シンボリックブレークポイントの追加]を選択し、シンボルとして「UIApplicationEndBackgroundTaskError」と入力します。
デバッグコンソールでこの警告の原因となったコードまたはフレームワークを探すのに何日もかかりますBackgroundTaskを終了できません:識別子2(0x2)のバックグラウンドタスクが存在しないか、すでに終了している可能性があります。 UIApplicationEndBackgroundTaskError()を中断してデバッグする。
最後に、空のプロジェクトSingle View Appを作成しました。 Xcodeによって生成されたコードのみです。アプリをシミュレーターで実行し、バックグラウンドで実行すると、同じ警告が表示されます。 iOS 13の問題だと言えます。 Appleがすぐに修正してくれることを願っています。Crashlyticsでは、それが原因でアプリにクラッシュが発生したためです。
「BackgroundTaskを終了できません:IDが指定されたバックグラウンドタスクがありません...」というメッセージに関しては、他の人が言ったように、これはあなたがしていることに関係のないニシンである可能性があります。
タイマーを使用してアプリをバックグラウンドで実行し続けるのではなく、ユーザーの位置を定期的に取得するという目標については、代わりにさまざまなサービスを利用して バックグラウンドでのユーザーの位置を更新するvisit location service または significant change location service など。これらのサービスを使用すると、ユーザーの場所が変更されたときに、OSがアプリをウェイクアップできます。