將推播通知新增至 Xamarin.Forms 應用程式

概觀

在本教學課程中,您會將推播通知新增至 Xamarin.Forms 快速入門所產生的所有專案。 這表示每次插入記錄時,就會將推播通知傳送到所有跨平台用戶端。

如果您不要使用下載的快速入門伺服器專案,將需要推播通知擴充套件。 如需詳細資訊,請參閱使用 Azure Mobile Apps 的 .NET 後端伺服器 SDK

必要條件

若為 iOS,您需要 Apple Developer Program 成員資格和實體 iOS 裝置。 iOS 模擬器不支援推播通知

設定通知中樞

Azure App Service 的 Mobile Apps 使用 Azure 通知中樞來傳送推送,因此您將為行動應用程式設定通知中樞。

  1. Azure 入口網站中,移至 [應用程式服務],然後選取應用程式後端。 在 [設定] 底下,選取 [推播]

  2. 將通知中樞資源新增至應用程式,選取 [連線]。 您可以建立中樞或連線到現有的中樞。

    設定中樞

現在您已將通知中樞連接到 Mobile Apps 後端專案。 稍後您要設定此通知中樞,使其連線到平台通知系統 (PNS) 以推播至裝置。

更新伺服器專案以傳送推播通知

在本節中,您會更新現有 Mobile Apps 後端專案中的程式碼,以在每次新增項目時傳送推播通知。 此程序是由 Azure 通知中樞的範本功能所提供,可啟用跨平台推播。 各種用戶端會使用範本來註冊推播通知,而單一通用推播即可送達所有的用戶端平台。

選擇符合後端項目類型的下列其中一個程式: .NET 後端Node.js 後端

.NET 後端專案

  1. 在 Visual Studio 中,以滑鼠右鍵按一下伺服器專案。 然後選取 [管理 NuGet 套件] 。 搜尋 Microsoft.Azure.NotificationHubs,然後選取 [安裝]Microsoft.Azure.NotificationHubs。 此程序會安裝通知中樞程式庫,以便從後端傳送通知。

  2. 在伺服器專案中,開啟 Controllers>TodoItemController.cs。 然後新增下列 using 陳述式:

    using System.Collections.Generic;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Azure.Mobile.Server.Config;
    
  3. PostTodoItem 方法中,於呼叫 InsertAsync 之後新增下列程式碼:

    // Get the settings for the server project.
    HttpConfiguration config = this.Configuration;
    MobileAppSettingsDictionary settings =
        this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
    // Get the Notification Hubs credentials for the mobile app.
    string notificationHubName = settings.NotificationHubName;
    string notificationHubConnection = settings
        .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
    // Create a new Notification Hub client.
    NotificationHubClient hub = NotificationHubClient
    .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    
    // Send the message so that all template registrations that contain "messageParam"
    // receive the notifications. This includes APNS, GCM, WNS, and MPNS template registrations.
    Dictionary<string,string> templateParams = new Dictionary<string,string>();
    templateParams["messageParam"] = item.Text + " was added to the list.";
    
    try
    {
        // Send the push notification and log the results.
        var result = await hub.SendTemplateNotificationAsync(templateParams);
    
        // Write the success result to the logs.
        config.Services.GetTraceWriter().Info(result.State.ToString());
    }
    catch (System.Exception ex)
    {
        // Write the failure result to the logs.
        config.Services.GetTraceWriter()
            .Error(ex.Message, null, "Push.SendAsync Error");
    }
    

    插入新的項目時,此程序會傳送包含 item.Text 的範本通知。

  4. 發佈伺服器專案。

Node.js 後端專案

  1. 設定後端專案。

  2. 在 todoitem.js 中,以下列程式碼取代現有的程式碼:

    var azureMobileApps = require('azure-mobile-apps'),
    promises = require('azure-mobile-apps/src/utilities/promises'),
    logger = require('azure-mobile-apps/src/logger');
    
    var table = azureMobileApps.table();
    
    table.insert(function (context) {
    // For more information about the Notification Hubs JavaScript SDK,
    // see https://aka.ms/nodejshubs.
    logger.info('Running TodoItem.insert');
    
    // Define the template payload.
    var payload = '{"messageParam": "' + context.item.text + '" }';  
    
    // Execute the insert. The insert returns the results as a promise.
    // Do the push as a post-execute action within the promise flow.
    return context.execute()
        .then(function (results) {
            // Only do the push if configured.
            if (context.push) {
                // Send a template notification.
                context.push.send(null, payload, function (error) {
                    if (error) {
                        logger.error('Error while sending push notification: ', error);
                    } else {
                        logger.info('Push notification sent successfully!');
                    }
                });
            }
            // Don't forget to return the results from the context.execute().
            return results;
        })
        .catch(function (error) {
            logger.error('Error while running context.execute: ', error);
        });
    });
    
    module.exports = table;  
    

    插入新的項目時,此程序會傳送包含 item.Text 的範本通知。

  3. 當您在本機電腦上編輯檔案時,請重新發佈伺服器專案。

