我知道有很多人问:“如何通过程序打开设置应用?” 答案是“不行”。 我知道自 iOS 5.0 之后,苹果不支持从任何其他应用程序打开设置。
但是像MapMyFitness这样的一些应用程序可以打开设置,并且它们可以在App Store中获得并获得苹果的批准。 如果关闭了蓝牙,则MapMyFitness会打开蓝牙设置。 我已在iOS 6和iOS 5.1中进行了检查。
我想知道这些应用程序如何合法地打开设置并绕过苹果的安全措施,因为据我所知,没有合法的方法可以做到这一点?
我知道有很多人问:“如何通过程序打开设置应用?” 答案是“不行”。 我知道自 iOS 5.0 之后,苹果不支持从任何其他应用程序打开设置。
但是像MapMyFitness这样的一些应用程序可以打开设置,并且它们可以在App Store中获得并获得苹果的批准。 如果关闭了蓝牙,则MapMyFitness会打开蓝牙设置。 我已在iOS 6和iOS 5.1中进行了检查。
我想知道这些应用程序如何合法地打开设置并绕过苹果的安全措施,因为据我所知,没有合法的方法可以做到这一点?
在iOS 5.0上,有prefs://
URL方案。
从iOS 5.1开始,它被删除了。仍然可以使用私有API和混淆来绕过二进制的静态分析。例如:
void (*openApp)(CFStringRef, Boolean);
void *hndl = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices");
openApp = dlsym(hndl, "SBSLaunchApplicationWithIdentifier");
openApp(CFSTR("com.apple.Preferences"), FALSE);
应用程序无法打开设置应用程序到特定屏幕。像MapMyFitness这样的应用程序打开偏好设置的原因是它们请求使用Bluetooth Low Energy的权限。请求权限是由首次使用时的CBCentralManager管理的。
这也是知道Bluetooth是否打开或关闭的类。当系统检测到蓝牙未打开时,它会自动显示一个警告并提供一个选项进入设置以打开蓝牙。
使用位置服务时也会显示类似的弹出窗口。
这些弹出窗口是由系统框架自动显示的。可以使用位置服务的purpose
属性自定义消息,而Bluetooth则不可能进行此操作。
此过程未使用私有API,因此应用程序不会被拒绝。
CBCentralManager
文档以了解其使用方法。 - Joris Kluivers