Некоторые регистрации не зарегистрированы в Центре уведомлений - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь интегрировать свои нативные приложения Android и iOS в Notification Hub. Например, на iOS, как только я получаю deviceToken и, если мой пользователь уже аутентифицирован, я регистрируюсь напрямую в NotificationHub:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    log.debug("Received device token \(deviceToken.hexEncodedString()). Saving device token to user defaults.", "AppDelegate.didRegisterForRemoteNotificationsWithDeviceToken")
    let defaults = UserDefaults.standard
    defaults.set(deviceToken, forKey: UserNotificationDeviceTokenKey)
    defaults.synchronize()

    if let authenticatedUser = Session.shared.authenticatedUser {
        log.debug("Trying to register device token \(deviceToken.hexEncodedString()) to user \(authenticatedUser.id) on notification hub with hub name \(String(describing: hubName)) and connection string \(String(describing: connectionString)). Notification hub null? \(notificationHub == nil)")
        self.notificationHub?.registerNative(withDeviceToken: deviceToken, tags: Set<String>([authenticatedUser.id]), completion: { error in
            if (error != nil) {
                log.error("Error registering for notifications: \(error.debugDescription)", "AppDelegate.didRegisterForRemoteNotificationsWithDeviceToken");
            } else {
                log.debug("Successfully registered device token \(deviceToken.hexEncodedString()) for user with ID \(authenticatedUser.id) and email \(authenticatedUser.emailAddress)", "AppDelegate.didRegisterForRemoteNotificationsWithDeviceToken")
            }
        })
    }
}

И что бы ни случилось, я начинаю с сохранения устройства токен для пользователя по умолчанию, так что когда пользователь входит в систему, он может извлечь deviceToken из значений пользователя по умолчанию и вызвать тот же метод registerNative, чтобы создать регистрацию, связывающую этот deviceToken с тегом, который является идентификатором пользователя:

func userDidSignIn(user: User) {
    if let appDelegate = UIApplication.shared.delegate as? AppDelegate,
        let deviceToken = UserDefaults.standard.data(forKey: UserNotificationDeviceTokenKey){

        log.debug("Trying to register device token \(deviceToken.hexEncodedString()) to user \(user.id) on notification hub with hub name \(String(describing: appDelegate.hubName)) and connection string \(String(describing: appDelegate.connectionString)). Notification hub null? \(appDelegate.notificationHub == nil)")

        appDelegate.notificationHub?.registerNative(withDeviceToken: deviceToken, tags: Set<String>([user.id]), completion: { error in
            if (error != nil) {
                log.error("Error registering for notifications: \(error.debugDescription)");
            } else {
                log.debug("Successfully registered device token \(deviceToken.hexEncodedString()) for user with ID \(user.id) (\(user.emailAddress)) who just logged in", context: "HTRootViewController.userDidSignIn")
            }
        })
    } else {
        log.warning("No device token found in settings.", "HTRootViewController.userDidSignIn")
    }
}

Все мои журналы удаленно отправляются в Bugfender, что позволяет мне проверять журналы для всех устройств, использующих это приложение, установленное в TestFlight, поэтому я вижу, что все registerNative успешны:

Попытка зарегистрировать маркер устройства 0fea9a4d99ec37dc4f3ac252c35fa4e1617004fd14740973d80a7dfdaeacc857 для пользователя 77bfb1c6-b05a-440b-a7a0-71ae5a91bubub hub мое имя (опция h h) [уведомление о подключении через hub (опция h h) имя уведомления (мое имя hub) «h h» [мое сообщение hub hub) Строка подключения] "). Центр уведомлений null? false

Успешно зарегистрированный токен устройства 0fea9a4d99ec37dc4f3ac252c35fa4e1617004fd14740973d80a7dfdaeacc857 для пользователя с ID 77bfb1c6-b05a-440b-a7a0-71ae5a91 101 * * * * * * * * * * * * * * * * загрузите список всех регистраций, используя это. NET C# код:

public async Task<List<RegistrationDescription>> GetRegistrations()
{
    var hub = NotificationHubClient.CreateClientFromConnectionString([my notification hub connection string], [my notification hub name]);
    var result = await hub.GetAllRegistrationsAsync(1000);
    return result.ToList();
}

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

Кто-нибудь знает, что еще может происходить? Что еще я могу проверить? Почему еще нельзя сохранить регистрацию, даже если вызов на registerNative кажется успешным?

РЕДАКТИРОВАТЬ: На самом деле, и после более точной проверки того, что происходит, регистрация сначала появляется в списке регистрации возвращаются Notification Hub, но как только мы пытаемся отправить уведомление, создается впечатление, что Notification Hub не может связаться с соответствующим токеном устройства и вообще удаляет регистрацию. Есть ли способ просмотреть журналы Notification Hub, чтобы увидеть, что происходит и почему он решает удалить эту регистрацию?

1 Ответ

0 голосов
/ 27 февраля 2020

Я понял это. Оказывается, он работал на моем устройстве, потому что я запускал бета-версию в режиме отладки, поэтому он получал маркер своего устройства из среды Sandbox APS, которая соответствовала конечной точке Sandbox, настроенной в Notification Hub, но другие пользователи использовали среду Production APS настроены в сборке архива, поэтому они получили токены устройства для другой среды и концентратор уведомлений, правильно идентифицированный как неправильные токены устройства. Как только мы переключили Центр уведомлений на конечную точку производственного APNS, все пользователи TestFlight смогли получать уведомления, поскольку их регистрации оставались в Центре уведомлений. Теперь это означает, что мои отладочные сборки, пытающиеся использовать эти среды, не будут получать уведомления, но это нормально, поэтому у нас есть другая среда и Центр уведомлений для целей разработки. Поэтому, если кто-то видит нечто подобное, не забудьте дважды проверить, что конфигурация вашего Notification Hub соответствует типу сборки, которую используют ваши пользователи, и не забывайте, что сборки TestFlight теперь являются сборками производственного типа, такими же, как сборки в App Store.

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