設定和執行 Android 專案 (選擇性)

完成本節可以為適用於 Android 的 Xamarin.Forms Droid 專案啟用推播通知。

啟用 Firebase 雲端傳訊 (FCM)

  1. 登入 Firebase 主控台。 建立新的 Firebase 專案 (如果您還沒有 Firebase 專案的話)。

  2. 建立專案之後,請選取 [將 Firebase 新增至 Android 應用程式]。

    將 Firebase 新增至 Android 應用程式

  3. 在 [將 Firebase 新增至 Android 應用程式] 頁面上,採取下列步驟:

    1. 對於 [Android 套件名稱],複製應用程式 build.gradle 檔案的 applicationId 值。 在此範例中為 com.fabrikam.fcmtutorial1app

      指定套件名稱

    2. 選取 [註冊應用程式]。

  4. 選取 [下載 google-services.json],將檔案儲存到專案的應用程式資料夾,然後選取 [下一步]

    下載 google-services.json

  5. 在 Android Studio 中對於專案進行下列設定變更

    1. 在專案層級 build.gradle檔案 (<專案>/build.gradle) 中,將下列陳述式加入到相依性區段。

      classpath 'com.google.gms:google-services:4.0.1'
      
    2. 在應用程式層級 build.gradle 檔案 (<project>/<app-module>/build.gradle) 中,將下列陳述式新增至 dependencies 區段。

      implementation 'com.google.firebase:firebase-core:16.0.8'
      implementation 'com.google.firebase:firebase-messaging:17.3.4'
      
    3. 將下行新增至應用程式層級 build.gradle 檔案結尾的相依性區段之後。

      apply plugin: 'com.google.gms.google-services'
      
    4. 在工具列上選取 [立即同步]。

      build.gradle 組態變更

  6. 選取 [下一步] 。

  7. 選取 [略過此步驟]

    略過最後一個步驟

  8. 在 Firebase 主控台中,選取您專案的齒輪圖示。 然後選取 [專案設定]。

    選取專案設定

  9. 如果您尚未將 google-services.json 檔案下載到 Android Studio 專案的 app 資料夾,可以在此頁面下載。

  10. 切換到頂端的 [雲端通訊] 索引標籤。

  11. 複製並儲存伺服器金鑰以供稍後使用。 您可以使用此值來設定中樞。

設定 Mobile Apps 後端以使用 FCM 傳送推送要求

  1. Azure 入口網站中,選取 [瀏覽全部]>[應用程式服務]。 然後選取您的 Mobile Apps 後端。
  2. 在 [設定] 底下,選取 [推播]。 然後選取 [設定推播通知服務]
  3. 前往 Google (GCM)。 輸入透過 Firebase 主控台取得的 FCM 舊版伺服器金鑰,然後選取 [儲存]

您的服務現在已設定為與 Firebase 雲端通訊搭配使用。

將推播通知新增至 Android 專案

為後端設定了 FCM 後,您就可以在用戶端中新增元件和程式碼,以向 FCM 註冊。 您也可以透過 Mobile Apps 後端向 Azure 通知中樞註冊推播通知,並接收通知。

  1. Droid 專案中,以滑鼠右鍵按兩下 [ 參考 > 管理 NuGet 套件...]。
  2. 在 [NuGet 套件管理員] 視窗中,搜尋 Xamarin.Firebase.Messaging 套件,並將其新增至專案。
  3. Droid 專案的專案屬性中,將應用程式設定為使用 Android 7.0 版或更新版本進行編譯。
  4. 將從 Firebase 主控台下載的 google-services.json 檔案新增至 Droid 專案的根目錄,並將其建置動作設定為 GoogleServicesJson。 如需詳細資訊,請參閱新增 Google Services JSON 檔案

向 Firebase 雲端傳訊進行註冊

  1. 開啟 AndroidManifest.xml 檔案,並將下列的 <receiver> 元素插入 <application> 元素:

    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdInternalReceiver" android:exported="false" />
    <receiver android:name="com.google.firebase.iid.FirebaseInstanceIdReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>
    

