0

私の質問は: 電話がロックされている (ディスプレイがオンになっていない) 間、またはバックグラウンドにある間、中央から継続的な監視を有効にするにはどうすればよいですか?

まず第一に、私は Christopher Mann @ https://github.com/csmann/iBeaconDemoの厚意により iBeaconDemo を使用しています。このデモを書いた功績は認めませんが、iBeacon と地域監視を理解するために使用しています。これは素晴らしいデモですが、Near 範囲に入ったときにローカル通知を表示するためにバックグラウンド モニタリングを有効にしてほしいと思います。

Capabilities (info.plist) ファイルで bluetooth-central、bluetooth-peripheral、および location を有効にし、.notifyOnDisplay、notifyOnEntry、notifyOnExit を YES に設定したところ、アプリがフォアグラウンドまたはロックされているときに結果が得られることがわかりました画面(電話がロックされているときにホームボタンを押す)を監視できますが、バックグラウンド(電話のロックが解除されている)または電話がロックされている(ディスプレイがオンになっていない)間は監視できません。

これは私の appDelegate の didEnterBackground メソッドです (注: これは別のローカル通知であり、これは毎回正しく機能しますが、領域に入ったときに表示したい通知とは異なります:

    - (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"Application entered background state.");
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    // create local notification and present it immediately
    UILocalNotification *notification = [self createLocalNotification:@"Bring app back to foreground"];
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}

バックグラウンドで表示したい通知は次のとおりです。リージョンに入るとポップアップする通知が 1 つだけ必要です (テスト目的でそれぞれに 1 つ入れました)。

    - (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {

    // identify closest beacon in range
    if ([beacons count] > 0) {
        CLBeacon *closestBeacon = beacons[0];
        if (closestBeacon.proximity == CLProximityImmediate) {
            /**
             Provide proximity based information to user.  You may choose to do this repeatedly
             or only once depending on the use case.  Optionally use major, minor values here to provide beacon-specific content
             */

            [self fireUpdateNotificationForStatus:[NSString stringWithFormat:@"Range: %li \n Beacon Name: %@ \n You are in the immediate vicinity of the Beacon.", (long)closestBeacon.rssi, ((CLBeaconRegion*)region).identifier]];

            [[UIApplication sharedApplication] presentLocalNotificationNow:[self createLocalNotification:@"Immediate LN"]];


        } else if (closestBeacon.proximity == CLProximityNear) {
            // detect other nearby beacons
            // optionally hide previously displayed proximity based information
            [self fireUpdateNotificationForStatus:[NSString stringWithFormat: @"Range: %li \n Beacon Name: %@ \n There are Beacons nearby.", (long)closestBeacon.rssi, ((CLBeaconRegion*)region).identifier]];

            [[UIApplication sharedApplication] presentLocalNotificationNow:[self createLocalNotification:@"Near LN"]];

        } else if (closestBeacon.proximity == CLProximityFar) {

            [self fireUpdateNotificationForStatus:[NSString stringWithFormat:@"Range: %li \n Beacon Name: %@ \n You are far away from the %@th beacon in store %@!", (long)closestBeacon.rssi, ((CLBeaconRegion*)region).identifier, closestBeacon.minor, closestBeacon.major]];

            [[UIApplication sharedApplication] presentLocalNotificationNow:[self createLocalNotification:@"Far LN"]];

        }

    } else {
        // no beacons in range - signal may have been lost
        // optionally hide previously displayed proximity based information
        [self fireUpdateNotificationForStatus:@"There are currently no Beacons within range."];
    }
}

最後に、便利な場合に備えて、fireUpdateNotificationsForStatus メソッドを次に示します。

    - (void)fireUpdateNotificationForStatus:(NSString*)status {
    // fire notification to update displayed status
    [[NSNotificationCenter defaultCenter] postNotificationName:kLocationUpdateNotification
                                                        object:Nil
                                                      userInfo:@{@"status" : status}];
}

他に役立つことがありましたら、お気軽にお知らせください。お時間をいただきありがとうございます!

4

1 に答える 1

1

通知がユーザーによって受信されたと仮定すると (通知の代わりにログを使用してこれをテストしましたよね?)、問題はバックグラウンドにあると仮定します。

iOS とバックグラウンド スキャンは少し風変わりですが、できることがいくつかあります。

  • アプリで UiBackgroundModes = location パーミッションを設定する
  • region.notifyEntryStateOnDisplay = YES は、画面のロックが解除されたときに didRangeBeacons を確実に受け取るようにします (持っているようです)。
  • locationManager.pausesLocationUpdatesAutomatically = NO; そうしないと、iOS がユーザーが移動していないと判断したときに、測距がシャットダウンされることがあります。
  • 同様に、desiredAccuracy = kCLLocationAccuracyThreeKilometers で startUpdatingLocation を使用します。役に立たない GPS コードも入手できますが、どうやら iO がビーコンの測距を止めないようにします。

http://airfy.svbtle.com/battery-friendly-indoor-positioning-with-ibeaconも参照してください。

于 2014-07-10T09:48:27.580 に答える