Bagikan melalui


Tutorial: Mengirim pemberitahuan push ke aplikasi React Native menggunakan Azure Notification Hubs melalui layanan backend

Unduh Sampel Unduh sampel

Dalam tutorial ini, Anda menggunakan Azure Notification Hubs untuk pemberitahuan push ke aplikasi React Native yang menargetkan Android dan iOS.

Backend ASP.NET Core Web API digunakan untuk menangani pendaftaran perangkat untuk klien menggunakan pendekatan Penginstalan terbaru dan terbaik. Layanan ini juga akan mengirim pemberitahuan push dengan cara lintas platform.

Operasi ini ditangani menggunakan SDK Notification Hubs untuk operasi backend. Detail lebih lanjut tentang pendekatan keseluruhan disediakan dalam dokumentasi Mendaftar dari backend aplikasi Anda.

Tutorial ini membawa Anda melalui langkah-langkah berikut:

Prasyarat

Untuk mengikutinya, Anda memerlukan:

  • Langganan Azure tempat Anda dapat membuat dan mengelola sumber daya.
  • Mac dengan Visual Studio for Mac terinstal (atau PC yang menjalankan Visual Studio 2019 dengan Mobile Development dengan beban kerja .NET).
  • Kemampuan untuk menjalankan aplikasi di Android (perangkat fisik atau emulator) atau iOS (hanya perangkat fisik).

Untuk Android, Anda harus memiliki:

  • Pengembang membuka kunci perangkat fisik atau emulator (menjalankan API 26 ke atas dengan Google Play Services terinstal).

Untuk iOS, Anda harus memiliki:

  • Akun Pengembang Apple aktif.
  • Perangkat iOS fisik yang terdaftar ke akun pengembang Anda(menjalankan iOS 13.0 ke atas).
  • Sertifikat pengembangan .p12 yang diinstal di rantai kunci memungkinkan Anda menjalankan aplikasi di perangkat fisik.

Nota

Simulator iOS tidak mendukung pemberitahuan jarak jauh sehingga perangkat fisik diperlukan saat menjelajahi sampel ini di iOS. Namun, Anda tidak perlu menjalankan aplikasi di Android dan iOS untuk menyelesaikan tutorial ini.

Anda dapat mengikuti langkah-langkah dalam contoh prinsip pertama ini tanpa pengalaman sebelumnya. Namun, Anda akan mendapat manfaat dari memiliki keakraban dengan aspek-aspek berikut.

Langkah-langkah yang disediakan adalah untuk Visual Studio untuk Mac dan Visual Studio Code tetapi dimungkinkan untuk mengikuti menggunakan Visual Studio 2019.

Menyiapkan Push Notification Services dan Azure Notification Hub

Di bagian ini, Anda menyiapkan Firebase Cloud Messaging (FCM) dan Apple Push Notification Services (APNS). Anda kemudian membuat dan mengonfigurasi hub pemberitahuan untuk bekerja dengan layanan tersebut.

Membuat proyek Firebase dan mengaktifkan Firebase Cloud Messaging untuk Android

  1. Masuk kekonsol Firebase . Buat proyek Firebase baru yang memasukkan PushDemo sebagai nama Proyek .

    Nota

    Nama unik akan dibuat untuk Anda. Secara default ini terdiri dari varian huruf kecil dari nama yang Anda berikan ditambah angka yang dihasilkan yang dipisahkan oleh tanda hubung. Anda dapat mengubah ini jika Anda ingin asalkan masih unik secara global.

  2. Setelah membuat proyek, pilih Tambahkan Firebase ke aplikasi Android anda.

    Tambahkan Firebase ke aplikasi Android Anda

  3. Di halaman Tambahkan Firebase ke aplikasi Android Anda, lakukan langkah-langkah berikut.

    1. Untuk nama paket Android, masukkan nama untuk paket Anda. Misalnya: com.<organization_identifier>.<package_name>.

      Tentukan nama paket

    2. Pilih Daftarkan aplikasi.

    3. Pilih Unduh google-services.json. Kemudian simpan file ke folder lokal untuk digunakan nanti dan pilih Berikutnya.

      Unduh google-services.json

    4. Pilih Berikutnya.

    5. Pilih Lanjutkan ke konsol

      Nota

      Jika tombol Lanjutkan ke konsol tidak diaktifkan, karena memverifikasi pemeriksaan penginstalan, pilih Lewati langkah ini.

  4. Di konsol Firebase, pilih cog untuk proyek Anda. Lalu pilih Pengaturan Proyek.

    Pilih Pengaturan Proyek

    Nota

    Jika Anda belum mengunduh file google-services.json, Anda dapat mengunduhnya di halaman ini.

  5. Beralih ke tab Cloud Messaging di bagian atas. Salin dan simpan kunci Server untuk digunakan nanti. Anda menggunakan nilai ini untuk mengonfigurasi hub pemberitahuan Anda.

    Menyalin kunci server

Mendaftarkan aplikasi iOS Anda untuk pemberitahuan push

Untuk mengirim pemberitahuan push ke app iOS, daftarkan aplikasi Anda dengan Apple, dan daftarkan juga pemberitahuan push.

  1. Jika Anda belum mendaftarkan aplikasi, telusuri portal provisi iOS di Pusat Pengembang Apple. Masuk ke portal dengan ID Apple Anda, navigasikan ke Sertifikat , Pengidentifikasi & Profil, lalu pilih Pengidentifikasi . Klik + untuk mendaftarkan aplikasi baru.

    halaman ID Aplikasi Portal Provisi iOS

  2. Pada layar Daftarkan Pengidentifikasi Baru, pilih tombol radio ID Aplikasi . Kemudian pilih Lanjutkan.

    portal provisi iOS mendaftarkan halaman ID baru

  3. Perbarui tiga nilai berikut untuk aplikasi baru Anda, lalu pilih Lanjutkan:

    • Deskripsi: Ketik nama deskriptif untuk aplikasi Anda.

    • ID Bundel: Masukkan ID Bundel formulir com.<organization_identifier>.<product_name> seperti yang disebutkan dalam Panduan Distribusi Aplikasi . Dalam cuplikan layar berikut, nilai mobcat digunakan sebagai pengidentifikasi organisasi dan nilai PushDemo digunakan sebagai nama produk.

      halaman ID aplikasi register iOS Provisioning Portal

    • Pemberitahuan Push: Periksa opsi Pemberitahuan Push di bagian Kemampuan .

      Formulir untuk mendaftarkan ID Aplikasi baru

      Tindakan ini menghasilkan ID Aplikasi dan permintaan yang Anda konfirmasi informasinya. Pilih Lanjutkan, lalu pilih Daftarkan untuk mengonfirmasi ID Aplikasi baru.

      Mengonfirmasi ID Aplikasi baru

      Setelah Anda memilih Daftarkan, Anda akan melihat ID Aplikasi baru sebagai item baris di halaman Sertifikat , Pengidentifikasi & Profil.

  4. Di halaman Sertifikat , Pengidentifikasi & Profil, di bawahPengidentifikasi , temukan item baris ID Aplikasi yang Anda buat. Kemudian, pilih barisnya untuk menampilkan layar Edit Konfigurasi ID Aplikasi Anda.

Membuat sertifikat untuk Notification Hubs

Sertifikat diperlukan untuk mengaktifkan hub pemberitahuan agar berfungsi dengan Apple Push Notification Services (APNS) dan dapat disediakan dengan salah satu dari dua cara:

  1. Membuat sertifikat push p12 yang dapat diunggah langsung ke Notification Hub (pendekatan asli)

  2. Membuat sertifikat p8 yang dapat digunakan untuk autentikasi berbasis token (pendekatan yang lebih baru dan direkomendasikan)

Pendekatan yang lebih baru memiliki sejumlah manfaat seperti yang didokumentasikan dalam autentikasi berbasis Token (HTTP/2) untuk APNS. Lebih sedikit langkah yang diperlukan tetapi juga diamanatkan untuk skenario tertentu. Namun, langkah-langkah telah disediakan untuk kedua pendekatan karena keduanya akan berfungsi untuk tujuan tutorial ini.

