ОПРЕДЕЛЕНИЕ ТИПА УСТРОЙСТВА
Ананьев Игорь
Ананьев Игорь
Разработка под Мас | Блог о разработке под Мас ОS Х, IPhone и не только
Иногда необходимо сделать так, чтобы приложение вело себя по разному в зависимости от того, на каком устройстве
запущено (выводить разные нотификации, делать различные опции для разных устройств и т.д.).
Используя класс UIDevice, мы можем определить в приложении на каком устройстве (iPod или iPhone) оно запущено. Для этого существует свойство model, которое возвращает NSString с текстом iPhone или iPod touch. Но иногда такой информации не достаточно. Например если нам нужно определить какая версия iPhone (2g, 3g или 3gs) или какого поколения iPod touch. Для этого нужно обращаться напрямую к «железу». Мы будем использовать категорию, чтобы расширить класс UIDevice методом, который возвращает тип «machine» в виде строки.
Начнем с определения интерфейса:
Для доступа к типу «железа» необходимо вызвать стандартную функцию C(sysctlbyname):
sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp,size_t newlen);
Первый параметр – имя системы, за информацией о которой мы обращаемся. Информация будет скопирована в буфер ‘oldp’, в параметре ‘oldlenp’ указывается размер этого буфера. В параметры ‘newp’ и ‘newlen’ мы передаем значения NULL и 0 соответсвенно, так как они не участвуют в получении информации о «железе».
Наш класс будет выглядеть так:
Теперь мы можем вызывать этот метод следующим образом:
Возвращаемые значения:
iPhone Simulator = i386
iPhone = iPhone1,1
3G iPhone = iPhone1,2
3GS iPhone = iPhone2,1
1st Gen iPod = iPod1,1
2nd Gen iPod = iPod2,1
Вот и все.
Используя класс UIDevice, мы можем определить в приложении на каком устройстве (iPod или iPhone) оно запущено. Для этого существует свойство model, которое возвращает NSString с текстом iPhone или iPod touch. Но иногда такой информации не достаточно. Например если нам нужно определить какая версия iPhone (2g, 3g или 3gs) или какого поколения iPod touch. Для этого нужно обращаться напрямую к «железу». Мы будем использовать категорию, чтобы расширить класс UIDevice методом, который возвращает тип «machine» в виде строки.
Начнем с определения интерфейса:
@interface UIDevice(machine)
- (NSString *)machine;
@end
- (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
#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]);
...
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
Вот и все.