私有API-iOS10方法跳转到设置界面失效的解决方法
来源:互联网 发布:行车记录仪支架淘宝 编辑:程序博客网 时间:2024/06/07 17:01
问题
在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;
头文件参考:LSApplicationWorkspace.h
使用方法:
//注意首字母改成了大写,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,因为它是不可靠的。也许某天苹果就把它移除了。
update:
- 还有一步遗漏了,app需要添加一个
Prefs
的URL Schemes,即添加到info.plist
的LSApplicationQueriesSchemes
项中。
参考:
http://stackoverflow.com/a/39102075/6380485
https://www.zhihu.com/question/50635906/answer/125195317
iOS10系统URLScheme
阅读全文
1 0
- 私有API-iOS10方法跳转到设置界面失效的解决方法
- iOS跳转到系统的设置界面(支持iOS10)
- iOS10应用内跳转到设置界面
- Android跳转到设置界面的方法
- iOS10从app跳转到WiFi设置界面
- iOS10跳转系统设置方法
- Android中跳转到系统一些设置界面的方法
- ios10跳转系统设置界面失败
- iOS10如何跳转到手机设置对应的页面
- iOS10 App 跳转到系统设置
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- iOS 跳转到系统的设置界面
- 小红书学习——JS(不定时更新)
- SQL总结(六)触发器
- 实战
- d3画散点图
- Java 基础——构造器和方法的区别
- 私有API-iOS10方法跳转到设置界面失效的解决方法
- web之sql约束攻击
- The Flash-14
- Enter键调用登陆按钮效果(keyCode、onkeydown)
- UVa1593
- 图解集合 2 :LinkedList
- 关于boost库里的内存池pool
- AOP的底层实现-CGLIB动态代理和JDK动态代理 (以后学习)
- HomeKit 设备接入协议