iOS设备中的蜂窝数据和3G数据的开启与关闭

这段时间由于工作的需要研究了一下iOS系统中蜂窝数据和3G的开启和关闭,也就是在系统的“设置”程序的“通用”项目的“网络”中我们看到的“开启3G”和“蜂窝数据”这两个开关:

在之前的随笔中我研究过了WiFi、蓝牙及飞行模式的开启与关闭,我理所当然的认为iOS系统中应该会有一个类型的单实例在维护这些开关,但是让我沮丧的是我几乎找遍了所有的框架及系统程序也没有找到有关的类及方法。后来还是通过对“设置”这个程序的研究发现了实现他的函数,这是之所以说“函数”是因为实现蜂窝数据和3G开关的的确是四个C语言函数:

蜂窝数据:

BOOL CTCellularDataPlanGetIsEnabled(void); // 获取蜂窝数据是否开启或关闭的状态
void CTCellularDataPlanSetIsEnabled(BOOL enabled); // 设置蜂窝数据的开启和关闭

3G:

CFStringRef kCTRegistrationRATSelection0;
CFStringRef kCTRegistrationRATSelection1;
CFStringRef kCTRegistrationRATSelection2;
CFStringRef kCTRegistrationRATSelection3;
CFStringRef kCTRegistrationRATSelection4;
CFStringRef kCTRegistrationRATSelection5;
CFStringRef kCTRegistrationRATSelection6;
CFStringRef kCTRegistrationRATSelection7;
CFStringRef kCTRegistrationRATSelectionUnknown;

struct CTServerConnection *_CTServerConnectionCreate(CFAllocatorRef, int (*)(void *, CFStringRef, CFDictionaryRef, void *), int *);

void _CTServerConnectionGetRATSelection(int *, struct CTServerConnection *, int *, int *, int *); // 获得3G是否开启
void _CTServerConnectionSetRATSelection(int *, struct CTServerConnection *, CFStringRef); // 设置3G功能开启或者关闭

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

相较于蜂窝数据的开关而言,3G的开启及关闭是不叫复杂的,尤其是获得3G开关的状态更是复杂,下面我就我们就来详细的给出实现函数:

static int callback(void *connection, CFStringRef string, CFDictionaryRef dictionary, void *data) {
    return 0;
}

- (BOOL)3GDataEnabled {
    BOOL retVal = NO;
    int unknown1 = 0, unknown2 = 0, unknown3 = 0, unknown4 = 0;
    struct CTServerConnection *conection = _CTServerConnectionCreate(kCFAllocatorDefault, callback, NULL);
    _CTServerConnectionSetRATSelection(&unknow1, connection, &unknow2, &unkonwn3, &unkonwn4);
    if(unkonwn3) {
        retVal = YES;
    }
    return retVal;
}

- (void)set3GDataEnabled:(BOOL)enabled {
    int unknown = 0;
    CFStringRef selection;
    if (enabled) {
        selection = kCTRegistrationRATSelection2;
    } else {
        selection = kCTRegistrationRATSelection0
    }
    
    struct CTServerConnection *conection = _CTServerConnectionCreate(kCFAllocatorDefault, callback, NULL);
    _CTServerConnectionSetRATSelection(&unknown, conection, selection);
}

以上函数经我在iOS5.0.1平台上测试通过。

posted @ 2012-04-04 17:44  Ray_Zhang  阅读(1189)  评论(1编辑  收藏  举报