共用方式為


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

概觀

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

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

先決條件

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

設定通知中樞

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

  1. 在 azure 入口網站的 中,移至 App Services,然後選取您的應用程式後端。 在 [設定]中,選取 [推送]

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

    設定中樞

現在您已將通知中樞連線到Mobile Apps 後端專案。 稍後您會將此通知中樞設定為連線到平臺通知系統 (PNS) 以推送至裝置。

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

在本節中,您會更新現有Mobile Apps 後端專案中的程式代碼,以在每次新增專案時傳送推播通知。 此過程得益於 Azure 通知中樞的 範本 功能,可啟用跨平臺推送。 各種客戶端會使用範本註冊推播通知,而單一通用推播可以到達所有客戶端平臺。

選擇下列符合您後端項目類型的程序——.NET 後端Node.js 後端

.NET 後端專案

  1. 在 Visual Studio 中,以滑鼠右鍵按兩下伺服器專案。 然後選取 [管理 NuGet 套件]。 搜尋 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");
    }
    

    此過程會在插入新項目時傳送一個包含項目文字的範本通知。

  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 檔案 (<project>/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. 複製並儲存伺服器金鑰以供稍後使用。 您可以使用此值來設定中樞。

設定行動應用程式後端以使用 FCM 發送推送通知請求

  1. 在 Azure 入口網站的 中,選取 瀏覽所有>App Services。 然後選取您的行動應用程式的後端。
  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 方法。 方法會從 FCM 異步更新的 FirebaseInstanceId.Instance.Token 屬性擷取令牌。 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 方法會建立簡單的通知訊息範本作為 JSON,並使用 Firebase 註冊令牌註冊從通知中樞接收範本通知。 這可確保從 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 收到通知、擷取訊息內容並呼叫 SendNotification 方法時,會叫用 OnMessageReceived 方法。 這個方法會將訊息內容轉換成應用程式執行時啟動的本機通知,通知會出現在通知區域中。

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

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

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

  1. 請確定您要在已設定 Google Play 服務的裝置或模擬器上部署或偵錯。 檢查裝置或模擬器上已安裝 Play 應用程式,即可驗證此情況。
  2. 按兩下 [應用程式]>[設定]>[新增帳戶],將Google帳戶新增至Android裝置。 然後依照提示將現有的 Google 帳戶新增至裝置,或建立新的帳戶。
  3. 在 Visual Studio 或 Xamarin Studio 中,以滑鼠右鍵點擊 Droid 專案,然後點擊 [設定為啟動專案]
  4. 按兩下 [執行 來建置專案,並在Android裝置或模擬器上啟動應用程式。
  5. 在應用程式中,輸入工作,然後按下加號 (+) 圖示。
  6. 確認新增專案時收到通知。

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

本節適用於執行適用於 iOS 裝置的 Xamarin iOS 專案。 如果您未使用 iOS 裝置,可以略過本節。

產生憑證簽署要求檔案

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

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

  1. 在您的 Mac 上,執行 Keychain 存取工具。 您可以從 [公用程式] 資料夾或 Launchpad 上的 [其他] 資料夾開啟它。

  2. 選取 [金鑰鏈存取],展開 [憑證助理],然後選取 [向證書頒發機構單位要求憑證]。

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

    備註

    根據預設,Keychain Access 會選取清單中的第一個專案。 如果您位於 憑證 類別,且 Apple Worldwide Developer Relations 認證機構不是清單中的第一個項目,那這可能會是個問題。 在產生 CSR(憑證簽署要求)之前,請確定您擁有非密鑰物品,或已選取 Apple 全球開發人員關係認證機構 的密鑰。

  3. 選取您的 [使用者電子郵件位址],輸入您的 [一般名稱] 值,確定您指定 [ 儲存到磁碟],然後選取 [ 繼續]。 將CA 電子郵件位址留空,因為它不是必需的。

    必要憑證資訊

  4. 「另存新檔」中輸入 CSR 檔案的名稱,於「位置」中選取位置,然後選取「儲存」

    選擇憑證的檔名

    此動作會將 CSR 檔案儲存在選取的位置。 默認位置為 Desktop。 請記住為檔案選擇的位置。

接下來,向Apple註冊您的應用程式、啟用推播通知,並上傳導出的 CSR 以建立推播憑證。

註冊應用程式以啟用推播通知

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

  1. 如果您尚未註冊應用程式,請流覽至 Apple 開發人員中心的 iOS 佈建入口網站 。 使用您的 Apple ID 登入入口網站,然後選取 [ 標識符]。 然後選取 + 以註冊新的應用程式。

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

  2. 在 [ 註冊新的標識符 ] 畫面上,選取 [ 應用程式標識符 ] 單選按鈕。 然後選取 [ 繼續]

    iOS 佈建入口 註冊新識別碼的頁面

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

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

    • 套件 ID:請輸入格式為組織識別碼.產品名稱的套件 ID,如應用程式分發指南中所述。 [組織標識符] 和 [產品名稱] 值必須符合您在建立 Xcode 專案時所使用的組織識別碼和產品名稱。 在下列螢幕快照中 ,NotificationHubs 值會當做組織標識碼使用,而 GetStarted 值會當做產品名稱使用。 請確定套件 組合識別碼 值符合 Xcode 專案中的值,讓 Xcode 使用正確的發佈配置檔。

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

    • 推播通知:檢查 功能區段中的 推播通知 選項。

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

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

      確認新的應用程式識別碼

      選取 [註冊之後,您會在 [憑證]、[標識符 & 配置檔] 頁面中看到新的 [應用程式標識符] 作為明細專案。

  4. 憑證、標識符和配置檔案 頁面的 標識符 下,找出您剛才建立的應用程式 ID 項目,然後選取其列以顯示 編輯應用程式 ID 設定畫面。

建立通知中心的憑證

需要憑證,才能讓通知中樞使用 APNS。 這可以透過下列兩種方式之一來完成:

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

較新的方法有一些優點(相較於使用憑證),如APNS 令牌型 (HTTP/2) 驗證中所述。 不過,已針對這兩種方法提供步驟。

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

  1. 向下卷動至核取的 [推播通知 ] 選項,然後選取 [ 設定 ] 以建立憑證。

    編輯 App ID 頁面

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

    為 App ID 按鈕創建憑證

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

    備註

    本教學課程使用開發憑證。 註冊生產憑證時會使用相同的程式。 只要確定您在傳送通知時使用相同的憑證類型。

  3. 選取 [選擇檔案],瀏覽至您在第一個任務中儲存 CSR 檔案的位置,然後雙擊憑證名稱以載入它。 然後選取 [ 繼續]

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

    產生的憑證下載頁面

    憑證將下載並儲存在您的電腦 下載 資料夾中。

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

    備註

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

  5. 雙擊下載的推送憑證 aps_development.cer。 此動作會在 Keychain 中安裝新的憑證,如下圖所示:

    Keychain 存取憑證清單,其中顯示新的憑證

    備註

    雖然憑證中的名稱可能不同,但名稱前面會加上 Apple Development iOS Push Services

  6. 在 [金鑰鏈存取] 中,於 [憑證] 類別裡,以滑鼠右鍵點擊您建立的新推播憑證。 依序選取 [匯出]、命名檔案、選取 .p12 格式,然後選取 [ 儲存]。

    將憑證匯出為 p12 格式

    您可以選擇使用密碼保護憑證,但這是選擇性的。 如果您想要略過密碼建立,請按兩下 [ 確定 ]。 記下匯出之 .p12 憑證的檔名和位置。 它們可用來啟用與 APN 的驗證。

    備註

    您的 .p12 檔名和位置可能與本教學課程中所描繪的內容不同。

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

  1. 記下下列詳細資料:

    • 應用程式識別碼前置詞 (這是 小組識別碼
    • 套件組合標識碼
  2. 回到 [ 憑證]、[標識符和配置檔] 中,按兩下 [ 金鑰]。

    備註

    如果您已經有一把為 APNS 設定的金鑰,您可以重新使用在建立後立即下載的 .p8 憑證。 若是如此,您可以忽略步驟 35

  3. 單擊+按鈕(或建立金鑰按鈕)來建立新的金鑰。

  4. 提供適當的 金鑰名稱 值,然後選取 [Apple 推播通知服務(APNs)] 選項,接著按一下 [繼續],然後在下一個畫面上點擊 [註冊]。

  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-----
    

    備註

    這是 令牌值,稍後將用來設定 通知中樞

在這些步驟結束時,您應該有以下資訊,以供稍後在 設定通知中樞的 APNs 資訊

  • 小組識別碼 (請參閱步驟 1)
  • 套件組合識別碼 (請參閱步驟 1)
  • 金鑰識別碼 (請參閱步驟 7)
  • 令牌值 也就是 .p8 索引鍵值(請參閱步驟 8)

建立應用程式的配置檔案

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

  2. 選取 [開發] 下的 [iOS 應用程式開發] 作為布建配置檔類型,然後選取 [繼續]。

    布建配置檔清單

  3. 接下來,從 [應用程式標識符] 下拉式清單中選取您建立的應用程式標識符,然後選取 [繼續]。

    選取應用程式識別碼

  4. 在 [ 選取憑證] 視窗中,選取用於程式代碼簽署的開發憑證,然後選取 [ 繼續]。 此憑證不是您所建立的推送憑證。 若不存在,您必須建立它。 如果憑證存在,請跳至下一個步驟。 如果開發憑證不存在,若要建立開發憑證:

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

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

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

  8. 最後,在 布建配置檔名稱中選擇配置檔的名稱,然後選取 [產生]。

    選擇配置設定檔名稱

  9. 建立新的布建配置檔後,選取下載。 請記住其儲存位置。

  10. 請瀏覽到配置檔的位置,然後雙擊以將其安裝在您的 Xcode 開發機上。

建立通知中樞

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

  1. 登入 Azure 入口網站

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

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

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

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

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

    1. Notification Hub中輸入名稱。

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

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

    4. 資源群組中選取現有的資源群組,或為新的資源群組建立名稱。

    5. 選取 ,創建

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

  5. 選取 [通知 ] (鈴鐺圖示),然後選取 [移至資源]。 您也可以在 [通知樞紐頁面] 上重新整理清單,然後選取您的樞紐。

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

  6. 從清單中選取 [ 存取原則 ]。 請注意,這兩個 連接字串 可供您使用。 您稍後需要他們來處理推播通知。

    這很重要

    請勿 不要 應用程式中使用 DefaultFullSharedAccessSignature 原則。 這僅供後端使用。

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

使用 APNs 資訊來配置通知中樞

在 [通知服務] 下,選取 [Apple (APNS),然後根據您先前在 建立通知中樞憑證 一節中選擇的方法,遵循適當的步驟。

備註

只有當您想要將推播通知傳送給從市集購買您應用程式的使用者時,才使用 生產應用程式模式

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

  1. 選取憑證

  2. 選取檔案圖示。

  3. 選取您稍早導出的 .p12 檔案,然後選取 [ 開啟]。

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

  5. 選取 [沙箱] 模式。

    在 Azure 入口網站中設定 APNs 認證

  6. 請選擇儲存

選項 2:使用令牌型驗證

  1. 選擇 Token

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

    • 金鑰識別碼
    • 套件組合標識碼
    • 小組標識碼
    • 令牌
  3. 選擇 沙箱

  4. 請選擇儲存

您現在已使用APN設定通知中樞。 您也有用來註冊應用程式的連線字串,並傳送推送通知。

設定APNS的通知中樞

  1. 在您的 Mac 上,啟動 Keychain Access。 在左側導覽列的 [類別目錄]下,開啟 [我的憑證] 。 尋找您在上一節下載的 SSL 憑證,然後揭露其內容。 只選取憑證(請勿選取私鑰)。 然後 匯出它
  2. 在 Azure 入口網站的 中,選取 瀏覽所有>App Services。 然後選取您的行動應用程式的後端。
  3. 在 [設定]下,選取 [App Service 推送]。 然後選取您的通知中樞名稱。
  4. 移至 Apple Push Notification Services>上傳憑證。 上傳 .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] 底下,選取 [Live Services 網站]。 記下 套件 SID 的值,以及 Application Secret中的 當前 值。

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

    這很重要

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

設定 WNS 的通知中樞

  1. 在 Azure 入口網站的 中,選取 瀏覽所有>App Services。 然後選取您的行動應用程式的後端。 在 [設定]下,選取 [App Service 推送]。 然後選取您的通知中樞名稱。

  2. 移至 Windows(WNS)。 然後輸入您從 Live Services 網站取得 安全性密鑰(客戶端密碼)和 套件 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 檔案,並將 Toast 支援 設定為 ,位於 通知下。

  5. 建置應用程式並確認您沒有任何錯誤。 您的用戶端應用程式現在應該從Mobile Apps 後端註冊範本通知。 針對解決方案中的每個 Windows 項目重複本節。

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

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

後續步驟

您可以深入瞭解推播通知:

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