[iOS] UIDevice를 통해 아이폰, 아이패드 디바아스 정보에 접근하기

2017. 5. 21. 02:53Mobile

원문: http://covelist.tistory.com/1

iOS에서 디바이스 정보에 접근하기 위해서는 UIDevice 클래스를 사용합니다. UIDevice 클래스는 iOS 2.0 이후 버전에서 사용할 수 있으며 일부 기능은 더 높은 iOS 버전을 요구하기도 합니다.

UIDevice를 통해 얻을 수 있는 디바이스 정보는 다음과 같습니다.

  • 디바이스 이름
  • OS 이름/버전
  • 디바이스 모델명
  • 디바이스 식별 문자열
  • 디바이스 화면 방향
  • 인터페이스 형식
  • 배터리 정보
  • 근접센서 정보
  • 멀티태스킹 지원 여부

UIDevice 클래 스를 사용하는 첫 단계는 현재 앱이 실행되고 있는 디바이스를 나타내는 싱글톤 인스턴스를 얻는 것입니다. 다음과 같이 currentDevice 클래스 메소드를 통해 싱글톤 인스턴스를 요청합니다.

UIDevice *device = [UIDevice currentDevice];

디바이스 이름

현재 디바이스의 이름은 name 속성을 통해 얻어올 수 있습니다. 이 이름은 iTunes에 표시되는 디바이스 이름과 동일하며 iTunes나 설정 > 일반 > 정보 > 이름 메뉴에서 수정할 수 있습니다.

NSString* deviceName = device.name;

OS 이름과 버전

systemName 속성은 OS의 이름을 systemVersion 속성은 OS의 버전을 나타냅니다.

NSString* OSName = device.systemName;
NSString* OSVersion = device.systemVersion;

디바이스 모 델명

model 속성은 iPhone, iPad 와 같은 디바이스의 모델명을 나타냅니다. 특정 언어로 지역화된 모델명을 얻을때는 localizedModel 속성을 사용합니다.

NSString* modelName = device.model;

디바이스 식 별문자열

모든 디바이스는 유일한 식별문자를 가집니다. iOS 5.0 이전까지는 uniqueIdentifier 속성값을 사용해서 디바이스를 식별하는 기능을 구현하기도 했으나, iOS 6.0부터는 이 속성을 사용할 수 없습니다. 좀 더 정확히 말하면, 아직 코드에서 사용할 수는 있지만 애플이 개발문서를 통해 사용하지 말 것을 강력히(?) 권고하고 있습니다.

iOS 6.0부터는 identifierForVendor 속성을 통해 식별문자열을 얻습니다. uniqueIdentifier 는 디바이스 고유의 ID를 리턴하는 반면, identifierForVendor는 디바이스와 앱 출시사(Vendor)별로 고유한 ID를 리턴합니다. 이 경우 같은 회사가 출시한 앱은 동일한 디바이스에 서 동일한 ID값을 가집니다. 반면, 출시한 회사가 다르거나 서로 다른 디바이스에 설치된 앱은 구별되는 ID 값을 가집니다.

NSString* idForVendor = [device.identifierForVendor UUIDString];
NSString* uuid = device.uniqueIdentifier; // deprecated in iOS 5.0

디바이스 화면방향

iOS 디바이스는 6가지 물리적인 방향을 인 식할 수 있습니다. 각 방향은 UIDevice.h 헤더파일에 선언되어 있는 UIDeviceOrientation 열거형으로 표현됩니다.

홈버튼이 아래쪽에 위치하는 가장 일반적인 세 로방향은 UIDeviceOrientationPortrait , 홈버튼이 위쪽에 있는 세로방향은 UIDeviceOrientationPortraitUpsideDown으로 나타냅니다. 디바이스가 가로방향일때, 홈버튼이 왼쪽에 있으면 UIDeviceOrientationLandscapeRight , 오른쪽에 있으면 UIDeviceOrientationLandscapeLeft 입니다. 디바이스 화면이 위쪽을 향하면 UIDeviceOrientationFaceUp , 아래쪽을 향하면 UIDeviceOrientationFaceDown 으로 나타냅니다.

이 값은 orientation 속성을 통해 얻어올 수 있습니다. 이 속성값에 접근하기 전에 반드시 beginGeneratingDeviceOrientationNotifications 메소드를 통해 디바이스가 회전과 관 련된 통지를 발생시키도록 해야 합니다. 그렇지 않으면 항상 0을 리턴합니다.

