原文网址:(48条消息) iOS,iOS10 跳转系统设置、WIFI、蓝牙…_Rex_Code的博客-CSDN博客

iOS10跳转系统设置、WIFI、蓝牙…

iOS自我们熟悉以来,就一直与Android有着不一样的体验,
系统更加流畅,使用更加舒适,
同时较高与Android的价格也导致了它的特殊性,
iOS系统的封闭和很多权限的限制导致了我们在开发的时候经常会遇到很多无法条件无法实现
就比如iOS10以前,我们开发的应用想要跳转到系统设置,跳转到蓝牙,跳转到WIFI…
iOS开发工程师们都很熟悉,系统给我们提供了一套URL,我们只要使用这一套就OK了
在iOS10以前,
可能会用到的这些

蜂窝网络:prefs:root=MOBILE_DATA_SETTINGS_ID
Wi-Fi:prefs:root=WIFI
定位服务:prefs:root=LOCATION_SERVICES
个人热点:prefs:root=INTERNET_TETHERING
关于本机:prefs:root=General&path=About
辅助功能:prefs:root=General&path=ACCESSIBILITY
飞行模式:prefs:root=AIRPLANE_MODE
锁定:prefs:root=General&path=AUTOLOCK
亮度:prefs:root=Brightness
蓝牙:prefs:root=Bluetooth
时间设置:prefs:root=General&path=DATE_AND_TIME
FaceTime:prefs:root=FACETIME
设置:prefs:root=General
设置 prefs:root=SETTING
定位服务 prefs:root=LOCATION_SERVICES
键盘设置:prefs:root=General&path=Keyboard
iCloud:prefs:root=CASTLE
iCloud备份:prefs:root=CASTLE&path=STORAGE_AND_BACKUP
语言:prefs:root=General&path=INTERNATIONAL
定位:prefs:root=LOCATION_SERVICES
音乐:prefs:root=MUSIC


我们在想要跳转的时候只要简单的几行代码

NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
   [[UIApplication sharedApplication]openURL:url];
}

 

但是万恶的iOS10来了,就一切都变了
以上的全部都失效了,一切都没有用了
无论是prefs:root=Bluetooth 还是 Prefs:root=Bluetooth 都没有用
那么怎么跳转呢?
但是网上面又有说Prefs:root=Bluetooth 这种是可以的?
后来经测试这个只在Widge里有效,App中无效!

于是有大神想到了私有的API

NSURL*url=[NSURL URLWithString:@"Prefs:root=Bluetooth"];
Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace");
    [[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:url withObject:nil];

 

因为是私有的API,可能会过不了审核,于是又有了下面的变种
利用ASCII值进行拼装组合方法。这样可绕过审核。

SignedByte classOneByte[] = {0x4c,0x53,0x41,0x70,0x70,0x6c,0x69,0x63,0x61,0x74,0x69,0x6f,0x6e,0x57,0x6f,0x72,0x6b,0x73,0x70,0x61,0x63,0x65};
NSString *classOneString = [[NSString alloc] initWithData:[NSData dataWithBytes:classOneByte length:sizeof(classOneByte)] encoding:NSASCIIStringEncoding];
Class classOne = NSClassFromString(classOneString);

SignedByte selectOneByte[] = {0x64,0x65,0x66,0x61,0x75,0x6c,0x74,0x57,0x6f,0x72,0x6b,0x73,0x70,0x61,0x63,0x65};
NSString *selectOneString = [[NSString alloc] initWithData:[NSData dataWithBytes:selectOneByte length:sizeof(selectOneByte)] encoding:NSASCIIStringEncoding];
SEL selectOne = NSSelectorFromString(selectOneString);

if ([classOne respondsToSelector:selectOne]) {
 Class classTwo = [classOne performSelector:selectOne];

SignedByte selectTwoByte[] = {0x6f,0x70,0x65,0x6e,0x53,0x65,0x6e,0x73,0x69,0x74,0x69,0x76,0x65,0x55,0x52,0x4c,0x3a,0x77,0x69,0x74,0x68,0x4f,0x70,0x74,0x69,0x6f,0x6e,0x73,0x3a};
 NSString *selectTwoString = [[NSString alloc] initWithData:[NSData dataWithBytes:selectTwoByte length:sizeof(selectTwoByte)] encoding:NSASCIIStringEncoding];
 SEL selectTwo = NSSelectorFromString(selectTwoString);

  SignedByte urlByte[] = {0x50,0x72,0x65,0x66,0x73,0x3a,0x72,0x6f,0x6f,0x74,0x3d,0x42,0x6c,0x75,0x65,0x74,0x6f,0x6f,0x74,0x68};
 NSString *urlString = [[NSString alloc] initWithData:[NSData dataWithBytes:urlByte length:sizeof(urlByte)] encoding:NSASCIIStringEncoding];
  NSURL *url = [NSURL URLWithString:urlString];

 if ([classTwo respondsToSelector:selectTwo]) {
      [classTwo performSelector:selectTwo withObject:url withObject:nil];
  }
}

 

是不是完全看不懂?其实就是把那些字符串,那些类,那些方法都使用ASCII进行了转换而已…

但是热更新事件来的很突然,审核系统开始对于respondsToSelector:和performSelector:有了一点关注,担心上面的方法会失效,毕竟是私有,不靠谱,
那么有没有靠谱的不是私有的?

答案是有!
千百次尝试,终于找到了!!

Wi-Fi: App-Prefs:root=WIFI
蓝牙: App-Prefs:root=Bluetooth
蜂窝移动网络: App-Prefs:root=MOBILE_DATA_SETTINGS_ID
个人热点: App-Prefs:root=INTERNET_TETHERING
运营商: App-Prefs:root=Carrier
通知: App-Prefs:root=NOTIFICATIONS_ID
通用: App-Prefs:root=General
通用-关于本机: App-Prefs:root=General&path=About
通用-键盘: App-Prefs:root=General&path=Keyboard
通用-辅助功能: App-Prefs:root=General&path=ACCESSIBILITY
通用-语言与地区: App-Prefs:root=General&path=INTERNATIONAL
通用-还原: App-Prefs:root=Reset
墙纸: App-Prefs:root=Wallpaper
Siri: App-Prefs:root=SIRI
隐私: App-Prefs:root=Privacy
定位: App-Prefs:root=LOCATION_SERVICES
Safari: App-Prefs:root=SAFARI
音乐: App-Prefs:root=MUSIC
音乐-均衡器: App-Prefs:root=MUSIC&path=com.apple.Music:EQ
照片与相机: App-Prefs:root=Photos
FaceTime: App-Prefs:root=FACETIME

之前的prefs或者Prefs 替换成最新的 App-Prefs

当前iOS10全部支持!亲测!不是私有方法!不是私有方法!不是私有方法!
过审核不是问题!全部支持!
其他的不用说啦!炫耀去吧……

再补充一个跳转到应用设置

NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if ([[UIApplication sharedApplication]canOpenURL:url]) {
    [[UIApplication sharedApplication]openURL:url];
}