2016-03-03 09:38:27 centralperk 阅读数 6024
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

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


2016-05-25 15:01:57 lxmy2012 阅读数 857
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

iOS跳转系统设置页面

在做一个蓝牙相关的应用,进入应用时如果蓝牙没有打开,提供快速通道开启蓝牙。

// objective-c
NSURL *url = [NSURL URLWithString:@"prefs:root=Bluetooth"];

if ([[UIApplication sharedApplication] canOpenURL:url]) {
     [[UIApplication sharedApplication] openURL:url];
} else {
     DEBUGLog(@"No find system bluetooth setting! this is simulator?");
}

// swift
let url = NSURL(string: "prefs:root=Bluetooth");

if (UIApplication.sharedApplication().canOpenURL(url)) {
     UIApplication.sharedApplication().openURL(url)
} else {
     DEBUGLog(@"No find system bluetooth setting! this is simulator?");
}

跳转其它设置页面,比如wifi、定位之类的设置页面,只需要修改对应的URL。

其它设置页面

名字 URL
关于本机 prefs:root=General&path=About
辅助功能 prefs:root=General&path=ACCESSIBILITY
飞行模式 prefs:root=AIRPLANE_MODE
自动锁定 prefs:root=General&path=AUTOLOCK
蓝牙 prefs:root=Bluetooth
日期与时间 prefs:root=General&path=DATE_AND_TIME
FaceTime prefs:root=FACETIME
通用 prefs:root=General
键盘 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=ACCOUNT_SETTINGS
音乐 prefs:root=MUSIC
音乐 prefs:root=MUSIC&path=EQ
音乐 prefs:root=MUSIC&path=VolumeLimit
备忘录 prefs:root=NOTES
通知 prefs:root=NOTIFICATIONS_ID
电话 prefs:root=Phone
照片与相机 prefs:root=Photos
描述文件 prefs:root=General&path=ManagedConfigurationList
还原 prefs:root=General&path=Reset
电话铃声 prefs:root=Sounds&path=Ringtone
Safari prefs:root=Safari
声音 prefs:root=Sounds
软件更新 prefs:root=General&path=SOFTWARE_UPDATE_LINK
App Store prefs:root=STORE
Twitter prefs:root=TWITTER
视频 prefs:root=VIDEO
VPN prefs:root=General&path=VPN
墙纸 prefs:root=Wallpaper
WiFi prefs:root=WIFI
个人热点 prefs:root=INTERNET_TETHERING

参看这里

2017-04-10 14:04:26 spicyShrimp 阅读数 11888
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

#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];
}

欢迎访问我的系列博客,刚刚开始写…
系列:iOS开发-前言+大纲
http://blog.csdn.net/spicyShrimp/article/details/62218521

2017-02-28 17:07:51 Three_Zhang 阅读数 1776
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

在iOS10更新后,系统设置跳转被禁用,只能跳转App设置? NO, NO, NO, 看这里,又可以换个姿势愉快的跳转啦。

其实方法很简单,例如原有跳转Wi-Fi设置是”prefs:root=WIFI”,新的写法是”App-Prefs:root=WIFI”。怎么样,是不是很简单!!!

Objective-c

#define iOS10 ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0)
NSString * urlString = @"App-Prefs:root=WIFI";
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlString]]) {
    if (iOS10) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString] options:@{} completionHandler:nil];
    } else {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
    }
}

Swift

if let url = URL(string:"App-Prefs:root=WIFI") {
      if #available(iOS 10.0, *) {
            UIApplication.shared.open(url, options: [:], completionHandler: nil)
      } else {
            UIApplication.shared.openURL(url)
      }
}

当前iOS10支持的所有跳转,亲测可用(测试系统:10.2.1)

跳转 写法
无线局域网 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=ACCESSIBILITYFI
通用-语言与地区 App-Prefs:root=General&path=INTERNATIONAL
通用-还原 App-Prefs:root=Reset
墙纸 App-Prefs:root=Wallpaper
Siri App-Prefs:root=SIRI
隐私 App-Prefs:root=Privacy
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
2017-05-26 17:15:49 libra_cool 阅读数 249
  • iOS开发-全面解析iOS蓝牙BLE4.0开发

    只要你会OC基础,会写HelloWorld,你就可以实现iOS的蓝牙通信功能,实现蓝牙小项目也不在话下,作者会带领大家详细分析BLE4.0原理,通过分析xcode使用的蓝牙API,让学者能够得心应手的实现蓝牙BLE4.0的开发

    3673 人正在学习 去看看 许英俊

iOS跳转系统设置方法支持iOS7~iOS10+

 _array = @[
               @{@"系统设置":@"App-Prefs:root=INTERNET_TETHERING"},
               @{@"WIFI设置":@"App-Prefs:root=WIFI"},
               @{@"蓝牙设置":@"App-Prefs:root=Bluetooth"},
               @{@"系统通知":@"App-Prefs:root=NOTIFICATIONS_ID"},
               @{@"通用设置":@"App-Prefs:root=General"},
               @{@"显示设置":@"App-Prefs:root=DISPLAY&BRIGHTNESS"},
               @{@"壁纸设置":@"App-Prefs:root=Wallpaper"},
               @{@"声音设置":@"App-Prefs:root=Sounds"},
               @{@"隐私设置":@"App-Prefs:root=privacy"},
               @{@"APP Store":@"App-Prefs:root=STORE"},
               @{@"Notes":@"App-Prefs:root=NOTES"},
               @{@"Safari":@"App-Prefs:root=Safari"},
               @{@"Music":@"App-Prefs:root=MUSIC"},
               @{@"photo":@"App-Prefs:root=Photos"}
               ];
        NSURL * url = [NSURL URLWithString:[_array[index] allValues].firstObject];
        [[UIApplication sharedApplication] openURL:url];

如果要跳转第三方应用的设置界面中,使用prefs:root=boundleId的方式,boundleId是第三方应用的boundleId。

如果需要继续向项目内层进行跳转,可以通过添加path路径的方式,如下:

_array = @[
           @{@"关于本机":@"App-Prefs:root=General&path=About"},
           @{@"软件升级":@"App-Prefs:root=General&path=SOFTWARE_UPDATE_LINK"},
           @{@"日期时间":@"App-Prefs:root=General&path=DATE_AND_TIME"},
           @{@"Accessibility":@"App-Prefs:root=General&path=ACCESSIBILITY"},
           @{@"键盘设置":@"App-Prefs:root=General&path=Keyboard"},
           @{@"VPN":@"App-Prefs:root=General&path=VPN"},
           @{@"壁纸设置":@"App-Prefs:root=Wallpaper"},
           @{@"声音设置":@"App-Prefs:root=Sounds"},
           @{@"隐私设置":@"App-Prefs:root=privacy"},
           @{@"APP Store":@"App-Prefs:root=STORE"},
           @{@"还原设置":@"App-Prefs:root=General&path=Reset"},
           @{@"应用通知":@"App-Prefs:root=NOTIFICATIONS_ID&path=应用的boundleId"}
           ];
没有更多推荐了,返回首页