iOS dyld:未找到符号:_NSU用户活动类型实时活动

rmbxnbpk  于 2023-01-03  发布在  iOS
关注(0)|答案(1)|浏览(76)

我正在为我的iOS应用添加对LiveActivities/Widgetkit的支持。我仍然支持iOS 14+的旧版本。当检查用户是否通过我的SceneDelegate中的LiveActivity返回应用时:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    if #available(iOS 16.2, *), isLiveActivity(activity: userActivity) {
        ...
    } else {
        let _ = handleDynamicLink(url: userActivity.webpageURL)
    }
}

@available(iOS 16.2, *)
public func isLiveActivity(activity: NSUserActivity) -> Bool {
    return activity.activityType == NSUserActivityTypeLiveActivity
}

现在的问题是,无论我如何将其 Package 在#available(iOS 16.2,*)中,或者即使我根本不调用isLiveActivity,只要代码中的任何地方出现NSUserActivityTypeLiveActivity,在旧的iOS版本(仅在模拟器上测试)上都会抛出错误:

dyld: Symbol not found: _NSUserActivityTypeLiveActivity

如果我甚至不能在代码中的任何地方包含这个符号,我应该如何包含这个检查?我会假设NSUserActivityTypeLiveActivity是一个编译时常量,但它似乎是动态查找的,并且会崩溃,因为它在旧版本的WidgetKit中不可用。

fwzugrvs

fwzugrvs1#

我认为这是SDK中的一个bug,建议你向苹果提交一个bug。
作为变通方案,您可以:

public func isLiveActivity(activity: NSUserActivity) -> Bool {
        if #available(iOS 16.2, *){
            // workaround; we know that the live activity type is a global
            // variable containing the name of itself as a string via
            // a debug session on iOS 16.2
            return activity.activityType == "NSUserActivityTypeLiveActivity"
        }
        return false
    }

我之所以认为这是一个错误,是因为查看文档,NSUserActivityTypeLiveActivity我们看到它被标记为iOS 14.0+,但如果我们根据iOS崩溃转储分析启动模拟器并进行调试(DYLD_PRINT_LIBRARIES环境变量),我们看到它抱怨:

dyld: Symbol not found: _NSUserActivityTypeLiveActivity
  Referenced from: /Users/faisalm/Library/Developer/CoreSimulator/Devices/77B3F700-46F7-402C-91D5-11453CD73D23/data/Containers/Bundle/Application/73D71FF5-2E01-46E7-AEE9-C1BF94FC8846/useractivity-expt.app/useractivity-expt
  Expected in: /System/Library/Frameworks/WidgetKit.framework/WidgetKit
.
.
DYLD_ROOT_PATH=/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 14.1.simruntime/Contents/Resources/RuntimeRoot

如果我们要进入上面的DYLD_ROOT_PATH,我们可以使用nm检查全局变量NSUserActivityTypeLiveActivity是否不存在,因为下面的命令没有产生匹配:

nm '/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 14.1.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/WidgetKit.framework/WidgetKit'| grep _NSUserActivityTypeLiveActivity

因此,全局变量NSUserActivityTypeLiveActivity需要在WidgetKit源代码中正确标记为在iOS 16.1之前不可用。

相关问题