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

时间:2016-07-11 07:03:35

标签: 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,我可能只需这样做。

  • 有一个Build步骤,它将读取PodSpec并生成一个包含Pod元数据的简单类,感觉比前一点好一点,但对于我正在寻找的东西仍然感觉有点矫枉过正对

有没有人有更好的想法或能指出我正确的方向?

我想要实现的目标是能够运行类似的东西

print("Current version: \(myPod.version)&#34)

并让它在控制台中正确登录

#Current version: 1.2.0

2 个答案:

答案 0 :(得分:3)

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

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名称列表中的每一行都使用-。请注意,我们在这里使用 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):

答案 1 :(得分:2)

1

let version = Bundle(for: type(of:PODClass)).object(forInfoDictionaryKey:"CFBundleShortVersionString") as? String

2

if let bundle = Bundle.allFrameworks.first(where: { $0.bundleIdentifier?.contains("POD bundleIdentifier or part") ?? false } ) {
    let version = bundle.object(forInfoDictionaryKey:"CFBundleShortVersionString") as? String
}

3

if let url = Bundle.main.resourceURL?.appendingPathComponent("Frameworks/PODName.framework") {
    let version = Bundle(url: url)?.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String
}