Есть ли способ определить, находится ли iphone в роуминге?
Я работаю над приложением для iPhone и очень хотел бы определить, находится ли устройство в роуминге, чтобы я мог разумно избежать затрат на дорогостоящие подключения моих пользователей, если они находятся вне их домашней сети.
Приложение, которое я пишу, предназначено для взломанных телефонов, однако я бы предпочел использовать стандартные SDK, если это возможно.
Вот что я уже нашел:
1. Apple SDK: в документации Apple я нашел обещание в API Apple SCNetworkReachability. API обеспечивает доступ к таким вещам, как то, находитесь ли вы в WIFI или сети сотовой связи, установлено ли сетевое соединение в настоящее время и т. Д. Однако при поиске в справочном документе по API SCNetworkReachability для "роуминга" или "роуминга" оба значения равны нулю. Как и их пример кода.
2. Grep для взломанного iPhone FS: на вкладке " Настройки" -> "Общие" -> "Сеть" пользователи могут включать или выключать свой роуминг. Посмотрев в файле plist для этого ("/Applications/Preferences/Network.plist"), я смог найти следующие ссылки:
PostNotification = "com.apple.commcenter.InternationalRoamingEDGE.changed";
cell = PSSwitchCell;
default = 1;
defaults = "com.apple.commcenter";
key = InternationalRoamingEDGE;
label = "EDGE_ROAMING_TOGGLE";
requiredCapabilities = (
telephony
);
Это, безусловно, преимущество, поскольку, похоже, я могу подписаться на уведомления о том, что пользователь изменил настройки InternationalRoaming. Тем не менее, я не уверен, как превратить это в знание того, что они на самом деле, в настоящее время в роуминге.
3. Проверьте исходные классы SpringBoard: я сбросил классы SpringBoard с помощью class-dump. Мне не удалось найти ссылки на "роуминг" или "роуминг"
4. Очевидно, я начал с проверки в SO для этого: не смог найти ничего связанного.
Дальнейшие шаги: есть ли у кого-нибудь здесь советы? Я знаю, что это возможно. Однако Apple явно очень трудно найти. Я очень сомневаюсь, что это возможно без использования частной структуры. (например, CoreTelephony). Поскольку это джейлбрейк-приложение, я могу прибегнуть к выводу на экран имени оператора с введенным кодом в SpringBoard, но я бы предпочел не идти по этому пути. Любой совет высоко ценится. Благодарю.
3 ответа
Есть! Это вообще не задокументировано, и я очень сомневаюсь, что это будет работать на не взломанном телефоне (так как для этого нужно использовать файлы, не входящие в "песочницу"). Однако вот как это делается.
Файловая система iPhone содержит две мягкие ссылки:
static NSString *carrierPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.carrier.plist";
static NSString *operatorPListSymLinkPath = @"/var/mobile/Library/Preferences/com.apple.operator.plist";
когда эти ссылки указывают на один и тот же файл, телефон не находится в роуминге. При наведении на разные файлы телефон ромает.
Упрощенный код (без проверки ошибок и т. Д.):
- (BOOL)isRoaming
{
NSFileManager *fm = [NSFileManager defaultManager];
NSError *error;
NSString *carrierPListPath = [fm destinationOfSymbolicLinkAtPath:carrierPListSymLinkPath error:&error];
NSString *operatorPListPath = [fm destinationOfSymbolicLinkAtPath:operatorPListSymLinkPath error:&error];
return (![operatorPListPath isEqualToString:carrierPListPath]);
}
Решение символических ссылок - не единственный способ сделать это, но определенно это лучший. Как я только что понял, возвращенные строки содержат коды MCC и MNC оператора и перевозчика!!! Даже базовая структура телефонии не может получить информацию об операторе, к которому подключен ваш iPhone в роуминге.
Logs:
carrier: /System/Library/Carrier Bundles/iPhone/72410/carrier.plist
operator: /System/Library/Carrier Bundles/iPhone/20810/carrier.plist
Как вы можете видеть, строка оператора (оригинального сотового провайдера) содержит файл внутри "папки" 72410, что означает MCC 724 (Бразилия) и MNC 10 (VIVO). Оператор (фактически тот, к которому мой сотовый телефон подключен сейчас - я в роуминге) находится внутри папки 20810, что означает MCC 208 (Франция) и MNC 10 (SFR).
Кстати, я использую iPhone 4 с iOS5.
На устройстве без джейлбрейка вы можете использовать сторонние сервисы, такие как http://ipinfo.io/ (мой собственный сервис), чтобы узнать текущую страну, даже код оператора, основываясь на IP-адресе устройства, а затем сравнить его с Подробности CTCarrier, чтобы определить, находится ли устройство в роуминге. Вот стандартный ответ API ipinfo.io:
$ curl ipinfo.io/24.32.148.1
{
"ip": "24.32.148.1",
"hostname": "doc-24-32-148-1.pecos.tx.cebridge.net",
"city": "Pecos",
"region": "Texas",
"country": "US",
"loc": "31.3086,-103.5892",
"org": "AS7018 AT&T Services, Inc.",
"postal": "79772"
}
Тем не менее, доступны пользовательские пакеты, которые также включают в себя сведения о мобильных IP-адресах mnc / mcc. Смотрите http://ipinfo.io/developers для деталей.