Как поступить со старыми токенами уведомлений iOS, остающимися действительными после создания нового токена и vendorId?

Я использую Центр уведомлений Azure для отправки удаленных уведомлений, в настоящее время только на iOS.

Сначала я понял, что мое устройство получало 5 уведомлений об одном событии уведомления. Я проверил и отладил свой код, и он действительно правильно проверяет, не зарегистрирован ли уже предоставленный токен для регистрации.

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

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

Похоже, другие люди сталкиваются с этой проблемой при разработке iOS, включая Android.

Использование VendorId для идентификации устройства оказывается бессмысленным, , как некоторые выясняют, он также изменяется при новой установке. Когда я удаляю приложение и переустанавливаю, я получаю новый vendorId плюс новый токен уведомления, оставляя предыдущие действительными, открывая возможность получать несколько экземпляров одного уведомления (поскольку серверная часть не может сопоставить новые два значения с все, что есть в базе данных).

Какие-нибудь советы по этому поводу, пожалуйста? Я совершенно потерялся в этом?

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




Ответы (2)


По сути, вам придется самостоятельно идентифицировать устройство, сохраняя идентификатор, используя UUID, в Связке ключей. Связка ключей, потому что данные сохраняются при нескольких установках.

Ниже приведена быстрая реализация с использованием слесаря ​​:

import UIKit
import Locksmith


class Keychain
{
    private static let AccountName = "MyAppName";
    private static let CustomDeviceIdKey = "CustomDeviceIdKey";
    
    private static func AccountData() -> Dictionary<String, Any>?
    {
        return Locksmith.loadDataForUserAccount(userAccount: AccountName)
    }
    
    private static func GenerateCustomDeviceId() -> Bool
    {
        do{
            try Locksmith.saveData(data: [CustomDeviceIdKey: UUID().uuidString], forUserAccount: AccountName)
            return true
        }catch{
            print("Failed to save custom device id: \(error.localizedDescription)")
            return false
        }
    }
    
    static func CustomDeviceId() -> String
    {
        let data = AccountData()
        if let result = data?[CustomDeviceIdKey] as? String{
            return result
        }else{
            if GenerateCustomDeviceId(){
                return CustomDeviceId()
            }
            return ""
        }
    }
}

А потом вы просто идете:

func SomeMethodThatNeedsDeviceId(){
    var customDeviceIdThatPersistsOverInstalls = Keychain.CustomDeviceId()
}

И это то, что вы используете вместо VendorId

person pnizzle    schedule 12.01.2021

Отвечая с точки зрения Центров уведомлений Azure, мы видим каждый идентификатор устройства как действительный идентификатор устройства и предотвращаем будущие отправки только после того, как мы попытаемся отправить на это устройство, и Apple даст нам ответ о том, что устройство истекло / недействительно. Следовательно, у нас нет информации о том, могут ли различные идентификаторы устройств принадлежать одному и тому же устройству из-за переустановок.

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

person Andrew Wang - MSFT    schedule 13.01.2021
comment
Проблема не в дублировании идентификатора устройства. Проблема в том, что все идентификаторы устройств действительны и указывают на одно устройство. То же самое и с токеном. - person pnizzle; 13.01.2021