OPSI 1: Membuat sertifikat push p12 yang dapat diunggah langsung ke Notification Hub
  1. Di Mac Anda, jalankan alat Akses Rantai Kunci. Ini dapat dibuka dari folder Utilitas atau folder lain di Launchpad.

  2. PilihAkses Rantai Kunci , perluasAsisten Sertifikat , lalu pilih Minta Sertifikat dari Otoritas Sertifikat.

    Menggunakan Akses Rantai Kunci untuk meminta sertifikat baru

    Nota

    Secara default, Akses Rantai Kunci memilih item pertama dalam daftar. Ini bisa menjadi masalah jika Anda berada dalam kategori Sertifikat dan Otoritas Sertifikasi Hubungan Pengembang Seluruh Dunia Apple bukan item pertama dalam daftar. Pastikan Anda memiliki item non-kunci, atau kunci Otoritas Sertifikasi Hubungan Pengembang Di Seluruh Dunia Apple dipilih, sebelum membuat CSR (Permintaan Penandatanganan Sertifikat).

  3. PilihAlamat Email Pengguna Anda , masukkan nilai Nama Umum Anda, pastikan Anda menentukan Disimpan kedisk, lalu pilih Lanjutkan. Biarkan Alamat Email CA kosong karena tidak diperlukan.

    informasi sertifikat yang diharapkan

  4. Masukkan nama untuk file Permintaan Penandatanganan Sertifikat (CSR) di Simpan Sebagai, pilih lokasi di Tempat, lalu pilih Simpan.

    Pilih nama file untuk sertifikat

    Tindakan ini menyimpan file CSR di lokasi yang dipilih. Lokasi default adalahDesktop . Ingat lokasi yang dipilih untuk file.

  5. Kembali ke halaman Sertifikat, Pengidentifikasi & Profil diPortal Provisi iOS , gulir ke bawah ke opsi Pemberitahuan Push yang dicentang, lalu pilih Konfigurasikan untuk membuat sertifikat.

    Edit halaman ID Aplikasi

  6. Jendela layanan Pemberitahuan Push Apple TLS/SSL muncul. Pilih tombol Buat Sertifikat di bawah bagian Sertifikat TLS/SSL Pengembangan .

    tombol Buat sertifikat untuk ID Aplikasi

    Layar Buat Sertifikat baru ditampilkan.

    Nota

    Tutorial ini menggunakan sertifikat pengembangan. Proses yang sama digunakan saat mendaftarkan sertifikat produksi. Pastikan Anda menggunakan jenis sertifikat yang sama saat mengirim pemberitahuan.

  7. Pilih Pilih File, telusuri ke lokasi tempat Anda menyimpan file CSR , lalu klik dua kali nama sertifikat untuk memuatnya. Kemudian pilih Lanjutkan.

  8. Setelah portal membuat sertifikat, pilih tombol Unduh. Simpan sertifikat, dan ingat lokasi penyimpanannya.

    halaman unduhan sertifikat yang dihasilkan

    Sertifikat diunduh dan disimpan ke komputer Anda di folder Unduhan Anda.

    Temukan file sertifikat di folder Unduhan

    Nota

    Secara default, sertifikat pengembangan yang diunduh diberi nama aps_development.cer.

  9. Klik dua kali sertifikat push yang diunduh aps_development.cer. Tindakan ini menginstal sertifikat baru di Rantai Kunci, seperti yang ditunjukkan pada gambar berikut:

    Daftar sertifikat akses Rantai Kunci memperlihatkan sertifikat baru

    Nota

    Meskipun nama dalam sertifikat Anda mungkin berbeda, nama akan diawali dengan Apple Development iOS Push Services dan memiliki pengidentifikasi bundel yang sesuai yang terkait dengannya.

  10. Di Akses Rantai Kunci, KontrolKlik pada sertifikat push baru yang Anda buat di kategori Sertifikat . Pilih Ekspor, beri nama file, pilih format p12, lalu pilih Simpan.

    Ekspor sertifikat sebagai format p12

    Anda dapat memilih untuk melindungi sertifikat dengan kata sandi, tetapi kata sandi bersifat opsional. Klik OK jika Anda ingin melewati pembuatan kata sandi. Catat nama file dan lokasi sertifikat p12 yang diekspor. Mereka digunakan untuk mengaktifkan autentikasi dengan APN.

    Nota

    Nama dan lokasi file p12 Anda mungkin berbeda dari apa yang digambarkan dalam tutorial ini.

OPSI 2: Membuat sertifikat p8 yang dapat digunakan untuk autentikasi berbasis token
  1. Catat detail berikut:

    • Awalan ID Aplikasi (ID Tim)
    • ID Bundel
  2. Kembali ke Sertifikat , Pengidentifikasi & Profil, klik Kunci .

    Nota

    Jika Anda sudah memiliki kunci yang dikonfigurasi untuk APNS, Anda dapat menggunakan kembali sertifikat p8 yang Anda unduh tepat setelah dibuat. Jika demikian, Anda dapat mengabaikan langkah-langkah 3 melalui 5.

  3. Klik tombol + (atau tombol Buat kunci) untuk membuat kunci baru.

  4. Berikan nilai Nama Kunci yang sesuai, lalu periksa opsi layanan Pemberitahuan Push Apple (APNS) , lalu klik Lanjutkan, diikuti dengan Daftar di layar berikutnya.

  5. Klik Unduh lalu pindahkan file p8 (diawali dengan AuthKey_) ke direktori lokal yang aman, lalu klik Selesai.

    Nota

    Pastikan untuk menyimpan file p8 Anda di tempat yang aman (dan simpan cadangan). Setelah mengunduh kunci Anda, kunci tidak dapat diunduh ulang karena salinan server dihapus.

  6. Pada Keys, klik kunci yang Anda buat (atau kunci yang ada jika Anda telah memilih untuk menggunakannya).

  7. Catat nilai ID Kunci .

  8. Buka sertifikat p8 Anda dalam aplikasi pilihan Anda yang sesuai seperti Visual Studio Code. Catat nilai kunci (antara -----BEGIN PRIVATE KEY----- dan -----END PRIVATE KEY-----).

    KUNCI PRIVAT -----BEGIN-----
    <key_value>
    ----- KUNCI PRIVAT-----

    Nota

    Ini adalah nilai token yang akan digunakan nanti untuk mengonfigurasi Notification Hub.

Di akhir langkah-langkah ini, Anda harus memiliki informasi berikut untuk digunakan nanti di Mengonfigurasi hub pemberitahuan Anda dengan informasi APNS:

  • ID Tim (lihat langkah 1)
  • ID Bundel (lihat langkah 1)
  • ID Kunci (lihat langkah 7)
  • nilai Token (nilai kunci p8 yang diperoleh pada langkah 8)

Membuat profil provisi untuk aplikasi

  1. Kembali kePortal Provisi iOS , pilih Sertifikat , Pengidentifikasi & Profil, pilih profil dari menu kiri, lalu pilih untuk membuat profil baru. Layar Daftarkan Profil Provisi Baru muncul.

  2. Pilih Pengembangan Aplikasi iOS di bawah Pengembangan sebagai jenis profil provisi, lalu pilih Lanjutkan.

    daftar profil provisi

  3. Selanjutnya, pilih ID aplikasi yang Anda buat dari daftar drop-down ID Aplikasi, dan pilih Lanjutkan.

    Pilih ID Aplikasi

  4. Di jendela Pilih sertifikat, pilih sertifikat pengembangan yang Anda gunakan untuk penandatanganan kode, dan pilih Lanjutkan.

    Nota

    Sertifikat ini bukan sertifikat push yang Anda buat di langkah sebelumnya. Ini adalah sertifikat pengembangan Anda. Jika tidak ada, Anda harus membuatnya karena ini adalah prasyarat untuk tutorial ini. Sertifikat pengembang dapat dibuat diPortal Pengembang Apple , melalui Xcode atau di Visual Studio.

  5. Kembali ke halaman Sertifikat , Pengidentifikasi & Profil, pilih profil dari menu sebelah kiri, lalu pilih untuk membuat profil baru. Layar Daftarkan Profil Provisi Baru muncul.

  6. Di jendela Pilih sertifikat, pilih sertifikat pengembangan yang Anda buat. Kemudian pilih Lanjutkan.

  7. Selanjutnya, pilih perangkat yang akan digunakan untuk pengujian, dan pilih Lanjutkan.

  8. Terakhir, pilih nama untuk profil di Nama Profil Provisi, dan pilih Hasilkan.

    Pilih nama profil provisi

  9. Saat profil provisi baru dibuat, pilih Unduh. Ingat lokasi penyimpanannya.

  10. Telusuri ke lokasi profil provisi, lalu klik dua kali untuk menginstalnya di komputer pengembangan Anda.

Membuat Notification Hub

Di bagian ini, Anda membuat hub pemberitahuan dan mengonfigurasi autentikasi dengan APNS . Anda dapat menggunakan sertifikat pendorongan p12 atau autentikasi berbasis token. Jika Anda ingin menggunakan hub pemberitahuan yang telah Anda buat, Anda dapat melompat ke langkah 5.

  1. Masuk ke Azure.

  2. Klik Buat sumber daya, lalu cari dan pilih Notification Hub, lalu klik Buat.

  3. Perbarui bidang berikut, lalu klik Buat:

    DETAIL DASAR

    Langganan : Pilih Langganan target dari daftar drop-down
    Grup Sumber Daya : Membuat
    Grup Sumber Daya baru (atau memilih yang sudah ada)

    DETAIL NAMESPACE

    Namespace Notification Hub: Masukkan nama unik global untuk namespace Notification Hub

    Nota

    Pastikan opsi Buat baru dipilih untuk bidang ini.

    DETAIL HUB PEMBERITAHUAN

    Notification Hub: Masukkan nama untuk Notification Hub
    Lokasi: Pilih lokasi yang sesuai dari daftar drop-down
    Tingkat Harga : Pertahankan opsi Gratis default

    Nota

    Kecuali Anda telah mencapai jumlah maksimum hub pada tingkat gratis.

  4. Setelah Hub Pemberitahuan disediakan, navigasikan ke sumber daya tersebut.

  5. Navigasi keHub Pemberitahuan baru Anda.

  6. Pilih Kebijakan Akses dari daftar (di bawah KELOLA).

  7. Catat nilai Nama Kebijakan bersama dengan nilai String Koneksi yang sesuai.

Mengonfigurasi Notification Hub Anda dengan informasi APNS

Di bawahNotification Services , pilih Apple lalu ikuti langkah-langkah yang sesuai berdasarkan pendekatan yang Anda pilih sebelumnya di bagian Membuat Sertifikat untuk Notification Hubs.

Nota

Gunakan Produksi untuk Mode Aplikasi hanya jika Anda ingin mengirim pemberitahuan push kepada pengguna yang membeli aplikasi Anda dari toko.