實作 Firebase 執行個體識別碼服務

  1. 將新的類別新增至名為 FirebaseRegistrationServiceDroid 專案,並確定下列 using 陳述式出現在檔案頂端:

    using System.Threading.Tasks;
    using Android.App;
    using Android.Util;
    using Firebase.Iid;
    using Microsoft.WindowsAzure.MobileServices;
    
  2. 將空的 FirebaseRegistrationService 類別取代為下列程式碼:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.INSTANCE_ID_EVENT" })]
    public class FirebaseRegistrationService : FirebaseInstanceIdService
    {
        const string TAG = "FirebaseRegistrationService";
    
        public override void OnTokenRefresh()
        {
            var refreshedToken = FirebaseInstanceId.Instance.Token;
            Log.Debug(TAG, "Refreshed token: " + refreshedToken);
            SendRegistrationTokenToAzureNotificationHub(refreshedToken);
        }
    
        void SendRegistrationTokenToAzureNotificationHub(string token)
        {
            // Update notification hub registration
            Task.Run(async () =>
            {
                await AzureNotificationHubService.RegisterAsync(TodoItemManager.DefaultManager.CurrentClient.GetPush(), token);
            });
        }
    }
    

    FirebaseRegistrationService 類別負責產生安全性權杖,以授與應用程式存取 FCM 的權限。 應用程式從 FCM 收到註冊權杖時會叫用 OnTokenRefresh 方法。 此方法會從 FirebaseInstanceId.Instance.Token 屬性取出權杖,而 FCM 會以非同步方式更新該屬性。 OnTokenRefresh 方法並不常受到叫用,因為只有在安裝或解除安裝應用程式、使用者刪除應用程式資料、應用程式清除執行個體識別碼,或權杖的安全性遭到洩露時,才會更新權杖。 此外,FCM 執行個體識別碼服務會要求應用程式定期重新整理其權杖,通常是每 6 個月一次。

    OnTokenRefresh 方法也會叫用 SendRegistrationTokenToAzureNotificationHub 方法,用來讓使用者的註冊權杖與 Azure 通知中樞產生關聯。

向 Azure 通知中樞進行註冊

  1. 將新的類別新增至名為 AzureNotificationHubServiceDroid 專案,並確定下列 using 陳述式出現在檔案頂端:

    using System;
    using System.Threading.Tasks;
    using Android.Util;
    using Microsoft.WindowsAzure.MobileServices;
    using Newtonsoft.Json.Linq;
    
  2. 將空的 AzureNotificationHubService 類別取代為下列程式碼:

    public class AzureNotificationHubService
    {
        const string TAG = "AzureNotificationHubService";
    
        public static async Task RegisterAsync(Push push, string token)
        {
            try
            {
                const string templateBody = "{\"data\":{\"message\":\"$(messageParam)\"}}";
                JObject templates = new JObject();
                templates["genericMessage"] = new JObject
                {
                    {"body", templateBody}
                };
    
                await push.RegisterAsync(token, templates);
                Log.Info("Push Installation Id: ", push.InstallationId.ToString());
            }
            catch (Exception ex)
            {
                Log.Error(TAG, "Could not register with Notification Hub: " + ex.Message);
            }
        }
    }
    

    RegisterAsync 方法會使用 Firebase 註冊權杖建立 JSON 格式的簡易通知訊息範本,並註冊為可從通知中樞接收範本通知。 這可確保從 Azure 通知中樞送出的任何通知會送往註冊權杖所代表的裝置。

顯示推播通知的內容

  1. 將新的類別新增至名為 FirebaseNotificationServiceDroid 專案,並確定下列 using 陳述式出現在檔案頂端:

    using Android.App;
    using Android.Content;
    using Android.Media;
    using Android.Support.V7.App;
    using Android.Util;
    using Firebase.Messaging;
    
  2. 將空的 FirebaseNotificationService 類別取代為下列程式碼:

    [Service]
    [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
    public class FirebaseNotificationService : FirebaseMessagingService
    {
        const string TAG = "FirebaseNotificationService";
    
        public override void OnMessageReceived(RemoteMessage message)
        {
            Log.Debug(TAG, "From: " + message.From);
    
            // Pull message body out of the template
            var messageBody = message.Data["message"];
            if (string.IsNullOrWhiteSpace(messageBody))
                return;
    
            Log.Debug(TAG, "Notification message body: " + messageBody);
            SendNotification(messageBody);
        }
    
        void SendNotification(string messageBody)
        {
            var intent = new Intent(this, typeof(MainActivity));
            intent.AddFlags(ActivityFlags.ClearTop);
            //Unique request code to avoid PendingIntent collision.
            var requestCode = new Random().Next();
            var pendingIntent = PendingIntent.GetActivity(this, requestCode, intent, PendingIntentFlags.OneShot);
            var notificationBuilder = new NotificationCompat.Builder(this)
                .SetSmallIcon(Resource.Drawable.ic_stat_ic_notification)
                .SetContentTitle("New Todo Item")
                .SetContentText(messageBody)
                .SetContentIntent(pendingIntent)
                .SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification))
                .SetAutoCancel(true);
    
            var notificationManager = NotificationManager.FromContext(this);
            notificationManager.Notify(0, notificationBuilder.Build());
        }
    }
    

    應用程式從 FCM 收到通知時所叫用的 OnMessageReceived 方法會擷取訊息內容,並呼叫 SendNotification 方法。 此方法會將訊息內容轉換成應用程式執行時所啟動的本機通知,並在通知區域中顯示通知。

現在,您已經準備好在 Android 裝置或模擬器上執行的應用程式中測試推播通知。

在 Android 應用程式中測試推播通知

