【问题标题】:Conditionally import a framework (such as Speech) based on iOS Version in Swift?在 Swift 中有条件地导入基于 iOS 版本的框架(例如 Speech)?
【发布时间】:2020-11-02 18:27:28
【问题描述】:

有没有办法根据运行时iOS版本有条件地在Swift中导入框架?

特别是,我有一个部署目标为iOS 8 的应用程序。如果在运行时可用,我想在应用程序中使用新的 Apple Speech 框架。我知道代码部分的#available(iOS 10, *) 指令,以及可用于整个类的@available(iOS 10, *) 指令。所以我可以很容易地避免执行任何使用语音框架的代码。但是在包含使用语音的类的文件中,我需要“导入语音”语句,并且这两个指令都不能在那里使用。我发现即使我的整个班级都有 @available(iOS 10, *) 指令,当我在 iOS 9 设备上运行我的应用程序时,它在启动时会被

杀死
"dyld: Library not loaded: /System/Library/Frameworks/Speech.framework/Speech".

是我遗漏了什么,还是只能在部署目标为 10 的应用中使用语音框架?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    您可以将框架设为可选(详情和图片来自Ray Wenderlicht):

    这与您对@available 的使用相结合,应该可以防止系统尝试将其加载到不可用的设备上。

    【讨论】:

    • 这不起作用,至少在这种情况下是这样。有趣的是,在 Apple 的示例 SpeakToMe 项目中,Speech Framework 甚至没有在项目中链接,但它无论如何都可以正常构建和运行(在设备上)。同样,在我的项目中,在 iOS 10 上,它无需链接 Speech 框架即可工作。如果我继续添加框架,并将其设为可选,它仍然可以在 iOS 10 上构建和运行,但在 iOS 9 上我会遇到同样的崩溃。
    • @MattF_PI 好奇。您确实需要使用可用的 @ 来涵盖框架的所有用途。尝试注释掉包含(s)以导致每个包含编译错误,以便您可以检查它们 - 仅使用一个没有 @ 可用的参数仍会触发系统尝试加载“可选”框架。如果没有,对不起,那应该可以工作。
    • 抱歉我的错误——我刚刚意识到我在项目中将框架添加到了错误的目标(我们有很多目标)。因此,将 Speech 框架显式添加到正确的目标,然后使其成为可选(结合 @available 和 #available 以避免代码),确实允许代码在 iOS 9 和 iOS 10 上运行。
    • 此解决方案是否也适用于第三方框架,还是仅适用于 Apple 的框架?
    【解决方案2】:

    你需要使用

    #if canImport(YourFramework)
    import YourFramework
    #endif
    

    在将你的框架设置为可选之后,现在而不是@available :-)

    【讨论】:

    • 我仍然收到消息:Compiling for iOS 9.0, but module 'ForestCore' has a minimum deployment target of iOS 10.0
    • canImport 适用于平台,例如 iOS、watchOS,而不是操作系统的版本
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2018-10-27
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多