私の質問は: 電話がロックされている (ディスプレイがオンになっていない) 間、またはバックグラウンドにある間、中央から継続的な監視を有効にするにはどうすればよいですか?
まず第一に、私は 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}];
}
他に役立つことがありましたら、お気軽にお知らせください。お時間をいただきありがとうございます!