簡體   English   中英

使用 Xamarin 將帶有一些標簽的設備再次注冊到 azure 通知中心

[英]Register again a device with some tags to a azure notification hub using Xamarin

我正在按照一系列教程創建推送通知 Xamarin 應用程序,特別是 Android,通過Azure 通知中心Firebase接收通知。 這是第一個視頻,代碼 在 github 中 但是我需要選擇應用程序使用標簽將設備注冊到通知中心的時刻。 目前,它發生在OnNewToken中,但我需要讓用戶先登錄,或者通過輸入提供標簽,然后我才能注冊標簽。

解決方案/Project.Android/Model/FirebaseMessagingServiceEx.cs

public override void OnNewToken(string token)
{
    base.OnNewToken(token);

    System.Diagnostics.Debug.WriteLine(token);

    var hub = new NotificationHub(
        Constants.HubName,
        Constants.HubConnectionString,
        MainActivity.Context);

    // register device with Azure Notification Hub using the token from FCM
    var registration = hub.Register(token, Constants.HubTagName);

    // Register template
    var pnsHandle = registration.PNSHandle;
    var templateReg = hub.RegisterTemplate(
        pnsHandle,
        "defaultTemplate",
        Template,
        Constants.HubTagName);

    var receiver = DependencyService.Get<INotificationsReceiver>();
    receiver.RaiseNotificationReceived("Ready and registered...");
}

我什至不明白什么時候調用OnNewToken 我試圖強制生成另一個令牌以再次運行OnNewToken ……但未成功。 我可以在檢索用戶標簽后檢索當前令牌以執行hub.Register嗎? 我看到的所有示例都使用了已棄用的代碼。 還有其他選擇嗎? 謝謝。

不幸的是,Xamarin 的推送通知文檔非常不完整,其中很多已棄用/過時。 我努力尋找獲取設備令牌並注冊 Azure 通知中心的最新機制。

要獲取設備令牌,您不應覆蓋 OnNewToken。 當前的首選機制如下:

  1. 在您的 Android 項目中,創建一個 C# class 實現Android.Gms.Tasks.IOnCompleteListener
/// <summary>
/// Wraps the native Android interface <see cref="IOnCompleteListener"/>,
/// which enables interaction with Promise-style async callbacks.
/// </summary>
public class GetFcmTokenSuccessHandler : Java.Lang.Object, IOnCompleteListener
{
    private readonly Action<string> _handleFcmTokenCallback;

    public GetFcmTokenSuccessHandler(Action<string> handleFcmTokenCallback)
    {
        _handleFcmTokenCallback = handleFcmTokenCallback;
    }

    /// <summary>
    /// Method invoked when the associated <see cref="Task"/> completes.
    /// </summary>
    /// <param name="result">The task that completed.</param>
    public void OnComplete(Task result)
    {
        if (result.IsComplete && result.IsSuccessful)
        {
            var token = result.Result.ToString();

            _handleFcmTokenCallback?.Invoke(token);
        }
        else if (result.IsComplete && result.Exception != null)
        {
            // Add error handling here
        }
    }

    #region Interface requiresments; irrelevant to implementation
    public JniManagedPeerStates JniManagedPeerState => JniManagedPeerStates.None;

    public void SetJniIdentityHashCode(int value) { }
    public void SetJniManagedPeerState(JniManagedPeerStates value) { }
    public void SetPeerReference(JniObjectReference reference) { }
    #endregion
}
  1. 登錄后,在您的 Android 項目的依賴注入的特定平台服務中觸發以下代碼:
await FirebaseMessaging.Instance
    .GetToken()
    .AddOnCompleteListener(new GetFcmTokenSuccessHandler(token =>
    {
        if (string.IsNullOrWhiteSpace(token))
        {
            // Add error handling here
        }

        // Now create your NotificationHub and register with the token and any tags
    }));

作為附錄,如果在應用程序運行時的任何時候您需要再次注冊,我建議將設備令牌緩存在 memory 中,這樣您就可以再次檢索它而無需通過 FirebaseMessaging 實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM