3

ld:警告:某些目标文件具有不兼容的 Objective-C 类别定义。某些类别元数据可能会丢失。所有包含 Objective-C 类别的文件都应该使用相同的编译器构建。

当我通过 cocopods 安装 Firebase/Core 时出现上述警告。而且我相信它会导致错误,因为我的项目无法在我的项目中的 App deleagate 处读取 FIRApp.configure()。我确定我下载了 GoogleService-Infor.plist 并将其放在项目中的正确位置,因为我之前在另一个项目上做过(正常工作),我的另一个项目没有 Objective-C 类别警告。

谁能帮我吗?

我做过的过程:

  1. 在项目 podfile 中添加 pod 'Firebase/Core',关闭 xcode。
  2. 打开终端,进入目标项目文件夹,执行pod install.

    在此处输入图像描述

  3. 在终端上出现警告(解决方案:只需将 $(inherited) 放在 ALWAYS_... 的构建设置中,然后问题解决)[!]xxxxxx-ebooking [Debug]目标覆盖ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES`Pods/Target Support Files/Pods-xxxxxx 中定义的构建设置-ebooking/Pods-xxxxx-ebooking.debug.xcconfig'。这可能会导致 CocoaPods 安装出现问题:

    • 使用$(inherited)旗帜,或
    • 从目标中删除构建设置。
  4. 在 xcode 上出现警告(这个问题很简单,只需提交新文件,警告就会消失):

    file:///Users/yyyyyy/Projects/xxxxxx_projects/xxxxxx-ebooking/Pods/Target%20Support%20Files/Pods-xxxxxx-ebooking/Pods-xxxxxx-ebooking.debug.xcconfig:警告:缺少文件:/Users/yyyyyy /Projects/xxxxxx_projects/xxxxxx-ebooking/Pods/Target Support Files/Pods-xxxxxx-ebooking/Pods-xxxxxx-ebooking.debug.xcconfig 从工作副本中丢失

  5. 忽略3、4的问题过程,因为很容易解决。因为最连线的警告是:

    ld:警告:某些目标文件具有不兼容的 Objective-C 类别定义。某些类别元数据可能会丢失。所有包含 Objective-C 类别的文件都应该使用相同的编译器构建。

  6. Firebase Analytics 尚未创建。请通过调用 [FIRApp configure] 来配置 Firebase

    我确实将 FIRApp.configure() 放在了我的项目中。但是当我在某些视图上调用 FA 事件确实加载时,它会显示此警告。我相信这是因为Objective-C的警告。

4

2 回答 2

3

看看@nonobjc在你的静态变量上使用是否可以解决问题

于 2017-01-26T16:39:15.993 回答
2

最后我解决了所有的错误,感谢我的朋友帮助我调试和堆栈溢出社区。这是解决方案:

一开始我以为这个警告“ld:警告:某些目标文件具有不兼容的Objective-C类别定义”导致执行FIRApp.configure()失败。但它最终是两个不同的错误!

第一个问题,FIRApp.configure() 问题是因为我的项目在 swift 2.2 到 3.0 时出现错误迁移。xcode 建议我将旧的 2.2 语法更改为 AppDelegate 中的私有方法:

private func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
    // This method is your app’s first chance to execute code at launch time.
    FIRApp.configure()         
    return true
 }

FIRApp.configure() 永远不会执行,因为它不是 AppDelegate 的方法。因此,改回正确的语法将解决问题:

func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    print("Fire! willFinishLaunchingWithOptions")
    return true
}

第二个问题,如果使用下面的演示语法并且您的项目在第三方插件或您的代码中有objective-C,则会导致警告“某些目标文件具有不兼容的Objective-C...”。也许,因为 swift 3.0 的语法很旧,所以出现了这个警告。

class var applicationBuildNumber: String {
    if let build = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
        return build
    }
    return "Build Number Not Available"
}

如果您使用类函数,则此警告将消失:

class func appLocalBuild() -> String {
    return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
}
于 2017-02-02T02:11:19.653 回答