只有要在模擬器上測試時,才需要前兩個步驟。

  1. 請確定您要在利用 Google Play Services 設定的裝置或模擬器上進行部署或偵錯。 藉由檢查裝置或模擬器上已安裝 Play 應用程式,即可確認這點。
  2. 按兩下 [ 應用程式>設定>] [新增帳戶],將Google帳戶新增至Android裝置。 然後遵循提示在裝置中新增現有 Google 帳戶,或是建立一個新的帳戶。
  3. 在 Visual Studio 或 Xamarin Studio 中,以滑鼠右鍵按一下 Droid 專案,然後按一下 [設定為啟始專案]
  4. 按一下 [執行] 以建置專案,並在 Android 裝置或模擬器上啟動應用程式。
  5. 在應用程式中輸入工作,然後按下加號 (+) 圖示。
  6. 確認在加入項目時收到通知。

設定和執行 iOS 專案 (選擇性)

這一節適用於對 iOS 裝置執行 Xamarin iOS 專案。 如果未使用 iOS 裝置,可以略過這一節。

產生憑證簽署要求檔案

Apple Push Notification Service (APNs) 使用憑證來驗證您的通知服務。 遵循下列指示來建立必要的推播憑證,以便傳送和接收通知。 如需這些概念的詳細資訊,請參閱 Apple Push Notification Service 官方文件。

產生憑證簽署要求 (CSR) 檔案,Apple 會用此檔案來產生簽署的推播憑證。

  1. 在您的 Mac 上,執行「鑰匙圈存取」工具。 此工具可從啟動控制板上的 [公用程式] 資料夾或 [其他] 資料夾開啟。

  2. 選取 [金鑰鏈存取] ,並展開 [憑證助理] ,然後選取 [從憑證授權單位要求憑證] 。

    使用金鑰鏈存取要求新憑證

    注意

    依預設,Keychain 存取會選取清單中的第一個項目。 如果您位於 [憑證] 類別中,而 Apple Worldwide Developer Relations 憑證授權單位不是清單中的第一個項目,則可能因此而產生問題。 在產生 CSR (憑證簽署要求) 之前,請確定您擁有非金鑰項目,或已選取 Apple Worldwide Developer Relations 憑證授權單位金鑰。

  3. 選取您的使用者電子郵件地址,輸入一般名稱值,並確定您已指定 [儲存至磁碟] ,然後選取 [繼續] 。 請將 [CA 電子郵件地址] 留空,因為這不是必要資訊。

    必要的憑證資訊

  4. 在 [另存新檔] 中輸入 CSR 檔案的名稱,在 [位置] 中選取位置,然後選取 [儲存] 。

    選擇憑證的檔案名稱

    此動作會在選取的位置儲存 CSR 檔案。 預設位置是桌面。 請記住為檔案選擇的位置。

接著,向 Apple 註冊您的應用程式,並啟用推播通知,然後上傳這個匯出的 CSR 建立推播憑證。

針對推播通知註冊應用程式

若要將推播通知傳送至 iOS 應用程式,請向 Apple 註冊您的應用程式,並註冊進行推播通知。

  1. 如果您尚未註冊應用程式,請瀏覽至 Apple Developer Center 上的 iOS 佈建入口網站。 使用您的 Apple ID 登入入口網站,然後選取 [識別碼] 。 然後選取 [+] 以註冊新的應用程式。

    iOS 佈建入口網站應用程式識別碼頁面

  2. 在 [註冊新識別碼] 畫面上,選取 [應用程式識別碼] 選項按鈕。 然後選取 [繼續]。

    iOS 佈建入口網站的 [註冊新識別碼] 頁面

  3. 將新應用程式的下列三個值予以更新,然後選取 [繼續] :

    • 描述:輸入您應用程式的描述性名稱。

    • 套件組合識別碼:以應用程式分發指南 \(英文\) 中所提的 Organization Identifier.Product Name 形式輸入套件組合識別碼。 [組織識別碼] 和 [產品名稱] 值必須符合當您建立 Xcode 專案時使用的組織識別碼和產品名稱。 在下列螢幕擷取畫面中,NotificationHubs 值會作為組織識別碼,GetStarted 值會作為產品名稱。 請確定套件組合識別碼值符合您 Xcode 專案中的值,好讓 Xcode 使用正確的發行設定檔。

      iOS 佈建入口網站的 [註冊應用程式識別碼] 頁面

    • 推播通知:勾選 [功能] 區段中的 [推播通知] 選項。

      註冊新應用程式識別碼的表單

      此動作會產生您的應用程式識別碼,並要求您確定此資訊。 選取 [繼續] ,然後選取 [註冊] 以確認新的應用程式識別碼。

      確認新的應用程式識別碼

      選取註冊之後,您會在 [憑證、識別碼與設定檔] 頁面中看到作為明細項目的新應用程式識別碼。

  4. 在 [憑證、識別碼與設定檔] 頁面的 [識別碼] 底下,找出您剛才建立的應用程式識別碼明細項目,然後選取其資料列以顯示 [編輯您的應用程式識別碼設定] 畫面。

建立通知中樞的憑證

需要憑證才能搭配使用通知中樞與 APNS。 完成此步驟的方式有兩種:

  1. 建立可直接上傳至通知中樞的 .p12
  2. 建立 .p8,其可用於權杖型驗證 (較新的方法)。

