显示应用程序的构建日期

时间:2012-08-02 14:19:03

标签: objective-c ios xcode build

我可以在模拟器中显示我的应用程序的构建日期,但每当我存档应用程序并将其上传到TestFlight,然后将其安装在设备上时,构建日期都不会显示。

以下是我正在显示的构建日期。

首先,我将 CFBuildDate 作为字符串添加到myproject-info.plist

接下来,我将以下脚本添加到Edit Scheme - >构建 - >预先行动 - >运行脚本操作:

infoplist="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH"
builddate=`date`
if [[ -n "$builddate" ]]; then
/usr/libexec/PlistBuddy -c "Add :CFBuildDate $builddate" ${infoplist}
/usr/libexec/PlistBuddy -c "Set :CFBuildDate $builddate" ${infoplist}
fi

最后,使用以下代码从plist文件中获取构建日期:

NSString *build_date = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBuildDate"];

这会在模拟器中显示构建日期(虽然偶尔也没有),但是当通过TestFlight部署应用程序时,构建日期永远不会显示。有什么想法吗?

提前致谢。

7 个答案:

答案 0 :(得分:27)

您可以考虑使用内置的__DATE____TIME__宏,这些宏将返回构建应用程序的日期和时间的字符串表示形式。也许他们会对你有所帮助:

NSString *dateStr = [NSString stringWithUTF8String:__DATE__];
NSString *timeStr = [NSString stringWithUTF8String:__TIME__];

答案 1 :(得分:12)

要获取格式为“yyMMddHHmm”的构建日期,您可以尝试这样做:

+ (NSString *)GetBuildDate {
    NSString *buildDate;

    // Get build date and time, format to 'yyMMddHHmm'
    NSString *dateStr = [NSString stringWithFormat:@"%@ %@", [NSString stringWithUTF8String:__DATE__], [NSString stringWithUTF8String:__TIME__]];

    // Convert to date
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"LLL d yyyy HH:mm:ss"];
    NSDate *date = [dateFormat dateFromString:dateStr];

    // Set output format and convert to string
    [dateFormat setDateFormat:@"yyMMddHHmm"];
    buildDate = [dateFormat stringFromDate:date];

    [dateFormat release];

    return buildDate;
}

答案 2 :(得分:7)

尝试将脚本作为构建阶段步骤运行,而不是方案预执行步骤,因此无论您生成的构建类型如何,它都会一直运行。

答案 3 :(得分:7)

Swift3

static var buildDate: Date? {
    guard let infoPath = Bundle.main.path(forResource: "Info.plist", ofType: nil) else {
        return nil
    }
    guard let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath) else {
        return nil
    }
    let key = FileAttributeKey(rawValue: "NSFileCreationDate")
    guard let infoDate = infoAttr[key] as? Date else {
        return nil
    }
    return infoDate
}

static var prettyBuildDate: String {
    guard let date = buildDate else {
        return "Unknown"
    }
    let formatter = DateFormatter()
    formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
    formatter.timeZone = TimeZone(abbreviation: "UTC")
    return formatter.string(from: date)
}

答案 4 :(得分:5)

如果您重新定义toString()__DATE__,则每次构建应用时都会更新时间。你不需要清理或存档来更新时间,只需要运行项目。

__TIME__

答案 5 :(得分:0)

Swift5

copy *.txt output.txt

答案 6 :(得分:0)

在 macOS 上,我使用此代码,它从应用程序的 Info.plist 内容中获取构建日期。可能也适用于 iOS,我还没有检查过:

+ (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;
}