Как определить дату, когда приложение установлено или используется впервые? - PullRequest
16 голосов
/ 03 ноября 2010

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

Я подумал выпустить обновление, которое будет хранить некоторую информацию при первом использовании приложения, а затем выпустить «реальное» обновление, которое выглядело бы, если приложение было приобретено ранее, однако, вероятно, не все выберут первое обновление.

Итак, есть ли способ узнать, когда именно пользователь впервые установил (или использовал) приложение?

Обновление:

Спасибо за ответы, но я должен сделать это менее двусмысленным:

Я ищу собственный вызов / что-нибудь подобное, чтобы сделать это. Поскольку приложение уже находится в хранилище, и я ничего не настроил для хранения данных в первой версии, обновление поможет мне сделать то, что я хочу, если все пользователи получат его до того, как произойдет второе обновление Выпущено: было бы невозможно отличить нового пользователя от существующего, который пропустил промежуточное обновление и только что обновил до самого последнего.

Ответы [ 9 ]

36 голосов
/ 04 сентября 2013

Чтобы узнать дату установки, проверьте дату создания папки «Документы».

NSURL* urlToDocumentsFolder = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
__autoreleasing NSError *error;
NSDate *installDate = [[[NSFileManager defaultManager] attributesOfItemAtPath:urlToDocumentsFolder.path error:&error] objectForKey:NSFileCreationDate];

NSLog(@"This app was installed by the user on %@", installDate);

Чтобы получить дату последнего обновления приложения, проверьте дату изменения самого пакета приложения

NSString* pathToInfoPlist = [[NSBundle mainBundle] pathForResource:@"Info" ofType:@"plist"];
NSString* pathToAppBundle = [pathToInfoPlist stringByDeletingLastPathComponent];
NSDate *updateDate  = [[[NSFileManager defaultManager] attributesOfItemAtPath:pathToAppBundle error:&error] objectForKey:NSFileModificationDate];

NSLog(@"This app was updated by the user on %@", updateDate);
11 голосов
/ 04 ноября 2010
NSDate *installDate = [[NSUserDefaults standardUserDefaults]objectForKey:@"installDate"];

if (!installDate) {
    //no date is present
    //this app has not run before
    NSDate *todaysDate = [NSDate date];
    [[NSUserDefaults standardUserDefaults]setObject:todaysDate forKey:@"installDate"];
    [[NSUserDefaults standardUserDefaults]synchronize];

    //nothing more to do?
} else {
    //date is found
    NSDate *todaysDate = [NSDate date];
    //compare todaysDate with installDate
    //if enough time has passed, yada yada,
    //apply updates, etc.
}
10 голосов
/ 03 ноября 2010

Мое решение будет проверять дату последнего изменения одного из файлов в комплекте приложения.

NSString *sourceFile = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Icon.png"];

NSDate *lastModif = [[[NSFileManager defaultManager] attributesOfItemAtPath:sourceFile error:&err] objectForKey:NSFileModificationDate];
1 голос
/ 18 октября 2017

Дата сборки приложения:

public var appBuildDate: Date {
  if let path = Bundle.main.path(forResource: "Info", ofType: "plist") {
    if let createdDate = try! FileManager.default.attributesOfItem(atPath: path)[.creationDate] as? Date {
      return createdDate
    }
  }
  return Date() // Should never execute
}

Дата установки приложения:

public var appInstallDate: Date {
  if let documentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last {
    if let installDate = try! FileManager.default.attributesOfItem(atPath: documentsFolder.path)[.creationDate] as? Date {
      return installDate
    }
  }
  return Date() // Should never execute
}
1 голос
/ 13 июня 2013

Ответ на вопрос, могут ли люди найти в этом ошибку.Он казался длиннее, чем другие, которые я нахожу здесь, но он говорит вам, запущено ли приложение впервые после обновления (для этого вам нужно изменить ваш info.plist) ...

// called during startup, compares the current version string with the one stored on standardUserDefaults
+ (BOOL)isFreshInstallOrUpdate
{
    BOOL ret = YES;
    NSString *cfBundleVersionStored = [[NSUserDefaults standardUserDefaults] objectForKey:@"CFBundleVersion"];
    NSString *cfBundleShortVersionStringStored = [[NSUserDefaults standardUserDefaults] objectForKey:@"CFBundleShortVersionString"];

    NSString *cfBundleVersionPlist = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];;
    NSString *cfBundleShortVersionStringPlist = [[NSBundle mainBundle] objectForInfoDictionaryKey:
                                                 @"CFBundleShortVersionString"];

    ret = [cfBundleVersionPlist compare:cfBundleVersionStored] != NSOrderedSame ||
    [cfBundleShortVersionStringPlist compare:cfBundleShortVersionStringStored] != NSOrderedSame;

    return ret;
}


// calling this once will necessarily cause isFreshInstall to return false
+ (void)setStoredVersionNumber
{
    NSString *cfBundleVersionPlist = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];
    NSString *cfBundleShortVersionStringPlist = [[NSBundle mainBundle] objectForInfoDictionaryKey:
                                                 @"CFBundleShortVersionString"];

    [[NSUserDefaults standardUserDefaults] setObject:cfBundleVersionPlist forKey:@"CFBundleVersion"];
    [[NSUserDefaults standardUserDefaults] setObject:cfBundleShortVersionStringPlist forKey:@"CFBundleShortVersionString"];

    // setting now as unfresh!
    [[NSUserDefaults standardUserDefaults] synchronize];
}
1 голос
/ 03 ноября 2010

Я бы рекомендовал просто установить дату при первом запуске и сохранить ее в NSUserDefaults. Ищите дату запуска, если ее там нет, установите ее. Если это так, проведите некоторое сравнение дат и обработайте все остальное в соответствии с вашим планом.

0 голосов
/ 25 января 2019

Использование даты создания каталога документов является лучшим решением на данный момент. Воспроизведение его в Swift 4.2

var inferredDateInstalledOn: Date? {
    guard
        let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last,
        let attributes = try? FileManager.default.attributesOfItem(atPath: documentsURL.path),
        else { return nil }
    return attributes[.creationDate] as? Date
}
0 голосов
/ 31 августа 2016

Быстрое решение:

let urlToDocumentsFolder = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last!
//installDate is NSDate of install
let installDate = (try! NSFileManager.defaultManager().attributesOfItemAtPath(urlToDocumentsFolder.path!)[NSFileCreationDate])
print("This app was installed by the user on \(installDate)")
0 голосов
/ 19 декабря 2011

Вы всегда можете проверить на сервере.Раньше все было просто с UDID, но так как они устарели, вы должны создать UUID (CFUUIDCreate () или что-то в этом роде :)) и сохранить его в цепочке для ключей, каждая информация, хранящаяся в цепочке для ключей, останется постоянной, даже если пользователь удалитприложение и устанавливает снова через год или около того ... Я нашел этот артикль действительно полезным при обработке значений цепочки для ключей в первый раз: http://useyourloaf.com/blog/2010/3/29/simple-iphone-keychain-access.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...