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

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

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

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

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

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

Обновление: @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. Просто хотел подтвердить, изменив файл, как это (не делалось раньше), будут ли у меня проблемы с архивированием сборки (или любая другая проблема), кроме того факта, что мы знайте, что этот код не попадет в магазин приложений


person hemant    schedule 04.07.2015    source источник


Ответы (1)


Без частных API

Вы можете обнаружить активную личную точку доступа, перечислив сетевые интерфейсы с помощью C API. Когда хотпост активен и к нему кто-то подключается, будет интерфейс с префиксом 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.

person creker    schedule 04.07.2015
comment
Чем это отличается от ссылки на личную точку доступа OP? - person Jesse Rusak; 04.07.2015
comment
@JesseRusak, я дал полный ответ на его вопрос, включая SSID точки доступа. Код в ссылке использует неправильное имя интерфейса. Как видите, искать bridge0 неправильно — на новых устройствах он называется bridge100. Нам нужно искать только префикс bridge. - person creker; 04.07.2015
comment
отличный. это сработало. Я также получаю bridge100 на данный момент. но мне все еще было интересно, могу ли я получить активный статус точки доступа, независимо от того факта, что никто еще не подключился к этой точке доступа? - person hemant; 05.07.2015
comment
@creker, я обновил вопрос, есть еще один вопрос, чтобы мы могли его закрыть. - person hemant; 05.07.2015
comment
Привет, я пытаюсь использовать ваш код, чтобы получить информацию о точке доступа. Но я получаю ошибку ниже. «SCDynamicStoreCreate» недоступен: недоступен на iOS. И другая ошибка ниже «SCDynamicStoreCopyValue» недоступна: недоступна на iOS. Есть ли способ решить вышеуказанную проблему? Я попробовал этот код в xcode6.4.iOS SDK 8.4. Спасибо большое. - person dickfala; 23.07.2015
comment
@dickfala, я упомянул об этом в своем ответе. - person creker; 23.07.2015
comment
@creker, спасибо за ответ. Я не очень понимаю. Можете ли вы объяснить, как это сделать, и изменили ли вы упомянутый метод детализации? Вы имеете в виду, что мы должны скопировать SCDynamicStore.h и скопировать в проект и изменить или удалить вручную? Я пытаюсь удалить метод show __OSX_AVAILABLE_STARTING? Но они все еще не нашли SCDynamicStoreCreate. Извините, я тупой. Но я действительно хочу добиться функции. Можете ли вы помочь мне, пожалуйста. спасибо - person dickfala; 24.07.2015
comment
Привет, @creker, я опубликовал всю свою проблему по адресу stackoverflow.com/questions/31621847/ Можете ли вы мне помочь? Спасибо. - person dickfala; 25.07.2015
comment
Как перечислить сетевые интерфейсы с помощью C API, не могли бы вы опубликовать код? - person DàChún; 05.09.2017
comment
нашел, спасибо: stackoverflow.com/questions/30748480/ - person DàChún; 05.09.2017