0

私がしたこと:-

私はジンバル ビーコンを使用しており、 "angular js + ionic + cordova"を使用してハイブリッド アプリケーションを作成しています。アプリケーションは正常に動作していますが、フォアグラウンドとバックグラウンドの両方でビーコンの入力と終了に時間がかかりすぎます。この問題を解決するにはどうすればよいですか?コード スニペットを以下に添付します。

手順:-

  1. まず、cordova を使用して angular からデリゲートを呼び出しています

  2. 私の iOS デリゲート メソッドが呼び出されますが、長い遅延の後

didEnterRegion - 10 秒後に呼び出されます

didExitRegion - 20 ~ 30 秒後に呼び出されます

ジンバル送信間隔 (MS) を 100 に設定しました

私のスニペット:-

Angular-js スニペット:

         // Request permission from user to access location info.
           cordova.plugins.locationManager.requestAlwaysAuthorization();

           // Create delegate object that holds beacon callback functions.
           var delegate = new cordova.plugins.locationManager.Delegate();
           console.log(delegate)
           cordova.plugins.locationManager.setDelegate(delegate);

           // Set delegate functions.
           delegate.didDetermineStateForRegion = onDidDetermineStateForRegion;
           delegate.didRangeBeaconsInRegion = onDidRangeBeaconsInRegion;
           delegate.didEnterRegion = onDidRangeBeaconsInRegion

iOS スニペット:-

-(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
[self.queue addOperationWithBlock:^{

        [self _handleCallSafely:^CDVPluginResult *(CDVInvokedUrlCommand *command) {

            [[self getLogger] debugLog:@"didEnterRegion: %@", region.identifier];
            [[self getLogger] debugNotification:@"didEnterRegion: %@", region.identifier];

            NSMutableDictionary* dict = [NSMutableDictionary new];
            [dict setObject:[self jsCallbackNameForSelector:(_cmd)] forKey:@"eventType"];
            [dict setObject:[self mapOfRegion:region] forKey:@"region"];

            CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dict];
            [pluginResult setKeepCallbackAsBool:YES];
            return pluginResult;

        } :nil :NO :self.delegateCallbackId];
    }];
}


-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
 [self.queue addOperationWithBlock:^{

        [self _handleCallSafely:^CDVPluginResult *(CDVInvokedUrlCommand *command) {

            [[self getLogger] debugLog:@"didExitRegion: %@", region.identifier];
            [[self getLogger] debugNotification:@"didExitRegion: %@", region.identifier];

            NSMutableDictionary* dict = [NSMutableDictionary new];
            [dict setObject:[self jsCallbackNameForSelector:(_cmd)] forKey:@"eventType"];
            [dict setObject:[self mapOfRegion:region] forKey:@"region"];

            CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:dict];
            [pluginResult setKeepCallbackAsBool:YES];
            return pluginResult;

        } :nil :NO :self.delegateCallbackId];
    }];
}
4

1 に答える 1

1

特に didExitRegion に関して、ネイティブの iBeacon リージョン機能で同様の動作が確認されています。iOSのバージョンやアプリの状態(フォアグラウンド/バックグラウンド)によって動作が異なるようです。個人的には、さまざまなデバイスや世代の違いにも気付きました。たとえば、iPhone 6 と古い iPad mini では、ブロードキャストされたパケットの一部がスキップされて遅延が発生するようです。

使用している iOS のバージョンは何ですか? あなたが言及した遅延は一貫していますか、それとも iBeacons の近くにあると時間の経過とともに改善されますか? 特に古いバージョンの iOS では、この種の動作が発生する傾向があります (当社のテストに基づく)。

反応時間をどのように改善したかについてのメモ:

「領域」の出入りをシミュレートする、測距と独自のジオフェンス比較を使用する独自の実装を行うことにしました。これにより、ジオフェンスの実装に関して余分な作業が発生することは事実ですが、より良い結果が得られます。

明らかに、アプリが中断され、バックグラウンドでアクティブに実行されていない場合、これには制限があります。「ロケーション」バックグラウンド モードは、アプリケーションがバックグラウンドにある場合でも、測距を行うための短いウィンドウを提供します。バックグラウンド モードは Apple によって厳しく規制されているため、適切な付加価値の理由が必要です。

So all in all, there might be some ways to improve the delay when using the native iBeacon regions but overall if the timing is critical for the app, i'd suggest trying the alternative route explained roughly above.

Disclosure: I work for Proximi.io Proximity Platform

于 2016-08-10T14:53:20.060 に答える