較新的方法具有許多優點 (相較於使用憑證),如 APNS 權杖型 (HTTP/2) 驗證中所述。 不過,已經為這兩種方法提供步驟。

選項 1:建立可直接上傳至通知中樞的 .p12 推送憑證

  1. 向下瀏覽至已核取的 [推播通知] 選項,然後選取 [設定] 來建立憑證。

    編輯應用程式識別碼頁面

  2. [Apple 推播通知服務 SSL 憑證] 視窗隨即出現。 在 [開發 SSL 憑證] 區段下方,選取 [建立憑證] 按鈕。

    為應用程式識別碼建立憑證的按鈕

    [建立新憑證] 畫面會隨即顯示。

    注意

    本教學課程使用開發憑證。 註冊生產憑證時,將使用同一個程序。 只要確定在傳送通知時使用相同的憑證類型即可。

  3. 選取 [選擇檔案] ,瀏覽到您在第一個工作中儲存 CSR 檔案的位置,然後按兩下憑證名稱來將其下載。 然後選取 [繼續] 。

  4. 在入口網站建立憑證之後,請選取 [下載] 按鈕。 儲存憑證,並記住其儲存位置。

    產生的憑證 CSR 下載頁面

    這會下載憑證並將其儲存到您電腦中的 [下載] 資料夾。

    在 [下載] 資料夾中找出憑證檔案

    注意

    依預設,下載的開發憑證會名為 aps_development.cer

  5. 按兩下下載的推播憑證 aps_development.cer。 此動作會將新的憑證安裝在金鑰鏈中,如下圖所示:

    顯示新憑證的金鑰鏈存取憑證清單

    注意

    雖然憑證中的名稱可能會不同,不過名稱會加上 Apple Development iOS Push Services 前置詞。

  6. 在 Keychain Access 中,以滑鼠右鍵按一下您在 [憑證] 類別中建立的新推播憑證。 選取 [匯出] 、為檔案命名、選取 [.p12] 格式,然後選取 [儲存] 。

    以 p12 格式匯出憑證

    您可以選擇使用密碼來保護憑證,但這是選擇性的。 如果您想要略過密碼建立,請按一下 [確定] 。 記下匯出的 .p12 憑證的檔案名稱和位置。 其可用來啟用 APNs 驗證功能。

    注意

    您的 .p12 檔案名稱和位置可能與本教學課程中所顯示的不同。

選項 2:建立可用於權杖型驗證的 .p8 憑證

  1. 記下下列詳細資料:

    • 應用程式識別碼首碼 (這是小組識別碼)
    • 套件組合識別碼
  2. 回到 [憑證、識別碼與設定檔] 中,按一下 [金鑰] 。

    注意

    如果您已為 APNS 設定金鑰,則可重複使用在建立之後所下載的 .p8 憑證。 若是如此,您可以忽略 35 的步驟。

  3. 按一下 [+] 按鈕 (或 [建立金鑰] 按鈕) 以建立新的金鑰。

  4. 提供適當的金鑰名稱值,然後勾選 [Apple Push Notifications service (APN)] 選項,接著在下一個畫面上,依序按一下 [繼續] 、[註冊] 。

  5. 按一下 [下載] 然後將 .p8 檔案 (前置為 AuthKey_ ) 移至安全的本機目錄,然後按一下 [完成] 。

    注意

    請務必將您的 .p8 檔案保留在安全的位置 (並儲存備份檔案)。 下載完您的金鑰之後,就無法再重新下載,因為伺服器複本已移除。

  6. 在 [金鑰] 上,按一下剛才建立的金鑰 (如果選擇改用現有的金鑰,則按一下現有金鑰)。

  7. 請記下金鑰識別碼的值。

  8. 在所選擇的適當應用程式中開啟您的 .p8 憑證,例如 Visual Studio Code,然後記下金鑰值。 這是 -----BEGIN PRIVATE KEY----------END PRIVATE KEY----- 之間的值。

    -----BEGIN PRIVATE KEY-----
    <key_value>
    -----END PRIVATE KEY-----
    

    注意

    這是稍後將用來設定通知中樞權杖值

在這些步驟的最後,您應該具有下列資訊,以便稍後在使用 APN 資訊設定通知中樞中使用:

  • 小組識別碼 (請參閱步驟 1)
  • 套件組合識別碼 (請參閱步驟 1)
  • 金鑰識別碼 (請參閱步驟 7)
  • 權杖值 例如,.p8 金鑰值 (請參閱步驟8)

