Есть ли способ определить, находится ли iphone в роуминге? - PullRequest
21 голосов
/ 23 мая 2009

Я работаю над приложением для iPhone и действительно хотел бы определить, находится ли устройство в роуминге, чтобы я мог разумно избежать затрат на дорогостоящие подключения моих пользователей, если они находятся вне их домашней сети.

Приложение, которое я пишу, предназначено для взломанных телефонов, однако я бы предпочел использовать стандартные SDK, если это возможно.

Вот что я уже нашел:

1. Apple SDK: В документации Apple я нашел обещание в API Apple SCNetworkReachability. API предоставляет доступ к таким вещам, как то, находитесь ли вы в WIFI или сети сотовой связи, установлено ли сетевое соединение в настоящее время и т. Д. Однако при поиске в справочном документе SCNetworkReachability API «роуминг» или «роуминг» оба значения обнуляются. Как и их пример кода.

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 ]

23 голосов
/ 08 июня 2009

Есть! Это вообще не задокументировано, и я очень сомневаюсь, что это сработает на не взломанном телефоне (так как для этого нужно использовать файлы, не находящиеся в песочнице). Однако вот как это делается.

Файловая система 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]);
}
1 голос
/ 12 ноября 2011

решение символических ссылок - не единственный способ сделать это, но определенно это лучший. Как я только что понял, возвращаемые строки содержат коды 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.

0 голосов
/ 09 августа 2014

На устройстве без джейлбрейка вы можете использовать сторонние сервисы, такие как 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.

...