web-dev-qa-db-ja.com

アプリが実行されていないときのiBeacon通知

ビーコンが範囲内にあるときに、iPhoneでローカルプッシュ通知をトリガーするiBeaconを作成できました。アプリがバックグラウンドモードの場合、完全に機能します。

私の質問は次のとおりです。アプリが実行されていなくても、バックグラウンドでも通知をトリガーできますか?

これは可能だと思ったが、よく分からない。もしそうなら、どうすればこれを達成できますか?

ありがとう!

57
Lapidus

はい、可能であり、自動である必要があります。

CLBeaconRegionを作成して監視を開始すると、アプリが実行されていなくても、位置情報サービスは電話が地域内にあるか地域外にあるかを追跡します。移行中にアプリが実行されていない場合、iOSはアプリをバックグラウンドで数秒間起動し、適切なCLLocationManagerDelegateメソッドを呼び出します。

私は自分のアプリで実験して上記の動作を見つけましたが、AppleのAirLocateサンプルプログラムでもそれを目撃しました。 AirLocateでは、監視地域を設定してから電話を再起動しても、電話が地域に入るとすぐにAirLocateはローカル通知を配信します。

これをテストするときは注意してください。iOSが地域の状態遷移を認識するまでに、iBeaconをオン/オフしてから最大4分かかることがあります。 [〜#〜] edit [〜#〜]:iPhone 5以降、アプリは通常、数秒以内にビーコンを検出するためにハードウェアアクセラレーションを使用します。また、ハードウェアアクセラレーションが利用できない場合、最大15分かかります。

EDIT:iOS 8の時点で、locationManager.requestAlwaysAuthorization()のみを呼び出してlocationManager.requestWhenInUseAuthorization()として正常に取得したことを確認する必要があります。ビーコンをフォアグラウンドで検出できます。

これがどのように機能するかについての詳細な議論を このブログ投稿 に投稿しました。

64
davidgyoung

OKこれが正しく動作するようになったので、試してみましたので、ここに答えがあります。これは、アプリが終了した後、ビーコン領域の境界を越えたときにアプリを呼び出すために必要なことです(フォアグラウンドでアプリが適切に動作すると仮定します):

  1. CLLocationデリゲートAppDelegate.mモジュール内に実装する必要があります。このデリゲートはiOSによって呼び出されるものなので、AppDelegate.mCLLocationデリゲートコードがない場合、アプリが終了したときにiOSに応答することはできません。これがAppleのAirLocateサンプルアプリの機能です。

したがって、AppDelegate.m内には次のものが必要です(CoreLocation.hでリンクする必要もあります)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.

// This location manager will be used to notify the user of region state transitions when the app has been previously terminated.
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
return YES;
}
  1. AppDelegate.m内で、locationManager didDetermineStateメソッドを次のように実装する必要があります。

    -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region{
    
      UILocalNotification *notification = [[UILocalNotification alloc] init];
    
      if(state == CLRegionStateInside)
      {
        notification.alertBody = [NSString stringWithFormat:@"You are inside region %@", region.identifier];
      }
      else if(state == CLRegionStateOutside)
      {
        notification.alertBody = [NSString stringWithFormat:@"You are outside region %@", region.identifier];
      }
     else
     {
       return;
     }
    
      [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
     }
    

->したがって、アプリが終了している場合(少なくとも1回実行する必要があります)、監視しているビーコン境界を越えてデバイスが移行すると、iOSはアプリを呼び出し、AppDelegateでlocationManager:didDetermineStateメソッドを呼び出します.mモジュール。このメソッド内で、presentLocalNotificationNowをセットアップして呼び出すことができます。これが発生したときにアプリがフォアグラウンドにない場合、iOSはロックされていても画面に通知を表示します。その後、ユーザーは詳細を確認するためにアプリを起動する必要があります。

メモリのプレッシャーはこれとは何の関係もないと確信しています。また、notifyEntryStateOnDisplayを設定しても、この問題は発生しません。 notifyEntryStateOnDisplayの設定は、ユーザーがiOSデバイスのディスプレイをオンにする(つまり、「ホーム」または左上のボタンを押す)場合にのみ使用されます。ユーザーがこれを行い、notifyEntryStateOnDisplayTRUEであり、デバイスが監視対象のビーコン領域内にある場合、その時点でディスプレイに通知が表示されます。このプロパティがFALSEに設定されている場合、そうではありません。

もちろん、これらが正しく機能するためにはiOS 7.1を実行している必要があります。

詳細については、Appleの ドキュメント をご覧ください

18
TNBtech

IBeaconの入退場イベントでアプリを起動するには、システムのCLBeaconRegionのnotifyEntryStateOnDisplay = YESを切り替える必要があります。

ただし、注意が必要な部分が1つあります。アプリが実行されていない場合、システムはビーコンのエントリ/出口処理のためにのみアプリをウェイクしますアプリがシステムのメモリ不足により以前に終了した場合ユーザーがアプリをスワイプしてアプリを強制終了した場合タスクビューでは、システムはアプリを起動しません。この動作を確認するには、アプリを起動し、バックグラウンドに配置してから、メモリを消費する複数のアプリを連続して起動します。メモリ不足のためにアプリがシステムによって終了する前に、いくつかの3Dゲームを開始しました。

9
Jian Yin Shen

IOSのバージョンを7.1にアップグレードし、「notifyEntryStateOnDisplay = YES」を設定するだけで、アプリが実行されていないときでも魅力のように動作するはずです。私は以前この問題を抱えていましたが、このアップグレードを行うと修正されました!楽しい..

6
Hugh Mbaezue

私がこの仕事をすることができた唯一の方法は、トリックを行うように見える主要な場所の変更を監視することです。すべてのデバイスまたはユースケースシナリオでこれをテストしていないことに注意してください。

2
Ronny Khan

はい、ローカル通知をキル状態またはバックグラウンド状態で提示できます。手順に従うだけで、

1)CLLocationManagerクラスを使用してロケーションマネージャーを起動します。

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy=kCLLocationAccuracyBest;
locationManager.distanceFilter=kCLDistanceFilterNone;

2)次のようなCLBeaconRegionを作成します。

CLBeaconRegion *beacon_Region = [[CLBeaconRegion alloc] initWithProximityUUID:uuid major:mjorVa minor:minorVa identifier:identifier];
beacon_Region.notifyEntryStateOnDisplay = YES;
beacon_Region.notifyOnEntry=YES;
beacon_Region.notifyOnExit=YES;

3)次のような2つのロケーションマネージャーデリゲートメソッドを実装します。

-didEnterRegion
-didExitRegion

上記の2つのロケーションマネージャーメソッドは、アプリが強制終了またはバックグラウンドであっても機能します。システムはビーコンを追跡し、範囲外になるとdidExitRegionメソッドを起動し、システムに入るとdidEnterRegionメソッドを起動します。

1
Gautam Sareriya