기존에 국가코드를 가져오는 코드에서 문제가 발생했습니다. 코드 정보를 제대로 못 받아오는 부분이 있었는데요. 이유는 바로 유심이 없는 테스트폰이었기 때문입니다. 기존에 사용하고 있던 코드는 디바이스에 연결된 네트워크에서 정보를 가져오고 있었습니다.
subscriberCellularProvider
CTTelephonyNetworkInfo *sNetworkInfo = [[[CTTelephonyNetworkInfo alloc] init] autorelease];
NSString* isoCountryCode;
if (@available(iOS 12.0, *)) {
NSDictionary<NSString *, CTCarrier *>* sCarrier = [sNetworkInfo serviceSubscriberCellularProviders];
CTCarrier* carrier = nil;
for (NSString *key in sCarrier) {
carrier = sCarrier[key];
break;
}
isoCountryCode = [carrier isoCountryCode];
}
else
{
CTCarrier* carrier = [sNetworkInfo subscriberCellularProvider];
isoCountryCode = [carrier isoCountryCode];
}
return ([isoCountryCode length] > 0 ) ? isoCountryCode : @"";
CTTelephonyNetworkInfo
는 셀룰러 데이터 정보에서 받아오게 됩니다. subscriberCellularProvider
의 경우도 Deprecated
되었습니다. 따라서 iOS 12 이상부터는 serviceSubscriberCellularProviders
로 변경해주면 됩니다. (아직 없어지지는 않아서 사용은 가능합니다.)
isoCountryCode
여기서 문제는 이 정보가 셀룰러 정보에서 가져오기 때문에 앞에서 설명한 것 처럼 데이터가 연결되지 않은 폰에서는 문제가 발생합니다.
- 비행기 모드일 경우
- 유심 카드가 없을 경우
- 셀룰러 서비스의 범위를 벗어났을 경우
이 경우에는 해당 isoCountryCode
를 사용 할 수 없습니다. Wifi 네트워크 정보에서 이런 국가 코드를 가져오는 게 있나 찾아봤었는데요. 딱히 정보를 얻을 수 없었습니다. 그래서 차선책으로 아이폰 로컬 설정 지역 정보를 가져오기로 했습니다. 이 방법으로 로컬 설정 언어도 가져올 수 있습니다.
NSLocale
NSLocale *currentLocale = [NSLocale currentLocale];
NSString *countryCode = [currentLocale objectForKey:NSLocaleCountryCode]
NSString *languageCode = [currentLocale objectForKey:NSLocaleLanguageCode];
현재 아이폰 로컬에 설정된 국가 정보 가져오는 코드 입니다. 방법은 NSLocale
을 이용합니다. 여기에 많은 정보가 있는데요. 언어 코드정보도 이 방식으로 가져올 수 있습니다.
그리드형(광고전용)