본문 바로가기

iOS개발팁

아이폰, 사용가능한 장치 확인하기.



아이폰 앱을 작성하다 보면 가속도계, 콤파스, GPS, 카메라 등의 사용 가능 여부를 원하는 때에 바로 알고 싶을 경우가 많습니다. 카메라 같은 경우 아래 코드처럼 이미지 픽커뷰에 장치를 확인하는 코드가 있지만 나머지는 그렇지 않습니다.
+ (BOOL) availableCamera
{
    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
}
GPS나 콤파스 같은 경우 실제로 startUpdateLocation 이나 startUpdateHeading 등의 메세지를 보내고 결과를 받아 봐야 사용 가능 여부를 알 수 있습니다. 하지만 언제 결과를 받을 수 있느냐는 정확하지 않아서 내가 알고 싶을 때 바로 원하는 결과를 얻을 수가 없습니다. 이런 고민을 안고 구글링을 해 보니 좋은 팁이 있어 정리해 봅니다. 팁의 출처는 StackOverflow 입니다.

방범은 UIDevice 의 model  속성이 "iPhone" 과 "iPod Touch"를 알려주는 것처럼 더 자세하게 현재 디바이스의 모델을 문자열로 반환해 주는 것입니다. 우선 코드 나갑니다.
#import <Foundation/Foundation.h>

@interface UIDeviceHardware : NSObject
{}
+ (NSString *) platform;
+ (NSString *) platformString;
@end
그리고 아래처럼 구현해 줍니다.
#import "UIDeviceHardware.h"
#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDeviceHardware
+ (NSString *) platform
{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = (char *)malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
    free(machine);
    return platform;
}
+ (NSString *) platformString
{
    NSString *platform = [UIDeviceHardware platform];
    if([platform isEqualToString:@"iPhone1,1"])
        return @"iPhone 1G";
    if([platform isEqualToString:@"iPhone1,2"])
        return @"iPhone 3G";
    if([platform isEqualToString:@"iPhone2,1"])
        return @"iPhone 3GS";
    if([platform isEqualToString:@"iPod1,1"])
        return @"iPod Touch 1G";
    if([platform isEqualToString:@"iPod2,1"])
        return @"iPod Touch 2G";
    if([platform isEqualToString:@"i386"])
        return @"iPhone Simulator";
    return platform;
}
@end
문제는 위에서 사용한 sysctlbyname() 함수가 문서화 되지 않은 비공식 API가 인지 아닌지의 여부일 것입니다. 비공식 API를 사용하면 리젝의 사유가 되니 말입니다. 하지만 이 함수는 여기에 문서화 되어 있는 iPhoneOS의 근간인 BSD 의 라이브러리 함수입니다. 따라서 마음 놓고 사용하셔도 될 것 같습니다.

업데이트 내용)
@implementation UIDeviceHardware

- (NSString *) platform{
    size_t size
;
    sysctlbyname
("hw.machine", NULL, &size, NULL, 0);
   
char *machine = malloc(size);
    sysctlbyname
("hw.machine", machine, &size, NULL, 0);
   
NSString *platform = [NSString stringWithCString:machine];
    free
(machine);
   
return platform;
}

- (NSString *) platformString{
   
NSString *platform = [self platform];
   
if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
   
if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
   
if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
   
if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
   
if ([platform isEqualToString:@"iPhone3,3"])    return @"Verizon iPhone 4";
   
if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
   
if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
   
if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
   
if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
   
if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
   
if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
   
if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
   
if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
   
if ([platform isEqualToString:@"i386"])         return @"Simulator";
   
return platform;
}

@end



이제 필요한 것은 아이폰의 모델별 하드웨어 스펙이겠죠? 스펙확인은 애플공식싸이트에서 확인할 수 있습니다. 아래는 아이팟, 아이폰, 아이패드의 스펙 문서 모음입니다. 즐거운 앱 개발 하세요! :)


이 글이 유익하셨다면 @skyfe79 팔로잉 부탁드립니다 :)

'iOS개발팁' 카테고리의 다른 글

트윗 WWDC10  (0) 2010.06.19
SIO2와 Blender를 만나다.  (2) 2010.06.14
쿼츠2D 튜토리얼...2  (0) 2010.05.18
쿼츠2D 튜토리얼...1  (0) 2010.05.18
맥에서 화면 캡쳐하기  (0) 2010.05.12