アプリ内ストアを開く予定で、既存のユーザーに無料でアイテムの一部を提供したいと思います。
アプリを初めて使用するときに情報を保存するアップデートをリリースしてから、アプリを以前に購入した場合に表示される「実際の」アップデートをリリースすることを考えましたが、すべての人が最初のアップデートを選択するわけではない可能性があります。
だから、正確にユーザーが最初にインストールしたのはいつかを知る方法はありますか (または使用済み) アプリ ?
更新:
回答ありがとうございますが、あいまいさを少なくする必要があります:
ネイティブコール/それに似たものを探しています。アプリはすでにストアにあり、最初のバージョンにデータを保存するための設定を行っていないため、更新は、次の場合に必要なことを実行するのに役立ちますすべてのユーザー 2番目の更新の前にそれを取得しますリリース済み:新しいユーザーと、中間更新を見逃して最新のユーザーに更新したばかりの既存のユーザーを区別することは不可能です。
私の解決策は、アプリバンドル内のファイルの1つの最終変更日を確認することです。
NSString *sourceFile = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Icon.png"];
NSDate *lastModif = [[[NSFileManager defaultManager] attributesOfItemAtPath:sourceFile error:&err] objectForKey:NSFileModificationDate];
インストール日を取得するには、Documentsフォルダーの作成日を確認してください。
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);
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.
}
人々がこれに誤りを見つけることができるかどうか見るために答える。ここで見つけた他のものよりも長いように見えましたが、更新後にアプリが初めて実行されているかどうかがわかります(このためには、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];
}
アプリのビルド日:
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
}
最初の起動時に日付を設定し、NSUserDefaultsに保存することをお勧めします。発売日を探し、ない場合は設定します。そうである場合は、日付の比較を行い、残りは計画に従って処理します。
これまでのところ、Documentsディレクトリの作成日を使用するのが最善の解決策です。 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
}
迅速なソリューション:
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)")
サーバーでいつでも確認できます。以前はUDIDで単純でしたが、これらは非推奨であるため、UUID(CFUUIDCreate()など:))を作成してキーチェーンに保存しているため、ユーザーが削除しても、キーチェーンに保存されているすべての情報は保持されます。アプリと1年かそこら後に再インストール...私はこのartickeが初めてキーチェーン値を処理するときに本当に役立つと思いました: http://useyourloaf.com/blog/2010/3/29/simple- iphone-keychain-access.html