OPSI 1: Menggunakan sertifikat push .p12

  1. PilihSertifikat .

  2. Pilih ikon file.

  3. Pilih file .p12 yang Anda ekspor sebelumnya, lalu pilih Buka.

  4. Jika perlu, tentukan kata sandi yang benar.

  5. Pilih mode Sandbox.

  6. Pilih Simpan.

OPSI 2: Menggunakan autentikasi berbasis token

  1. PilihToken .

  2. Masukkan nilai berikut yang Anda peroleh sebelumnya:

    • ID Kunci
    • ID Bundel
    • ID Tim
    • Token
  3. PilihSandbox .

  4. Pilih Simpan.

Mengonfigurasi hub pemberitahuan Anda dengan informasi FCM

  1. Pilih Google (GCM/FCM) di bagian Pengaturan di menu sebelah kiri.
  2. Masukkan kunci server Anda catat dariGoogle Firebase Console .
  3. Pilih Simpan pada toolbar.

Membuat aplikasi backend ASP.NET Core Web API

Di bagian ini, Anda membuat ASP.NET Core Web API backend untuk menangani pendaftaran perangkat dan pengiriman pemberitahuan ke aplikasi seluler React Native.

Membuat proyek web

  1. DiVisual Studio, pilih FileSolusi Baru.

  2. Pilih .NET Core>App>ASP.NET Core>API>Next.

  3. Dalam dialog Mengonfigurasi ASP.NET Core Web API baru Anda, pilih Kerangka Kerja Target .NET Core 3.1.

  4. Masukkan PushDemoApi untuk Nama Proyek lalu pilih Buat.

  5. Mulai penelusuran kesalahan (perintah + Masukkan) untuk menguji aplikasi yang di-template.

    Nota

    Aplikasi templat dikonfigurasi untuk menggunakan WeatherForecastController sebagai launchUrl. Ini diatur dalamlaunchSettings.jsonProperti .

    Jika Anda diminta dengan sertifikat pengembangan tidak valid yang ditemukan pesan:

    1. Klik Ya untuk menyetujui menjalankan alat 'dotnet dev-certs https' untuk memperbaikinya. Alat 'dotnet dev-certs https' kemudian meminta Anda untuk memasukkan kata sandi untuk sertifikat dan kata sandi untuk Rantai Kunci Anda.

    2. Klik Ya saat diminta untuk Menginstal dan mempercayai sertifikat baru, lalu masukkan kata sandi untuk Rantai Kunci Anda.

  6. Perluas folder Pengontrol , lalu hapus WeatherForecastController.cs.

  7. Hapus WeatherForecast.cs.

  8. Siapkan nilai konfigurasi lokal menggunakan alat Secret Manager. Memisahkan rahasia dari solusi memastikan bahwa rahasia tersebut tidak berakhir di kontrol sumber. Buka Terminal lalu buka direktori file proyek dan jalankan perintah berikut:

    dotnet user-secrets init
    dotnet user-secrets set "NotificationHub:Name" <value>
    dotnet user-secrets set "NotificationHub:ConnectionString" <value>
    

    Ganti nilai tempat penampung dengan nama hub pemberitahuan dan nilai string koneksi Anda sendiri. Anda mencatatnya di bagian membuat hub pemberitahuan. Jika tidak, Anda dapat mencarinya di Azure.

    NotificationHub:Name:
    Lihat Nama di ringkasan Essentials di bagian atasGambaran Umum .

    NotificationHub:ConnectionString:
    Lihat DefaultFullSharedAccessSignature dalam Kebijakan Akses

    Nota

    Untuk skenario produksi, Anda dapat melihat opsi seperti Azure KeyVault untuk menyimpan string koneksi dengan aman. Untuk kesederhanaan, rahasia akan ditambahkan ke pengaturan aplikasi Azure App Service .

Mengautentikasi klien menggunakan Kunci API (Opsional)

Kunci API tidak seaman token, tetapi cukup untuk tujuan tutorial ini. Kunci API dapat dikonfigurasi dengan mudah melalui ASP.NET Middleware.

  1. Tambahkan kunci API ke nilai konfigurasi lokal.

    dotnet user-secrets set "Authentication:ApiKey" <value>
    

    Nota

    Anda harus mengganti nilai tempat penampung dengan nilai Anda sendiri dan mencatatnya.

  2. ControlKlik pada proyek PushDemoApi, pilih Folder Baru dari menu Tambahkan, lalu klik Tambahkan menggunakan Autentikasi sebagai Nama Folder .

  3. KontrolKlik pada folder Autentikasi , lalu pilih File Baru... dari menu tambahkan .

  4. Pilih Kelas KosongUmum , masukkan ApiKeyAuthOptions.cs untukNama , lalu klik Baru menambahkan implementasi berikut.

    using Microsoft.AspNetCore.Authentication;
    
    namespace PushDemoApi.Authentication
    {
        public class ApiKeyAuthOptions : AuthenticationSchemeOptions
        {
            public const string DefaultScheme = "ApiKey";
            public string Scheme => DefaultScheme;
            public string ApiKey { get; set; }
        }
    }
    
  5. Tambahkan Kelas Kosong lain ke folder Autentikasi yang disebut ApiKeyAuthHandler.cs, lalu tambahkan implementasi berikut.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Security.Claims;
    using System.Text.Encodings.Web;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Authentication;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Options;
    
    namespace PushDemoApi.Authentication
    {
        public class ApiKeyAuthHandler : AuthenticationHandler<ApiKeyAuthOptions>
        {
            const string ApiKeyIdentifier = "apikey";
    
            public ApiKeyAuthHandler(
                IOptionsMonitor<ApiKeyAuthOptions> options,
                ILoggerFactory logger,
                UrlEncoder encoder,
                ISystemClock clock)
                : base(options, logger, encoder, clock) {}
    
            protected override Task<AuthenticateResult> HandleAuthenticateAsync()
            {
                string key = string.Empty;
    
                if (Request.Headers[ApiKeyIdentifier].Any())
                {
                    key = Request.Headers[ApiKeyIdentifier].FirstOrDefault();
                }
                else if (Request.Query.ContainsKey(ApiKeyIdentifier))
                {
                    if (Request.Query.TryGetValue(ApiKeyIdentifier, out var queryKey))
                        key = queryKey;
                }
    
                if (string.IsNullOrWhiteSpace(key))
                    return Task.FromResult(AuthenticateResult.Fail("No api key provided"));
    
                if (!string.Equals(key, Options.ApiKey, StringComparison.Ordinal))
                    return Task.FromResult(AuthenticateResult.Fail("Invalid api key."));
    
                var identities = new List<ClaimsIdentity> {
                    new ClaimsIdentity("ApiKeyIdentity")
                };
    
                var ticket = new AuthenticationTicket(
                    new ClaimsPrincipal(identities), Options.Scheme);
    
                return Task.FromResult(AuthenticateResult.Success(ticket));
            }
        }
    }
    

    Nota

    Handler Autentikasi adalah jenis yang mengimplementasikan perilaku skema, dalam hal ini skema Kunci API kustom.

  6. Tambahkan Kelas Kosong lain ke folder Autentikasi yang disebut ApiKeyAuthenticationBuilderExtensions.cs, lalu tambahkan implementasi berikut.

    using System;
    using Microsoft.AspNetCore.Authentication;
    
    namespace PushDemoApi.Authentication
    {
        public static class AuthenticationBuilderExtensions
        {
            public static AuthenticationBuilder AddApiKeyAuth(
                this AuthenticationBuilder builder,
                Action<ApiKeyAuthOptions> configureOptions)
            {
                return builder
                    .AddScheme<ApiKeyAuthOptions, ApiKeyAuthHandler>(
                        ApiKeyAuthOptions.DefaultScheme,
                        configureOptions);
            }
        }
    }
    

    Nota

    Metode ekstensi ini menyederhanakan kode konfigurasi middleware dalam Startup.cs membuatnya lebih mudah dibaca dan umumnya lebih mudah diikuti.

  7. Di Startup.cs, perbarui metode ConfigureServices untuk mengonfigurasi autentikasi Kunci API di bawah panggilan ke layanan . Metode AddControllers.

    using PushDemoApi.Authentication;
    using PushDemoApi.Models;
    using PushDemoApi.Services;
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = ApiKeyAuthOptions.DefaultScheme;
            options.DefaultChallengeScheme = ApiKeyAuthOptions.DefaultScheme;
        }).AddApiKeyAuth(Configuration.GetSection("Authentication").Bind);
    }
    
  8. Masih dalam Startup.cs, perbarui metode Konfigurasikan untuk memanggil metode ekstensi UseAuthentication dan UseAuthorization pada aplikasi IApplicationBuilder. Pastikan metode tersebut dipanggil setelah UseRouting dan sebelum aplikasi . UseEndpoints.

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseHttpsRedirection();
    
        app.UseRouting();
    
        app.UseAuthentication();
    
        app.UseAuthorization();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
    

    Nota

    Memanggil UseAuthentication mendaftarkan middleware yang menggunakan skema autentikasi yang terdaftar sebelumnya (dari ConfigureServices). Ini harus dipanggil sebelum middleware apa pun yang bergantung pada pengguna yang diautentikasi.

Menambahkan dependensi dan mengonfigurasi layanan

ASP.NET Core mendukung pola desain perangkat lunak injeksi dependensi (DI) , yang merupakan teknik untuk mencapai Inversion of Control (IoC) antara kelas dan dependensinya.

