首页 > 解决方案 > iOS:通过通用链接启动应用程序会导致应用程序崩溃

问题描述

我正在使用 Flutter 开发 iOS 应用程序。当我通过通用链接启动应用程序时(例如在 Safari 中输入 url 并单击打开按钮),应用程序启动但会立即崩溃。但是如果应用程序已经在后台运行,当我点击链接时,它不会崩溃。当它崩溃时,我得到以下日志。所以我把所有与NSUserActivity相关的代码都注释掉了,但是还是报了同样的错误。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSUserActivity)'

任何想法?谢谢。

标签: iosflutterios-universal-links

解决方案


终于找到问题了,这个bug是由于didFinishLaunchingWithOptions函数中JSON转换失败造成的。我在我的一个 didFinishLaunchingWithOptions 方法中进行了 JSON 转换(多个颤振插件调用覆盖此方法)。通过 UL 进入应用时,会携带一个 NSDictionary 到 didFinishLaunchingWithOptions。例如,如果从 Safari 输入,这个 NSDictionary 看起来像

dict :{
    UIApplicationLaunchOptionsSourceApplicationKey = "com.apple.mobilesafari";
    UIApplicationLaunchOptionsUserActivityDictionaryKey =     {
        UIApplicationLaunchOptionsUserActivityIdentifierKey = "ABCD-SOME-KEY";
        UIApplicationLaunchOptionsUserActivityKey = "<NSUserActivity: 0x12345678>";
        UIApplicationLaunchOptionsUserActivityTypeKey = NSUserActivityTypeBrowsingWeb;
    };
}

因此,当将其转换为 JSON 时,我得到“未捕获的异常 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSUserActivity)'”。
我认为让我感到困惑的是,从日志中我认为术语“NSUserActivity”是我的代码中的东西(因为我确实在 continueUserActivity 方法中使用了这个对象,并且在我得到这个错误之前我已经修改了 continueUserActivity 来解决这个问题),所以我注释掉了这些代码,但没有注释掉。但是,我没有注意到它是字典中的一个术语,可以在运行时创建。
我的解决方案是在Json转换之前检查字典中的键并添加try catch以避免此错误。


推荐阅读