iOS 11 Swift应用因私有API及权限重请求问题遭App Store拒审
我之前帮好几个开发者解决过类似的iOS 11 Swift应用问题,结合你的情况,给你拆解下问题根源和对应的解决办法:
一、App Store拒审:违反Apple Guideline 2.5.1的问题
首先说拒审的核心原因:你用了苹果明确禁止的私有URL Scheme prefs:root=,苹果的官方通知已经说得很严肃:
Apple Guideline 2.5.1(性能-软件要求)拒审通知:
使用了私有URL Scheme“prefs:root=”。私有API的使用会因API变更导致用户体验不佳,后续若继续使用或隐瞒私有API,可能导致开发者账号被终止及相关应用被下架等后果。
prefs:root=是iOS早期存在的跳转系统设置的私有方式,但从iOS 10开始苹果就逐步收紧管控,iOS 11之后完全禁止使用这类私有Scheme——它绕过了系统的权限引导逻辑,而且私有API随时可能被苹果修改或移除,会导致应用崩溃或功能失效,严重影响用户体验。
解决方案:使用官方合规的跳转API
苹果只允许通过UIApplication.openSettingsURLString跳转到你的应用专属设置页面,这是唯一合规的方式,Swift代码示例如下:
// 跳转至应用专属设置页面 if let settingsURL = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil) }
注意:这个API只能跳转到应用自己的设置页,不能直接跳转到相机、定位这类全局设置页面,这是苹果的硬性规定,必须严格遵守。
二、权限重请求被拒绝的问题
这个问题和iOS的权限机制直接相关:当用户第一次拒绝某个权限请求后,iOS会默认屏蔽后续的权限请求弹窗,直接返回拒绝状态,不会再向用户弹出请求框——这是系统为了避免应用反复骚扰用户而设计的逻辑。
解决方案:自定义引导+跳转设置
不能直接重复调用权限请求API,而是要先通过自定义弹窗向用户清晰解释权限的用途,引导用户主动去设置里开启权限,再用上面的合规API跳转设置页面。以相机权限为例,Swift代码示例:
import AVFoundation // 请求相机权限 AVCaptureDevice.requestAccess(for: .video) { granted in guard !granted else { return } // 用户拒绝后,弹出自定义引导弹窗 DispatchQueue.main.async { let alert = UIAlertController( title: "需要相机权限", message: "我们需要相机权限来完成拍照、扫码等核心功能,请前往设置开启权限", preferredStyle: .alert ) alert.addAction(UIAlertAction(title: "去设置", style: .default) { _ in if let settingsURL = URL(string: UIApplication.openSettingsURLString) { UIApplication.shared.open(settingsURL) } }) alert.addAction(UIAlertAction(title: "取消", style: .cancel)) self.present(alert, animated: true) } }
总结
这两个问题本质上都是要遵守苹果的官方规范:一是绝对不能使用私有API或Scheme,否则会面临账号被封的风险;二是权限请求要符合iOS的用户交互逻辑,不能强制重复请求,要通过友好引导让用户主动授权。
内容的提问来源于stack exchange,提问作者ios akashrao

