Обнаружение включения горячей точки в 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
изменен или удален