Биография
Реферат
Библиотека
Ссылки
Отчет о поиске
Личный раздел



ОПРЕДЕЛЕНИЕ ТИПА УСТРОЙСТВА
Ананьев Игорь

Разработка под Мас | Блог о разработке под Мас ОS Х, IPhone и не только

     Иногда необходимо сделать так, чтобы приложение вело себя по разному в зависимости от того, на каком устройстве запущено (выводить разные нотификации, делать различные опции для разных устройств и т.д.).
Используя класс UIDevice, мы можем определить в приложении на каком устройстве (iPod или iPhone) оно запущено. Для этого существует свойство model, которое возвращает NSString с текстом iPhone или iPod touch. Но иногда такой информации не достаточно. Например если нам нужно определить какая версия iPhone (2g, 3g или 3gs) или какого поколения iPod touch. Для этого нужно обращаться напрямую к «железу». Мы будем использовать категорию, чтобы расширить класс UIDevice методом, который возвращает тип «machine» в виде строки.

Начнем с определения интерфейса:

@interface UIDevice(machine)
- (NSString *)machine;
@end

Для доступа к типу «железа» необходимо вызвать стандартную функцию C(sysctlbyname):

sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp,size_t newlen);

Первый параметр – имя системы, за информацией о которой мы обращаемся. Информация будет скопирована в буфер ‘oldp’, в параметре ‘oldlenp’ указывается размер этого буфера. В параметры ‘newp’ и ‘newlen’ мы передаем значения NULL и 0 соответсвенно, так как они не участвуют в получении информации о «железе».

Наш класс будет выглядеть так:

#import "UIDevice+machine.h"
#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDevice(machine)

- (NSString *)machine
{
size_t size;

// Устанавливаем параметр 'oldp' равный NULL, чтобы получить размер
// возвращаемых данных, чтобы выделить неообходимое количество памяти
sysctlbyname("hw.machine", NULL, &size, NULL, 0);

// Выделяем память под name
char *name = malloc(size);

// Получаем имя платформы
sysctlbyname("hw.machine", name, &size, NULL, 0);

// Переводим name в строку
NSString *machine = [NSString stringWithCString:name];

// Освобождаем память
free(name);

return machine;
}

@end

Теперь мы можем вызывать этот метод следующим образом:

#import "UIDevice+machine.h"


...
NSLog(@"device: %@", [[UIDevice currentDevice] machine]);


Возвращаемые значения:
iPhone Simulator = i386
iPhone = iPhone1,1
3G iPhone = iPhone1,2
3GS iPhone = iPhone2,1
1st Gen iPod = iPod1,1
2nd Gen iPod = iPod2,1

Вот и все.