如何判断iOS应用程序是否已重新安装或更新?

时间:2012-01-06 09:28:42

标签: objective-c ios migration

我目前在app商店有一个应用程序,我打算很快提交更新。

有了这个更新,我想添加代码,告诉应用程序首次运行application:didFinishLaunchingWithOptions时是否:

  1. 来自应用商店的新安装。
  2. 从以前的版本新更新
  3. 应用程序商店中当前的应用程序中没有代码可以处理此问题 该应用程序使用SQLite数据库,但由于我不会进入这里的原因,我不想使用检查它的存在作为解决此问题的方法。

    作为一个附带问题,如果不手动存储数据,是否有可用于查询应用程序安装到设备上的SDK? (最好与iOS 3.0兼容)

    我见过similar question,但没有一个答案适用于使用现有的应用商店代码。

5 个答案:

答案 0 :(得分:19)

以下代码可能有助于回答有关何时安装应用的问题。我不确定应用程序包创建日期是XCode构建日期还是下载日期,因为这是从应用程序商店中未经测试的。

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; // e.g. /var/mobile/Applications/<GUID>/<AppName>.app
NSFileManager *manager = [NSFileManager defaultManager];
NSDictionary* attrs = [manager attributesOfItemAtPath:bundleRoot error:nil];
NSLog(@"Build or download Date/Time of first  version to be installed: %@", [attrs fileCreationDate]);
NSLog(@"Date/Time of last install (unless bundle changed by code): %@", [attrs fileModificationDate]);
NSString *rootPath = [bundleRoot substringToIndex:[bundleRoot rangeOfString:@"/" options:NSBackwardsSearch].location]; // e.g /var/mobile/Applications/<GUID>
attrs = [manager attributesOfItemAtPath:rootPath error:nil];
NSLog(@"Date/Time first installed (or first reinstalled after deletion): %@", [attrs fileCreationDate]);

答案 1 :(得分:7)

您可以将版本号保存到NSUserDefaults,并相应地进行更新。

如果这不起作用,您可以发布介绍版本控制方案的中间版本。

如果这不是一个选项,您可以检查您创建的文件的先前运行痕迹,或者您有条件或懒惰地设置的首选项。

答案 2 :(得分:3)

试试这段代码,我知道我对这个答案来说太晚了,但是为了知道分享,我去了。

    -(void) checkIsAppUpdated
{
NSString *urlString = @"http://itunes.apple.com/lookup?id=995558215";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];

[request setHTTPMethod:@"GET"];

NSError *error = nil;
NSURLResponse *response = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

//NSString *stringReply = (NSString *)[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

if (error)
{
   // NSLog(@"Error: %@", stringReply);
    //error reviced

}
else
{
    //The response is in data
    //NSLog(@"Success: %@", stringReply);
    NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    float appStoreVersion=[[[[dictResponse objectForKey:@"results"] firstObject] objectForKey:@"version"] floatValue];

    NSLog(@"app stroe version=%f",appStoreVersion);

    NSString *strLocalVersion=[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    float localAppVersion=[strLocalVersion floatValue];
    if (localAppVersion!=appStoreVersion)
    {
        //open app store url
       // NSString *iTunesLink = @"itms://itunes.apple.com/us/app/apple-store/id375380948?mt=8";
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://itunes.apple.com/app/washthenfold/id995558215?mt=8"]];
    }
}

 }

请注意

id:-replace id,带有您自己的应用ID。你可以从itune获取app id连接所选应用程序 - >更多信息 - >元数据

由于模拟器没有应用程序商店应用程序,因此该代码无法在模拟器上运行。

答案 3 :(得分:0)

GBVersionTracking is good pod可跟踪所有版本历史记录。

[GBVersionTracking isFirstLaunchEver];  

答案 4 :(得分:0)

这是一个简单的代码,可以知道当前版本是否不同(此代码也适用于模拟器。)

-(BOOL) needsUpdate
{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1)
    {
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion])
        {
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

注意:确保在iTunes中输入新版本时,这与您要发布的应用中的版本相匹配。如果没有,则无论用户是否更新,上述代码将始终返回YES。