使用UIApplication.value(forKeyPath:)替代shared提交App Store会被拒吗?
问题:通过KVC获取UIApplication实例能否用于App Store构建?
我在SDK里使用了这段代码:
let app = UIApplication.value(forKeyPath: #keyPath(UIApplication.shared)) as? UIApplication
原因是将该SDK集成到通知扩展时,UIApplication.shared在扩展环境中不可用,换成这段代码后能正常编译。想知道这段代码能不能替代let app = UIApplication.shared用于App Store构建?
回答
这种方式绝对不建议用于App Store提交的版本,大概率会被拒,而且存在后续失效风险
具体原因如下:
- 通知扩展这类App Extension中禁用
UIApplication.shared是苹果的明确设计,目的是保证扩展的沙箱隔离性,防止扩展越权访问主应用或系统资源。你用KVC的方式绕过这个限制,本质上违反了苹果的扩展设计规范。 - 虽然
UIApplication.shared是公开属性,但通过value(forKeyPath:)跨环境获取它的操作,会被苹果的审核检测工具标记为异常行为——毕竟正常的扩展环境根本不该存在UIApplication实例。 - 退一步说,就算侥幸通过审核,后续iOS版本迭代时,苹果可能修改内部实现逻辑,导致这段KVC代码直接失效,引发崩溃或功能异常。
替代方案
如果你的SDK需要同时兼容主应用和扩展,应该做环境适配:
- 先判断当前运行环境是否为App Extension:可以通过检查
Bundle.main.bundlePath是否包含appex后缀,或者判断UIApplication类的shared属性是否可访问(扩展环境中该属性会直接报错)。 - 主应用环境下正常使用
UIApplication.shared;扩展环境中跳过依赖UIApplication的逻辑,或者提供专门的扩展适配逻辑,比如直接使用扩展自身的UNNotificationContentExtensionContext处理相关需求。
内容的提问来源于stack exchange,提问作者Amit Saxena
相关产品推荐
相关产品推荐

