我目前正在尝试创建一种在运行时记录我当前版本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
答案 0 :(得分:3)
使用URLForResource怎么样?使用您要求的print语句在运行时很好地打印。
此版本将整个锁定文件打印到控制台。
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
}