Penggunaan hub pemberitahuan dan SDK Notification Hubs untuk operasi backend dienkapsulasi dalam layanan. Layanan ini terdaftar dan tersedia melalui abstraksi yang sesuai.

  1. ControlKlik pada folder Dependensi , lalu pilih Kelola Paket NuGet....

  2. Cari Microsoft.Azure.NotificationHubs dan pastikan telah diperiksa.

  3. Klik Tambahkan Paket, lalu klik Terima saat diminta untuk menerima persyaratan lisensi.

  4. Control + Klik pada proyek PushDemoApi, pilih Folder Baru dari menu Tambahkan, lalu klik Tambahkan menggunakan Model sebagai Nama Folder .

  5. ControlKlik pada folder Model , lalu pilih File Baru... dari menu Tambahkan.

  6. PilihKelas KosongUmum , masukkan PushTemplates.cs untukNama , lalu klik Baru menambahkan implementasi berikut.

    namespace PushDemoApi.Models
    {
        public class PushTemplates
        {
            public class Generic
            {
                public const string Android = "{ \"notification\": { \"title\" : \"PushDemo\", \"body\" : \"$(alertMessage)\"}, \"data\" : { \"action\" : \"$(alertAction)\" } }";
                public const string iOS = "{ \"aps\" : {\"alert\" : \"$(alertMessage)\"}, \"action\" : \"$(alertAction)\" }";
            }
    
            public class Silent
            {
                public const string Android = "{ \"data\" : {\"message\" : \"$(alertMessage)\", \"action\" : \"$(alertAction)\"} }";
                public const string iOS = "{ \"aps\" : {\"content-available\" : 1, \"apns-priority\": 5, \"sound\" : \"\", \"badge\" : 0}, \"message\" : \"$(alertMessage)\", \"action\" : \"$(alertAction)\" }";
            }
        }
    }
    

    Nota

    Kelas ini berisi payload pemberitahuan yang ditokenisasi untuk pemberitahuan generik dan senyap yang diperlukan oleh skenario ini. Payload didefinisikan di luar Penginstalan untuk memungkinkan eksperimen tanpa harus memperbarui penginstalan yang ada melalui layanan. Menangani perubahan pada penginstalan dengan cara ini di luar cakupan untuk tutorial ini. Untuk produksi, pertimbangkan templat kustom .

  7. Tambahkan Kelas Kosong lain ke folder Model yang disebut DeviceInstallation.cs, lalu tambahkan implementasi berikut.

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace PushDemoApi.Models
    {
        public class DeviceInstallation
        {
            [Required]
            public string InstallationId { get; set; }
    
            [Required]
            public string Platform { get; set; }
    
            [Required]
            public string PushChannel { get; set; }
    
            public IList<string> Tags { get; set; } = Array.Empty<string>();
        }
    }
    
  8. Tambahkan Kelas Kosong lainnya ke folder Model yang disebut NotificationRequest.cs, lalu tambahkan implementasi berikut.

    using System;
    
    namespace PushDemoApi.Models
    {
        public class NotificationRequest
        {
            public string Text { get; set; }
            public string Action { get; set; }
            public string[] Tags { get; set; } = Array.Empty<string>();
            public bool Silent { get; set; }
        }
    }
    
  9. Tambahkan Kelas Kosong lain ke folder Model yang disebut NotificationHubOptions.cs, lalu tambahkan implementasi berikut.

    using System.ComponentModel.DataAnnotations;
    
    namespace PushDemoApi.Models
    {
        public class NotificationHubOptions
        {
            [Required]
            public string Name { get; set; }
    
            [Required]
            public string ConnectionString { get; set; }
        }
    }
    
  10. Tambahkan folder baru ke proyek PushDemoApi yang disebut Services.

  11. Tambahkan Antarmuka Kosong ke folder Layanan yang disebut INotificationService.cs, lalu tambahkan implementasi berikut.

    using System.Threading;
    using System.Threading.Tasks;
    using PushDemoApi.Models;
    
    namespace PushDemoApi.Services
    {
        public interface INotificationService
        {
            Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation, CancellationToken token);
            Task<bool> DeleteInstallationByIdAsync(string installationId, CancellationToken token);
            Task<bool> RequestNotificationAsync(NotificationRequest notificationRequest, CancellationToken token);
        }
    }
    
  12. Tambahkan Kelas Kosong ke folder Layanan yang disebut NotificationHubsService.cs, lalu tambahkan kode berikut untuk mengimplementasikan antarmuka INotificationService :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.Azure.NotificationHubs;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Options;
    using PushDemoApi.Models;
    
    namespace PushDemoApi.Services
    {
        public class NotificationHubService : INotificationService
        {
            readonly NotificationHubClient _hub;
            readonly Dictionary<string, NotificationPlatform> _installationPlatform;
            readonly ILogger<NotificationHubService> _logger;
    
            public NotificationHubService(IOptions<NotificationHubOptions> options, ILogger<NotificationHubService> logger)
            {
                _logger = logger;
                _hub = NotificationHubClient.CreateClientFromConnectionString(
                    options.Value.ConnectionString,
                    options.Value.Name);
    
                _installationPlatform = new Dictionary<string, NotificationPlatform>
                {
                    { nameof(NotificationPlatform.Apns).ToLower(), NotificationPlatform.Apns },
                    { nameof(NotificationPlatform.Fcm).ToLower(), NotificationPlatform.Fcm }
                };
            }
    
            public async Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation, CancellationToken token)
            {
                if (string.IsNullOrWhiteSpace(deviceInstallation?.InstallationId) ||
                    string.IsNullOrWhiteSpace(deviceInstallation?.Platform) ||
                    string.IsNullOrWhiteSpace(deviceInstallation?.PushChannel))
                    return false;
    
                var installation = new Installation()
                {
                    InstallationId = deviceInstallation.InstallationId,
                    PushChannel = deviceInstallation.PushChannel,
                    Tags = deviceInstallation.Tags
                };
    
                if (_installationPlatform.TryGetValue(deviceInstallation.Platform, out var platform))
                    installation.Platform = platform;
                else
                    return false;
    
                try
                {
                    await _hub.CreateOrUpdateInstallationAsync(installation, token);
                }
                catch
                {
                    return false;
                }
    
                return true;
            }
    
            public async Task<bool> DeleteInstallationByIdAsync(string installationId, CancellationToken token)
            {
                if (string.IsNullOrWhiteSpace(installationId))
                    return false;
    
                try
                {
                    await _hub.DeleteInstallationAsync(installationId, token);
                }
                catch
                {
                    return false;
                }
    
                return true;
            }
    
            public async Task<bool> RequestNotificationAsync(NotificationRequest notificationRequest, CancellationToken token)
            {
                if ((notificationRequest.Silent &&
                    string.IsNullOrWhiteSpace(notificationRequest?.Action)) ||
                    (!notificationRequest.Silent &&
                    (string.IsNullOrWhiteSpace(notificationRequest?.Text)) ||
                    string.IsNullOrWhiteSpace(notificationRequest?.Action)))
                    return false;
    
                var androidPushTemplate = notificationRequest.Silent ?
                    PushTemplates.Silent.Android :
                    PushTemplates.Generic.Android;
    
                var iOSPushTemplate = notificationRequest.Silent ?
                    PushTemplates.Silent.iOS :
                    PushTemplates.Generic.iOS;
    
                var androidPayload = PrepareNotificationPayload(
                    androidPushTemplate,
                    notificationRequest.Text,
                    notificationRequest.Action);
    
                var iOSPayload = PrepareNotificationPayload(
                    iOSPushTemplate,
                    notificationRequest.Text,
                    notificationRequest.Action);
    
                try
                {
                    if (notificationRequest.Tags.Length == 0)
                    {
                        // This will broadcast to all users registered in the notification hub
                        await SendPlatformNotificationsAsync(androidPayload, iOSPayload, token);
                    }
                    else if (notificationRequest.Tags.Length <= 20)
                    {
                        await SendPlatformNotificationsAsync(androidPayload, iOSPayload, notificationRequest.Tags, token);
                    }
                    else
                    {
                        var notificationTasks = notificationRequest.Tags
                            .Select((value, index) => (value, index))
                            .GroupBy(g => g.index / 20, i => i.value)
                            .Select(tags => SendPlatformNotificationsAsync(androidPayload, iOSPayload, tags, token));
    
                        await Task.WhenAll(notificationTasks);
                    }
    
                    return true;
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Unexpected error sending notification");
                    return false;
                }
            }
    
            string PrepareNotificationPayload(string template, string text, string action) => template
                .Replace("$(alertMessage)", text, StringComparison.InvariantCulture)
                .Replace("$(alertAction)", action, StringComparison.InvariantCulture);
    
            Task SendPlatformNotificationsAsync(string androidPayload, string iOSPayload, CancellationToken token)
            {
                var sendTasks = new Task[]
                {
                    _hub.SendFcmNativeNotificationAsync(androidPayload, token),
                    _hub.SendAppleNativeNotificationAsync(iOSPayload, token)
                };
    
                return Task.WhenAll(sendTasks);
            }
    
            Task SendPlatformNotificationsAsync(string androidPayload, string iOSPayload, IEnumerable<string> tags, CancellationToken token)
            {
                var sendTasks = new Task[]
                {
                    _hub.SendFcmNativeNotificationAsync(androidPayload, tags, token),
                    _hub.SendAppleNativeNotificationAsync(iOSPayload, tags, token)
                };
    
                return Task.WhenAll(sendTasks);
            }
        }
    }
    

    Nota

    Ekspresi tag yang disediakan untuk SendTemplateNotificationAsync dibatasi hingga 20 tag. Ini dibatasi hingga 6 untuk sebagian besar operator tetapi ekspresi hanya berisi OU (||) dalam kasus ini. Jika ada lebih dari 20 tag dalam permintaan, tag tersebut harus dibagi menjadi beberapa permintaan. Lihat dokumentasi Perutean dan Ekspresi Tag untuk detail selengkapnya.

  13. Di Startup.cs, perbarui metode ConfigureServices untuk menambahkan NotificationHubsService sebagai implementasi singleton INotificationService.

    
    using PushDemoApi.Models;
    using PushDemoApi.Services;
    
    public void ConfigureServices(IServiceCollection services)
    {
        ...
    
        services.AddSingleton<INotificationService, NotificationHubService>();
    
        services.AddOptions<NotificationHubOptions>()
            .Configure(Configuration.GetSection("NotificationHub").Bind)
            .ValidateDataAnnotations();
    }
    

