前语
UIScene 是什么|在 iOS 13 之前,在功用职责上,UIApplication 担任 App 状况,UIApplicationDelegate(AppDelegate)担任 App 事情和生命周期,包含进程和 UI 的。关于单窗口的 App 来说这没有问题,可是要想开发多窗产品批号是生产日期吗口的 iPad App 或者 Mac Cata监控拍下东航客机坠落瞬间lyst App 的话,这种功用职责的区分已经不支持了。因而,Apple 于 iOS 13 引进用于构建多窗口运用的 UIScene,并对功用职责进行了拆分,将 UI 相关的状况、事情和生命周期交与 UIWindowScene 和 UIWindowSceneDelegate(ios系统SceneDelegate)担任,UISceneSession 担任耐久化的 UI 状况ios下载。
接入 UIScene|可参阅 iOS CarPlay|与你共享 CarPlaios应用商店y 音频 App 的开发进程与细节 – 兼容 UIScene。
一般来说,没有支持多窗口的ios模拟器需求可不接入 UIScene。咱们apple运用 CarPlay framework 需求 UISios是什么意思cene 的监控摄像头支持,在接入 UIScene 后遇到了一些问题,写此文章记录一下。
Bug 1:iOS 15 用户日活异常增多
咱们的 App 有在监控眼 application:didFinishLaunchingWithOptions:
时机统计日活。在咱们的一款产品的支持 CarPlay 的版别上线后,观察到 iOS 15 用户日活异常增多,凌晨 0 – 3 点时刻段日活异常增多。经排查后,首windows7旗舰版要定位到监控拍下东航客机坠落瞬间是接入 UIScene 导致。然后结合“iOS 15”这一特征,最终定位到是 UIScene 和 iOS 15 的 prewarm 机制发生了奇妙的反应。
prewarm 机制|Apple 在 iOS 15 中引进了 prewarm (预热)机制,体系或许会根据设备的情况,prewarm 你的 App —— 发动不windows7怎么重装系统在approach运转的 App 进程,以减少用户手动发动 App 等候的时刻。prewarm 履行一个 ApAPPp 的发动序列直到(但不包含)当 main()
调用 UIApplicationMain
。这为体系供给了一个机会来构建和缓存它需求的任何低层结构,以等待一监控系统个完好的发动。也就是说,prewarm 机制能够减少发动时刻,咱windows系统们乃至能够在 load 办法中做一些资源的预加载。详见 Apple|About the App L监控aunch Sequenc产品介绍e。
prewarm 机制的 bug
可是实际上 pwindows7怎么重装系统rewarm 机制的行为与 Applwindows7怎么重装系统e 文档描绘的有些不符监控安装流程。
以下是在 iOS 15 上观察到的行为:prewarmwindows是什么意思 会触发 main()
以及 UIApplicationMain
履行。之后会发生什么取决于你的 App 是否接入了 UIScene。
- 关于接入 UIScene 的 App:
-
application:didFinishLaunchingWithOptions:iOS
或许会被调用(并不总是发生) -
scene:willConnectToSession:options:
未被调approach用。事实上,SceneDelegate
直到 App 打开才创建。
-
- 关于没有接入 UIScene 的 App:
-
application:didFinishLaunchingWithOptions:
不会调用。
-
因而,假如 App 接入了 UIScene,又没做监控app下载特别处理的话,会因为 pios是什么意思rewarm 机制的 bug 而导致 iOS 15 用户日活异常增多。用户或许底子没有打开 App,却因为体系 prewarm 导致发生假期活。windows更新有必要吗
修正
一个简单粗犷的计划是:判断假windows更新有必要吗如是 prewarm 导致的发动,直接 exit App,这样当用户application自己手动发动 App 时就是正常的完好的发动流程。在 Stackoverflow 上也有开发者提出过这个计划。该计划等同于咱们主动抛弃了 prewarm 机制。
下面附上代码。
void exitIfPrewarm(void) {
double systemVersion = [[UIDevice currentDevice] systemVersion].doubleValue;
if (systemVersion >= 15.0) {
NSDictionary* environment = [[NSProcessInfo processInfo] environment];
BOOL prewarmed = false;
for (NSString *key in environment.allKeys) {
if ([key.lowercaseString containsString:@"prewarm"]) {
prewarmed = true;
break;
}
}
if (prewarmed) {
exit(0);
}
}
}
int main(int argc, char * argv[]) {
@autoreleasepool {
exitIfPrewarm();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
危险
咱们目前运用了上述修正计划,暂时没ios下载有发现问题。但该计划存在危险。
- 该计划用于修正当时windows怎么激活 prewarm bug,这没有问题,如下左图。
- 假如没有 prewarm,用户点击 App 发动监控app下载,有完好的发动流程
- 假如监控摄像头品牌排行体iOS系 pr产品ewarm,这时候 prewarm 会触发
main()
,那么在main()
里 exit Appwindows系统,接下来当用户点击 App 发动,仍是完好的发动流程
- 而假如 Apple 在某个版别修正了该 prewarm bug,当时计划存在问题,如下右图。
- 假如没有 prewarm,用户点击 App 发动,有完好的发动流程(同上)
- 假如体系 prewarm,这时候依照官方文档的描绘 prewarm 不会触发
main()
,接下监控安装来当用户点击 App 发动,此刻触发main()
会 exit App。需求用户重新发动 App 才能正常运用。
假如 Apple 在未来的 iOS 版别中修正Windows了该 prewarm bug,咱们ios16需求在 exitIfPrewarm
函数中约束体系版别。
参阅
- iOS CarPlay|与你共享 CarPlay 音频 App 的开发进程与细节 – 兼容 UIScene
- iOS 开发高手课|App 发动速度怎么做优化与监控监控?
- Apple|About the App Launch S产品介绍equence
- Stackoverflow|iOS 15 do产品运营ewindows10激活密钥s not awake app while enter产品批号是生产日期吗i产品经理ng BLE beacon reg产品定位ion
- Stackoverflow|ios 15 prewarming causiios是苹果还是安卓ng appwill产品运营Launch method when prewarmios是什么意思 is done