iOS dyld : Symbol not found: _NSUserActivityTypeLiveActivity

标签 ios swiftui widgetkit dynamic-island

我正在为我的 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
}

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

dyld: Symbol not found: _NSUserActivityTypeLiveActivity

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

最佳答案

我认为这是 SDK 中的一个错误,建议您向 Apple 提交有关此问题的错误。

作为解决方法,您可以这样做:

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 Crash Dump Analysis 启动带有调试(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 之前不可用。

关于iOS dyld : Symbol not found: _NSUserActivityTypeLiveActivity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74964330/

相关文章:

swift - CloudKit中的Core Data发生变化时如何调用WidgetCenter.shared.reloadAllTimelines()?

ios - 在 iOS 14 WidgetKit 中获取当前位置

ios - 在 ios 中单击 + 或 - 按钮时在标签上递增、递减

ios - 以下构建命令失败

ios - NSURLSession 返回数据

swiftui - UIViewRepresentable 无法在模态呈现的 SwiftUI View 中工作

swift - 从iOS的Core Data 14 WidgetKit 中获取数据

ios - 是否可以在 UITextview 链接选择上设置清除颜色?

swiftui - 如何隐藏 SwiftUI 列表分隔符

binding - 如何在 SwiftUI 中绑定(bind)计算属性