Membuat API pemberitahuan

  1. KontrolKlik pada folder Pengontrol , lalu pilih File Baru... dari menu Tambahkan.

  2. Pilih ASP.NET CoreWeb API Controller Class, masukkan NotificationsController untukNama , lalu klik New.

    Nota

    Jika Anda mengikutiVisual Studio 2019 , pilih Pengontrol API dengan tindakan baca/tulis templat.

  3. Tambahkan namespace berikut ke bagian atas file.

    using System.ComponentModel.DataAnnotations;
    using System.Net;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using PushDemoApi.Models;
    using PushDemoApi.Services;
    
  4. Perbarui pengontrol templat sehingga berasal dari ControllerBase dan dihiasi dengan atribut ApiController .

    [ApiController]
    [Route("api/[controller]")]
    public class NotificationsController : ControllerBase
    {
        // Templated methods here
    }
    

    Nota

    Kelas dasar Controller menyediakan dukungan untuk tampilan tetapi ini tidak diperlukan dalam hal ini sehingga ControllerBase dapat digunakan sebagai gantinya. Jika Anda mengikutiVisual Studio 2019 , Anda dapat melewati langkah ini.

  5. Jika Anda memilih untuk menyelesaikan Mengautentikasi klien menggunakan bagian Kunci API, Anda juga harus menghias NotificationsController dengan atribut Otorisasi .

    [Authorize]
    
  6. Perbarui konstruktor untuk menerima instans terdaftar INotificationService sebagai argumen dan tetapkan ke anggota readonly.

    readonly INotificationService _notificationService;
    
    public NotificationsController(INotificationService notificationService)
    {
        _notificationService = notificationService;
    }
    
  7. Di launchSettings.json (dalam folder Properti ), ubah launchUrl dari menjadi api/pemberitahuan agar sesuai dengan URL yang ditentukan dalam atribut RegistrationsControllerRoute.

  8. Mulai penelusuran kesalahan (perintahMasukkan) untuk memvalidasi aplikasi bekerja dengan NotificationsController baru dan mengembalikan status tidak sah 401.

    Nota

    Visual Studio mungkin tidak secara otomatis meluncurkan aplikasi di browser. Anda akan menggunakan Postman untuk menguji API mulai saat ini.

  9. Pada tab Postman baru, atur permintaan ke GET. Masukkan alamat di bawah ini menggantikan tempat penampung <applicationUrl> dengan aplikasi httpsUrl ditemukan di properti >launchSettings.json.

    <applicationUrl>/api/notifications
    

    Nota

    applicationUrl harus 'https://localhost:5001' untuk profil default. Jika Anda menggunakan IIS (default di Visual Studio 2019 di Windows), Anda harus menggunakan aplikasi Url ditentukan dalam item iisSettings. Anda akan menerima respons 404 jika alamat salah.

  10. Jika Anda memilih untuk menyelesaikan Mengautentikasi klien menggunakan bagian Kunci API, pastikan untuk mengonfigurasi header permintaan untuk menyertakan nilai apikey Anda.

    Kunci Nilai
    apikey <your_api_key>
  11. Klik tombol Kirim .

    Nota

    Anda akan menerima status OK 200 dengan beberapa konten JSON .

    Jika Anda menerima peringatan verifikasi sertifikat SSL , Anda dapat mengalihkan permintaan verifikasi sertifikat SSL Postman dinonaktifkan di pengaturan .

  12. Ganti metode kelas templat di NotificationsController.cs dengan kode berikut.

    [HttpPut]
    [Route("installations")]
    [ProducesResponseType((int)HttpStatusCode.OK)]
    [ProducesResponseType((int)HttpStatusCode.BadRequest)]
    [ProducesResponseType((int)HttpStatusCode.UnprocessableEntity)]
    public async Task<IActionResult> UpdateInstallation(
        [Required]DeviceInstallation deviceInstallation)
    {
        var success = await _notificationService
            .CreateOrUpdateInstallationAsync(deviceInstallation, HttpContext.RequestAborted);
    
        if (!success)
            return new UnprocessableEntityResult();
    
        return new OkResult();
    }
    
    [HttpDelete()]
    [Route("installations/{installationId}")]
    [ProducesResponseType((int)HttpStatusCode.OK)]
    [ProducesResponseType((int)HttpStatusCode.BadRequest)]
    [ProducesResponseType((int)HttpStatusCode.UnprocessableEntity)]
    public async Task<ActionResult> DeleteInstallation(
        [Required][FromRoute]string installationId)
    {
        var success = await _notificationService
            .DeleteInstallationByIdAsync(installationId, CancellationToken.None);
    
        if (!success)
            return new UnprocessableEntityResult();
    
        return new OkResult();
    }
    
    [HttpPost]
    [Route("requests")]
    [ProducesResponseType((int)HttpStatusCode.OK)]
    [ProducesResponseType((int)HttpStatusCode.BadRequest)]
    [ProducesResponseType((int)HttpStatusCode.UnprocessableEntity)]
    public async Task<IActionResult> RequestPush(
        [Required]NotificationRequest notificationRequest)
    {
        if ((notificationRequest.Silent &&
            string.IsNullOrWhiteSpace(notificationRequest?.Action)) ||
            (!notificationRequest.Silent &&
            string.IsNullOrWhiteSpace(notificationRequest?.Text)))
            return new BadRequestResult();
    
        var success = await _notificationService
            .RequestNotificationAsync(notificationRequest, HttpContext.RequestAborted);
    
        if (!success)
            return new UnprocessableEntityResult();
    
        return new OkResult();
    }
    

Membuat aplikasi API

Anda sekarang membuat Aplikasi API di Azure App Service untuk menghosting layanan backend.

  1. Masuk ke portal Microsoft Azure .

  2. Klik Buatsumber daya, lalu cari dan pilihAplikasi API , lalu klik Buat.

  3. Perbarui bidang berikut, lalu klik Buat.

    Nama aplikasi:
    Masukkan nama unik global untuk Aplikasi API

    Langganan :
    Pilih target yang sama Langganan Anda membuat hub pemberitahuan.

    Grup Sumber Daya :
    Pilih Grup Sumber Daya yang sama Anda membuat hub pemberitahuan.

    Paket/Lokasi App Service:
    Membuat Paket App Service baru

    Nota

    Ubah dari opsi default ke paket yang menyertakan dukungan SSL . Jika tidak, Anda harus mengambil langkah-langkah yang sesuai saat bekerja dengan aplikasi seluler untuk mencegah permintaan http diblokir.

    Application Insights:
    Pertahankan opsi yang disarankan (sumber daya baru akan dibuat menggunakan nama tersebut) atau pilih sumber daya yang sudah ada.

  4. Setelah aplikasi API disediakan, navigasikan ke sumber daya tersebut.

  5. Catat properti URL di ringkasan Essentials di bagian atasGambaran Umum . URL ini adalah titik akhir backend Anda yang akan digunakan nanti dalam tutorial ini.

    Nota

    URL menggunakan nama aplikasi API yang Anda tentukan sebelumnya, dengan format https://<app_name>.azurewebsites.net.

  6. Pilih Konfigurasi dari daftar (di bawah pengaturan ).

  7. Untuk setiap pengaturan di bawah ini, klik Pengaturan aplikasi baru untuk memasukkan Nama danNilai , lalu klik OK.

    Nama Nilai
    Authentication:ApiKey <api_key_value>
    NotificationHub:Name <hub_name_value>
    NotificationHub:ConnectionString <hub_connection_string_value>

    Nota

    Ini adalah pengaturan yang sama dengan yang Anda tentukan sebelumnya di pengaturan pengguna. Anda harus dapat menyalin ini. Pengaturan Authentication:ApiKey diperlukan hanya jika Anda memilih untuk menyelesaikan klien Authenticate menggunakan bagian Kunci API. Untuk skenario produksi, Anda dapat melihat opsi seperti Azure KeyVault. Ini telah ditambahkan sebagai pengaturan aplikasi untuk kesederhanaan dalam hal ini.

  8. Setelah semua pengaturan aplikasi ditambahkan, klik Simpan, lalu Lanjutkan.

Menerbitkan layanan backend

Selanjutnya, Anda menyebarkan aplikasi ke Aplikasi API untuk membuatnya dapat diakses dari semua perangkat.

Nota

