使用私有 api 检测 iOS 中启用的热点
detect hotspot enabling in iOS with private api's
好的,所以我想检测用户在 iOS 设备中是否启用了 hotspot/tethering 的天气。我可以使用私人 api 知道它不会进入应用程序商店。
我正在尝试通读 private api's list/ runtime headers,但有太多内容无法决定哪些可能有用。
或者如果我能知道 UIApplicationWillChangeStatusBarFrameNotification 在哪里被私下 api 解雇(可能需要活跃的通话和激活的热点等)
我尝试了这个 detect personal hotspot 并且还使用了 CaptiveNetwork 但它只 returns 连接的 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 的字典。只是想通过像这样更改文件(之前没有做过)来确认我在归档构建时是否有任何问题(或任何其他问题)其他那么我们知道这段代码不会进入应用商店的事实
没有私有 API
您可以使用 C API 枚举网络接口来检测活跃的个人热点。当热点处于活动状态并且有人连接到它时,将会出现带有 bridge
前缀的界面。在我的 iPhone 5 上是 bridge100
。如果热点被禁用或没有人连接到它,那么接口甚至不会出现在列表中。
C API 甚至 return 您在该网络中的 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
当热点处于活动状态时,无论活动连接如何。我不知道该值是否包含 bit-flags 或不。 iOS 实际上是在检查值是否等于 1023
.
SCDynamicStore API 来自 public SystemConfiguration
框架,但标记为在 iOS 平台上不可用。这意味着所有 header 都在那里,您只需要复制没有 __OSX_AVAILABLE_STARTING
宏的定义。
您甚至可以观察到该设置的变化 - 您可以指定一个键来观察哪个值。阅读 Apple 文档以了解实施细节。
更新
So i went into SCDynamicStore.h and changed the following
我不会那样做。它应该不会造成任何问题,但对我来说更改 SDK headers 不是一个好的解决方案。我建议如下。不包括框架 headers。制作您自己的 header,在其中复制您需要的所有方法,并更改或删除 __OSX_AVAILABLE_STARTING
。
好的,所以我想检测用户在 iOS 设备中是否启用了 hotspot/tethering 的天气。我可以使用私人 api 知道它不会进入应用程序商店。
我正在尝试通读 private api's list/ runtime headers,但有太多内容无法决定哪些可能有用。
或者如果我能知道 UIApplicationWillChangeStatusBarFrameNotification 在哪里被私下 api 解雇(可能需要活跃的通话和激活的热点等)
我尝试了这个 detect personal hotspot 并且还使用了 CaptiveNetwork 但它只 returns 连接的 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 的字典。只是想通过像这样更改文件(之前没有做过)来确认我在归档构建时是否有任何问题(或任何其他问题)其他那么我们知道这段代码不会进入应用商店的事实
没有私有 API
您可以使用 C API 枚举网络接口来检测活跃的个人热点。当热点处于活动状态并且有人连接到它时,将会出现带有 bridge
前缀的界面。在我的 iPhone 5 上是 bridge100
。如果热点被禁用或没有人连接到它,那么接口甚至不会出现在列表中。
C API 甚至 return 您在该网络中的 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
当热点处于活动状态时,无论活动连接如何。我不知道该值是否包含 bit-flags 或不。 iOS 实际上是在检查值是否等于 1023
.
SCDynamicStore API 来自 public SystemConfiguration
框架,但标记为在 iOS 平台上不可用。这意味着所有 header 都在那里,您只需要复制没有 __OSX_AVAILABLE_STARTING
宏的定义。
您甚至可以观察到该设置的变化 - 您可以指定一个键来观察哪个值。阅读 Apple 文档以了解实施细节。
更新
So i went into SCDynamicStore.h and changed the following
我不会那样做。它应该不会造成任何问题,但对我来说更改 SDK headers 不是一个好的解决方案。我建议如下。不包括框架 headers。制作您自己的 header,在其中复制您需要的所有方法,并更改或删除 __OSX_AVAILABLE_STARTING
。