博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS10 openURL方法跳转到设置界面
阅读量:4960 次
发布时间:2019-06-12

本文共 2729 字,大约阅读时间需要 9 分钟。

问题

在iOS10之前,跳转到系统设置界面的某个指定界面的方式如下:

//打开定位服务界面NSURL*url=[NSURL URLWithString:@"prefs:root=Privacy&path=LOCATION"]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; };

但是在iOS10上,调用canOpenURL:打开系统设置界面时控制台会报如下错误,并且无法跳转:

-canOpenURL: failed for URL: "Prefs:root=Privacy&path=LOCATION" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"

原因是iOS10只允许如下方式跳转到设置里自己app的界面,对跳转到其他界面做了限制:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

解决方法

可以使用 MobileCoreServices.framework 里的私有API:

- (BOOL)openSensitiveURL:(id)arg1 withOptions:(id)arg2;

头文件参考: 

使用方法:

//注意首字母改成了大写,prefs->PrefsNSURL*url=[NSURL URLWithString:@"Prefs:root=Privacy&path=LOCATION"]; Class LSApplicationWorkspace = NSClassFromString(@"LSApplicationWorkspace"); [[LSApplicationWorkspace performSelector:@selector(defaultWorkspace)] performSelector:@selector(openSensitiveURL:withOptions:) withObject:url withObject:nil];

MobileCoreServices.framework 不是私有库,所以直接使用 performSelector: 即可调用私有API。

注意

  • iOS10的系统URLScheme改成了首字母大写,使用小写的方式会无法打开。
  • 使用私有API的app无法通过App Store审核。你也可以尝试把私有类名和selector字符串混淆一下,绕过审核。例如  用ASCII混淆的方法:
- (UIView *)statusBarView { UIView *statusBar = nil; NSData *data = [NSData dataWithBytes:(unsigned char []){ 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9]; NSString *key = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; id object = [UIApplication sharedApplication]; if ([object respondsToSelector:NSSelectorFromString(key)]) { statusBar = [object valueForKey:key]; } return statusBar; }

不过,还是不建议使用私有API,因为它是不可靠的。也许某天苹果就把它移除了。

 

以下是摘抄自GitHub上的一段可以通过Google私有文件


2
+100

Point 1: LSApplicationWorkspace is private api, so if you use this and will upload your app to app store, it will get rejected.

Point 2: If you are having any in-house app and still want to use this in your app, then below is the way to use it.

  1. Add MobileCoreServices Framework in your bundle
  2. Create LSApplicationWorkspace.h file with the code exactly same as the code provided at here "".
  3. Now add this LSApplicationWorkspace.h file into your bundle
  4. Create bridging header for your swift app
  5. Add #import "LSApplicationWorkspace.h" in your bridging header
  6. Now add import MobileCoreServices in your current file and add your code let test = LSApplicationWorkspace.defaultWorkSpace(), it will work fine.

NOTE: For using any private header, you must have to include its .h file into your code. You can find any private headers by searching "runtime headers" in google. You will get all runtime headers. And to include that header in your swift code, you need to go via bridging-header.

转载于:https://www.cnblogs.com/shycie/p/6677004.html

你可能感兴趣的文章
关于js touch事件 的引用设置
查看>>
ThreadLocal源码原理以及防止内存泄露
查看>>
函数装饰器与类装饰器
查看>>
sql 增删改查等语句
查看>>
Xen虚拟机磁盘镜像模板制作(四)—CentOS 7
查看>>
【洛谷】3402:【模板】可持久化并查集
查看>>
python第15天
查看>>
ueditor1_4_3-utf8-jsp配置及自定义,结合struts2
查看>>
PHPMyAdmin在Window下的安装
查看>>
Eclipse 批量创建多级文件夹
查看>>
用console.log分析Vue源码
查看>>
java抽象类与接口
查看>>
Vue仿string.format
查看>>
C#读取大文件
查看>>
Dubbo学习-2-注册中心搭建
查看>>
ANSIToMultiByteUTF8的跨平台实现
查看>>
(专题一)02 matlab数值数据的表示方法,输出数据以及相关函数
查看>>
通过WebService获取归属地查询
查看>>
求两个等长的已排序数组的中位数(《算法导论》P113习题9.3-8)
查看>>
Mysql数据库查询优化日常笔记
查看>>