[device beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation currentOrientation = device.orientation;

화면방향과 관련된 정보는 디바이스에 내장된 가속도계를 통해 얻어오기 때문에 필요한 정보를 얻은 후에는 반드시 endGeneratingDeviceOrientationNotifications 메소드를 호출해서 시스템이 가속도계를 끌 수 있도록 해주어야 불필요한 자원(특히, 배터리)의 낭비를 막을 수 있습니다.

[device endGeneratingDeviceOrientationNotifications];

인터페이스 형식 (iOS 3.2 이상)

현재 iOS에서 사용할 수 있는 인터페이스는 아이폰/아이팟용 인터페이스와 아이패드용 인터페이스로 구분됩니다. 이 정보는 userInterfaceIdiom 속성을 통해 얻을 수 있으며, 아이패드와 아이폰에서 동시에 실행할 수 있는 Universal 앱을 개발할 때 유 용하게 사용할 수 있습니다.

if (device.userInterfaceIdiom == UIUserInterfaceIdiomPhone)
 {
   // 아이폰 인터페이스
}
else
{
   // 아이패드 인터페이스
}

배터리 정보 (iOS 3.0 이상)

batteryLevel 속성을 통해 배터리의 충전 레벨을 얻거나, batteryState 속성을 통해 충전 상태를 얻을 수 있습니다 . 이 속성들을 사용하기 전에는 반드시 batteryMonitoringEnabled 속성 을 YES로 설정해서 시스템이 배터리와 관련된 통지(UIDeviceBatteryLevelDidChangeNotification, UIDeviceBatteryStateDidChangeNotification )들을 발생시키도록 해야 합니다. 그리고 원하는 작업을 마친 후에는 NO로 설정해서 관련된 통지가 불필요하게 발생되는 것을 방지해야 합니다.

// 배터리 정보에 접근하는 코드
device.batteryMonitoringEnabled = YES; // 배터리 모니터링 시작
device.batteryMonitoringEnabled = NO; // 배터리 모니터링 종료

batteryLevel 속성은 0.0 ~ 1.0 사이의 값을 리턴하며, 1.0은 완전충전을 나타냅니다. 앞에서 설명한 batteryMonitoringEnabled 속성이 YES가 아닌 경우에는 항상 -1.0을 리턴합니다.

// ex. 77% 형식의 문자열
NSString* betteryLevel = [NSString stringWithFormat:@"%.0f%%", device.batteryLevel * 100.0f];

batteryState 속성을 통해 3가지 배터리 상태를 구분할 수 있습니다. UIDeviceBatteryStateUnplugged는 USB 케이블이 연결되지 않은 상태를, UIDeviceBatteryStateCharging 는 충전중인 상태를, UIDeviceBatteryStateFull은 충전이 완료된 상태를 각각 나타냅니다. batteryLevel 속성과 마찬가지로 배터리 모니터링을 활성 화하지 않은 경우에는 항상 UIDeviceBatteryStateUnknown을 리턴합니다.

UIDeviceBatteryState betteryState = device.batteryState;

근접센서 정보 (iOS 3.0 이상)

근접센서는 화면 가까이에 어떠한 물체가 근접했는가를 식별하는데 사용되는 센서입니다. 현재는 아이폰에만 내장되어 있으며, 사용자가 통화를 하기위해 아이폰을 귀에 가까 이 가져갈 때 발생할 수 있는 불필요한 터치를 방지하는데 주로 사용됩니다. 

배터리 정보를 얻을때와 마찬가지로 관련된 속성을 사용하 기 전에 proximityMonitoringEnabled 속성을 YES로 설정해 주어야 합니다. proximityState 속성 값이 YES라면 디바이스가 어떠한 물체 가까이에 근접해 있다는 것을 나타냅니다.

device.proximityMonitoringEnabled = YES; // 근접센서 모니터링 시작

if (device.proximityState) 
{
    // 디바이스에 물체가 근접함.
}

device.proximityMonitoringEnabled = NO; // 근접센서 모니터링 종료

멀티태스킹 (iOS 4.0 이상)

iOS 4.0 이전 버전이 설치된 디바이스에서는 홈버튼을 누르면 현재 실행중인 앱이 종료되고 홈스크린으로 이동했습니다. 그러나 iOS 4.0부터는 멀티태스킹이 지원되기 때문에 앱이 바로 종료되지 않고 백그라운드 상태로 이동하게 됩니다. 

멀티태스킹은 iOS 4.0 이상이 설치된 아이폰 3GS 이상, 아이팟 3세대 이상과 모든 아이패드에서 지원됩니다. 그리므로 현재 시점에서 이 속성을 통해 멀티태스킹 여부를 확인하는 작업은 대부분의 경우 필요없다고 봐도 무방합니다.

디바이스가 멀티태스킹을 지원한다면 multitaskingSupported 속성은 YES를 리턴합니다.

BOOL isSupported = device.multitaskingSupported;

커스텀 키보드 지원 (iOS 4.2 이상)

iOS 4.2 이상에서는 OS가 기본적으로 제공하는 키보드가 아닌 커스텀 키보드를 직접 구현해서 사용할 수 있습니다. UIDevice는 커스텀 키보드를 사용하는 경우 기본 키보드 를 사용할 때 재생되는 효과음과 동일한 효과를 구현할 수 있도록 playInputClick 메소드 를 제공합니다.

예제소스

//POINT 1. 현재 디바이스를 나타내는 객체를 얻기 위해 currentDevice 클래스 메소드를 사용합니다.
UIDevice *device = [UIDevice currentDevice]

//POINT 2. 디바 이스의 상태를 알려주는 통지들이 생성되도록 설정합니다.
- (void)startMonitoring
{
   UIDevice *device = [UIDevice currentDevice];
   [device beginGeneratingDeviceOrientationNotifications];
   device.batteryMonitoringEnabled = YES;
   device.proximityMonitoringEnabled = YES;
}

//POINT 3. 원하 는 정보를 얻은 후에는 불필요한 통지들이 생성되지 않도록 합니다.
- (void)stopMonitoring
{
   UIDevice *device = [UIDevice currentDevice];
   [device endGeneratingDeviceOrientationNotifications];
   device.batteryMonitoringEnabled = NO;
   device.proximityMonitoringEnabled = NO;
}