iOS开发实战 - 跳转到设置页面的正确姿势

示例:项目里面有扫码功能,当用户第一次扫码—选择不允许访问相机,再次使用扫码APP就需要引导用户到系统的相机页面开启相机权限。类似的功能还有定位、录音、蓝牙、相册等,这些功能都需要给用户提示/引导。

根据上述情况,市场上的App有两种做法:
①不做跳转,给用户提示;
②给用户提示,并做跳转,引导用户到设置界面;

淘票票 - iOS 11 - 不做跳转
京东 - iOS 11 - 不做跳转
摩拜 - iOS 11 + 提示 + 跳转
这里需要注意的是:虽然提示的是在“设置-隐私-定位服务”中开启,但是跳转到的不是隐私下面的定位服务,而是跳转到了该应用的设置界面,因为当前系统版本是iOS11

具体看需求吧,亲测过微信(包括定位和相机权限)、QQ、淘宝的(iOS 10 - iOS 11)都没有做跳转,和淘票票一样都是给的提示,不过支付宝的相机权限也做了跳转。

正文:

1.第一次网上查找总结的结果 ❎
iOS 10 之前 还需要进行如上设置

可以看到网上大多数的解释是:
①iOS 10之前可以进入系统设置的子页面
②iOS 10之后不允许跳转到设置的子页面,只允许跳转到设置界面(首页)

说明:上述这种方法我没应用到已上架项目,不过看到有的人通过使用苹果私有API去实现iOS10以后版本能够跳转到系统设置子页面,但同时会加大遇到审核被拒的可能性,所以也不建议大家使用;感兴趣的朋友可以上网查一下相关的代码。

指南2.5.1-性能-软件需求,您的应用程序使用或引用以下非公共的api:LSApplicationWorkspace
准则2.5.1-性能-软件需求
您的应用程序使用或引用以下非公开的api: LSApplicationWorkspace
在App Store中不允许使用非公开的api,因为如果这些api发生变化,就会导致糟糕的用户体验。
下一个步骤
为了解决这个问题,请修改您的应用程序,删除任何非公开的api。如果您在源代码中定义了与上述api相同的方法,我们建议更改您的方法名称,以便它们不再与苹果的私有api发生冲突,以避免您的应用程序在未来的提交中被标记。
另外,如果您正在使用第三方库,请更新这些库的最新版本。如果您没有访问库的源代码,您可以使用“字符串”或“otool”命令行工具搜索已编译的二进制文件。“strings”工具可以输出库调用的方法列表和“otool-ov”将输出objective-a类结构及其定义的方法。这些工具可以帮助您缩小问题代码所在的位置。您还可以使用“nm”工具来验证是否有任何第三方库调用这些api。

思考:参考的其中一篇博客甚至展示了了苹果的文件来证明上述第二点,但现在我再次访问那个博客已经是404了;得到上面的结果让我很不甘心,心想苹果不会这么绝情,于是我就测试了一下其他APP,发现iOS 10以后可以跳转到设置界面,看来我没找对答案;于是又搜了一波,终于找到了解决方案。

2. 跳转至系统设置页面的正确姿势(适配 iOS 8.1 ~ iOS 14) ✅

⚠️ 不要在URL Types 中设置prefs 了;
⚠️ 下面的方法在iOS 11+不能实现,本文后面会介绍怎么在iOS 11+下实现该方案,请耐心看完。

例:跳转到系统设置-相机权限

// 亲测:iOS 8.1 ~ iOS 14
- (IBAction)pushToSystemConfig:(UIButton *)sender {
    NSURL *url = [NSURL URLWithString:@"App-Prefs:root=Privacy&path=CAMERA"];
    if ([[UIApplication sharedApplication] canOpenURL:url]){
        if (@available(iOS 10.0, *)) {
             [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
        }else {
             [[UIApplication sharedApplication] openURL:url];
        }
    }
}

补充:
① iOS 9.0之后版本,应用间进行跳转,在状态栏的左边增加了快速返回上一App的点击事件,方便了不少;
② 需要注意的是,当你改变了系统相机权限后回到App中,该App会重启;这里还测试了定位功能,而开启定位功能回到应用不会引起应用重启,不过这你也不用担心,这是系统层决定的。

4. 跳转至系统设置页面的正确姿势(适配 iOS 8.1 ~ iOS 14) ✅

关于iOS 11+,上面的做法当然行不通了,但还是有办法满足需求的,可以看本文上面的摩拜单车跳转到自己的设置界面的图 (现在主流App都是这个做法)
原因:iOS 11+ 现在只允许跳转到系统设置首页/该应用的设置界面

⚠️ 因为有一些小伙伴是新建一个测试工程进行测试的,并没有登入开发者账号,工程也就没有配置开发证书,在模拟器上测试时,发现只能跳转到设置首页,仔细观察可以发现在设置界面底部应用列表根本找不到你测试的应用,所以就不能跳转到该应用的设置界面

// 跳转到设置 - 相机 / 该应用的设置界面
NSURL *url1 = [NSURL URLWithString:@"App-Prefs:root=Privacy&path=CAMERA"];
// iOS10也可以使用url2访问,不过使用url1更好一些,可具体根据业务需求自行选择
NSURL *url2 = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if (@available(iOS 11.0, *)) {
    if ([[UIApplication sharedApplication] canOpenURL:url2]){
        [[UIApplication sharedApplication] openURL:url2 options:@{} completionHandler:nil];
    }
} else {
    if ([[UIApplication sharedApplication] canOpenURL:url1]){
        if (@available(iOS 10.0, *)) {
            [[UIApplication sharedApplication] openURL:url1 options:@{} completionHandler:nil];
        } else {
            [[UIApplication sharedApplication] openURL:url1];
        }
    }
}
3. 如果你不是跳转到系统相机界面,怎么办呢?

其他跳转如下:
注:App-Prefs等同于App-prefs

名称 对应字符串
无线局域网 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
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

如果你发现上面还是没有你需要的字符串怎么办?
找规律:比如我这篇写的进入相机权限页面就没有;将真机/模拟器的语言改为英文,再仔细对比上面的字符串,就会发现规律,多尝试几遍就试出来相应的字符串了。

补充:

名称 对应字符串
个人热点 App-Prefs:root=INTERNET_TETHERING
运营商 App-Prefs:root=Carrier
隐私->麦克风 App-Prefs:root=Privacy&path=MICROPHONE
隐私->定位 App-Prefs:root=Privacy&path=LOCATION
隐私->相机 App-Prefs:root=Privacy&path=CAMERA

最近看到一个解决方案,分享给大家

iOS 极致速度优化:快速打开任意 APP 的设置界面

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 王国维有十个字令我印象深刻:“独立之精神”、“自由之思想”。初见它时我对它毫无感觉,对于陈寅恪评价它与日月长存,我...
    诗客酒魂阅读 262评论 0 0
  • 细雨绵绵秋日寒, 琼浆玉露洒河川。 紫云东来破晓日, 锦绣龙腾迎凯旋。
    裴煜泽阅读 200评论 0 2
  • 以青少年作为主要人物关系的电影有很多,但形成系列者已屈指可数,《饥饿游戏》、《分歧者》和《移动迷宫》不仅算是青少年...
    影评人路飞阅读 1,373评论 0 2