今天写了一段有关在iPhone程序中开关WiFi型号的代码,经测试运行良好。
我想不用我多说大家都应该知道以上的功能只能在越狱的设备中实现!
好了,闲话稍少叙,进入正题:1.首先要在SpringBoard启动之后,我们要执行hook动作:NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];if ([identifier isEqualToString:@"com.apple.springboard"]) {Class $SpringBoard = (objc_getClass("SpringBoard"));_SpringBoard$applicationDidFinishLaunching$ =            MSHookMessage($SpringBoard, @selector(applicationDidFinishLaunching:),&$SpringBoard$applicationDidFinishLaunching$);}2. 然后实现我们的HOOK函数,这里我们仅仅是注册了两个消息:CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL,&NotificationReceivedCallback, CFSTR("turnOffWiFi"), NULL, CFNotificationSuspensionBehaviorCoalesce);CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), NULL,&NotificationReceivedCallback, CFSTR("turnOnWiFi"), NULL,CFNotificationSuspensionBehaviorCoalesce);3. 最后我们要响应这两个信号,也就是实现我们在第二步中指明的那个回调方法(NotificationReceivedCallback)static void NotificationReceivedCallback(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
{BOOL offOrOn = YES;if ([(NSString *)name isEqualToString:@"turnOffWiFi"]) {offOrOn = NO;} else if ([(NSString *)name isEqualToString:@"turnOnWiFi"]) {offOrOn = YES;}[[objc_getClass("SBWiFiManager") sharedInstance] setWiFiEnabled:offOrOn];
}也就是这一步正真的对WiFi信号进行开关操作。好了我们的后台程序(dynamicLibrary)已经编写完成了。然后在我们的前台程序中我们找个事件来发送我们在后台注册的那两个消息,例如一个Button和一个BOOL值来完成这功能:BOOL turnOff = YES;if (turnOn) {CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("turnOffWiFi"), NULL, NULL, 0);} else {CFNotificationCenterPostNotificationWithOptions(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("turnOffWiFi"), NULL, NULL, 0);}测试设备:iPhone 3GS系统:iOS 4.3.3设备状态:已越狱测试结果:Perfect!注1:使用相同的方法我们可以启动和关闭蓝牙:首先,我们要从BluetoothManager.framework这个私有库中dump出BluetoothManager这个类;然后,我们就可以调用这个类的setPowered:方法启动和关闭蓝牙了(参数:YES为启动、NO为关闭)。经过我的测试是可以正常使用的。注2:我们同样可以对飞行模式作开启和关闭操作:首先:我们从SpringBoard中可以dump出SBTelephonyManager和SBStatusBarDataManager这两个类,前者主要负责功能的开关,后者则是负责UI显示的。使用SBTelephonyManager的isInAirplaneMode方法可以得到当前的飞行模式状态,setIsInAirplaneMode:这个方法来设置飞行模式。使用SBStatusBarDataManager的airplaneModeChanged和_updateSignalStrengthItem来刷新UI显示状态。以上的方法最终都是由后台(动态库)完成的,最近由于工作需要要在应用中直接开启关闭WiFi、Bluetooth和飞行模式,所以又做了一些研究工作。最终发现我们在App中也可以开启或关闭以上三种模式(当然这一切依旧需要在越狱环境),其中最简单的是蓝牙(Bluetooth)只要将一个名为BluetoothManager的私有库添加到工程中,然后使用其中的BluetoothManager这个单例就可以开关蓝牙了(Class-Dump);而WiFi和飞行模式相对复杂一些,但是他们缺只需要个共有库就可以,那就是SystemConfiguration.framework,下面我把开飞行模式的代码给出大家:SCPreferencesRef preferences = SCPreferencesCreateWithAuthorization(kCFAllocatorDefault, CFSTR("MyAppIndtifier"), CFSTR("com.apple.radios.plist"), NULL);if (preferences) {Boolean result = SCPreferencesLock(preferences, YES);if (result == TRUE) {CFBooleanRef airplane = SCPreferencesGetValue(preferences, CFSTR("AirplaneMode"));if (airplane == kCFBooleanTrue) {airplane = kCFBooleanFalse;} else {airplane = kCFBooleanTrue;}result = SCPreferencesSetValue(preferences, CFSTR("AirplaneMode"), airplane);if (result == TRUE) {result = SCPreferencesCommitChanges(preferences);if (result) {result = SCPreferencesApplyChanges(preferences);}}SCPreferencesUnlock(preferences);}CFRelease(preferences);}只要将com.apple.radios.plist换成com.apple.wifi.plist, 同时将AirplaneMode换成AllowEnable就可以开关蓝牙了。最后我们还需要Entitlements,它的内容如下:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>keychain-access-groups</key><array><string>$(AppIdentifierPrefix)MyAppIndtifier</string></array><key>com.apple.SystemConfiguration.SCDynamicStore-write-access</key><true/><key>com.apple.SystemConfiguration.SCPreferences-write-access</key><array><string>com.apple.radios.plist</string><string>com.apple.wifi.plist</string></array>
</dict>
</plist>我们需要用ldid给将这个Entitlements签到可执行程序就可以了!最近的开发中又研究了一下VPN的开关方法,涉及到ManagedConfiguration、VPNUtilities以及SystemConfiguration三个framework,代码如下:extern Boolean MCVPNPreferencesLock(SCPreferencesRef);
extern Boolean MCVPNPreferencesUnlock(SCPreferencesRef);extern CFDictionaryRef MCVPNServiceGetConfigurationProperty(SCNetworkServiceRef, CFStringRef);
extern CFStringRef MCVPNServiceCopyPassword(SCNetworkServiceRef);
extern CFStringRef MCVPNServiceCopySharedSecret(SCNetworkServiceRef);static void callout(SCNetworkConnectionRef connection, SCNetworkConnectionStatus status, void *info) {
}- (BOOL)VPNEnabled {BOOL retVal = NO;CFBundleRef mainBundle = CFBundleGetMainBundle();CFStringRef bundleIdentifier = CFBundleGetIdentifier(mainBundle);SCPreferencesRef preferences = SCPreferencesCreateWithAuthorization(kCFAllocatorDefault, bundleIdentifier, nil, nil);if (preferences) {CFArrayRef services = SCNetworkServiceCopyAll(preferences);if (services) {CFIndex i, count = CFArrayGetCount(services);for (i = 0; i < count; i++) {SCNetworkServiceRef networkServerice = CFArrayGetValueAtIndex(services, i);if (SCNetworkServiceGetEnabled(networkServerice)) {SCNetworkInterfaceRef interface = SCNetworkServiceGetInterface(networkServerice);CFStringRef interfaceType = SCNetworkInterfaceGetInterfaceType(interface);if (CFStringCompare(interfaceType, kSCNetworkInterfaceTypePPP, kCFCompareAnchored) == kCFCompareEqualTo || CFStringCompare(interfaceType, kSCNetworkInterfaceTypeIPSec, kCFCompareAnchored) == kCFCompareEqualTo) {if (MCVPNPreferencesLock(preferences)) {SCNetworkConnectionRef connection = SCNetworkConnectionCreateWithServiceID(kCFAllocatorDefault, SCNetworkServiceGetServiceID(networkServerice), NULL, NULL);if (connection) {SCNetworkConnectionStatus connectionStatus = SCNetworkConnectionGetStatus(connection);if (connectionStatus == kSCNetworkConnectionConnecting || connectionStatus == kSCNetworkConnectionConnected) {retVal = YES;}CFRelease(connection);}MCVPNPreferencesUnlock(preferences);}break;}}}CFRelease(services);}CFRelease(preferences);}return retVal;
}- (void)setVPNEnabled:(BOOL)enabled {CFBundleRef mainBundle = CFBundleGetMainBundle();CFStringRef bundleIdentifier = CFBundleGetIdentifier(mainBundle);SCPreferencesRef preferences = SCPreferencesCreateWithAuthorization(kCFAllocatorDefault, bundleIdentifier, nil, nil);if (preferences) {CFArrayRef services = SCNetworkServiceCopyAll(preferences);if (services) {CFIndex i, count = CFArrayGetCount(services);for (i = 0; i < count; i++) {SCNetworkServiceRef networkServerice = CFArrayGetValueAtIndex(services, i);if (SCNetworkServiceGetEnabled(networkServerice)) {SCNetworkInterfaceRef interface = SCNetworkServiceGetInterface(networkServerice);CFStringRef interfaceType = SCNetworkInterfaceGetInterfaceType(interface);if (CFStringCompare(interfaceType, kSCNetworkInterfaceTypePPP, kCFCompareAnchored) == kCFCompareEqualTo) {if (MCVPNPreferencesLock(preferences)) {SCNetworkConnectionRef connection = SCNetworkConnectionCreateWithServiceID(kCFAllocatorDefault, SCNetworkServiceGetServiceID(networkServerice), callout, NULL);if (connection) {if (SCNetworkConnectionScheduleWithRunLoop(connection, CFRunLoopGetMain(), kCFRunLoopDefaultMode)) {if (enabled) {CFStringRef password = MCVPNServiceCopyPassword(networkServerice);CFStringRef sharedSecret = MCVPNServiceCopySharedSecret(networkServerice);CFDictionaryRef    userOptions = nil;if (password) {NSArray *keys1 = [[NSArray alloc] initWithObjects:(NSString *)kSCPropNetIPSecAuthenticationMethod, (NSString *)kSCPropNetIPSecLocalCertificate, (NSString *)kSCPropNetIPSecLocalIdentifier, (NSString *)kSCPropNetIPSecLocalIdentifierType, (NSString *)kSCPropNetIPSecSharedSecret, (NSString *)kSCPropNetIPSecSharedSecretEncryption, (NSString *)kSCPropNetIPSecConnectTime, (NSString *)kSCPropNetIPSecRemoteAddress, (NSString *)kSCPropNetIPSecStatus, (NSString *)kSCPropNetIPSecXAuthEnabled, (NSString *)kSCPropNetIPSecXAuthName, (NSString *)kSCPropNetIPSecXAuthPassword, (NSString *)kSCPropNetIPSecXAuthPasswordEncryption, nil];CFMutableDictionaryRef IPSecValue = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);for (NSString *key in keys1) {if (CFStringCompare(kSCPropNetIPSecSharedSecret, (CFStringRef)key, kCFCompareAnchored) == kCFCompareEqualTo) {if (sharedSecret) {CFDictionaryAddValue(IPSecValue, (const void *)key, (const void *)sharedSecret);}} else if (CFStringCompare(kSCPropNetIPSecXAuthPassword, (CFStringRef)key, kCFCompareAnchored) == kCFCompareEqualTo) {if (password) {CFDictionaryAddValue(IPSecValue, (const void *)key, (const void *)password);}} else {CFStringRef value = (CFStringRef)MCVPNServiceGetConfigurationProperty(networkServerice, (CFStringRef)key);if (value) {CFDictionaryAddValue(IPSecValue, (const void *)key, (const void *)value);}}}[keys1 release];NSArray *keys2 = [[NSArray alloc] initWithObjects:(NSString *)kSCPropNetPPPAuthName, (NSString *)kSCPropNetPPPAuthPassword, (NSString *)kSCPropNetPPPCommRemoteAddress, nil];CFMutableDictionaryRef PPPSecValue = CFDictionaryCreateMutable(kCFAllocatorDefault, 3, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);for (NSString *key in keys2) {if (CFStringCompare(kSCPropNetPPPAuthPassword, (CFStringRef)key, kCFCompareAnchored) == kCFCompareEqualTo) {if (password) {CFDictionaryAddValue(PPPSecValue, (const void *)key, (const void *)password);}} else {CFStringRef value = (CFStringRef)MCVPNServiceGetConfigurationProperty(networkServerice, (CFStringRef)key);if (value) {CFDictionaryAddValue(PPPSecValue, (const void *)key, (const void *)value);}}}[keys2 release];CFStringRef keys[] = {kSCNetworkInterfaceTypeIPSec, kSCNetworkInterfaceTypePPP};CFDictionaryRef values[] = {IPSecValue, PPPSecValue};userOptions = CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void **)values, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);CFRelease(IPSecValue);CFRelease(PPPSecValue);CFRelease(password);}SCNetworkConnectionStart(connection, userOptions, true);if (userOptions) {CFRelease(userOptions);}} else {SCNetworkConnectionStop(connection, true);}SCNetworkConnectionUnscheduleFromRunLoop(connection, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);}CFRelease(connection);}MCVPNPreferencesUnlock(preferences);}break;} else if (CFStringCompare(interfaceType, kSCNetworkInterfaceTypeIPSec, kCFCompareAnchored) == kCFCompareEqualTo) {if (MCVPNPreferencesLock(preferences)) {SCNetworkConnectionRef connection = SCNetworkConnectionCreateWithServiceID(kCFAllocatorDefault, SCNetworkServiceGetServiceID(networkServerice), callout, NULL);if (connection) {if (SCNetworkConnectionScheduleWithRunLoop(connection, CFRunLoopGetMain(), kCFRunLoopDefaultMode)) {if (enabled) {CFStringRef password = MCVPNServiceCopyPassword(networkServerice);CFStringRef sharedSecret = MCVPNServiceCopySharedSecret(networkServerice);CFDictionaryRef    userOptions = nil;if (password) {NSArray *keys1 = [[NSArray alloc] initWithObjects:(NSString *)kSCPropNetIPSecAuthenticationMethod, (NSString *)kSCPropNetIPSecLocalCertificate, (NSString *)kSCPropNetIPSecLocalIdentifier, (NSString *)kSCPropNetIPSecLocalIdentifierType, (NSString *)kSCPropNetIPSecSharedSecret, (NSString *)kSCPropNetIPSecSharedSecretEncryption, (NSString *)kSCPropNetIPSecConnectTime, (NSString *)kSCPropNetIPSecRemoteAddress, (NSString *)kSCPropNetIPSecStatus, (NSString *)kSCPropNetIPSecXAuthEnabled, (NSString *)kSCPropNetIPSecXAuthName, (NSString *)kSCPropNetIPSecXAuthPassword, (NSString *)kSCPropNetIPSecXAuthPasswordEncryption, nil];CFMutableDictionaryRef IPSecValue = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);for (NSString *key in keys1) {if (CFStringCompare(kSCPropNetIPSecSharedSecret, (CFStringRef)key, kCFCompareAnchored) == kCFCompareEqualTo) {if (sharedSecret) {CFDictionaryAddValue(IPSecValue, (const void *)key, (const void *)sharedSecret);}} else if (CFStringCompare(kSCPropNetIPSecXAuthPassword, (CFStringRef)key, kCFCompareAnchored) == kCFCompareEqualTo) {if (password) {CFDictionaryAddValue(IPSecValue, (const void *)key, (const void *)password);}} else {CFStringRef value = (CFStringRef)MCVPNServiceGetConfigurationProperty(networkServerice, (CFStringRef)key);if (value) {CFDictionaryAddValue(IPSecValue, (const void *)key, (const void *)value);}}}[keys1 release];CFDictionaryRef PPPSecValue = CFDictionaryCreate(kCFAllocatorDefault, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);CFStringRef keys[] = {kSCNetworkInterfaceTypeIPSec, kSCNetworkInterfaceTypePPP};CFDictionaryRef values[] = {IPSecValue, PPPSecValue};userOptions = CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void **)values, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);CFRelease(IPSecValue);CFRelease(PPPSecValue);CFRelease(password);}SCNetworkConnectionStart(connection, userOptions, true);if (userOptions) {CFRelease(userOptions);}} else {SCNetworkConnectionStop(connection, true);}SCNetworkConnectionUnscheduleFromRunLoop(connection, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);}CFRelease(connection);}MCVPNPreferencesUnlock(preferences);}break;}}}CFRelease(services);}CFRelease(preferences);}
}

