Датчик приближения не работает в устройстве iPhone 4 - PullRequest
6 голосов
/ 22 марта 2012
//I have created below snippet to let the sensor to be detected.

-(void)addProximitySensorControl {

    UIDevice *device = [UIDevice currentDevice];
    device.proximityMonitoringEnabled = YES;

    BOOL state = device.proximityState;
    if(state)
        NSLog(@"YES");
    else
        NSLog(@"NO");

    [[NSNotificationCenter defaultCenter] addObserver:self
                            selector:@selector(proximityChanged:)
                                name:@"UIDeviceProximityStateDidChangeNotification"
                                object:nil];
}

В iPhone 3GS или более ранних версиях бесконтактный метод вызывается успешно, но в iPhone 4 при наведении объекта вверх на сенсор (экран) он не обнаруживается.Есть идеи, ребята?

Ответы [ 5 ]

2 голосов
/ 13 августа 2013

Apple Docs:"Не все устройства iOS имеют датчики приближения. Чтобы определить, доступен ли мониторинг приближения, попробуйте включить его. Если значение свойства близостиMonitoringEnabled остается НЕТ, мониторинг близости не доступен. «

2 голосов
/ 01 марта 2013

Я вижу несколько проблем с этим кодом. Во-первых, вы используете

 name:@"UIDeviceProximityStateDidChangeNotification"

вместо

name:UIDeviceProximityStateDidChangeNotification

Оба работают, но использование пустой версии приведет к ошибке компиляции, если вы сделаете опечатку. (Вы хотите получить ошибку компилятора с опечатками, это предотвращает ошибки без вывода сообщений).

Следующее, что вы на самом деле не проверяете, доступен ли датчик приближения, до добавления уведомления. Ваш код:

BOOL state = device.proximityState

Но это просто проверяет, находится ли устройство близко к лицу пользователя. То, что вы действительно хотите, это установить proximityEnabled в YES, а затем убедиться, что оно действительно установлено. Это немного нелогично.

UIDevice *device = [UIDevice currentDevice];
[device setProximityMonitoringEnabled:YES];
if ([device isProximityMonitoringEnabled]) {
    // Do your stuff
}

Вот полный пример кода:

NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
UIDevice *device = [UIDevice currentDevice];

// Register for proximity notifications
[device setProximityMonitoringEnabled:YES];

if ([device isProximityMonitoringEnabled]) {
    [notificationCenter addObserver:self
                           selector:@selector(proximityChanged:)
                               name:UIDeviceProximityStateDidChangeNotification
                             object:device];
} else {
    NSLog(@"No Proximity Sensor");
}
1 голос
/ 29 марта 2012
1 голос
/ 26 марта 2012

В вашем коде нет ничего плохого (конечно, при условии, что вы реализовали proximityChanged:).Я тестировал ваш код на iPhone 4, и он реагирует на то, что моя рука двигалась перед датчиком приближения.

Может быть, аппаратное обеспечение немного отличается в 3GS, то есть оно более чувствительно к тому, что вы делаете?Можете ли вы примерить другое устройство iPhone 4 (или хотя бы убедиться, что датчик приближения вообще работает, например, с помощью приложения телефона)?

0 голосов
/ 30 марта 2012

Вы всегда должны проверять, есть ли на конкретном устройстве датчик приближения или нет. Не все устройства iOS имеют датчики приближения.

BOOL state = device.proximityState;
if(state)
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(proximityChanged:) 
                                         name:@"UIDeviceProximityStateDidChangeNotification" object:nil];
else
    NSLog(@"NO");
...