Могу ли я определить/как, есть ли у устройства вибрация или нет?

У меня есть некоторые настройки, которые включают/отключают вибрацию для определенных действий, но я считаю бессмысленным отображать их, если устройство не имеет возможности вибрации. Есть ли способ проверить, использует ли человек iPod touch и есть ли у него вибрация?


person Alex Gosselin    schedule 14.08.2011    source источник


Ответы (2)


Этот код должен сделать это — имейте в виду, что он «предполагает», что iPhone — единственное устройство с возможностью вибрации. Что на данный момент...

- (NSString *)machine
{
    static NSString *machine = nil;

    // we keep name around (its like 10 bytes....) forever to stop lots of little mallocs;
    if(machine == nil)
    {
        char * name = nil;
        size_t size;

        // Set 'oldp' parameter to NULL to get the size of the data
        // returned so we can allocate appropriate amount of space
        sysctlbyname("hw.machine", NULL, &size, NULL, 0); 

        // Allocate the space to store name
        name = malloc(size);

        // Get the platform name
        sysctlbyname("hw.machine", name, &size, NULL, 0);

        // Place name into a string
        machine = [[NSString stringWithUTF8String:name] retain];
        // Done with this
        free(name);
    }

    return machine;
}

-(BOOL)hasVibration
{
    NSString * machine = [self machine];

    if([[machine uppercaseString] rangeOfString:@"IPHONE"].location != NSNotFound)
    {
        return YES;
    }

    return NO;
}

Просто отредактировано, чтобы машинный вызов не выполнял множество мелких операций при каждом вызове.

person Tony Million    schedule 14.08.2011
comment
Это здорово, но два вопроса, хотя я не очень понимаю функции C, которые вы использовали - не следует ли "free (name)" вызываться после последнего использования "name"? Во-вторых, могу ли я более легко кэшировать результат «BOOL» для «hasVibration», а не строку? Кажется более прямым. - person Alex Gosselin; 14.08.2011
comment
Да, спасибо, что заметили, что бесплатное было после того места, где оно использовалось - мой плохой :( - Кроме того, вы должны кешировать результат, если вам нужно, функции, которые я вставил, были частью более крупного класса, который у меня есть, который возвращает все виды аппаратных свойств . - person Tony Million; 15.08.2011
comment
О, отлично, тогда я отрегулирую соответственно. - person Alex Gosselin; 15.08.2011

Я не уверен, что есть способ сделать это, кроме проверки модели, что, вероятно, не лучший подход. Я знаю, что яблоко обеспечивает:

 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

Если устройство может вибрировать, оно будет. На устройствах без вибрации ничего не получится. Есть еще звонок:

AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Этот будет вибрировать устройство, если у него есть возможность, или устройство издаст звуковой сигнал.

Возможно, было бы лучше просто иметь настройки и иметь некоторые пояснения по настройке, потому что пользователю может понадобиться звуковой сигнал, когда у него нет вибрирующего устройства. Возможно, назовите настройку как-то иначе, чем «Включение/выключение виброзвонка».

person Jake Dempsey    schedule 14.08.2011