Подтвердить что ты не робот

Почему iOS получает новый идентификатор forVendor при обновлении приложения?

Каждый раз, когда мое приложение обновляется из App Store, небольшое количество пользователей по какой-то причине получает новый идентификаторForVendor. Мои пользователи не регистрируются и не заходят в систему. Все они анонимны, поэтому мне нужно разделить их через идентификаторы поставщиков.

Я подумал, что на некоторых устройствах может быть недостаточно места, в результате чего приложение будет удалено и переустановлено, но это не так, поскольку в последнем обновлении мой друг имел более 2 ГБ свободного пространства.

Я знаю, что идентификатор ForVendor изменен для пользователя, который удаляет и переустанавливает приложение. Но это не так, поскольку приложение просто обновляется.

В чем проблема? Странная часть заключается в том, что этого еще не было для разработчиков команды разработчиков. Или есть пользователи, которые не испытывали этой ошибки после бесчисленных обновлений приложений, обновлений ОС и т.д. Это происходит только с небольшим процентом пользователей. Все пользователи 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 как backend, а deviceID используется как имя пользователя. Когда эта небольшая часть пользователей испытывает эту ошибку, я вижу новое имя пользователя и созданную учетную запись.

4b9b3361

Ответ 1

Возникла ошибка, влияющая на вычисление идентификатораForVendor при обновлении приложения из магазина приложений в период с мая по июль. Apple заявила, что они уже решили проблему, а другое обновление должно восстановить исходное значение до критической даты. Ссылка: https://openradar.appspot.com/22677034

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

Ответ 2

Сохраните идентификатор поставщика в 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 нашел источник

Ответ 3

Я смущен, почему вы сначала сохраняете 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
}