iOS设备中WiFi、蓝牙和飞行模式的开启与关闭相关推荐

  1. iOS设备中WiFi、蓝牙和飞行模式的开启与关闭(私有API)

    今天写了一段有关在iPhone程序中开关WiFi型号的代码,经测试运行良好. 我想不用我多说大家都应该知道以上的功能只能在越狱的设备中实现! 好了,闲话稍少叙,进入正题: 1.首先要在SpringBo ...

  2. 飞行模式的开启和关闭

    2019独角兽企业重金招聘Python工程师标准>>> if(Settings.System.getString(getActivity().getContentResolver() ...

  3. wp———跳转系统设置页面的wifi、网络连接、蓝牙、飞行模式等

    通过 ConnectionSettingsType 的设置,可以跳转 到 wifi.蓝牙.飞行模式.以及网络连接 其他方案跳转 1 private async void Button_Click_1( ...

  4. android飞行模式开启wifi,手机在飞行模式下怎么使用WiFi? 飞行模式下开启WiFi的方法图文教程详细介绍[多图]...

    类型: 大小: 评分: 平台: 标签: 手机在飞行模式下怎么使用WiFi?相信很多朋友都还不太清楚吧?没关系,下面是友情小编搜集相关资料整理出来的手机在飞行模式下开启WiFi的方法图文教程详细介绍,希 ...

  5. 转 如何在IOS设备中去掉屏幕上的status bar

    引入 如何在IOS设备中去掉屏幕上的status bar,即:不显示设备上方的[网络.时间.电池??]条? 操作 方法一: 在-info.list项目文件中,加上"Status bar is ...

  6. 防止在iOS设备中的Safari将数字识别为电话号码

    转:防止在iOS设备中的Safari将数字识别为电话号码 在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名 ...

  7. 在iOS设备中跑Python脚本

    在iOS设备中运行python脚本?那不就意味着可以在手机上跑爬虫,可以使用各种牛逼哄哄的python库了吗. 这个标题对我很有吸引力,曾经就有见到过在iOS平台上的python编译器(很多iOS上p ...

  8. 同步推软件:查看ios设备中persistentDataPath下文件,安装ipa

    1.使用Unity开发的app,有可能会用到PersistentDataPath,在ios设备中可以借助同步推软件来查看(mac上也有,不过更新不是太频繁,经常下载后和mac os系统不兼容,不可用) ...

  9. 从ios设备中获取ipa并且获取其中的资源

    1.从ios设备中获取ipa的方法很简单. 使用itools工具就,点击应用栏目. 然后再选择你需要的获取的ipa的程序,选中之后,点击右键备份,选择目录存放就可以获取ipa了 2.修改.ipa为.z ...

最新文章

  1. 在青岛呆了两年之后,我明白了何为工资低消费高。。。
  2. matlab 小技巧
  3. nlp 中文停用词数据集
  4. 【渝粤教育】国家开放大学2018年春季 0062-21T港台文学专题讲座 参考试题
  5. java 等待唤醒机制,Java线程等待唤醒机制
  6. java中未解决的编译问题_java – 我遇到了这个异常:未解决的编译问题
  7. graphics | 基础绘图系统(三)——添加文本标注、坐标轴线和图例
  8. Linux 目录简要结构认识
  9. SQL2005学习(三十二),Group by
  10. IOS打开pdf文件
  11. 基于scrapy-splash进行单页应用网站seo处理
  12. wxpython控件自适应窗口大小
  13. Visual Studio 2015的破解密钥
  14. 计算机技术发展5大阶段,现阶段计算机技术应用及发展
  15. 破解钉钉旧版本强制更新(实现旧版本登录)
  16. GHOST恢复盘.维护盘关键词
  17. 吃猕猴桃,当然不不不不能错过贵州的啦
  18. 先序、中序、后序、递归序(重要)
  19. Python爬取京东任意商品数据实战总结
  20. Word控件Spire.Doc更新至最新版v10.7,增强产品稳定性,修复老版本漏洞

热门文章

  1. android临时root权限获取失败,安卓手机为何获取Root权限失败?分析手机Root失败的原因是什么?...
  2. php 创造csv,从 PHP 数据创建 CSV 文件
  3. 红旗linux安装oracle,红旗linux 4.1上安装oracle 9204
  4. 百度云进军智慧农业,ABC+IoT为农业匠人带来全新可能
  5. android仿新浪微博随便看看
  6. 顶级研究机构发布《ChatGPT 全产业研究报告》 120页PDF 打包下载
  7. [ITIL] IT服务管理经典语录---刘亿舟
  8. 1.20和1.21的区别
  9. Vue elementUI中把数据库中的1,0转成男女
  10. 在SOM-RK3399上使用QT的QMediaPlayer组件实现的播放器播放视频卡顿的解决办法