建立應用程式的佈建設定檔

  1. 返回 iOS 布建入口網站,選取 [ 憑證]、[標識符 & 配置檔]、從左側功能表中選取 [ 配置檔 ],然後選取 + 以建立新的配置檔。 [註冊新佈建設定檔] 的畫面會隨即出現。

  2. 在 [開發] 下,選取 [iOS 應用程式開發] 作為佈建設定檔類型,然後選取 [繼續] 。

    佈建設定檔清單

  3. 接著,從 [應用程式識別碼] 下拉式清單選取您建立的應用程式識別碼,然後選取 [繼續] 。

    選取應用程式識別碼

  4. 在 [選取憑證] 視窗中,選取用於程式碼簽署的開發憑證,然後選取 [繼續] 。 此憑證不是您建立的推播憑證。 如果沒有憑證存在,您必須加以建立。 如果憑證存在,請跳到下一個步驟。 若要建立開發憑證 (憑證不存在的話):

    1. 如果您看到 [沒有可用憑證] ,請選取 [建立憑證] 。
    2. 在 [軟體] 區段中,選取 [Apple 開發] 。 然後選取 [繼續] 。
    3. 在 [建立新憑證] 畫面中,選取 [選擇檔案] 。
    4. 瀏覽至您稍早建立的憑證簽署要求憑證並加以選取,然後選取 [開啟] 。
    5. 選取 [繼續] 。
    6. 下載開發憑證,並記住其儲存位置。
  5. 返回 [ 憑證]、[標識符 & 配置檔] 頁面,從左側功能表中選取 [ 配置檔 ],然後選取 + 以建立新的配置檔。 [註冊新佈建設定檔] 的畫面會隨即出現。

  6. 在 [選取憑證] 視窗中,選取您剛才建立的開發憑證。 然後選取 [繼續] 。

  7. 接下來,選取要用來測試的裝置,然後選取 [繼續] 。

  8. 最後,在 [佈建設定檔名稱] 中為設定檔選擇名稱,然後選取 [產生] 。

    選擇佈建設定檔名稱

  9. 建立新的佈建設定檔後,請選取 [下載] 。 記住其儲存位置。

  10. 瀏覽至佈建設定檔的位置,然後按兩下來將其安裝在您的 Xcode 開發機器上。

建立通知中樞

在本節中,您會建立一個通知中樞,並透過 .p12 推播憑證或權杖型驗證,使用 APN 來設定驗證。 如果您想要使用已經建立的通知中樞,可以跳至步驟 5。

  1. 登入 Azure 入口網站

  2. 選取左功能表上的 [所有服務],然後選取 [行動] 區段中的 [通知中樞]。 選取服務名稱旁邊的星號圖示,將服務加到左功能表上的 [我的最愛] 區段。 將 [通知中樞] 新增至 [我的最愛] 之後,在左功能表上予以選取。

    Azure 入口網站 - 選取通知中樞

  3. 在 [通知中樞] 頁面上,選取工具列上的 [新增] 。

    通知中樞 - 新增工具列按鈕

  4. 在 [通知中樞] 頁面上,執行下列步驟:

    1. 在 [通知中樞] 中輸入名稱。

    2. 在 [建立新的命名空間] 中輸入名稱。 命名空間包含一或多個中樞。

    3. 從 [位置] 下拉式清單方塊選取值。 此值會指定您要在其中建立中樞的位置。

    4. 在 [資源群組] 中選取現有的資源群組,或建立一個新群組。

    5. 選取 [建立]。

      Azure 入口網站 - 設定通知中樞屬性

  5. 選取 [通知] \(鈴鐺圖示),然後選取 [前往資源] 。 您也可以重新整理 [通知中樞] 頁面中的清單,然後選取您的中樞。

    Azure 入口網站 - 通知 ->移至資源

  6. 從清單中選取 [存取原則] 。 請記下您可使用的兩個連接字串。 您稍後需要用到這些連接字串來處理推播通知。

    重要

    「請勿」 在應用程式中使用 DefaultFullSharedAccessSignature 原則。 這只能在後端使用。

    Azure 入口網站 - 通知中樞連接字串

使用 APNs 資訊設定您的通知中樞

在 [Notification Services] 下,選取 [Apple (APNS)] ,然後遵循先前在<建立通知中樞的憑證>一節中選擇的方法進行適當的步驟。

注意

只有在您想傳送推播通知給從市集購買應用程式的使用者時,才可使用 [生產] 的 [應用程式模式]。

選項 1:使用 .p12 推送憑證

  1. 選取 [憑證] 。

  2. 選取 [檔案] 圖示。

  3. 選取您先前匯出的 .p12 檔案,然後選取 [開啟] 。

  4. 若有需要,請指定正確的密碼。

  5. 選取 [沙箱] 模式。

    在 Azure 入口網站中設定 APNS 憑證

  6. 選取 [儲存]。

選項 2:使用權杖型驗證

  1. 選取權杖

  2. 輸入您稍早取得的下列值:

    • 金鑰識別碼
    • 套件組合識別碼
    • 小組識別碼
    • 權杖
  3. 選擇 [沙箱]

  4. 選取 [儲存] 。

您現在已使用 APNs 來設定通知中樞。 您也擁有可用來註冊應用程式和傳送推播通知的連接字串。

