转自:http://www.cnblogs.com/OtionSky/archive/2011/11/08/iOS_WiFi_Controller.html

今天写了一段有关在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为关闭)。

带有.h文件的BluetoothManager.framework请到我的资源里下载

#import <UIKit/UIKit.h>
#import <BluetoothManager/BluetoothManager.h>
//#import <SpringBoard/SBWiFiManager.h> @interface hylViewController : UIViewController{
BOOL isBlueToothOn;
BOOL isWlanOn;
} @end

  

#import "hylViewController.h"

@implementation hylViewController
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad]; Class BluetoothManager = objc_getClass( "BluetoothManager" ) ;
id btCont = [BluetoothManager sharedInstance] ;
isBlueToothOn = [btCont enabled] ;
UISwitch *blueTouthSwitch = [[UISwitch alloc] initWithFrame:CGRectMake(150,50,0,0)];
[blueTouthSwitch addTarget:self action:@selector(BlueTouthSwitchAction:) forControlEvents:UIControlEventValueChanged];
blueTouthSwitch.on = isBlueToothOn;
[self.view addSubview:blueTouthSwitch];
[blueTouthSwitch release];
} -(void)BlueTouthSwitchAction:(id)sender
{
#if TARGET_IPHONE_SIMULATOR
exit( EXIT_SUCCESS ) ;
#else
/* this works in iOS 4.2.3 */
Class BluetoothManager = objc_getClass( "BluetoothManager" );
id btCont = [BluetoothManager sharedInstance];
[self performSelector:@selector(toggle:) withObject:btCont afterDelay:1.0f];
#endif
}
#if TARGET_IPHONE_SIMULATOR
#else
- (void)toggle:(id)btCont
{
BOOL currentState = [btCont enabled] ;
[btCont setEnabled:!currentState] ;
[btCont setPowered:!currentState] ;
}
#endif
@end

  

经过我的测试是可以正常使用的。

注2:我们同样可以对飞行模式作开启和关闭操作:

首先:我们从SpringBoard中可以dump出SBTelephonyManager和SBStatusBarDataManager这两个 类,前者主要负责功能的开关,后者则是负责UI显示的。使用SBTelephonyManager的isInAirplaneMode方法可以得到当前的 飞行模式状态,setIsInAirplaneMode:这个方法来设置飞行模式。使用SBStatusBarDataManager的 airplaneModeChanged和_updateSignalStrengthItem来刷新UI显示状态。

iOS设备中WiFi、蓝牙和飞行模式的开启与关闭的更多相关文章

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

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

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

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

  3. mysql严格模式的开启、关闭

    关于mysql严格模式的开启.关闭 由于项目中对一些默认值设置问题,以及种种原因,mysql数据库需要使用非严格模式开发(mysql最近的版本默认是开启严格模式的). linux下mysql服务下操作 ...

  4. Eclipse Debug模式的开启与关闭问题简析_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 默认情况下,eclipse中右键debug,当运行到设置的断点时会自动跳到debug模式下.但由于我的eclipse环境 ...

  5. 对IOS设备中UDID的一些思考

    本文转载至 http://blog.csdn.net/happyrabbit456/article/details/11565209 http://blog.csdn.net/xiaoguan2008 ...

  6. iOS设备中垂直同步开启后的帧率计数

    因为iOS设备的垂直同步总是开启的所以显得帧计数意义没啥意义. 帧计数给你一个多个帧中的平均数,现实中,你帧速率只能是60,30,20,15,12以及6fps等各个常数中的一个.所有这些值都是60的因 ...

  7. mac系统升级导致无法在iOS设备中运行Safari Web 调试器

    macOS系统升级之后,可能会导致Safari开发选项中没有iOS设备,进而无法运行Safari Web 调试器. 此问题的解决办法: 请转到设置>常规>重置>重置位置和隐私.现在, ...

  8. iOS开发中WiFi相关功能总结

    http://www.cocoachina.com/ios/20160715/17022.html 投稿文章,作者:Haley_Wong(简书) 查漏补缺集是自己曾经做过相关的功能,但是重做相关功能或 ...

  9. 如何在iOS设备中配置S/MIME邮件签名证书

    本篇将介绍如何在iOS设备(如iPhone或iPad)上导入.配置并使用S/MIME邮件证书. 前置条件: iOS设备上已完成邮箱账号配置: 您的S/MIME邮件证书PFX/P12文件已导出备用. 步 ...

随机推荐

  1. matlab和FPGA中无符号数和有符号数的转化(转)

    在FPGA 设计过程中经常会遇到关于数表示之间的转化问题,最常见的是无符号数和有符号数之间的转化问题.(1)在FPGA设计过程中,能够很直接的看出数字的位宽,但经常以无符号数的形式输出,在后继的处理中 ...

  2. iOS-图片png

    把图片添加到工程里面:就报了108个警告!!! 然后我发现我添加的图片有很多命名是这样子的: xcode去找图片的时候是按照什么方式找的呢????? 还发现有好几张同名的图片..... ------- ...

  3. python dict{}和set([])

    200 ? "200px" : this.width)!important;} --> 介绍 dict(dictionary),在其他语言中也称为map,使用键-值(key- ...

  4. 超轻量级spring模板方案

    最近从事的工作是web方面的,主要j2ee,spring jsp这些内容,由于刚入门,很多的技术都不了解.所谓初生牛犊不怕虎,刚入门,各种不顺手,比如写jsp,总是重复很多的代码,各种不爽,然后就去看 ...

  5. Python3批量爬取网页图片

    所谓爬取其实就是获取链接的内容保存到本地.所以爬之前需要先知道要爬的链接是什么. 要爬取的页面是这个:http://findicons.com/pack/2787/beautiful_flat_ico ...

  6. C++11新特性(3) lambda表达式(1)

    C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...

  7. 最小投票BZOJ 1934([Shoi2007]Vote 善意的投票-最小割)

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下最小投票 1934: [Shoi2007]Vote 好心的投票 Time Limit: 1 Sec Memory L ...

  8. hadoop数据[Hadoop] 实际应用场景之 - 阿里

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.明天在这里和大家一起学习一下hadoop数据 Hadoop在淘宝和支付宝的应用从09年开始,用于对海量数据的离线处置,例如对日志的分析,也涉及内 ...

  9. hadoop namenode又一次格式化以后hbase的hmaster进程启动后立即消失

    hadoop的 namenode又一次格式化以后.重新启动hbase.发现它的hmaster进程启动后立即消失,查看一大堆日志,最后在zookeeper的日志里发现例如以下问题 Unable to r ...

  10. 【PAT Advanced Level】1008. Elevator (20)

    没什么难的,简单模拟题 #include <iostream> using namespace std; int main() { int num; cin>>num; int ...