可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am able to display the build date for my app in the simulator, but whenever I archive the app, and upload it to TestFlight, and then install it on a device, the build date doesn't show.
Here is what I'm doing to display the build date.
First, I added CFBuildDate as a string to myproject-info.plist
Next, I added the following script to Edit Scheme -> Build -> Pre-Actions -> Run Script Action :
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
Finally, used the following code to get the build date from the plist file :
NSString *build_date = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBuildDate"];
This displays the build date in simulator (though occasionally it doesn't), but when deploying the app through TestFlight, the build date never displays. Any ideas ?
Thanks in advance.
回答1:
Try running the script as a build phase step, rather than a scheme pre-action step, so it's run all the time, regardless of the type of build you are producing.
回答2:
You might consider using the built-in __DATE__ and __TIME__ macros which will return a string representation of the date and time the app was built. Perhaps they will be of more help to you:
NSString *dateStr = [NSString stringWithUTF8String:__DATE__]; NSString *timeStr = [NSString stringWithUTF8String:__TIME__];
回答3:
To get build date with format 'yyMMddHHmm' you could try this:
+ (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; }
回答4:
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) }
回答5:
If you redefine __DATE__ and __TIME__
#define DATE [NSString stringWithUTF8String:__DATE__] #define TIME [NSString stringWithUTF8String:__TIME__] - (NSString *)getBuildDate { NSString *buildDate; // Get build date and time, format to 'yyMMddHHmm' NSString *dateStr = [NSString stringWithFormat:@"%@ %@", DATE , TIME ]; // Convert to date NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; [dateFormat setDateFormat:@"LLL d yyyy HH:mm:ss"]; NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; [dateFormat setLocale:usLocale]; NSDate *date = [dateFormat dateFromString:dateStr]; // Set output format and convert to string [dateFormat setDateFormat:@"dd/MM/yyyy-HH:mm"]; buildDate = [dateFormat stringFromDate:date]; return buildDate; }