Есть ли способ определить, находится ли iphone в роуминге?
Я работаю над iPhone-приложением, и мне очень хотелось бы определить, находится ли устройство в роуминге, чтобы я мог разумно избегать дорогостоящих подключений моих пользователей, если они находятся вне их домашней сети.
Приложение, которое я пишу, предназначено для jailbroken телефонов, однако я бы предпочел использовать стандартные SDK, если это возможно.
Вот что я уже нашел:
1. Apple SDK:
В документации Apple я нашел обещание в API Apple SCNetworkReachability. API обеспечивает доступ к таким вещам, как ли вы в сети WIFI или сотовой сети, независимо от того, установлено ли сетевое соединение и т.д. Однако поиск в API-интерфейсе SCNetworkReachability API для "роуминга" или "роуминга" становится равным нулю. Так же их пример кода.
2. Греп Jailbroken 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, но я бы предпочел не идти по этому маршруту. Любые советы очень ценятся. Спасибо.
Ответы
Ответ 1
Есть! Он вообще не задокументирован, и я очень сомневаюсь, что это будет работать на не-jailbroken телефоне (так как для этого требуется использовать файлы, не находящиеся в песочнице). Однако, вот как это делается.
Файловая система 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]);
}
Ответ 2
решение символических ссылок - это не единственный способ сделать это, но, безусловно, это лучший. Как я только что понял, строки, которые были возвращены, содержат коды 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.
Ответ 3
На устройстве без джейлбрейка вы можете использовать сторонние сервисы, такие как 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"
}
Доступны пользовательские пакеты, которые также включают в себя данные mnc/mcc для мобильных IP-адресов. Подробнее см. http://ipinfo.io/developers.