Подтвердить что ты не робот

Есть ли способ определить, находится ли 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, но я бы предпочел не идти по этому маршруту. Любые советы очень ценятся. Спасибо.

4b9b3361

Ответ 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.