iOS BugFix|接入 UIScene 遇到的一些问题及解决方案

前语

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。

iOS BugFix|接入 UIScene 遇到的一些问题及解决计划

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 才能正常运用。

iOS BugFix|接入 UIScene 遇到的一些问题及解决计划

假如 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

发表回复

提供最优质的资源集合

立即查看 了解详情