設定 APNS 的通知中樞

  1. 在您的 Mac 上啟動 Keychain Access。 在左側導覽列的 [類別] 下,開啟 [我的憑證]。 尋找您在上一節中下載的 SSL 憑證,然後公開其內容。 僅選取憑證 (不選取私密金鑰)。 然後將它匯出
  2. Azure 入口網站中,選取 [瀏覽全部]>[應用程式服務]。 然後選取您的 Mobile Apps 後端。
  3. 在 [設定] 下,選取 [App Service 推播]。 然後選取您的通知中樞名稱。
  4. 移至 Apple 推播通知服務>上傳憑證。 上傳 .p12 檔案,選取正確的模式 (根據您稍早的用戶端 SSL 憑證為生產或沙箱)。 儲存任何變更。

您的服務現在已設定成在 iOS 上使用推播通知。

接下來,您將在 Xamarin Studio 或 Visual Studio 中設定 iOS 專案設定。

在 Xamarin Studio 中設定 iOS 專案

  1. 在 Xamarin.Studio 中,開啟 Info.plist,並使用您稍早使用新應用程式識別碼建立的 套件組合識別碼來更新套件組合標識碼

  2. 向下捲動到 [背景模式]。 選取 [啟用背景模式] 方塊與 [遠端通知] 方塊。

  3. 按兩下 [方案面板] 中的專案,以開啟 [專案選項]

  4. 選擇 [建置] 下的 [iOS 套件組合簽署],然後選取對應的身分識別以及您為此專案設定的 [佈建設定檔]。

    這將確保專案使用新的設定檔進行程式碼簽署。 如需官方 Xamarin 裝置佈建文件,請參閱 Xamarin 裝置佈建

在 Visual Studio 中設定 iOS 專案

  1. 在 Visual Studio 中,以滑鼠右鍵按一下專案,然後按一下 [屬性]

  2. 在 [屬性] 頁面中,按一下 [iOS 應用程式] 索引標籤,然後使用您稍早建立的識別碼更新 [識別碼]

  3. 在 [iOS 套件組合簽署] 索引標籤中,選取對應的身分識別以及您為此專案設定的佈建設定檔。

    這將確保專案使用新的設定檔進行程式碼簽署。 如需官方 Xamarin 裝置佈建文件,請參閱 Xamarin 裝置佈建

  4. 按兩下 Info.plist 以開啟,並啟用 [背景模式] 下的 RemoteNotifications

將推播通知加入至 iOS 應用程式

  1. iOS 專案中開啟 AppDelegate.cs,並將下列陳述式新增到程式碼檔案頂端。

    using Newtonsoft.Json.Linq;
    
  2. AppDelegate 類別中,新增 RegisteredForRemoteNotifications 事件的覆寫以註冊通知:

    public override void RegisteredForRemoteNotifications(UIApplication application,
        NSData deviceToken)
    {
        const string templateBodyAPNS = "{\"aps\":{\"alert\":\"$(messageParam)\"}}";
    
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
            {
                {"body", templateBodyAPNS}
            };
    
        // Register for push with your mobile app
        Push push = TodoItemManager.DefaultManager.CurrentClient.GetPush();
        push.RegisterAsync(deviceToken, templates);
    }
    
  3. 此外,也在 AppDelegate 中新增 DidReceiveRemoteNotification 事件處理常式的下列覆寫:

    public override void DidReceiveRemoteNotification(UIApplication application,
        NSDictionary userInfo, Action<UIBackgroundFetchResult> completionHandler)
    {
        NSDictionary aps = userInfo.ObjectForKey(new NSString("aps")) as NSDictionary;
    
        string alert = string.Empty;
        if (aps.ContainsKey(new NSString("alert")))
            alert = (aps[new NSString("alert")] as NSString).ToString();
    
        //show alert
        if (!string.IsNullOrEmpty(alert))
        {
            UIAlertView avAlert = new UIAlertView("Notification", alert, null, "OK", null);
            avAlert.Show();
        }
    }
    

    當應用程式執行時,此方法會處理傳入的通知。

  4. AppDelegate 類別中,將下列程式碼新增到 FinishedLaunching 方法:

    // Register for push notifications.
    var settings = UIUserNotificationSettings.GetSettingsForTypes(
        UIUserNotificationType.Alert
        | UIUserNotificationType.Badge
        | UIUserNotificationType.Sound,
        new NSSet());
    
    UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
    UIApplication.SharedApplication.RegisterForRemoteNotifications();
    

    這能夠支援遠端通知,並要求推播註冊。

您的應用程式現在已更新為支援推播通知。

在 iOS 應用程式中測試推播通知

  1. 以滑鼠右鍵按一下 iOS 專案,然後按一下 [設為起始專案]

  2. 在 Visual Studio 中按下 [執行] 按鈕或 F5 以建置專案,並在 iOS 裝置上啟動應用程式。 然後,按一下 [確定] 以接收推撥通知。

    注意

    您必須明確地接受來自應用程式的推播通知。 只有在應用程式第一次執行時,才會發生此要求。

  3. 在應用程式中輸入工作,然後按下加號 (+) 圖示。

  4. 確認您已接收到通知,然後按一下 [確定] 以關閉通知。

設定和執行 Windows 專案 (選擇性)

本節說明執行適用於 Windows 裝置的 Xamarin.Forms WinApp 和 WinPhone81 專案。 這些步驟也支援通用 Windows 平台 (UWP) 專案。 如果未使用 Windows 裝置,可以略過這一節。

