iPhone更新应用程序版本(在设置中)

时间:2009-08-21 11:22:57

标签: iphone settings

  

可能重复:
  How can I display the application version revision in my application's settings bundle?

我有一个iPhone应用程序,将当前版本显示为设置常量(就像Skype一样)。

当我发布应用程序的第一个版本时,我使用此代码来设置应用程序设置:

- (void)registerDefaultsFromSettingsBundle {
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"];
    if(!settingsBundle) {
        NSLog(@"Could not find Settings.bundle");
        return;
    }

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]];
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];
    for(NSDictionary *prefSpecification in preferences) {
        NSString *key = [prefSpecification objectForKey:@"Key"];
        if(key) {
            [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key];

        }
    }

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister];
    [defaultsToRegister release];
}

这很好用,花花公子。

我现在面临的问题是,如果您更新应用程序,则不会重写这些默认设置(设置),因此不会更新应用程序版本。

如何强制在每次安装时设置特定设置?

由于 Gonso

3 个答案:

答案 0 :(得分:7)

您可以使用以下“运行脚本”构建阶段:

CFBundleShortVersionString=`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${SRCROOT}/YourApp/YourApp-Info.plist`
CFBundleVersion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" ${SRCROOT}/YourApp/YourApp-Info.plist`
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:3:DefaultValue '${CFBundleShortVersionString} (${CFBundleVersion})'" ${SRCROOT}/YourApp/Settings.bundle/Root.plist

您需要做的就是用您的应用名称替换YourApp并设置相应的密钥路径。

在我的情况下,我在PreferenceSpecifiers数组中有4个项目,我需要设置数组中最后一项的值,这就是我使用':PreferenceSpecifiers: 3 :DefaultValue'的原因

答案 1 :(得分:1)

我在我的应用程序代理中使用了此代码-applicationDidFinishLaunching:

#if DDEBUG // debugging/testing
    NSString *versionString = [NSString stringWithFormat:@"v%@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]];
#else
    NSString *versionString = [NSString stringWithFormat:@"Version %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]];
#endif // DDEBUG
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setValue:versionString forKey:@"version"];
    printf("Version: = %s\n", [versionString cStringUsingEncoding:NSMacOSRomanStringEncoding]);
    [defaults synchronize]; // force immediate saving of defaults.

但必须在“设置版本”更新之前运行应用以反映更改。

答案 2 :(得分:0)

为什么不从mainBundle设置版本号?

NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]];

这样您就不必为每个版本更新设置文件。如果要比较现有安装版本和新安装版本。您可以在启动时将版本号写入文件,并将目录版本与启动版本进行比较。