我在Objective-C中使用__DATE__
和__TIME__
来获取应用的构建日期和时间。我找不到在Swift中获取此信息的方法。有可能吗?
答案 0 :(得分:22)
您可以获取构建日期和时间,而无需恢复到Objective-C。构建应用程序时,将始终从项目中创建的Info.plist文件创建。因此该文件的创建日期与构建日期和时间相匹配。您始终可以阅读应用程序包中的文件并获取其属性。因此,您可以通过访问其Info.plist文件属性来获取Swift中的构建日期:
TSearchResultItem
注意:这是让我在最初遇到此问题时使用桥接头的帖子。从那以后我发现了这个“更快”的解决方案,所以我想我会分享它以供将来参考。
[EDIT]添加了compileDate变量以获取最新的编译日期,即使没有进行完整的构建也是如此。这只有在开发过程中有意义,因为你将不得不做一个完整的构建来在应用程序商店上发布应用程序,但它可能仍然有用。它的工作方式相同,但使用包含实际代码的捆绑文件而不是Info.plist文件。
LookbookSearchResultItem
答案 1 :(得分:9)
您可以使用#line
,#column
和#function
。
原始答案:
在项目中创建一个新的Objective-C文件,当Xcode询问时,对创建桥接头说“是”。
在这个新的Objective-C文件中,添加以下.h
文件:
NSString *compileDate();
NSString *compileTime();
在.m
中实现这些功能:
NSString *compileDate() {
return [NSString stringWithUTF8String:__DATE__];
}
NSString *compileTime() {
return [NSString stringWithUTF8String:__TIME__];
}
现在转到桥接标题并导入我们创建的.h
。
现在回到你的任何Swift文件:
println(compileDate() + ", " + compileTime())
答案 2 :(得分:0)
Swift 5版本的Alain T的答案:
var buildDate: Date {
if let infoPath = Bundle.main.path(forResource: "Info", ofType: "plist"),
let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath),
let infoDate = infoAttr[.modificationDate] as? Date {
return infoDate
}
return Date()
}
答案 3 :(得分:0)
与之前的答案略有不同,改为检查可执行文件的创建日期。这似乎也适用于 macOS(使用 Catalyst 应用测试)。
/// Returns the build date of the app.
public static var buildDate: Date
{
if let executablePath = Bundle.main.executablePath,
let attributes = try? FileManager.default.attributesOfItem(atPath: executablePath),
let date = attributes[.creationDate] as? Date
{
return date
}
return Date()
}
答案 4 :(得分:0)
这里的所有旧答案都不好,因为它们没有提供一种稳定可靠的方式来获取实际构建日期。例如,获取应用内文件的文件日期并不好,因为文件日期可能会更改,而不会使应用的代码签名无效。
官方构建日期由 Xcode 添加到应用程序的 Info.plist 中——这是您应该使用的日期。
例如,使用此代码(抱歉,它在 ObjC 中,但将其转录为 Swift 不应该那么难):
+ (NSDate *)buildDate {
static NSDate *result = nil;
if (result == nil) {
NSDictionary *infoDictionary = NSBundle.mainBundle.infoDictionary;
NSString *s = [infoDictionary valueForKey:@"BuildDateString"];
NSISO8601DateFormatter *formatter = [[NSISO8601DateFormatter alloc] init];
NSDate *d = [formatter dateFromString:s];
result = d;
}
return result;
}