1

そのため、多くの試行錯誤と Apples のドキュメントと SO スレッドを読んだ後、didEnterRegion が適切に機能していると思いました。

これが私が仕上げたものです...

- (void)locationManager:(LocationManager *)locationManager didEnterRegion:(CLRegion *)region{

NSLog(@"Location manager did enter region called");
[self.locationManager stopUpdatingLocation];

if ([[UIApplication sharedApplication] applicationState] != UIApplicationStateActive) {

    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

    UILocalNotification *localNotification = [[UILocalNotification alloc]init];
    localNotification.alertBody = @"You are about to arrive";
    localNotification.alertAction = @"Open";
    localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1;

    [[UIApplication sharedApplication]presentLocalNotificationNow:localNotification];

} else {

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"App Running in foreground notification fired");

        [self setupAlarmTriggeredView];

        //vibrate device
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    });
}

}

ご覧のとおり、アプリがアクティブかどうかを確認する簡単なチェックを行います。アクティブでない場合は、すぐに表示される UILocalNotification を設定します。アクティブな場合は、振動してビューを変更します。

GPX ファイルを使用してシミュレーターでテストし、境界を越えて場所を移動すると、両方のシナリオが完全に機能します。ただし、アプリをテストしているときに、アプリがバックグラウンドにある場合、デバイスをスリープ解除するまで通知は発生しないようです。すなわち。境界を越えることができ、何も起こらない場合、デバイスのロックを解除すると、ブーンと振動し、それに応じてビューが変更されます。(ロックを解除したときにアプリが最優先でない場合、アプリを再起動するまでこれは起こりません)。

appDidFinishLaunchingWithOptions でこの設定を行う必要がありますか? 私のテストでは、そのメソッドと didRecieveLocalNotification: の両方で、アプリのデリゲートでは、通知が発生し、ユーザーが通知を実行してアプリを再起動するまで呼び出されません (その時点で、オプション配列の起動キー)、これは didEnterRegion の一部としての通知の最初の発火には何の役にも立たないようです。現時点では、これらの方法のいずれにもコードがありません。

私が知る限り、didEnterRegion のバックグラウンドでの位置情報の更新を行う必要はありません。これは iOS によって自動的に処理されます。

4

0 に答える 0