Langkah-langkah berikut khusus untuk Visual Studio untuk Mac. Jika Anda mengikuti Visual Studio 2019 di Windows, alur penerbitan akan berbeda. Lihat Terbitkan ke Azure App Service di Windows.

  1. Ubah konfigurasi Anda dari Debug menjadi Rilis jika Anda belum melakukannya.

  2. Control + KlikPushDemoApi project, lalu pilih Terbitkan ke Azure... dari menu Terbitkan.

  3. Ikuti alur autentikasi jika diminta untuk melakukannya. Gunakan akun yang Anda gunakan di sebelumnya untuk membuat bagian Aplikasi API.

  4. Pilih Aplikasi API Azure App Service yang Anda buat sebelumnya dari daftar sebagai target penerbitan Anda, lalu klik Terbitkan.

Setelah Anda menyelesaikan wizard, wizard menerbitkan aplikasi ke Azure lalu membuka aplikasi. Catat url jika Anda belum melakukannya. URL ini adalah titik akhir backend Anda yang digunakan nanti dalam tutorial ini.

Memvalidasi API yang diterbitkan

  1. Di Postman buka tab baru, atur permintaan ke PUT dan masukkan alamat di bawah ini. Ganti tempat penampung dengan alamat dasar yang Anda catat di bagian sebelumnya menerbitkan layanan backend.

    https://<app_name>.azurewebsites.net/api/notifications/installations
    

    Nota

    Alamat dasar harus dalam format https://<app_name>.azurewebsites.net/

  2. Jika Anda memilih untuk menyelesaikan Mengautentikasi klien menggunakan bagian Kunci API, pastikan untuk mengonfigurasi header permintaan untuk menyertakan nilai apikey Anda.

    Kunci Nilai
    apikey <your_api_key>
  3. Pilih opsi mentah untukIsi , lalu pilih JSON dari daftar opsi format, lalu sertakan beberapa tempat penampung konten JSON:

    {}
    
  4. Klik Kirim.

    Nota

    Anda harus menerima status UnprocessableEntity 422 dari layanan.

  5. Lakukan langkah 1-4 lagi tetapi kali ini menentukan titik akhir permintaan untuk memvalidasi Anda menerima respons 400 Permintaan Buruk.

    https://<app_name>.azurewebsites.net/api/notifications/requests
    

Nota

Belum dimungkinkan untuk menguji API menggunakan data permintaan yang valid karena ini akan memerlukan informasi khusus platform dari aplikasi seluler klien.

Membuat aplikasi React Native lintas platform

Di bagian ini, Anda membangun aplikasi seluler React Native yang menerapkan pemberitahuan push secara lintas platform.

Ini memungkinkan Anda untuk mendaftar dan membatalkan pendaftaran dari hub pemberitahuan melalui layanan backend yang Anda buat.

Pemberitahuan ditampilkan saat tindakan ditentukan dan aplikasi berada di latar depan. Jika tidak, pemberitahuan muncul di pusat pemberitahuan.

Nota

Anda biasanya akan melakukan tindakan pendaftaran (dan deregistrasi) selama titik yang sesuai dalam siklus hidup aplikasi (atau sebagai bagian dari pengalaman eksekusi pertama Anda mungkin) tanpa input pendaftaran/deregister pengguna eksplisit. Namun, contoh ini akan memerlukan input pengguna eksplisit untuk memungkinkan fungsionalitas ini dieksplorasi dan diuji dengan lebih mudah.

Membuat solusi React Native

  1. Di Terminal, perbarui alat lingkungan Anda, yang diperlukan untuk bekerja dengan React Native menggunakan perintah berikut:

    # install node
    brew install node
    # or update
    brew update node
    # install watchman
    brew install watchman
    # or update
    brew upgrade watchman
    # install cocoapods
    sudo gem install cocoapods
    
  2. Di Terminal, jalankan perintah berikut, jika Anda telah menginstal CLI React Native untuk menghapus instalannya. Gunakan npx untuk mengakses versi React Native CLI terbaru yang tersedia secara otomatis:

    npm uninstall -g react-native-cli
    

    Nota

    React Native memiliki antarmuka baris perintah bawaan. Daripada menginstal dan mengelola versi CLI tertentu secara global, kami sarankan Anda mengakses versi saat ini saat runtime menggunakan npx, yang dikirim dengan Node.js. Dengan npx react-native <command>, versi stabil CLI saat ini akan diunduh dan dijalankan pada saat perintah dijalankan.

  3. Navigasikan ke folder proyek tempat Anda ingin membuat aplikasi baru. Gunakan templat berbasis Typescript dengan menentukan parameter --template:

    # init new project with npx
    npx react-native init PushDemo --template react-native-template-typescript
    
  4. Jalankan server metro, yang membangun bundel JavaScript dan memantau pembaruan kode apa pun untuk merefresh bundel secara real time:

    cd PushDemo
    npx react-native start
    
  5. Jalankan aplikasi iOS untuk memverifikasi penyiapan. Pastikan Anda memulai simulator iOS atau menghubungkan perangkat iOS, sebelum menjalankan perintah berikut:

    npx react-native run-ios
    
  6. Jalankan aplikasi Android untuk memverifikasi penyiapan. Diperlukan beberapa langkah tambahan untuk mengonfigurasi emulator atau perangkat Android agar dapat mengakses server metro React Native. Perintah berikut menghasilkan bundel JavaScript awal untuk Android dan memasukkannya ke dalam folder aset.

    # create assets folder for the bundle
    mkdir android/app/scr/main/assets
    # build the bundle
    npx react-native bundle --platform android --dev true --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res
    # enable ability for sim to access the localhost
    adb reverse tcp:8081 tcp:8081
    

    Skrip ini akan disebarkan sebelumnya dengan versi awal aplikasi. Setelah disebarkan, konfigurasikan emulator atau perangkat Anda untuk mengakses server metro dengan menentukan alamat ip server. Jalankan perintah berikut untuk membangun dan menjalankan aplikasi Android:

    npx react-native run-android
    

    Setelah berada di aplikasi, tekan CMD+M (emulator) atau goyangkan perangkat untuk mengisi pengaturan pengembang, navigasikan ke Settings>Change Bundle Location, dan tentukan alamat ip server metro dengan port default: <metro-server-ip-address>:8081.

  7. Dalam file App.tsx, terapkan perubahan apa pun pada tata letak halaman, simpan dan buat perubahan secara otomatis tercermin di aplikasi iOS dan Android.

    Nota

    Panduan penyiapan lingkungan pengembangan terperinci tersedia dalam dokumentasi resmi

Menginstal paket yang diperlukan

Anda memerlukan tiga paket berikut agar sampel ini berfungsi:

  1. React Native Push Notifications iOS - Project GitHub

    Paket ini dibuat ketika PushNotificationIOS dibagi dari inti React Native. Paket ini secara asli mengimplementasikan pemberitahuan push untuk iOS dan menyediakan antarmuka React Native untuk mengaksesnya. Jalankan perintah berikut untuk menginstal paket:

    yarn add @react-native-community/push-notification-ios
    
  2. React Native Push Notifications Lintas platform

    Paket ini menerapkan pemberitahuan lokal dan jarak jauh di iOS dan Android dengan cara lintas platform. Jalankan perintah berikut untuk menginstal paket:

    yarn add react-native-push-notification
    
  3. Paket info perangkat Paket menyediakan informasi tentang perangkat dalam runtime. Gunakan untuk menentukan pengidentifikasi perangkat, yang digunakan untuk mendaftar untuk pemberitahuan push. Jalankan perintah berikut untuk menginstal paket:

    yarn add react-native-device-info
    

Menerapkan komponen lintas platform

  1. Buat dan terapkan DemoNotificationHandler:

    import PushNotification from 'react-native-push-notification';
    
    class DemoNotificationHandler {
      private _onRegister: any;
      private _onNotification: any;
    
      onNotification(notification: any) {
        console.log('NotificationHandler:', notification);
    
        if (typeof this._onNotification === 'function') {
          this._onNotification(notification);
        }
      }
    
      onRegister(token: any) {
        console.log('NotificationHandler:', token);
    
        if (typeof this._onRegister === 'function') {
          this._onRegister(token);
        }
      }
    
      attachTokenReceived(handler: any) {
        this._onRegister = handler;
      }
    
      attachNotificationReceived(handler: any) {
        this._onNotification = handler;
      }
    }
    
    const handler = new DemoNotificationHandler();
    
    PushNotification.configure({
      onRegister: handler.onRegister.bind(handler),
      onNotification: handler.onNotification.bind(handler),
      permissions: {
        alert: true,
        badge: true,
        sound: true,
      },
      popInitialNotification: true,
      requestPermissions: true,
    });
    
    export default handler;
    
  2. Buat dan terapkan DemoNotificationService:

    import PushNotification from 'react-native-push-notification';
    import DemoNotificationHandler from './DemoNotificationHandler';
    
    export default class DemoNotificationService {
      constructor(onTokenReceived: any, onNotificationReceived: any) {
        DemoNotificationHandler.attachTokenReceived(onTokenReceived);
        DemoNotificationHandler.attachNotificationReceived(onNotificationReceived);
        PushNotification.getApplicationIconBadgeNumber(function(number: number) {
          if(number > 0) {
            PushNotification.setApplicationIconBadgeNumber(0);
          }
        });
      }
    
      checkPermissions(cbk: any) {
        return PushNotification.checkPermissions(cbk);
      }
    
      requestPermissions() {
        return PushNotification.requestPermissions();
      }
    
      cancelNotifications() {
        PushNotification.cancelLocalNotifications();
      }
    
      cancelAll() {
        PushNotification.cancelAllLocalNotifications();
      }
    
      abandonPermissions() {
        PushNotification.abandonPermissions();
      }
    }
    
  3. Buat dan terapkan DemoNotificationRegistrationService:

    export default class DemoNotificationService {
        constructor(
            readonly apiUrl: string,
            readonly apiKey: string) {
        }
    
    async registerAsync(request: any): Promise<Response> {
            const method = 'PUT';
            const registerApiUrl = `${this.apiUrl}/notifications/installations`;
            const result = await fetch(registerApiUrl, {
                method: method,
                headers: {
                    Accept: 'application/json',
                    'Content-Type': 'application/json',
                    'apiKey': this.apiKey
                },
                body: JSON.stringify(request)
            });
    
            this.validateResponse(registerApiUrl, method, request, result);
            return result;
        }
    
        async deregisterAsync(deviceId: string): Promise<Response> {
            const method = 'DELETE';
            const deregisterApiUrl = `${this.apiUrl}/notifications/installations/${deviceId}`;
            const result = await fetch(deregisterApiUrl, {
                method: method,
                headers: {
                    Accept: 'application/json',
                    'Content-Type': 'application/json',
                    'apiKey': this.apiKey
                }
            });
    
            this.validateResponse(deregisterApiUrl, method, null, result);
            return result;
        }
    
        private validateResponse(requestUrl: string, method: string, requestPayload: any, response: Response) {
            console.log(`Request: ${method} ${requestUrl} => ${JSON.stringify(requestPayload)}\nResponse: ${response.status}`);
            if (!response || response.status != 200) {
                throw `HTTP error ${response.status}: ${response.statusText}`;
            }
        }
    }
    
  4. Konfigurasikan aplikasi. Buka package.json dan tambahkan definisi skrip berikut:

    "configure": "cp .app.config.tsx src/config/AppConfig.tsx"
    

    Kemudian jalankan skrip ini, yang akan menyalin konfigurasi default ke folder config.

    yarn configure
    

    Langkah terakhir adalah memperbarui file konfigurasi yang disalin pada langkah sebelumnya dengan informasi akses API. Tentukan parameter apiKey dan apiUrl:

    module.exports = {
        appName: "PushDemo",
        env: "production",
        apiUrl: "https://<azure-push-notifications-api-url>/api/",
        apiKey: "<api-auth-key>",
    };
    