為 Windows 應用程式向 Windows 通知服務 (WNS) 註冊推播通知

  1. 在 Visual Studio 方案總管中,以滑鼠右鍵按一下 Windows 市集應用程式專案。 然後選取 [市集>關聯應用程式與市集]。

    建立應用程式與 Windows 市集的關聯

  2. 在精靈中,選取 [下一步]。 然後使用您的 Microsoft 帳戶登入。 在 [保留新的應用程式名稱] 中,輸入您應用程式的名稱,然後選取 [保留]

  3. 成功建立應用程式註冊之後,選取新的應用程式名稱。 選取 [下一步],然後選取 [關聯]。 此程序會將所需的 Windows 市集註冊資訊新增至應用程式資訊清單。

  4. 使用您之前為 Windows 市集應用程式所建立的相同註冊,針對 Windows Phone 市集應用程式專案重複步驟 1 和 3。

  5. 移至 Windows 開發人員中心,然後使用您的 Microsoft 帳戶登入。 在 [我的應用程式] 中,選取新的應用程式註冊。 然後展開 [服務>推播通知]。

  6. 在 [推播通知] 頁面上的 [Windows 推播通知服務] ([WNS) ] 和 [Microsoft Azure Mobile Apps] 底下,選取 [線上服務 網站]。 記下 Package SID 的值和應用程式密碼中的目前值。

    開發人員中心的應用程式設定

    重要

    應用程式密碼與封裝 SID 是重要的安全性認證。 請勿與任何人共用這些值,或與您的應用程式一起散發密碼。

設定 WNS 的通知中樞

  1. Azure 入口網站中,選取 [瀏覽全部]>[應用程式服務]。 然後選取您的 Mobile Apps 後端。 在 [設定] 下,選取 [App Service 推播]。 然後選取您的通知中樞名稱。

  2. 移至 Windows (WNS)。 然後輸入您從線上服務網站取得的 [安全性金鑰] \(用戶端秘密) 和 [封裝 SID]。 接下來,選取 [儲存]

    在入口網站中設定 WNS 金鑰

您的後端現在已設定成使用 WNS 傳送來傳送推播通知。

將推播通知加入至 Windows 應用程式

  1. 在 Visual Studio 中,開啟 Windows 專案中的 App.xaml.cs,並新增下列陳述式。

    using Newtonsoft.Json.Linq;
    using Microsoft.WindowsAzure.MobileServices;
    using System.Threading.Tasks;
    using Windows.Networking.PushNotifications;
    using <your_TodoItemManager_portable_class_namespace>;
    

    使用包含 TodoItemManager 類別的可攜式專案命名空間來取代 <your_TodoItemManager_portable_class_namespace>

  2. 在 App.xaml.cs 中,新增下列 InitNotificationsAsync 方法:

    private async Task InitNotificationsAsync()
    {
        var channel = await PushNotificationChannelManager
            .CreatePushNotificationChannelForApplicationAsync();
    
        const string templateBodyWNS =
            "<toast><visual><binding template=\"ToastText01\"><text id=\"1\">$(messageParam)</text></binding></visual></toast>";
    
        JObject headers = new JObject();
        headers["X-WNS-Type"] = "wns/toast";
    
        JObject templates = new JObject();
        templates["genericMessage"] = new JObject
        {
            {"body", templateBodyWNS},
            {"headers", headers} // Needed for WNS.
        };
    
        await TodoItemManager.DefaultManager.CurrentClient.GetPush()
            .RegisterAsync(channel.Uri, templates);
    }
    

    這個方法會取得推播通知通道,並註冊範本以接收來自通知中樞的範本通知。 支援 messageParam 的範本通知會傳送到此用戶端。

  3. 在 App.xaml.cs 中,新增 async 修飾詞以更新 OnLaunched 事件處理常式方法定義。 然後,在方法的結尾新增下列程式碼行:

    await InitNotificationsAsync();
    

    如此可確保每次啟動應用程式時都會建立或重新整理推播通知註冊。 必須如此以保證 WNS 推送通道永遠在作用中。

  4. 在 Visual Studio 的 [方案總管] 中,開啟 Package.appxmanifest 檔案,然後把 [通知] 下方的 [支援快顯通知] 設為 [是]

  5. 建置應用程式並確認沒有錯誤。 您用戶端應用程式現在應該註冊 Mobile Apps 後端的範本通知。 針對方案中每個 Windows 專案重複操作這一節。

在 Windows 應用程式中測試推播通知

  1. 在 Visual Studio 中,以滑鼠右鍵按一下 Windows 專案,然後按一下 [設定為啟始專案]
  2. 按 [ 執行 ] 按鈕以建置項目並啟動應用程式。
  3. 在應用程式中,輸入新 todoitem 的名稱,然後按下加號 (+) 圖示加以新增。
  4. 確認在加入項目時收到通知。

下一步

您可以深入了解推播通知︰

您也可以繼續進行下列其中一個教學課程: