iOS 10.3动态更换Alternate Icon:关闭图标变更提示弹窗(更新)
绕过iOS更换Alternate Icon时的弹窗提示(仅测试场景)
嘿,我懂你想要在测试场景下绕开iOS更换Alternate Icon时的那个烦人的系统弹窗——先敲个重点:苹果官方没有提供合法移除这个弹窗的方式,这是系统级的强制限制,目的是让用户明确感知到App图标发生了变更。如果把这类操作放到上线的App里,百分之百会被App Store拒审,所以下面的方法仅限本地测试使用!
方法1:调用私有API(风险高,随时可能失效)
iOS的UIApplication藏有一个私有方法,可以跳过弹窗直接更换图标,但因为是私有接口,苹果的审核系统一抓一个准,绝对不能用于上线版本,纯测试可以试试:
func setAppIconWithoutAlert(type: String) { if #available(iOS 10.3, *) { // 调用私有方法跳过弹窗 UIApplication.shared.perform(Selector(("setAlternateIconName:completionHandler:")), with: type, with: nil) // 备用方案:如果私有方法失效,回退到官方方法(会弹出系统弹窗) // UIApplication.shared.setAlternateIconName(type) } }
注意:不同iOS版本的私有方法名可能有差异,比如部分版本是_setAlternateIconName:completionHandler:,你可能需要根据测试的系统版本调整Selector里的方法名。另外,使用私有API会导致App提交审核时直接被拒,测试完成后一定要彻底移除相关代码。
方法2:用自定义弹窗“覆盖”系统弹窗(视觉小技巧)
这个方法不是真的移除系统弹窗,而是利用时机差,在系统弹窗出现的瞬间立刻弹出一个自定义Alert覆盖它,让用户根本看不到系统自带的提示。不过这个方法的稳定性依赖系统弹窗的出现时机,在不同iOS版本上可能表现不一致:
func setAppIconWithFakeCover(type: String) { if #available(iOS 10.3, *) { UIApplication.shared.setAlternateIconName(type) { error in // 延迟0.1秒弹出自定义弹窗,刚好覆盖系统弹窗 DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { let customAlert = UIAlertController(title: "图标已更新", message: nil, preferredStyle: .alert) customAlert.addAction(UIAlertAction(title: "确定", style: .default)) // 获取当前根控制器展示弹窗 if let rootVC = UIApplication.shared.keyWindow?.rootViewController { rootVC.present(customAlert, animated: true) } } } } }
原理就是利用两个弹窗的显示层级,让自定义弹窗盖在系统弹窗上面,用户只会看到你自己的提示,系统弹窗会被快速覆盖(大概率用户完全没察觉)。
最后再啰嗦一句:这些都只是测试用的小trick,绝对不能用于正式上线的App,苹果的审核规则对这类修改系统默认行为的操作查得非常严,别给自己找麻烦哦!
内容的提问来源于stack exchange,提问作者user9225081
相关产品推荐
相关产品推荐

