如何在应用程序中以编程方式打开设置应用程序

13

我知道有很多人问:“如何通过程序打开设置应用?” 答案是“不行”。 我知道自 iOS 5.0 之后,苹果不支持从任何其他应用程序打开设置。

但是像MapMyFitness这样的一些应用程序可以打开设置,并且它们可以在App Store中获得并获得苹果的批准。 如果关闭了蓝牙,则MapMyFitness会打开蓝牙设置。 我已在iOS 6和iOS 5.1中进行了检查。

我想知道这些应用程序如何合法地打开设置并绕过苹果的安全措施,因为据我所知,没有合法的方法可以做到这一点?

2个回答

18

在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);

通过操作字符串(拆分和连接等),您最终可以将其提交到AppStore。尽管如此,这仍然是不被允许的。

这也适用于iOS7。太好了!但我不得不在dlopen的第二个参数中添加0,并包含“dlfcn.h”。有人发现如何以这种方式打开设置中的特定部分吗? - akw
@akw 我不认为你可以使用这个来打开设置应用程序的特定部分。这个函数只能打开一个应用程序,它不允许用户指定其他上下文数据。 - user529758
@H2CO3 如何在iOS 7中打开设置? - jpd
@H2CO3,我已经添加了你的代码,但在我的应用程序中无法运行。你能帮我吗? - jpd
这在iOS8.3模拟器中可以运行,但在设备上无法运行。有什么想法吗? - dmorrow
显示剩余4条评论

13

应用程序无法打开设置应用程序到特定屏幕。像MapMyFitness这样的应用程序打开偏好设置的原因是它们请求使用Bluetooth Low Energy的权限。请求权限是由首次使用时的CBCentralManager管理的。

enter image description here

这也是知道Bluetooth是否打开或关闭的类。当系统检测到蓝牙未打开时,它会自动显示一个警告并提供一个选项进入设置以打开蓝牙。

使用位置服务时也会显示类似的弹出窗口。

这些弹出窗口是由系统框架自动显示的。可以使用位置服务的purpose属性自定义消息,而Bluetooth则不可能进行此操作。

此过程未使用私有API,因此应用程序不会被拒绝。


感谢您的回复。在启动时, mapmyfitness 会显示一个警报视图,用于打开设置屏幕中的蓝牙选项,并带有应用程序名称和自定义消息。这是通过私有蓝牙API实现的,这是非法的。那么苹果是如何通过这个应用程序的App Store审核的呢?或者还有其他合法的方法可以实现吗? - codester
谢谢你的帮助,Joris。你能提供一些代码来实现吗? - codester
请查看 CBCentralManager 文档以了解其使用方法。 - Joris Kluivers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接