web-dev-qa-db-ja.com

アプリの更新時にiOSが新しいidentifierForVendorを取得するのはなぜですか?

私のアプリがAppStoreから更新されるたびに、いくつかの少数のユーザーが何らかの理由で新しいidentifierForVendorを取得します。私のユーザーはサインアップもログインもしません。それらはすべて匿名であるため、ベンダーIDで区切る必要があります。

一部のデバイスの容量が不足しているためにアプリが削除されて再インストールされた可能性があると考えましたが、前回の更新で友人が2 GBを超える空き容量を持っていたため、そうではありませんでした。

アプリを削除して再インストールしたユーザーのidentifierForVendorが変更されていることを知っています。ただし、アプリが更新されたばかりなので、ここではそうではありません。

問題は何でしょうか?奇妙な部分は、これが開発チームのデバイスではまだ発生していないことです。または、数え切れないほどのアプリの更新やOSの更新などを行っても、このバグを経験していないユーザーがまだいます。これは、ごく一部のユーザーにのみ発生します。すべてのユーザーはiOS7 +であり、さまざまなデバイスモデルとiOSバージョンで発生します。

私はこのコードを使用してIDを取得します。

static let DeviceId = UIDevice.currentDevice().identifierForVendor.UUIDString

次に、それらをNSUserDefaultsに保存します。

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "User" + DeviceId)
NSUserDefaults.standardUserDefaults().synchronize()

次に、新しいログインのたびに、ユーザーが存在するかどうかを確認します。

static func doesUserExist() -> Bool {
    var userDefaultValue: AnyObject? = NSUserDefaults.standardUserDefaults().valueForKey("User" + DeviceId)

    if defaultValue == true {
        println("Userdefaults already has this guy, moving on")
        FirstTime = false
        return true
    } else {
        println("First time in the app!")
        FirstTime = true
        return false
    }
}

ユーザーが存在する場合は、ログインプロセスを開始します。ユーザーが存在しない場合は、サインアッププロセスが表示されます。私はParse.comをバックエンドとして使用しており、deviceIDはユーザー名として使用されています。その少数のユーザーがこのバグを経験すると、新しいユーザー名と新しいアカウントが作成されます。

13
Esqarrouth

5月から7月の間にアプリストアからアプリを更新するときに、identifierForVendorの計算に影響するバグがありました。 Appleはすでに問題を解決していると主張しており、別のアップデートをプッシュすると、クリティカルな日付より前に元の値が復元されるはずです。参照: https://openradar.appspot.com/22677034

一部のユーザーは、7月から数週間後に更新してもこの問題を確認していることに注意してください。そのため、バグがまだ残っている可能性があります。または、将来いつでも再発する可能性があります。したがって、このデータを暗号化の一部として使用している場合は、これをキーチェーンに保存するのが最善です。

7
chalcopyrite

最初にIFVをNSUserDefaultsに保存してから、そのキーが存在するかどうかを確認する理由がわかりません。私はあなたがすべきだと思います...

1)最初にNSUserDefaultsをチェックして、作成したIFVキーが存在するかどうかを確認します

2)NSUserDefaultsキーが存在する場合は、必要なことを実行してください。このユーザーのプロファイルはすでに存在します。

3)キーが存在しない場合は、IFVを取得し、NSUserDefaultsに保存します

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

if ([defaults valueForKey:@"IFV"]) {
    //this user already exists, do what you need to do next with IFV
}

else{
    //this is their first time using the app
    NSString *ifvString = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [defaults setValue:ifvString forKey:@"IFV"];

    //do what you need to do next with IFV
}
0
George Steiner

ベンダーIDをKeyChainに保存します。これは、削除または更新後も保持されます。

-(NSString *)getUniqueDeviceIdentifierAsString
{

NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
if (strApplicationUUID == nil)
{
    strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
}

return strApplicationUUID;
}

免責事項:私は他のSO少し前に答えて、 誰を褒めるかは覚えていませんが、結局は私ではありません
@ Jonnyが ソース を見つけました

0
dogsgod