Обнаружение включения горячей точки в iOS с помощью частного API

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

Я пытался просмотреть заголовки списка / времени выполнения частного API, но их слишком много, чтобы решить, что может быть полезным.

или если бы я мог узнать, откуда UIApplicationWillChangeStatusBarFrameNotification запускается в частных API (вероятно, вызванный для активного вызова и активированной точки доступа и т. д.)

Я попытался это обнаружить личную точку доступа, а также использовал CaptiveNetwork, но он возвращает только подключенный Wi-Fi Wi-Fi, а не созданную точку доступа.

любые знания будут чрезвычайно полезны

Обновление: @creker

С помощью приведенного выше кода компилятор показывает ошибку " SCDynamicStoreCreate недоступен: недоступен на iOS. Поэтому я зашел в SCDynamicStore.h и изменил следующее

    SCDynamicStoreRef
SCDynamicStoreCreate            (
                    CFAllocatorRef          allocator,
                    CFStringRef         name,
                    SCDynamicStoreCallBack      callout,
                    SCDynamicStoreContext       *context
                    )               __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_NA);

в

    SCDynamicStoreRef
SCDynamicStoreCreate            (
                    CFAllocatorRef          allocator,
                    CFStringRef         name,
                    SCDynamicStoreCallBack      callout,
                    SCDynamicStoreContext       *context
                    )               __OSX_AVAILABLE_STARTING(__MAC_10_1,__IPHONE_6_0);

Теперь я могу получить словарь с состояниями 1022 и 1023. Просто хотел подтвердить, изменив файл следующим образом (не было сделано ранее), возникнет ли у меня какая-либо проблема с архивированием сборки (или любая другая проблема), кроме того факта, что мы знаю, что этот код не попадет в магазин приложений

1 ответ

Решение

Без частных API

Вы можете обнаружить активную личную точку доступа, перечислив сетевые интерфейсы, используя C API. Когда hotpost активен и кто-то подключен к нему, будет интерфейс с bridge префикс. На моем iPhone 5 это bridge100, Если горячая точка отключена или никто не подключен к ней, то интерфейсы даже не будут в списке.

API C даже вернут вам IP-адрес и маску подсети в этой сети.

Это то, что я использую в своих приложениях для обнаружения активной точки доступа.

Чтобы получить SSID вам нужно [[UIDevice currentDevice] name] - SSID личной точки доступа всегда совпадает с именем устройства.

С частными API

Вы можете получить всю информацию о личной точке доступа, используя этот код:

SCDynamicStoreRef sc = SCDynamicStoreCreate(NULL, CFSTR("com.apple.wirelessmodemsettings.MISManager"), NULL, NULL);
NSDictionary* info = (__bridge_transfer NSDictionary*)SCDynamicStoreCopyValue(sc, CFSTR("com.apple.MobileInternetSharing"));
CFRelease(sc);

info словарь будет выглядеть примерно так, когда точка доступа активна и имеет соединения:

{
    Errnum = 0;
    ExternalInterfaces =     (
        "pdp_ip0"
    );
    Hosts =     {
        Current = 1;
        Max = 5;
        MoreAllowed = 1;
        Type =         {
            AirPort = 0;
            Bluetooth = 0;
            Ethernet = 0;
            "USB-Ethernet" = 1;
        };
    };
    InternalInterfaces =     (
        bridge100
    );
    Reason = 0;
    State = 1023;
    Version = 2;
} 

Когда точка доступа активна, но нет соединений:

{
    Errnum = 0;
    ExternalInterfaces =     (
    );
    Hosts =     {
        Current = 0;
        Max = 5;
        MoreAllowed = 1;
        Type =         {
            AirPort = 0;
            Bluetooth = 0;
            Ethernet = 0;
            "USB-Ethernet" = 0;
        };
    };
    InternalInterfaces =     (
    );
    Reason = 0;
    State = 1023;
    Version = 2;
}

Когда горячая точка не активна:

{
    Errnum = 45;
    ExternalInterfaces =     (
    );
    Hosts =     {
        Current = 0;
        Max = 5;
        MoreAllowed = 1;
        Type =         {
            AirPort = 0;
            Bluetooth = 0;
            Ethernet = 0;
            "USB-Ethernet" = 0;
        };
    };
    InternalInterfaces =     (
    );
    Reason = 0;
    State = 1022;
    Version = 2;
}

State ключ будет равен 1023 когда точка доступа активна независимо от активных соединений. Я не знаю, содержит ли это значение битовые флаги или нет. iOS фактически проверяет, равно ли значение 1023,

API SCDynamicStore от общественности SystemConfiguration рамки, но помечены как недоступные на платформе iOS. Это означает, что все заголовки есть, вам просто нужно скопировать определения без __OSX_AVAILABLE_STARTING макро.

Вы даже можете наблюдать изменения этого параметра - вы можете указать ключ, значение которого вы хотите наблюдать. Прочитайте документацию Apple для деталей реализации.

ОБНОВИТЬ

Поэтому я вошел в SCDynamicStore.h и изменил следующее

Я бы не стал этого делать. Это не должно вызывать никаких проблем, но для меня смена заголовков SDK не является хорошим решением. Я предлагаю следующее. Не включайте заголовки фреймворка. Создайте свой собственный заголовок, куда вы скопируете все необходимые методы __OSX_AVAILABLE_STARTING изменен или удален

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