Menerapkan UI lintas platform

  1. Tentukan tata letak halaman

    <View style={styles.container}>
      {this.state.isBusy &&
        <ActivityIndicator></ActivityIndicator>
      }
      <View style={styles.button}>
        <Button title="Register" onPress={this.onRegisterButtonPress.bind(this)} disabled={this.state.isBusy} />
      </View>
      <View style={styles.button}>
        <Button title="Deregister" onPress={this.onDeregisterButtonPress.bind(this)} disabled={this.state.isBusy} />
      </View>
    </View>
    
  2. Terapkan gaya

    const styles = StyleSheet.create({
      container: {
        flex: 1,
        alignItems: "center",
        justifyContent: 'flex-end',
        margin: 50,
      },
      button: {
        margin: 5,
        width: "100%",
      }
    });
    
  3. Menginisialisasi komponen halaman

      state: IState;
      notificationService: DemoNotificationService;
      notificationRegistrationService: DemoNotificationRegistrationService;
      deviceId: string;
    
      constructor(props: any) {
        super(props);
        this.deviceId = DeviceInfo.getUniqueId();
        this.state = {
          status: "Push notifications registration status is unknown",
          registeredOS: "",
          registeredToken: "",
          isRegistered: false,
          isBusy: false,
        };
    
        this.notificationService = new DemoNotificationService(
          this.onTokenReceived.bind(this),
          this.onNotificationReceived.bind(this),
        );
    
        this.notificationRegistrationService = new DemoNotificationRegistrationService(
          Config.apiUrl,
          Config.apiKey,
        );
      }
    
  4. Tentukan penangan klik tombol

      async onRegisterButtonPress() {
        if (!this.state.registeredToken || !this.state.registeredOS) {
          Alert.alert("The push notifications token wasn't received.");
          return;
        }
    
        let status: string = "Registering...";
        let isRegistered = this.state.isRegistered;
        try {
          this.setState({ isBusy: true, status });
          const pnPlatform = this.state.registeredOS == "ios" ? "apns" : "fcm";
          const pnToken = this.state.registeredToken;
          const request = {
            installationId: this.deviceId,
            platform: pnPlatform,
            pushChannel: pnToken,
            tags: []
          };
          const response = await this.notificationRegistrationService.registerAsync(request);
          status = `Registered for ${this.state.registeredOS} push notifications`;
          isRegistered = true;
        } catch (e) {
          status = `Registration failed: ${e}`;
        }
        finally {
          this.setState({ isBusy: false, status, isRegistered });
        }
      }
    
      async onDeregisterButtonPress() {
        if (!this.notificationService)
          return;
    
        let status: string = "Deregistering...";
        let isRegistered = this.state.isRegistered;
        try {
          this.setState({ isBusy: true, status });
          await this.notificationRegistrationService.deregisterAsync(this.deviceId);
          status = "Deregistered from push notifications";
          isRegistered = false;
        } catch (e) {
          status = `Deregistration failed: ${e}`;
        }
        finally {
          this.setState({ isBusy: false, status, isRegistered });
        }
      }
    
  5. Menangani pendaftaran token yang diterima dan pemberitahuan push

      onTokenReceived(token: any) {
        console.log(`Received a notification token on ${token.os}`);
        this.setState({ registeredToken: token.token, registeredOS: token.os, status: `The push notifications token has been received.` });
    
        if (this.state.isRegistered && this.state.registeredToken && this.state.registeredOS) {
          this.onRegisterButtonPress();
        }
      }
    
      onNotificationReceived(notification: any) {
        console.log(`Received a push notification on ${this.state.registeredOS}`);
        this.setState({ status: `Received a push notification...` });
    
        if (notification.data.message) {
          Alert.alert(AppConfig.appName, `${notification.data.action} action received`);
        }
      }
    };
    

Mengonfigurasi proyek Android asli untuk pemberitahuan push

Mengonfigurasi paket Android yang diperlukan

Paket ini secara otomatis ditautkan saat membangun aplikasi. Anda memiliki beberapa langkah tambahan di bawah ini untuk menyelesaikan proses konfigurasi.

Mengonfigurasi manifes Android

Di "android/app/src/main/AndroidManifest.xml", verifikasi nama paket, izin, dan layanan yang diperlukan. Pastikan Anda mendaftarkan penerima RNPushNotificationPublisher dan RNPushNotificationBootEventReceiver, dan mendaftarkan layanan RNPushNotificationListenerService. Metadata pemberitahuan dapat digunakan untuk menyesuaikan tampilan pemberitahuan push Anda.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="YOUR_PACKAGE_NAME">

      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.WAKE_LOCK" />
      <uses-permission android:name="android.permission.VIBRATE" />
      <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

      <application
        android:name=".MainApplication"
        android:label="@string/app_name"
        android:usesCleartextTraffic="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:allowBackup="false"
        android:theme="@style/AppTheme">

        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_channel_name"
                    android:value="PushDemo Channel"/>
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_channel_description"
                    android:value="PushDemo Channel Description"/>
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_foreground"
                    android:value="true"/>
        <meta-data  android:name="com.dieam.reactnativepushnotification.notification_color"
                    android:resource="@android:color/white"/>

        <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationPublisher" />
        <receiver android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationBootEventReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <service
            android:name="com.dieam.reactnativepushnotification.modules.RNPushNotificationListenerService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>

        <activity
          android:name=".MainActivity"
          android:label="@string/app_name"
          android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
          android:launchMode="singleTask"
          android:windowSoftInputMode="adjustResize">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
        </activity>
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
      </application>

</manifest>

Mengonfigurasi layanan Google

Di "android/app/build.gradle" daftarkan Google Services:

dependencies {
  ...
  implementation 'com.google.firebase:firebase-analytics:17.3.0'
  ...
}

apply plugin: 'com.google.gms.google-services'

Salin file "google-services.json" yang Anda unduh selama penyiapan FCM ke folder proyek "android/app/".

Menangani pemberitahuan push untuk Android

Anda mengonfigurasi layanan RNPushNotificationListenerService yang ada untuk menangani pemberitahuan push Android yang masuk. Layanan ini terdaftar sebelumnya dalam manifes aplikasi. Ini memproses pemberitahuan masuk dan memproksinya ke bagian React Native lintas platform. Tidak ada langkah tambahan yang diperlukan.

Mengonfigurasi proyek iOS asli untuk pemberitahuan push

Mengonfigurasi paket iOS yang diperlukan

Paket ini secara otomatis ditautkan saat membangun aplikasi. Yang perlu Anda lakukan adalah menginstal pod asli:

npx pod-install

Mengonfigurasi Info.plist dan Entitlements.plist

  1. Buka folder "PushDemo/ios" Anda dan buka ruang kerja "PushDemo.xcworkspace", pilih proyek teratas "PushDemo" dan pilih tab "Kemampuan & Penandatanganan".

  2. Perbarui Pengidentifikasi Bundel agar sesuai dengan nilai yang digunakan dalam profil provisi.

  3. Tambahkan dua Kemampuan baru menggunakan tombol - "+":

    • Kemampuan Mode Latar Belakang dan centang Pemberitahuan Jarak Jauh.
    • Kemampuan Pemberitahuan Push

