2012-01-06 2 views
8

У меня есть приложение, находящееся сейчас в магазине приложений, на котором я собираюсь отправить обновление в ближайшее время.Как узнать, было ли недавно установлено или обновлено приложение iOS?

С помощью этого обновления, я хочу, чтобы добавить код, который будет сказать приложение, когда он первый работает application:didFinishLaunchingWithOptions ли это:

  1. УСТАНАВЛИВАЕТЕ из магазина приложений.
  2. Недавно обновлен с предыдущей версией

Там нет кода в приложении в данный момент в магазине приложений справиться с этим.
Приложение использует базу данных SQLite, но по причинам, в которые я не буду входить, я не хочу использовать проверку на ее существование как решение этой проблемы.

В качестве побочного вопроса, не сохраняя данные вручную, есть ли SDK, который я могу использовать для запроса, когда приложение было установлено на устройство? (Желательно совместим с iOS 3.0)

Я видел similar question, но ни один из ответов не применим к работе с существующим кодом магазина приложений.

ответ

7

Вы можете сохранить номер версии до NSUserDefaults и обновить ее соответствующим образом.

Если это не сработает, вы можете освободить промежуточную версию, которая вводит схему управления версиями.

Если это не вариант, вы можете проверить наличие следов предыдущих запусков из создаваемых вами файлов или предпочтений, которые вы устанавливаете условно или лениво.

+4

Так в чем проблема? No version number == старая версия. – Krizz

+0

В некоторых случаях вы можете ввести схему версии в промежуточной версии в этом сценарии. Можете ли вы придумать какие-либо постоянные данные или ключи предпочтений, которые не существуют при первом запуске? – justin

+0

cool - Я расширил ответ с этими деталями. – justin

18

Следующий код может помочь ответить на ваш вопрос о том, когда приложение было установлено. Я не уверен, что дата создания приложения - это дата сборки 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]); 
+0

Спасибо за этот новый способ узнать, есть ли новая установка или нет, даже если у нас нет настроек NSUserDefaults в предыдущей версии. – Alex

+2

Я тестирую существующее приложение appstore, и кажется, что первый журнал дает дату/время загрузки, а не дату и время сборки. – Alex

+2

Это очень хороший ответ! Следует по праву отметить правильный ответ. –

3

попробуйте этот код, я знаю, что я слишком поздно для этого ответа, но для обмена knwoldge здесь я иду.

-(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 идентификатор с собственным идентификатором приложения. вы можете получить идентификатор приложения из itune connect selected app-> more info-> meta data

Поскольку у симулятора нет приложения для приложения, этот код не будет работать на симуляторе.

0

GBVersionTracking is good pod для отслеживания всей истории версий.

[GBVersionTracking isFirstLaunchEver]; 
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 независимо от того, обновляется ли пользователь.