如何在configurationForConnecting方法外设置UISceneConfiguration
解决方案
覆盖安装时application(_:configurationForConnecting:options:)不触发的核心原因是iOS会持久化缓存已有的Scene Session配置,覆盖更新时系统直接复用本地存储的旧配置,不会重新走配置创建回调,只有卸载重装清空本地缓存后才会触发这个方法。
完全可以不依赖这个回调完成UISceneConfiguration设置,两种稳定方案可覆盖所有安装/更新场景:
方案1:Info.plist静态配置(优先推荐,稳定性最高)
这是系统优先级最高的Scene配置加载方式,不受安装方式、本地缓存影响,首次安装、覆盖更新都会正常生效:
- 打开项目的
Info.plist,展开Application Scene Manifest配置项 - 找到
Scene Configuration->Application Session Role下的默认配置项,新增Delegate Class Name字段,值填$(PRODUCT_MODULE_NAME).FSSceneDelegate(Swift类必须带模块名前缀,否则系统无法找到对应类) - 直接删除AppDelegate里之前写的
application(_:configurationForConnecting:options:)方法即可,不需要额外保留相关逻辑。
方案2:动态修改已有Session配置(适合需要动态切换Delegate的场景)
如果业务需要动态决定SceneDelegate类型,无法使用静态配置,可以在App启动最早期手动修改所有已缓存的Scene Session配置,覆盖系统的旧缓存:
func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil ) -> Bool { // 遍历所有已存在的Scene Session,替换Delegate类 application.openSessions.forEach { session in session.configuration.delegateClass = FSSceneDelegate.self } return true }
这段逻辑会在App启动入口执行,不管是首次安装还是覆盖更新,都会把所有已缓存的scene配置替换成你需要的代理类,不会出现回调不触发的问题。
如果你的App支持多Scene,不要全量替换Delegate,要根据
session.role、session.configuration.name等属性判断,给不同类型的Scene匹配对应的代理类。
内容的提问来源于stack exchange,提问作者nelson PARRILLA
相关产品推荐
相关产品推荐

