4

iPhone 4S に関する奇妙な問題が発生しています。iBeacons を使用するアプリケーションを開発しています。次のコードは、iPad mini、iPhone 5s、および iPhone 4s で実行されているものですが、iBeacon に遭遇したときに応答できるのは iPad と 5S のみであり、4S は何もしません。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //start ibeacon monitoring mode
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
    [self enableMonitoring];
}

- (void)enableMonitoring
{
    [self initRegion];
    [self locationManager:self.locationManager didStartMonitoringForRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region
{
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void) initRegion
{
    self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:UUID]
                                                           identifier:@"iBeacon"];
    [self.locationManager startMonitoringForRegion:self.beaconRegion];
    hasAlerted = NO;
}

- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
    ST_UNUSED(manager);
    ST_UNUSED(region);
    NSLog(@"Beacon Found");
    [self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region {
    ST_UNUSED(manager);
    ST_UNUSED(region);
    NSLog(@"Left Region");
    [self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
}

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region {
    ST_UNUSED(manager);
    ST_UNUSED(region);
    CLBeacon *beacon = [beacons lastObject];

    // stuff gets done here

}

4S は問題なく iBeacon をブロードキャストでき、他の 2 つはそれらを見つけることができます。

[CLLocationManager isMonitoringAvailableForClass:[CLBeacon class]]4S でおよびテストを実行[CLLocationManager isRangingAvailable]しましたが、失敗しません。

これが私たちの 4S だけの問題なのか、それとも一般的な 4S の問題なのか、誰か教えてもらえますか?

4

4 に答える 4

4

私はまったく同じ問題を抱えていたので、ユニットに欠陥があるとは思いません!同じコードは 5S でうまく機能しましたが、4S を使用したビーコンは見つかりませんでした。4S BLE スタックは 5S とは少し異なる動作をすることが判明しました (明らかに)。

私がコードを書いた方法では、「locationManager didDetermineState forRegion」が呼び出され、実際にビーコン領域内にいると判断するまで、ビーコンの範囲を調べ始めませんでした。これはiPhone 5Sでうまく機能し、正当な理由もなく範囲を広げていません. しかし、4S ではコールバックを受け取ることはありません!

ただし、次のように入力して、より早くレンジングを開始した場合:

[locationManager startRangingBeaconsInRegion:beaconRegion];

「locationManager didStartMonitoringForRegion」コールバック内で、チャンピオンのように機能します!

于 2014-01-16T00:25:58.557 に答える
2

「iPhone4s」でも同じ問題が発生しました。Bluetoothサービスと位置情報サービスがオンになっているにもかかわらず、ビーコンサービスがどれも機能していないように感じました。

再起動したところ、動作し始めました。今はうまくいっているので、しばらくは満足していましたが、この問題は何なのか、まだ理解できませんでした。これがエンド ユーザーに発生した場合、エンド ユーザーはデバイスを再起動する必要があることをどのように知ることができますか?

于 2014-04-09T11:56:30.693 に答える
1

この質問で述べたのと同様の問題がありました: IBeacon 領域の監視がデバイス間で一貫して機能しない

違いは、デバイスでバックグラウンド更新が有効になっているかどうかであることがわかりました。これを確認するために、次のスニペットを使用します。

if ([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusAvailable) {

    NSLog(@"Background updates are available for the app.");
}else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusDenied)
{
    NSLog(@"The user explicitly disabled background behavior for this app or for the whole system.");
}else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusRestricted)
{
    NSLog(@"Background updates are unavailable and the user cannot enable them again. For example, this status can occur when parental controls are in effect for the current user.");
}

この回答で見つかりました: iOS 7 でのアプリのバックグラウンド更新のユーザー設定の検出

于 2014-01-30T11:50:12.287 に答える