ios - 支持应用程序和扩展程序的 Swift 库

标签 ios swift frameworks

我为我的 iOS 应用程序创建了一个库,但收到警告 linking against a dylib which is not safe for use in application extensions .
我知道这是因为我没有启用 Allow app extension API only为我的图书馆。因此,当我启用该设置时,我的库会在我使用 UIApplication.shared 的地方出现错误.
我知道我不能使用 shared在我的扩展程序中,实际上并不需要,但是我的应用程序和我的扩展程序都使用了这个库。
所以问题是,我怎样才能在 UIApplication.shared 附近编译带有守卫的库?
我已经使用了这个:

#if !IS_EXTENSION
    // Cancel the background task
    UIApplication.shared.endBackgroundTask(bgTask)
#endif
并设置IS_EXTENSION对于 Active Compilation Conditions在我的扩展目标中,还有 IS_EXTENSION=1对于 Preprocessor Macros在我的应用程序扩展中,但是库仍然在这些行上给我警告。

最佳答案

第一个解决方案
我建议你在你的库中使用 UIApplication 注入(inject)。可以这样实现。
您的 lib 实例可能类似于以下内容:

class DarrenLib {

    static var shared = DarrenLib()
    
    // User application instance everywhere where needed in your lib.
    private var application: UIApplication?
    
    func setup(_ app: UIApplication) {
        self.application = app
    }
}
作为示例注入(inject)可以在完成启动功能中完成:
func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
    
    DarrenLib.shared.setup(application)
    
    return true
}
我不建议使用预处理器宏,因为它取决于无法完成的附加设置要求抛出源代码。
第二种解决方案
同样,您当前正在使用应用程序和扩展程序目标。您可以创建这些框架:
  • DJSwiftCommonHelpers .在这个框架中将包含适用于应用程序和扩展目标的源代码。
  • DJSwiftAppHelpers .该框架将包含源代码,其中包含 UIKit 特定案例,如 UIApplication 共享 实例。
  • DJSwiftExtensionHelpers .在此框架中,将包含仅针对扩展的源代码(如果有的话)。

  • DJApp 将嵌入 DJSwiftCommonHelpers 和 DJSwiftAppHelpers 框架。
    DJNotificationExtension 将嵌入 DJSwiftCommonHelpers 和 DJSwiftExtensionHelpers 框架。
    enter image description here

    关于ios - 支持应用程序和扩展程序的 Swift 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64699041/

    相关文章:

    iphone - 如何忽略@2x 图像

    swift - 转换时是否需要显式大小写类型?

    swift - 还是 "dangerous to rely on binary frameworks that use Swift"吗?

    java - java 是否有一个简约的 WebSocket 客户端库?

    ios - 设置 Root View Controller 不起作用?

    iphone - 查看 NSString drawInRect 将使用多少行的简单方法?

    ios - POST json 对象作为 iOS 6 中 POST 中的变量名称 json

    arrays - Swift:初始化一个字典数组,其中键是一个字符串,值是一个类型

    ios - SwiftUI:VStack 中的 VStack,标签被截断

    ios - Xcode 框架版本/当前/标题/错误