Menangani pemberitahuan push untuk iOS

  1. Buka "AppDelegate.h" dan tambahkan impor berikut:

    #import <UserNotifications/UNUserNotificationCenter.h>
    
  2. Perbarui daftar protokol, didukung oleh "AppDelegate", dengan menambahkan UNUserNotificationCenterDelegate:

    @interface AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeDelegate, UNUserNotificationCenterDelegate>
    
  3. Buka "AppDelegate.m" dan konfigurasikan semua panggilan balik iOS yang diperlukan:

    #import <UserNotifications/UserNotifications.h>
    #import <RNCPushNotificationIOS.h>
    
    ...
    
    // Required to register for notifications
    - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
    {
     [RNCPushNotificationIOS didRegisterUserNotificationSettings:notificationSettings];
    }
    
    // Required for the register event.
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
     [RNCPushNotificationIOS didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
    }
    
    // Required for the notification event. You must call the completion handler after handling the remote notification.
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
      [RNCPushNotificationIOS didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
    }
    
    // Required for the registrationError event.
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    {
     [RNCPushNotificationIOS didFailToRegisterForRemoteNotificationsWithError:error];
    }
    
    // IOS 10+ Required for localNotification event
    - (void)userNotificationCenter:(UNUserNotificationCenter *)center
    didReceiveNotificationResponse:(UNNotificationResponse *)response
             withCompletionHandler:(void (^)(void))completionHandler
    {
      [RNCPushNotificationIOS didReceiveNotificationResponse:response];
      completionHandler();
    }
    
    // IOS 4-10 Required for the localNotification event.
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
     [RNCPushNotificationIOS didReceiveLocalNotification:notification];
    }
    
    //Called when a notification is delivered to a foreground app.
    -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
    {
      completionHandler(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge);
    }
    

Menguji solusi

Anda sekarang dapat menguji pengiriman pemberitahuan melalui layanan backend.

Mengirim pemberitahuan pengujian

  1. Buka tab baru di Postman.

  2. Atur permintaan ke POST, dan masukkan alamat berikut:

    https://<app_name>.azurewebsites.net/api/notifications/requests
    
  3. Jika Anda memilih untuk menyelesaikan Mengautentikasi klien menggunakan bagian Kunci API, pastikan untuk mengonfigurasi header permintaan untuk menyertakan nilai apikey Anda.

    Kunci Nilai
    apikey <your_api_key>
  4. Pilih opsi mentah untukIsi , lalu pilih JSON dari daftar opsi format, lalu sertakan beberapa tempat penampung konten JSON:

    {
        "text": "Message from Postman!",
        "action": "action_a"
    }
    
  5. Pilih tombol Kode , yang berada di bawah tombol Simpan di kanan atas jendela. Permintaan akan terlihat mirip dengan contoh berikut saat ditampilkan untuk HTML (tergantung pada apakah Anda menyertakan header apikey ):

    POST /api/notifications/requests HTTP/1.1
    Host: https://<app_name>.azurewebsites.net
    apikey: <your_api_key>
    Content-Type: application/json
    
    {
        "text": "Message from backend service",
        "action": "action_a"
    }
    
  6. Jalankan aplikasi PushDemo pada satu atau kedua platform target (Android dan iOS ).

    Nota

    Jika Anda menguji di Android memastikan bahwa Anda tidak berjalan di Debug, atau jika aplikasi telah disebarkan dengan menjalankan aplikasi, tutup paksa aplikasi dan mulai lagi dari peluncur.

  7. Di aplikasi PushDemo, ketuk tombol Daftarkan.

  8. Kembali kePostman , tutup jendela Generate Code Snippets (jika Anda belum melakukannya) lalu klik tombol Kirim.

  9. Validasi bahwa Anda mendapatkan respons 200 OK di Postman dan pemberitahuan muncul di aplikasi yang menunjukkan tindakan ActionA yang diterima.

  10. Tutup aplikasi PushDemo, lalu klik tombol Kirim lagi diPostman .

  11. Validasi bahwa Anda mendapatkan respons 200 OK di Postman lagi. Validasi bahwa pemberitahuan muncul di area pemberitahuan untuk aplikasi PushDemo dengan pesan yang benar.

  12. Ketuk pemberitahuan untuk mengonfirmasi bahwa aplikasi membuka dan menampilkan tindakan ActionA yang diterima pemberitahuan.

  13. Kembali kePostman , ubah isi permintaan sebelumnya untuk mengirim pemberitahuan senyap yang menentukan action_b alih-alih action_a untuk tindakan nilai.

    {
        "action": "action_b",
        "silent": true
    }
    
  14. Dengan aplikasi masih terbuka, klik tombol Kirim di Postman.

  15. Validasi bahwa Anda mendapatkan respons 200 OK di Postman dan bahwa pemberitahuan muncul di aplikasi yang menunjukkan tindakan TindakanB yang diterima alih-alih tindakan ActionA diterima.

  16. Tutup aplikasi PushDemo, lalu klik tombol Kirim lagi diPostman .

  17. Validasi bahwa Anda mendapatkan respons 200 OK di Postman dan bahwa pemberitahuan senyap tidak muncul di area pemberitahuan.

Pemecahan masalah

Tidak ada respons dari layanan backend

Saat menguji secara lokal, pastikan bahwa layanan backend berjalan dan menggunakan port yang benar.

Jika pengujian terhadapAplikasi Azure API , periksa layanan berjalan dan telah disebarkan dan telah dimulai tanpa kesalahan.

Pastikan untuk memeriksa bahwa Anda telah menentukan alamat dasar dengan benar di Postman atau dalam konfigurasi aplikasi seluler saat menguji melalui klien. Alamat dasar harus secara indikatif https://<api_name>.azurewebsites.net/ atau https://localhost:5001/ saat pengujian secara lokal.

Tidak menerima pemberitahuan di Android setelah memulai atau menghentikan sesi debug

Pastikan Anda mendaftar lagi setelah memulai atau menghentikan sesi debug. Debugger akan menyebabkan token Firebase baru dibuat. Penginstalan hub pemberitahuan juga harus diperbarui.

Menerima kode status 401 dari layanan backend

Validasi bahwa Anda mengatur apikey header permintaan dan nilai ini cocok dengan yang telah Anda konfigurasi untuk layanan backend.

Jika Anda menerima kesalahan ini saat menguji secara lokal, pastikan nilai kunci yang Anda tentukan dalam konfigurasi klien, cocok dengan nilai Autentikasi :ApiKey pengaturan pengguna yang digunakan oleh API .

Jika Anda menguji denganAplikasi API , pastikan nilai kunci dalam file konfigurasi klien cocok dengan pengaturan aplikasi Authentication:ApiKey yang Anda gunakan di aplikasi API .

Nota

Jika Anda telah membuat atau mengubah pengaturan ini setelah Anda menyebarkan layanan backend, maka Anda harus memulai ulang layanan agar berlaku.

Jika Anda memilih untuk tidak menyelesaikan Mengautentikasi klien menggunakan bagian Kunci API, pastikan Anda tidak menerapkan atribut Otorisasi ke kelas NotificationsController.

Menerima kode status 404 dari layanan backend

Validasi bahwa titik akhir dan metode permintaan HTTP sudah benar. Misalnya, titik akhir harus secara indikatif:

  • [PUT]
  • [HAPUS]https://<api_name>.azurewebsites.net/api/notifications/installations/<installation_id>
  • [POST]https://<api_name>.azurewebsites.net/api/notifications/requests

Atau saat menguji secara lokal:

  • [PUT]
  • [HAPUS]https://localhost:5001/api/notifications/installations/<installation_id>
  • [POST]https://localhost:5001/api/notifications/requests

Saat menentukan alamat dasar di aplikasi klien, pastikan alamat tersebut berakhir dengan /. Alamat dasar harus secara indikatif https://<api_name>.azurewebsites.net/ atau https://localhost:5001/ saat pengujian secara lokal.

Tidak dapat mendaftar dan pesan kesalahan hub pemberitahuan ditampilkan

Verifikasi bahwa perangkat pengujian memiliki konektivitas jaringan. Kemudian, tentukan kode status respons Http dengan mengatur titik henti untuk memeriksa nilai properti StatusCode di HttpResponse.

Tinjau saran pemecahan masalah sebelumnya jika berlaku berdasarkan kode status.

Atur titik henti pada baris yang mengembalikan kode status khusus ini untuk API masing-masing. Kemudian coba panggil layanan backend saat menelusuri kesalahan secara lokal.

Validasi layanan backend berfungsi seperti yang diharapkan melalui Postman menggunakan payload yang sesuai. Gunakan payload aktual yang dibuat oleh kode klien untuk platform yang dimaksud.

Tinjau bagian konfigurasi khusus platform untuk memastikan bahwa tidak ada langkah yang terlewatkan. Periksa apakah nilai yang sesuai sedang diselesaikan untuk variabel installation id dan token untuk platform yang sesuai.

Tidak dapat mengatasi ID untuk pesan kesalahan perangkat ditampilkan

Tinjau bagian konfigurasi khusus platform untuk memastikan bahwa tidak ada langkah yang terlewatkan.

Langkah berikutnya

Anda sekarang harus memiliki aplikasi React Native dasar yang terhubung ke hub pemberitahuan melalui layanan backend dan dapat mengirim dan menerima pemberitahuan.

Anda mungkin perlu menyesuaikan contoh yang digunakan dalam tutorial ini agar sesuai dengan skenario Anda sendiri. Menerapkan penanganan kesalahan yang lebih kuat, logika coba lagi, dan pengelogan juga disarankan.

Visual Studio App Center dapat dengan cepat dimasukkan ke dalam aplikasi seluler yang menyediakan analitik dan diagnostik untuk membantu pemecahan masalah.