Есть ли способ определить, находится ли 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 для деталей.

Другие вопросы по тегам