ios - 在运行时获取特定 CocoaPods 版本的最佳方法是什么?

标签 ios objective-c swift cocoapods

我目前正在尝试创建一种方法来在运行时记录我的 Pod 的当前版本,我想到了几种方法,但我想在这里问一下以确保我没有遗漏一些明显的东西。

到目前为止我做了什么:

  • 发现 Cocoapods 生成一个 myPod-umbrella.h 头文件,导出以下内容:

    FOUNDATION_EXPORT double myPodVersionNumber;
    FOUNDATION_EXPORT const unsigned char myPodVersionString[];
    

    他们只有 myPodVersionNumber 似乎可以访问,并且由于某种原因它总是 1.0,有没有办法让它正常工作,因为我觉得这是正确的方法,但我有配置错误。

  • 尝试获取构建框架的 Info.plist 并阅读那里的版本,但这似乎有点问题,我无法保证开发人员最终将如何处理 pod 并可能结束改变包的不同位置,甚至让项目无法访问它。

  • 用版本号创建一个硬编码的属性,这显然有效,但它增加了很多出错的空间,并且真的感觉不是实现它的正确方法,但如果没有其他方法可以解决CocoaPods,我可能只需要这样做。

  • 有一个构建步骤将读取 PodSpec 并生成一个简单的类,其中包含有关 Pod 的元数据,感觉比上一点好一点,但对于我正在寻找的东西来说仍然感觉有点矫枉过正。

有没有人有更好的主意或可以指出正确的方向?

我想要实现的是能够运行这样的东西

print("当前版本:\(myPod.version)")

并让它在控制台中正确注销

#当前版本:1.2.0

最佳答案

使用 URLForResource 怎么样?使用您要求的打印语句在运行时很好地打印。

enter image description here

此版本将整个锁定文件打印到控制台。

override func viewDidLoad() {
    super.viewDidLoad()

    let url = NSBundle.mainBundle().URLForResource("/lockfilefolder/Podfile", withExtension: "lock")!
    let data = try! String(contentsOfURL: url, encoding: NSUTF8StringEncoding)
    print(data)   
}

/* Prints */
// PODS:
// - Firebase/Analytics (3.3.0):
// - FirebaseAnalytics (= 3.2.1)
// - Firebase/Auth (3.3.0):
// - Firebase/Analytics (= 3.3.0)
// - FirebaseAuth (= 3.0.3)
// - Firebase/Core (3.3.0):
// - Firebase/Analytics (= 3.3.0)
// - Firebase/Database (3.3.0):
// - Firebase/Analytics (= 3.3.0)
// - FirebaseDatabase (= 3.0.2)
// TL;DR

下一个版本打印特定的行号。通过使用 componentsSeparatedByString("-") 我可以删除 pod 名称前的 - 字符,使其看起来更干净。这是有效的,因为锁定文件在 pod 名称列表中的每一行都使用了 -。请注意,我们在这里使用的是 pathForResource 而不是 URLForResource

    do {
        if let path = NSBundle.mainBundle().pathForResource("/lockfilefolder/Podfile", ofType: "lock"){
            let data = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
            let lockFileData = data.componentsSeparatedByString("-")
            print("Current version: \(lockFileData[6])")
        }
    } catch let err as NSError {
        print(err)
    }

/* Prints */
// Current version: - Firebase/Core (3.3.0):

下一个版本我们打印两行。我们正在使用 data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) 方法。在这种情况下删除 - 会变得冗长,因此不值得。

let url = NSBundle.mainBundle().URLForResource("/lockfilefolder/Podfile", withExtension: "lock")!
    let data = try! String(contentsOfURL: url, encoding: NSUTF8StringEncoding)
    let lockFileData = data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet())
    print(lockFileData[72])
    print(lockFileData[6])

/* Prints */
// COCOAPODS: 0.39.0
// - Firebase/Core (3.3.0):

关于ios - 在运行时获取特定 CocoaPods 版本的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38300945/

相关文章:

ios - SwiftUI从ViewModel访问全局状态

ios - 使用 SWIFT 将 indexPath.row 传递给自定义单元格中的按钮

iPhone:UIImageView 淡入 - 如何?

ios - NSPersisten[NSPersistentStoreCoordinator 崩溃

ios - 如何从 GCD 返回 UIImage 类型

ios - 您如何覆盖新功能并使其向后兼容?

ios - 如何在自己的行上制作每个customLabel?

ios - 强烈提及委托(delegate)

ios - 如何调用不带参数的函数来更新界面?

ios - 计时器倒计时快速跳过秒并暂停