Öğretici: Arka uç hizmeti aracılığıyla Azure Notification Hubs kullanarak Xamarin.Forms uygulamalarına anında iletme bildirimleri gönderme

Örnek İndir Örneği indirme

Bu öğreticide, Android ve iOS'u hedefleyen bir Xamarin.Forms uygulamasına anında iletme bildirimleri göndermek için Azure Notification Hubs'ı kullanacaksınız.

ASP.NET Core Web API'sinin arka ucu, en son ve en iyi Yükleme yaklaşımı kullanılarak istemcinin cihaz kaydını işlemek için kullanılır. Hizmet ayrıca platformlar arası bir şekilde anında iletme bildirimleri gönderir.

Bu işlemler , arka uç işlemleri için Notification Hubs SDK'sı kullanılarak işlenir. Genel yaklaşım hakkında daha fazla ayrıntı , Uygulama arka ucunuzdan kaydolma belgelerinde sağlanır.

Bu öğreticide aşağıdaki adımlar izlenir:

Önkoşullar

Birlikte ilerlemek için şunlar gerekir:

  • Kaynakları oluşturabileceğiniz ve yönetebileceğiniz bir Azure aboneliği .
  • Mac için Visual Studio yüklü bir Mac veya Visual Studio 2019 çalıştıran bir bilgisayar.
  • Visual Studio 2019 kullanıcılarının .NET ve ASP.NET ileweb geliştirme iş yükleri yüklü mobil geliştirme de olmalıdır.
  • Uygulamayı Android (fiziksel veya öykünücü cihazları) veya iOS (yalnızca fiziksel cihazlar) üzerinde çalıştırma özelliği.

Android için sahip olmanız gerekenler:

  • Geliştiricinin kilidini açan fiziksel cihaz veya öykünücü (Google Play Hizmetleri yüklü api 26 ve üzerini çalıştırıyor).

iOS için sahip olmanız gerekenler:

Not

iOS Simülatörü uzaktan bildirimleri desteklemez ve bu nedenle iOS'ta bu örneği keşfederken fiziksel bir cihaz gerekir. Ancak, bu öğreticiyi tamamlamak için uygulamayı hem Android hem de iOS'ta çalıştırmanız gerekmez.

Bu ilk ilkeler örneğindeki adımları daha önce hiç deneyim olmadan izleyebilirsiniz. Ancak, aşağıdaki yönlerden bilgi sahibi olmanın avantajından yararlanabilirsiniz.

Önemli

Sağlanan adımlar Mac için Visual Studio özeldir. Visual Studio 2019'u kullanarak takip etmek mümkündür, ancak bazı farklılıklar olabilir. Örneğin, kullanıcı arabirimi ve iş akışlarının açıklamaları, şablon adları, ortam yapılandırması vb.

Anında İletme Bildirimi Hizmetleri'ni ve Azure Notification Hub'ı ayarlama

Bu bölümde Firebase Cloud Messaging (FCM) ve Apple Anında İletme Bildirimi Hizmetleri'ni (APNS) ayarlamış olacaksınız. Ardından bu hizmetlerle çalışmak için bir bildirim hub'ı oluşturup yapılandırabilirsiniz.

Firebase projesi oluşturma ve Android için Firebase Cloud Messaging'i etkinleştirme

  1. Firebase konsolunda oturum açın. Proje adı olarak PushDemo'yu girerek yeni bir Firebase projesi oluşturun.

    Not

    Sizin için benzersiz bir ad oluşturulur. Varsayılan olarak bu değer, sağladığınız adın küçük harfli bir varyantının yanı sıra tireyle ayrılmış olarak oluşturulan bir sayıdan oluşur. Yine de genel olarak benzersiz olması koşuluyla bunu değiştirebilirsiniz.

  2. Projenizi oluşturduktan sonra Android uygulamanıza Firebase Ekle'yi seçin.

    Android uygulamanıza Firebase ekleme

  3. Android uygulamanıza Firebase ekle sayfasında aşağıdaki adımları uygulayın.

    1. Android paketi adı için paketiniz için bir ad girin. Örneğin: com.<organization_identifier>.<package_name>.

      Paket adını belirtin

    2. Uygulamayı kaydet'i seçin.

    3. google-services.json İndir'i seçin. Ardından dosyayı daha sonra kullanmak üzere yerel bir klasöre kaydedin ve İleri'yi seçin.

      google-services.json'ı indirin

    4. İleri'yi seçin.

    5. Konsola devam et'i seçin

      Not

      Yüklemeyi doğrula denetimi nedeniyle Konsola devam et düğmesi etkinleştirilmediyse Bu adımı atla'yı seçin.

  4. Firebase konsolunda projenizin dişlisini seçin. Ardından Proje Ayarları'nı seçin.

    Proje Ayarları'nı seçin

    Not

    google-services.json dosyasını indirmediyseniz bu sayfadan indirebilirsiniz.

  5. Üst kısımdaki Cloud Messaging sekmesine geçin. Sunucu anahtarını kopyalayıp daha sonra kullanmak üzere kaydedin. Bildirim hub'ınızı yapılandırmak için bu değeri kullanırsınız.

    Sunucu anahtarını kopyalama

Anında iletme bildirimleri için iOS uygulamanızı kaydetme

Bir iOS uygulamasına anında iletme bildirimleri göndermek için uygulamanızı Apple'a kaydedin ve anında iletme bildirimlerine kaydolun.

  1. Uygulamanızı henüz kaydettirdiyseniz Apple Geliştirici Merkezi'nde iOS Sağlama Portalı'na göz atın. Apple kimliğinizle portalda oturum açın, Sertifikalar, Tanımlayıcılar & Profilleri'ne gidin ve Tanımlayıcılar'ı seçin. Yeni bir uygulama kaydetmek için tıklayın + .

    iOS Sağlama Portalı Uygulama Kimlikleri sayfası

  2. Yeni Tanımlayıcı Kaydet ekranında Uygulama Kimlikleri radyo düğmesini seçin. Ardından Devam'ı seçin.

    iOS Sağlama Portalı yeni kimlik sayfası kaydetme

  3. Yeni uygulamanız için aşağıdaki üç değeri güncelleştirin ve devam'ı seçin:

    • Açıklama: Uygulamanız için açıklayıcı bir ad yazın.

    • Paket Kimliği: com.organization_identifier<> formunun Paket Kimliğini girin.<>UygulamaDağıtım Kılavuzu'nda belirtildiği gibi product_name. Aşağıdaki ekran görüntüsünde mobcat , değer kuruluş tanımlayıcısı olarak, PushDemo değeri ise ürün adı olarak kullanılır.

      iOS Sağlama Portalı kayıt uygulaması kimliği sayfası

    • Anında İletme Bildirimleri: Özellikler bölümündeki Anında İletme Bildirimleri seçeneğini işaretleyin.

      Yeni uygulama kimliğini kaydetme formu

      Bu eylem Uygulama Kimliğinizi oluşturur ve bilgileri onaylamanızı talep eder. Yeni Uygulama Kimliğini onaylamak için Devam'ı ve ardından Kaydet'i seçin.

      Yeni Uygulama Kimliğini Onayla

      Kaydet'i seçtikten sonra, Yeni Uygulama Kimliği'ni Sertifikalar, Tanımlayıcılar & Profiller sayfasında satır öğesi olarak görürsünüz.

  4. Sertifikalar, Tanımlayıcılar & Profilleri sayfasında, Tanımlayıcılar'ın altında oluşturduğunuz Uygulama Kimliği satır öğesini bulun. Ardından, Uygulama Kimliği Yapılandırmanızı Düzenleyin ekranını görüntülemek için satırını seçin.

Notification Hubs için sertifika oluşturma

Bildirim hub'ının Apple Anında İletme Bildirim Hizmetleri (APNS) ile çalışmasını sağlamak için bir sertifika gereklidir ve iki yoldan biriyle sağlanabilir:

  1. Doğrudan Notification Hub'a yüklenebilen bir p12 anında iletme sertifikası oluşturma (özgün yaklaşım)

  2. Belirteç tabanlı kimlik doğrulaması için kullanılabilecek bir p8 sertifikası oluşturma (daha yeni ve önerilen yaklaşım)

ApNS için Belirteç tabanlı (HTTP/2) kimlik doğrulamasında belirtildiği gibi daha yeni yaklaşımın bir dizi avantajı vardır. Daha az adım gereklidir ancak belirli senaryolar için de zorunludur. Ancak her iki yaklaşım da bu öğreticinin amaçları doğrultusunda çalışacağından her iki yaklaşım için de adımlar sağlanmıştır.

SEÇENEK 1: Doğrudan Notification Hub'a yüklenebilen bir p12 anında iletme sertifikası oluşturma
  1. Mac bilgisayarınızda Anahtarlık Erişimi aracını çalıştırın. Yardımcı Programlar klasöründen veya Başlatma Çubuğundaki Diğer klasöründen açılabilir.

  2. Anahtarlık Erişimi'ni seçin, Sertifika Yardımcısı'nı genişletin ve ardından Sertifika Yetkilisinden Sertifika İste'yi seçin.

    Yeni sertifika istemek için Anahtarlık Erişimi'ni kullanma

    Not

    Varsayılan olarak, AnahtarLık Erişimi listedeki ilk öğeyi seçer. Sertifikalar kategorisindeyseniz ve Apple Worldwide Geliştirici İlişkileri Sertifika Yetkilisi listedeki ilk öğe değilse bu sorun olabilir. CSR(Sertifika İmzalama İsteği) oluşturmadan önce anahtar olmayan bir öğeye sahip olduğunuzdan veya Apple Worldwide Developer Relations Certification Authority anahtarının seçildiğinden emin olun.

  3. Kullanıcı Email Adresinizi seçin, Ortak Ad değerinizi girin, Diske kaydedildi'yi belirttiğinizden emin olun ve ardından Devam'ı seçin. Ca Email Adresi gerekli olmadığından boş bırakın.

    Beklenen sertifika bilgileri

  4. Farklı Kaydet'teSertifika İmzalama İsteği (CSR) dosyası için bir ad girin, Konum'da konumu seçin ve ardından Kaydet'i seçin.

    Sertifika için bir dosya adı seçin

    Bu eylem CSR dosyasını seçili konuma kaydeder. Varsayılan konum Masaüstü'dür. Dosya için seçilen konumu unutmayın.

  5. iOS Sağlama Portalı'ndakiSertifikalar, Tanımlayıcılar & Profilleri sayfasına dönün, ekranı aşağı kaydırarak işaretli Anında İletme Bildirimleri seçeneğine gelin ve sertifikayı oluşturmak için Yapılandır'ı seçin.

    Uygulama Kimliğini Düzenle sayfası

  6. Apple Anında İletme Bildirimi hizmeti TLS/SSL Sertifikaları penceresi görüntülenir. Geliştirme TLS/SSL Sertifikası bölümünün altında Sertifika Oluştur düğmesini seçin.

    Uygulama Kimliği için sertifika oluştur düğmesi

    Yeni sertifika oluştur ekranı görüntülenir.

    Not

    Bu öğreticide bir geliştirme sertifikası kullanılır. Üretim sertifikası kaydederken de aynı işlem kullanılır. Bildirim gönderirken aynı sertifika türünü kullandığınızdan emin olmanız gerekir.

  7. Dosya Seç'i seçin, CSR dosyasını kaydettiğiniz konuma gidin ve ardından sertifika adına çift tıklayarak dosyayı yükleyin. Ardından Devam'ı seçin.

  8. Portal sertifikayı oluşturduğunda İndir düğmesini seçin. Sertifikayı kaydedin ve kaydedildiği konumu unutmayın.

    Oluşturulan sertifika indirme sayfası

    Sertifika indirilir ve bilgisayarınıza İndirilenler klasörünüze kaydedilir.

    İndirilenler klasöründe sertifika dosyasını bulma

    Not

    Varsayılan olarak, indirilen geliştirme sertifikası aps_development.cer olarak adlandırılır.

  9. İndirilen anında iletme sertifikası aps_development.cer çift tıklayın. Bu eylem, aşağıdaki görüntüde gösterildiği gibi yeni sertifikayı Anahtarlık'a yükler:

    Yeni sertifikayı gösteren anahtarlık erişim sertifikaları listesi

    Not

    Sertifikanızdaki ad farklı olsa da, ad Apple Development iOS Anında İletme Hizmetleri ön ekine eklenir ve bununla ilişkili uygun paket tanımlayıcısı bulunur.

  10. Anahtarlık Erişimi'nde, Denetim + Sertifikalar kategorisinde oluşturduğunuz yeni anında iletme sertifikasınatıklayın. Dışarı Aktar'ı seçin, dosyayı adlandırın, p12 biçimini seçin ve ardından Kaydet'i seçin.

    Sertifikayı p12 biçiminde dışarı aktarma

    Sertifikayı parolayla korumayı seçebilirsiniz, ancak parola isteğe bağlıdır. Parola oluşturmayı atlamak istiyorsanız Tamam'a tıklayın. Dışarı aktarılan p12 sertifikasının dosya adını ve konumunu not edin. APN'lerle kimlik doğrulamasını etkinleştirmek için kullanılırlar.

    Not

    p12 dosya adınız ve konumunuz bu öğreticide görünenden farklı olabilir.

SEÇENEK 2: Belirteç tabanlı kimlik doğrulaması için kullanılabilecek bir p8 sertifikası oluşturma
  1. Aşağıdaki ayrıntıları not edin:

    • Uygulama Kimliği Ön Eki (Ekip Kimliği)
    • Paket Kimliği
  2. Sertifikalar, Tanımlayıcılar & Profilleri'ne dönüp Anahtarlar'a tıklayın.

    Not

    APNS için yapılandırılmış bir anahtarınız varsa, indirdiğiniz p8 sertifikasını oluşturulduktan hemen sonra yeniden kullanabilirsiniz. Öyleyse, 3 ile 5. adımları yoksayabilirsiniz.

  3. + Yeni bir anahtar oluşturmak için düğmeye (veya Anahtar oluştur düğmesine) tıklayın.

  4. Uygun bir Anahtar Adı değeri sağlayın, ardından Apple Anında İletme Bildirimleri hizmeti (APNS) seçeneğini işaretleyin ve ardından Devam'a ve ardından bir sonraki ekranda Kaydet'e tıklayın.

  5. İndir'e tıklayın ve p8 dosyasını (AuthKey_ ön ekli) güvenli bir yerel dizine taşıyın, ardından Bitti'ye tıklayın.

    Not

    p8 dosyanızı güvenli bir yerde tuttuğunuzdan emin olun (ve yedek kaydedin). Anahtarınızı indirdikten sonra, sunucu kopyası kaldırıldıktan sonra yeniden indirilemez.

  6. Anahtarlar'da, oluşturduğunuz anahtara (veya bunun yerine kullanmayı seçtiyseniz mevcut bir anahtara) tıklayın.

  7. Anahtar Kimliği değerini not edin.

  8. p8 sertifikanızı Visual Studio Code gibi seçtiğiniz uygun bir uygulamada açın. Anahtar değerini not edin ( -----BEGIN PRIVATE KEY----- ile -----END PRIVATE KEY----- arasında).

    -----BEGIN ÖZEL ANAHTARI-----
    <key_value>
    -----END ÖZEL ANAHTAR-----

    Not

    Bu, daha sonra Notification Hub'ı yapılandırmak için kullanılacak belirteç değeridir.

Bu adımların sonunda, bildirim hub'ınızı APNS bilgileriyle yapılandırma bölümünde kullanmak üzere aşağıdaki bilgilere sahip olmanız gerekir:

  • Ekip Kimliği (bkz. 1. adım)
  • Paket Kimliği (bkz. 1. adım)
  • Anahtar Kimliği (bkz. 7. adım)
  • Belirteç değeri (8. adımda alınan p8 anahtar değeri)

Uygulama için sağlama profili oluşturma

  1. iOS Sağlama Portalı'na dönün, Sertifikalar, Tanımlayıcılar & Profiller'i seçin, soldaki menüden Profiller'i seçin ve ardından yeni bir profil oluşturmak için seçin+. Yeni Sağlama Profili Kaydet ekranı görüntülenir.

  2. Sağlama profili türü olarak Geliştirme'nin altında iOS Uygulama Geliştirme'yi ve ardından Devam'ı seçin.

    Sağlama profili listesi

  3. Ardından, Uygulama Kimliği açılan listesinden oluşturduğunuz uygulama kimliğini seçin ve Devam'ı seçin.

    Uygulama Kimliğini seçin

  4. Sertifika seç penceresinde, kod imzalama için kullandığınız geliştirme sertifikasını seçin ve Devam'ı seçin.

    Not

    Bu sertifika, önceki adımda oluşturduğunuz anında iletme sertifikası değil. Bu, geliştirme sertifikanızdır. Yoksa, bu öğreticinin önkoşullarından biri olduğundan bunu oluşturmanız gerekir. Geliştirici sertifikaları Apple Geliştirici Portalı'nda, Xcode aracılığıyla veya Visual Studio'da oluşturulabilir.

  5. Sertifikalar, Tanımlayıcılar & Profiller sayfasına dönün, sol menüden Profiller'i seçin ve ardından yeni bir profil oluşturmak için öğesini seçin+. Yeni Sağlama Profili Kaydet ekranı görüntülenir.

  6. Sertifika seç penceresinde, oluşturduğunuz geliştirme sertifikasını seçin. Ardından Devam'ı seçin.

  7. Ardından test için kullanılacak cihazları seçin ve Devam'ı seçin.

  8. Son olarak, Sağlama Profili Adı'nda profil için bir ad seçin ve Oluştur'u seçin.

    Sağlama profili adı seçin

  9. Yeni sağlama profili oluşturulduğunda İndir'i seçin. Kaydedildiği konumu unutmayın.

  10. Sağlama profilinin konumuna göz atın ve ardından geliştirme makinenize yüklemek için çift tıklayın.

Bildirim Hub'ı oluşturma

Bu bölümde bir bildirim hub'ı oluşturacak ve APNS ile kimlik doğrulamayı yapılandıracaksınız. P12 anında iletme sertifikası veya belirteç tabanlı kimlik doğrulaması kullanabilirsiniz. Önceden oluşturduğunuz bir bildirim hub'ını kullanmak istiyorsanız 5. adıma atlayabilirsiniz.

  1. Azure'da oturum açın.

  2. Kaynak oluştur'a tıklayın, Bildirim Merkezi'ni arayıp seçin, ardından Oluştur'a tıklayın.

  3. Aşağıdaki alanları güncelleştirin ve oluştur'a tıklayın:

    TEMEL AYRINTILAR

    Abonelik: Açılan listeden hedef Aboneliği seçin
    Kaynak Grubu: Yeni bir Kaynak Grubu oluşturma (veya var olan bir kaynak grubunu seçme)

    AD ALANı AYRıNTıLARı

    Notification Hub Ad Alanı:Notification Hub ad alanı için genel olarak benzersiz bir ad girin

    Not

    Bu alan için Yeni oluştur seçeneğinin belirlendiğinden emin olun.

    BILDIRIM HUB'ı AYRıNTıLARı

    Bildirim Hub'ı:Bildirim Hub'ı için bir ad girin
    Konum: Açılan listeden uygun bir konum seçin
    Fiyatlandırma Katmanı: Varsayılan Ücretsiz seçeneğini koru

    Not

    Ücretsiz katmanda hub sayısı üst sınırına ulaşmadığınız sürece.

  4. Bildirim Hub'ı sağlandıktan sonra bu kaynağa gidin.

  5. Yeni Bildirim Hub'ınıza gidin.

  6. Listeden Erişim İlkeleri'ni seçin ( YÖNET'in altında).

  7. İlke Adı değerlerini ve karşılık gelen Bağlantı Dizesi değerlerini not edin.

ApNS bilgileriyle Bildirim Hub'ınızı yapılandırma

Bildirim Hizmetleri'nin altında Apple'ı seçin, ardından Notification Hubs için Sertifika Oluşturma bölümünde daha önce seçtiğiniz yaklaşıma göre uygun adımları izleyin.

Not

Uygulama Modu için Üretim'i yalnızca uygulamanızı mağazadan satın alan kullanıcılara anında iletme bildirimleri göndermek istiyorsanız kullanın.

SEÇENEK 1: .p12 anında iletme sertifikası kullanma

  1. Sertifika'ya tıklayın.

  2. Dosya simgesini seçin.

  3. Daha önce dışarı aktardığınız .p12 dosyasını ve ardından Aç'ı seçin.

  4. Gerekirse doğru parolayı belirtin.

  5. Korumalı alan modu'nu seçin.

  6. Kaydet'i seçin.

SEÇENEK 2: Belirteç tabanlı kimlik doğrulamayı kullanma

  1. Belirteç'i seçin.

  2. Daha önce edindiğiniz aşağıdaki değerleri girin:

    • Anahtar Kimliği
    • Paket Kimliği
    • Ekip Kimliği
    • Belirte -ci
  3. Korumalı Alan'ı seçin.

  4. Kaydet'i seçin.

Bildirim hub'ınızı FCM bilgileriyle yapılandırma

  1. Soldaki menünün Ayarlar bölümünde Google (GCM/FCM) öğesini seçin.
  2. Google Firebase Konsolu'ndan not ettiğiniz sunucu anahtarını girin.
  3. Araç çubuğunda Kaydet'i seçin.

ASP.NET Core Web API arka uç uygulaması oluşturma

Bu bölümde, cihaz kaydını ve Xamarin.Forms mobil uygulamasına bildirim göndermeyi işlemek için ASP.NET Core Web API arka ucu oluşturacaksınız.

Web projesi oluşturma

  1. Visual Studio'daDosya>Yeni Çözüm'e tıklayın.

  2. .NET Core>Uygulaması> ASP.NET Core API>İleri'yi> seçin.

  3. Yeni ASP.NET Core Web API'nizi yapılandırın iletişim kutusunda.NET Core 3.1Hedef Çerçevesi'ni seçin.

  4. Proje Adı olarak PushDemoApi girin ve Oluştur'u seçin.

  5. Şablonlu uygulamayı test etmek için hata ayıklamayı başlatın (Command + Enter).

    Not

    Şablonlu uygulama, launchUrl olarak WeatherForecastController kullanacak şekilde yapılandırılmıştır. Bu, Özellikler>launchSettings.json'nde ayarlanır.

    Geçersiz geliştirme sertifikası bulundu iletisi istenirse:

    1. Bunu düzeltmek için 'dotnet dev-certs https' aracını çalıştırmayı kabul etmek için Evet'e tıklayın. 'dotnet dev-certs https' aracı daha sonra sertifika için bir parola ve Anahtar zincirinizin parolasını girmenizi ister.

    2. Yeni sertifikayı yükleyip güvenmeniz istendiğinde Evet'e tıklayın ve anahtarlığınızın parolasını girin.

  6. Denetleyiciler klasörünü genişletin ve WeatherForecastController.cs silin.

  7. WeatherForecast.cs silin.

  8. Gizli Dizi Yöneticisi aracını kullanarak yerel yapılandırma değerlerini ayarlayın. Gizli dizileri çözümden ayırma, bunların kaynak denetiminde yer almamasını sağlar. Terminal'i açın, ardından proje dosyasının dizinine gidin ve aşağıdaki komutları çalıştırın:

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

    Yer tutucu değerlerini kendi bildirim hub'ı adınızla ve bağlantı dizesi değerleriyle değiştirin. Bildirim hub'ı oluşturma bölümünde bunları not edin. Aksi takdirde, bunları Azure'da arayabilirsiniz.

    NotificationHub:Name:
    Genel Bakış'ın üst kısmındaki Temel Bileşenler özetindeki Ad bölümüne bakın.

    NotificationHub:ConnectionString:
    Bkz. Erişimİlkeleri'nde DefaultFullSharedAccessSignature

    Not

    Üretim senaryolarında, bağlantı dizesi güvenli bir şekilde depolamak için Azure KeyVault gibi seçeneklere bakabilirsiniz. Kolaylık olması için gizli diziler Azure App Service uygulama ayarlarına eklenir.

API Anahtarı kullanarak istemcilerin kimliğini doğrulama (İsteğe bağlı)

API anahtarları belirteçler kadar güvenli değildir, ancak bu öğreticinin amaçları için yeterlidir. API anahtarı , ASP.NET Ara Yazılımı aracılığıyla kolayca yapılandırılabilir.

  1. API anahtarını yerel yapılandırma değerlerine ekleyin.

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

    Not

    Yer tutucu değerini kendi değerinizle değiştirip not etmelisiniz.

  2. Denetim + PushDemoApi projesine tıklayın, Eklemenüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Kimlik Doğrulaması kullanarak ekle'ye tıklayın.

  3. Denetim + Kimlik Doğrulaması klasörüne tıklayın, ardından Eklemenüsünden Yeni Dosya... öğesini seçin.

  4. Genel>Boş Sınıf'ı seçin, Ad için ApiKeyAuthOptions.cs girin ve ardından Yeni'ye tıklayarak aşağıdaki uygulamayı ekleyin.

    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. Authentication klasörüne ApiKeyAuthHandler.cs adlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    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));
            }
        }
    }
    

    Not

    Kimlik Doğrulama İşleyicisi, bir düzenin davranışını uygulayan bir türdür ve bu durumda özel bir API Anahtarı düzenidir.

  6. ApiKeyAuthenticationBuilderExtensions.cs adlıKimlik Doğrulama klasörüne başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    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);
            }
        }
    }
    

    Not

    Bu uzantı yöntemi, ara yazılım yapılandırma kodunu Startup.cs basitleştirerek daha okunabilir ve genel olarak takip edilebilir hale getirir.

  7. Startup.cs'daConfigureServices yöntemini güncelleştirerek hizmetlere yapılan çağrının altında API Anahtarı kimlik doğrulamasını yapılandırın. AddControllers yöntemi.

    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. Hala Startup.cs içinde Configure yöntemini güncelleştirerek uygulamanın IApplicationBuilder'ındaUseAuthentication ve UseAuthorization uzantısı yöntemlerini çağırın. Bu yöntemlerin UseRouting'den sonra ve uygulamadan önce çağrıldığından emin olun . 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();
        });
    }
    

    Not

    UseAuthentication çağrısı, önceden kaydedilmiş kimlik doğrulama düzenlerini kullanan ara yazılımı kaydeder (ConfigureServices'ten). Bu, kimliği doğrulanan kullanıcılara bağımlı olan herhangi bir ara yazılımdan önce çağrılmalıdır.

Bağımlılık ekleme ve hizmetleri yapılandırma

ASP.NET Core, sınıflar ve bağımlılıkları arasında Denetimin TersIni (IoC) elde etmeye yönelik bir teknik olan bağımlılık ekleme (DI) yazılım tasarım desenini destekler.

Arka uç işlemleri için bildirim hub'ının ve Notification Hubs SDK'sının kullanımı bir hizmet içinde kapsüllenmiş olur. Hizmet kaydedilir ve uygun bir soyutlama ile kullanılabilir hale getirilir.

  1. Denetim + Bağımlılıklar klasörüne tıklayın, ardından NuGet Paketlerini Yönet...'i seçin.

  2. Microsoft.Azure.NotificationHubs araması yapın ve işaretli olduğundan emin olun.

  3. Paket Ekle'ye tıklayın, ardından lisans koşullarını kabul etmek isteyip istemediğiniz sorulduğunda Kabul Et'e tıklayın.

  4. Denetim + PushDemoApi projesine tıklayın, Eklemenüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Modelleri Kullanarak Ekle'ye tıklayın.

  5. Denetim + Modeller klasörüne tıklayın, ardından Eklemenüsünden Yeni Dosya... öğesini seçin.

  6. Genel>Boş Sınıf'ı seçin, Ad için PushTemplates.cs girin ve ardından Yeni'ye tıklayarak aşağıdaki uygulamayı ekleyin.

    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)\" }";
            }
        }
    }
    

    Not

    Bu sınıf, bu senaryonun gerektirdiği genel ve sessiz bildirimler için belirteçli bildirim yüklerini içerir. Yükleri, hizmet aracılığıyla mevcut yüklemeleri güncelleştirmek zorunda kalmadan denemelere izin vermek için Yükleme dışında tanımlanır. Yüklemelerdeki değişiklikleri bu şekilde işlemek, bu öğreticinin kapsamı dışındadır. Üretim için özel şablonları göz önünde bulundurun.

  7. Models klasörüne DeviceInstallation.cs adlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    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. Models klasörüne NotificationRequest.cs adlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    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. Models klasörüne NotificationHubOptions.cs adlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    using System.ComponentModel.DataAnnotations;
    
    namespace PushDemoApi.Models
    {
        public class NotificationHubOptions
        {
            [Required]
            public string Name { get; set; }
    
            [Required]
            public string ConnectionString { get; set; }
        }
    }
    
  10. PushDemoApi projesine Hizmetler adlı yeni bir klasör ekleyin.

  11. services klasörüne INotificationService.cs adlı Boş Bir Arabirim ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    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. services klasörüne NotificationHubsService.cs adlı Boş Bir Sınıf ekleyin ve ardından INotificationService arabirimini uygulamak için aşağıdaki kodu ekleyin:

    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);
            }
        }
    }
    

    Not

    SendTemplateNotificationAsync için sağlanan etiket ifadesi 20 etiketle sınırlıdır. Çoğu işleç için 6 ile sınırlıdır, ancak ifade bu durumda yalnızca OR'leri (||) içerir. İstekte 20'den fazla etiket varsa bunların birden çok isteğe bölünmesi gerekir. Daha fazla ayrıntı için Yönlendirme ve Etiket İfadeleri belgelerine bakın.

  13. Startup.cs'deConfigureServices yöntemini güncelleştirerek NotificationHubsService'iINotificationService'in tek bir uygulaması olarak ekleyin.

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

Bildirimler API'sini oluşturma

  1. Denetim + Denetleyiciler klasörüne tıklayın, ardından Eklemenüsünden Yeni Dosya... öğesini seçin.

  2. ASP.NET Core>Web API Denetleyicisi Sınıfı'nı seçin, Ad için NotificationsController yazın ve Yeni'ye tıklayın.

    Not

    Visual Studio 2019 ile takip ediyorsanız okuma/yazma eylemleri içeren API Denetleyicisi şablonunu seçin.

  3. Aşağıdaki ad alanlarını dosyanın en üstüne ekleyin.

    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. Şablonlu denetleyiciyi ControllerBase'den türetilen ve ApiController özniteliğiyle süslenen şekilde güncelleştirin.

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

    Not

    Denetleyici temel sınıfı görünümler için destek sağlar, ancak bu durumda bu gerekli değildir ve bu nedenle ControllerBase kullanılabilir. Visual Studio 2019'u takip ediyorsanız bu adımı atlayabilirsiniz.

  5. İstemcileri api anahtarı kullanarak doğrulama bölümünü tamamlamayı seçtiyseniz NotificationsController'ıAuthorize özniteliğiyle de süslemeniz gerekir.

    [Authorize]
    
  6. INotificationService'in kayıtlı örneğini bağımsız değişken olarak kabul etmek ve salt okunur bir üyeye atamak için oluşturucuyu güncelleştirin.

    readonly INotificationService _notificationService;
    
    public NotificationsController(INotificationService notificationService)
    {
        _notificationService = notificationService;
    }
    
  7. launchSettings.json'da (Özellikler klasöründe), launchUrlweatherforecast değerini, RegistrationsControllerRoute özniteliğinde belirtilen URL ile eşleşecek şekilde api/notifications olarak değiştirin.

  8. Uygulamanın yeni NotificationsController ile çalıştığını doğrulamak için hata ayıklamayı başlatın (Command + Enter) ve 401 Yetkisiz durumunu döndürür.

    Not

    Visual Studio uygulamayı tarayıcıda otomatik olarak başlatamayabilir. Bu noktadan sonra API'yi test etmek için Postman kullanacaksınız.

  9. Yeni bir Postman sekmesinde isteği GET olarak ayarlayın. Aşağıdaki adresi girin ve applicationUrl> yer tutucusunu<Özellikler>launchSettings.json'nde bulunan https applicationUrl ile değiştirin.

    <applicationUrl>/api/notifications
    

    Not

    applicationUrl varsayılan profil için 'https://localhost:5001' olmalıdır. IIS kullanıyorsanız (Windows üzerinde Visual Studio 2019'da varsayılan), bunun yerine iisSettings öğesinde belirtilen applicationUrl'yi kullanmalısınız. Adres yanlışsa 404 yanıtı alırsınız.

  10. İstemcileri API Anahtarı kullanarak doğrula bölümünü tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırdığınızdan emin olun.

    Anahtar Değer
    apikey <your_api_key>
  11. Gönder düğmesine tıklayın.

    Not

    Bazı JSON içeriğiyle 200 Tamam durumu almalısınız.

    SSL sertifikası doğrulama uyarısı alırsanız, Ayarlar'dan SSL sertifika doğrulaması postman isteği ayarını kapatabilirsiniz.

  12. NotificationsController.cs'daki şablonlu sınıf yöntemlerini aşağıdaki kodla değiştirin.

    [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();
    }
    

API uygulamasını oluşturma

Artık arka uç hizmetini barındırmak için Azure App Service'de bir API Uygulaması oluşturacaksınız.

  1. Azure portal oturum açın.

  2. Kaynak oluştur'a tıklayın, ARDıNDAN API Uygulaması'nı arayıp seçin, ardından Oluştur'a tıklayın.

  3. Aşağıdaki alanları güncelleştirin ve oluştur'a tıklayın.

    Uygulama adı:
    API Uygulaması için genel olarak benzersiz bir ad girin

    Abonelik:
    Bildirim hub'ını oluşturduğunuz hedef Aboneliği seçin.

    Kaynak Grubu:
    Bildirim hub'ını oluşturduğunuz Kaynak Grubunu seçin.

    plan/konum App Service:
    Yeni bir App Service Planı oluşturma

    Not

    Varsayılan seçenekten SSL desteği içeren bir plana geçin. Aksi takdirde, http isteklerinin engellenmesini önlemek için mobil uygulamayla çalışırken uygun adımları uygulamanız gerekir.

    Application Insights:
    Önerilen seçeneği koruyun (bu ad kullanılarak yeni bir kaynak oluşturulur) veya mevcut bir kaynağı seçin.

  4. API Uygulaması sağlandıktan sonra bu kaynağa gidin.

  5. Genel Bakış'ın üst kısmındaki Temel Bileşenler özetinde URL özelliğini not edin. Bu URL, bu öğreticinin ilerleyen bölümlerinde kullanılacak arka uç uç noktanızdır .

    Not

    URL, daha önce belirttiğiniz API uygulama adını biçiminde https://<app_name>.azurewebsites.netkullanır.

  6. Listeden Yapılandırma'ya tıklayın ( Ayarlar'ın altında).

  7. Aşağıdaki ayarların her biri için Yeni uygulama ayarı'na tıklayarak Ad ve Değer girin, ardından Tamam'a tıklayın.

    Adı Değer
    Authentication:ApiKey <api_key_value>
    NotificationHub:Name <hub_name_value>
    NotificationHub:ConnectionString <hub_connection_string_value>

    Not

    Bunlar, daha önce kullanıcı ayarlarında tanımladığınız ayarlarla aynıdır. Bunları kopyalayabilirsiniz. Authentication:ApiKey ayarı yalnızca BIR API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir. Üretim senaryoları için Azure KeyVault gibi seçeneklere bakabilirsiniz. Bunlar, bu örnekte kolaylık sağlamak için uygulama ayarları olarak eklenmiştir.

  8. Tüm uygulama ayarları eklendikten sonra Kaydet'e ve ardından Devam'a tıklayın.

Arka uç hizmetini yayımlama

Ardından, uygulamayı tüm cihazlardan erişilebilir hale getirmek için API Uygulamasına dağıtacaksınız.

Not

Aşağıdaki adımlar Mac için Visual Studio özgü adımlardır. Windows'da Visual Studio 2019 ile takip ediyorsanız yayımlama akışı farklı olacaktır. Bkz. Windows'da Azure App Service yayımlama.

  1. Henüz yapmadıysanız yapılandırmanızı Hata Ayıkla olan Sürüm olarak değiştirin.

  2. Denetim + PushDemoApi projesine tıklayın ve yayımla menüsünden Azure'da Yayımla...öğesini seçin.

  3. İstenirse kimlik doğrulama akışını izleyin. ÖNCEKI API Uygulaması bölümünde kullandığınız hesabı kullanın.

  4. Listeden yayımlama hedefiniz olarak daha önce oluşturduğunuz Azure App Service API Uygulamasını seçin ve yayımla'ya tıklayın.

Sihirbazı tamamladıktan sonra uygulamayı Azure'da yayımlar ve ardından uygulamayı açar. Henüz yapmadıysanız URL'yi not edin. Bu URL, bu öğreticinin ilerleyen bölümlerinde kullanılan arka uç uç noktanızdır .

Yayımlanan API'yi doğrulama

  1. Postman'de yeni bir sekme açın, isteği PUT olarak ayarlayın ve aşağıdaki adresi girin. Yer tutucusunu , önceki arka uç hizmetini yayımlama bölümünde not ettiğiniz temel adresle değiştirin.

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

    Not

    Temel adres biçiminde olmalıdır https://<app_name>.azurewebsites.net/

  2. İSTEMCIlerin kimliğini doğrulama bölümünü API Anahtarı kullanarak tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırdığınızdan emin olun.

    Anahtar Değer
    apikey <your_api_key>
  3. Gövde için ham seçeneği belirleyin, ardından biçim seçenekleri listesinden JSON'u seçin ve ardından bazı yer tutucu JSON içeriği ekleyin:

    {}
    
  4. Gönder'e tıklayın.

    Not

    Hizmetten 422 UnprocessableEntity durumu almalısınız.

  5. 1-4 arası adımları yeniden uygulayın, ancak bu kez 400 Hatalı İstek yanıtı aldığınızı doğrulamak için istekler uç noktasını belirtin.

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

Not

Bunun için istemci mobil uygulamasından platforma özgü bilgiler gerekeceğinden, API'yi geçerli istek verileri kullanarak test etmek henüz mümkün değildir.

Platformlar arası Xamarin.Forms uygulaması oluşturma

Bu bölümde, anında iletme bildirimlerini platformlar arası bir şekilde uygulayan bir Xamarin.Forms mobil uygulaması oluşturacaksınız.

Oluşturduğunuz arka uç hizmeti aracılığıyla bir bildirim hub'ından kaydolmanızı ve kaydını kaldırmanızı sağlar.

Bir eylem belirtildiğinde ve uygulama ön planda olduğunda bir uyarı görüntülenir. Aksi takdirde bildirimler bildirim merkezinde görünür.

Not

Kayıt (ve kaydı kaldırma) eylemlerini genellikle uygulama yaşam döngüsünde uygun bir noktada (veya ilk çalıştırma deneyiminizin bir parçası olarak) açık kullanıcı kaydı/kaydını kaldırma girişleri olmadan gerçekleştirirsiniz. Ancak bu örnek, bu işlevselliğin daha kolay keşfedilmesine ve test edilmesine olanak sağlamak için açık kullanıcı girişi gerektirir.

Xamarin.Forms çözümünü oluşturma

  1. Visual Studio'da şablon olarak Boş Formlar Uygulaması'nı kullanarak yeni bir Xamarin.Forms çözümü oluşturun ve Proje Adı için PushDemo girin.

    Not

    Boş Forms Uygulamanızı Yapılandırın iletişim kutusunda, Kuruluş Tanımlayıcısı'nın daha önce kullandığınız değerle eşleştiğinden ve hem Android hem de iOS hedeflerinin denetlendiğinden emin olun.

  2. Denetim + PushDemo çözümüne tıklayın ve NuGet Paketlerini Güncelleştir'i seçin.

  3. Denetim + PushDemo çözümüne tıklayın, ardından NuGet Paketlerini Yönet... öğesini seçin.

  4. Newtonsoft.Json için arama yapın ve işaretli olduğundan emin olun.

  5. Paket Ekle'ye tıklayın ve ardından lisans koşullarını kabul etmek isteyip istemediğiniz sorulduğunda Kabul Et'e tıklayın.

  6. Cihazınızdaki şablonlu uygulama çalıştırmalarını test etmek için uygulamayı her hedef platformda (Command + Enter) derleyin ve çalıştırın.

Platformlar arası bileşenleri uygulama

  1. Denetim + PushDemo projesine tıklayın, Eklemenüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Modelleri Kullanarak Ekle'ye tıklayın.

  2. Denetim + Modeller klasörüne tıklayın, ardından Eklemenüsünden Yeni Dosya... öğesini seçin.

  3. Genel>Boş Sınıf'ı seçin, DeviceInstallation.cs girin ve aşağıdaki uygulamayı ekleyin.

    using System.Collections.Generic;
    using Newtonsoft.Json;
    
    namespace PushDemo.Models
    {
        public class DeviceInstallation
        {
            [JsonProperty("installationId")]
            public string InstallationId { get; set; }
    
            [JsonProperty("platform")]
            public string Platform { get; set; }
    
            [JsonProperty("pushChannel")]
            public string PushChannel { get; set; }
    
            [JsonProperty("tags")]
            public List<string> Tags { get; set; } = new List<string>();
        }
    }
    
  4. Aşağıdaki uygulamayla PushDemoAction.cs adlı Models klasörüne Boş Bir Numaralandırma ekleyin.

    namespace PushDemo.Models
    {
        public enum PushDemoAction
        {
            ActionA,
            ActionB
        }
    }
    
  5. PushDemo projesine Hizmetler adlı yeni bir klasör ekleyin ve ardından aşağıdaki uygulamayla ServiceContainer.cs adlı klasöre Boş Bir Sınıf ekleyin.

    using System;
    using System.Collections.Generic;
    
    namespace PushDemo.Services
    {
       public static class ServiceContainer
       {
           static readonly Dictionary<Type, Lazy<object>> services
               = new Dictionary<Type, Lazy<object>>();
    
           public static void Register<T>(Func<T> function)
               => services[typeof(T)] = new Lazy<object>(() => function());
    
           public static T Resolve<T>()
               => (T)Resolve(typeof(T));
    
           public static object Resolve(Type type)
           {
               {
                   if (services.TryGetValue(type, out var service))
                       return service.Value;
    
                   throw new KeyNotFoundException($"Service not found for type '{type}'");
               }
           }
       }
    }
    

    Not

    Bu, XamCAT deposundan ServiceContainer sınıfının kırpılmış bir sürümüdür. Hafif bir IoC (Denetimin Tersine Çevrilmesi) kapsayıcısı olarak kullanılacaktır.

  6. IDeviceInstallationService.cs adlı Hizmetler klasörüne Boş Bir Arabirim ekleyin ve ardından aşağıdaki kodu ekleyin.

    using PushDemo.Models;
    
    namespace PushDemo.Services
    {
        public interface IDeviceInstallationService
        {
            string Token { get; set; }
            bool NotificationsSupported { get; }
            string GetDeviceId();
            DeviceInstallation GetDeviceInstallation(params string[] tags);
        }
    }
    

    Not

    Bu arabirim, platforma özgü işlevselliği ve arka uç hizmeti tarafından gereken DeviceInstallation bilgilerini sağlamak için daha sonra her hedef tarafından uygulanır ve önyüklenir.

  7. Hizmetler klasörüne INotificationRegistrationService.cs adlı başka bir Boş Arabirim ekleyin ve ardından aşağıdaki kodu ekleyin.

    using System.Threading.Tasks;
    
    namespace PushDemo.Services
    {
        public interface INotificationRegistrationService
        {
            Task DeregisterDeviceAsync();
            Task RegisterDeviceAsync(params string[] tags);
            Task RefreshRegistrationAsync();
        }
    }
    

    Not

    Bu, istemci ve arka uç hizmeti arasındaki etkileşimi işler.

  8. hizmetler klasörüne INotificationActionService.cs adlı başka bir Boş Arabirim ekleyin ve ardından aşağıdaki kodu ekleyin.

    namespace PushDemo.Services
    {
        public interface INotificationActionService
        {
            void TriggerAction(string action);
        }
    }
    

    Not

    Bu, bildirim eylemlerinin işlenmesini merkezileştirmek için basit bir mekanizma olarak kullanılır.

  9. Aşağıdaki uygulamayla, INotificationActionService'ten türetilen IPushDemoNotificationActionService.cs adlı Hizmetler klasörüne Boş Bir Arabirim ekleyin.

    using System;
    using PushDemo.Models;
    
    namespace PushDemo.Services
    {
        public interface IPushDemoNotificationActionService : INotificationActionService
        {
            event EventHandler<PushDemoAction> ActionTriggered;
        }
    }
    

    Not

    Bu tür PushDemo uygulamasına özgüdür ve pushDemoAction numaralandırmasını kullanarak kesin olarak türlenmiş bir şekilde tetiklenen eylemi tanımlar.

  10. Aşağıdaki kodla INotificationRegistrationService'i uygulamak NotificationRegistrationService.cs adlı Services klasörüne Boş Bir Sınıf ekleyin.

    using System;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    using PushDemo.Models;
    using Xamarin.Essentials;
    
    namespace PushDemo.Services
    {
        public class NotificationRegistrationService : INotificationRegistrationService
        {
            const string RequestUrl = "api/notifications/installations";
            const string CachedDeviceTokenKey = "cached_device_token";
            const string CachedTagsKey = "cached_tags";
    
            string _baseApiUrl;
            HttpClient _client;
            IDeviceInstallationService _deviceInstallationService;
    
            public NotificationRegistrationService(string baseApiUri, string apiKey)
            {
                _client = new HttpClient();
                _client.DefaultRequestHeaders.Add("Accept", "application/json");
                _client.DefaultRequestHeaders.Add("apikey", apiKey);
    
                _baseApiUrl = baseApiUri;
            }
    
            IDeviceInstallationService DeviceInstallationService
                => _deviceInstallationService ??
                    (_deviceInstallationService = ServiceContainer.Resolve<IDeviceInstallationService>());
    
            public async Task DeregisterDeviceAsync()
            {
                var cachedToken = await SecureStorage.GetAsync(CachedDeviceTokenKey)
                    .ConfigureAwait(false);
    
                if (cachedToken == null)
                    return;
    
                var deviceId = DeviceInstallationService?.GetDeviceId();
    
                if (string.IsNullOrWhiteSpace(deviceId))
                    throw new Exception("Unable to resolve an ID for the device.");
    
                await SendAsync(HttpMethod.Delete, $"{RequestUrl}/{deviceId}")
                    .ConfigureAwait(false);
    
                SecureStorage.Remove(CachedDeviceTokenKey);
                SecureStorage.Remove(CachedTagsKey);
            }
    
            public async Task RegisterDeviceAsync(params string[] tags)
            {
                var deviceInstallation = DeviceInstallationService?.GetDeviceInstallation(tags);
    
                await SendAsync<DeviceInstallation>(HttpMethod.Put, RequestUrl, deviceInstallation)
                    .ConfigureAwait(false);
    
                await SecureStorage.SetAsync(CachedDeviceTokenKey, deviceInstallation.PushChannel)
                    .ConfigureAwait(false);
    
                await SecureStorage.SetAsync(CachedTagsKey, JsonConvert.SerializeObject(tags));
            }
    
            public async Task RefreshRegistrationAsync()
            {
                var cachedToken = await SecureStorage.GetAsync(CachedDeviceTokenKey)
                    .ConfigureAwait(false);
    
                var serializedTags = await SecureStorage.GetAsync(CachedTagsKey)
                    .ConfigureAwait(false);
    
                if (string.IsNullOrWhiteSpace(cachedToken) ||
                    string.IsNullOrWhiteSpace(serializedTags) ||
                    string.IsNullOrWhiteSpace(DeviceInstallationService.Token) ||
                    cachedToken == DeviceInstallationService.Token)
                    return;
    
                var tags = JsonConvert.DeserializeObject<string[]>(serializedTags);
    
                await RegisterDeviceAsync(tags);
            }
    
            async Task SendAsync<T>(HttpMethod requestType, string requestUri, T obj)
            {
                string serializedContent = null;
    
                await Task.Run(() => serializedContent = JsonConvert.SerializeObject(obj))
                    .ConfigureAwait(false);
    
                await SendAsync(requestType, requestUri, serializedContent);
            }
    
            async Task SendAsync(
                HttpMethod requestType,
                string requestUri,
                string jsonRequest = null)
            {
                var request = new HttpRequestMessage(requestType, new Uri($"{_baseApiUrl}{requestUri}"));
    
                if (jsonRequest != null)
                    request.Content = new StringContent(jsonRequest, Encoding.UTF8, "application/json");
    
                var response = await _client.SendAsync(request).ConfigureAwait(false);
    
                response.EnsureSuccessStatusCode();
            }
        }
    }
    

    Not

    apiKey bağımsız değişkeni yalnızca BIR API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiyseniz gereklidir.

  11. Aşağıdaki kodla IPushDemoNotificationActionService'i uygulamak PushDemoNotificationActionService.cs adlı Services klasörüne Boş Bir Sınıf ekleyin.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using PushDemo.Models;
    
    namespace PushDemo.Services
    {
        public class PushDemoNotificationActionService : IPushDemoNotificationActionService
        {
            readonly Dictionary<string, PushDemoAction> _actionMappings = new Dictionary<string, PushDemoAction>
            {
                { "action_a", PushDemoAction.ActionA },
                { "action_b", PushDemoAction.ActionB }
            };
    
            public event EventHandler<PushDemoAction> ActionTriggered = delegate { };
    
            public void TriggerAction(string action)
            {
                if (!_actionMappings.TryGetValue(action, out var pushDemoAction))
                    return;
    
                List<Exception> exceptions = new List<Exception>();
    
                foreach (var handler in ActionTriggered?.GetInvocationList())
                {
                    try
                    {
                        handler.DynamicInvoke(this, pushDemoAction);
                    }
                    catch (Exception ex)
                    {
                        exceptions.Add(ex);
                    }
                }
    
                if (exceptions.Any())
                    throw new AggregateException(exceptions);
            }
        }
    }
    
  12. Aşağıdaki uygulamayla pushdemo projesine Config.cs adlı boş bir sınıf ekleyin.

    namespace PushDemo
    {
        public static partial class Config
        {
            public static string ApiKey = "API_KEY";
            public static string BackendServiceEndpoint = "BACKEND_SERVICE_ENDPOINT";
        }
    }
    

    Not

    Bu, gizli dizileri kaynak denetiminin dışında tutmanın basit bir yolu olarak kullanılır. Bu değerleri otomatik bir derlemenin parçası olarak değiştirebilir veya yerel bir kısmi sınıf kullanarak geçersiz kılabilirsiniz. Bunu bir sonraki adımda yapacaksınız.

    ApiKey alanı yalnızca BIR API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir.

  13. PushDemo projesine bu kez aşağıdaki uygulamayla Config.local_secrets.cs adlı başka bir Boş Sınıf ekleyin.

    namespace PushDemo
    {
        public static partial class Config
        {
            static Config()
            {
                ApiKey = "<your_api_key>";
                BackendServiceEndpoint = "<your_api_app_url>";
            }
        }
    }
    

    Not

    Yer tutucu değerlerini kendi değerlerinizle değiştirin. Arka uç hizmetini oluştururken bunları not almış olmanız gerekirdi. API Uygulaması URL'si olmalıdırhttps://<api_app_name>.azurewebsites.net/. Bu dosyanın işlenmesini önlemek için gitignore dosyanıza eklemeyi *.local_secrets.* unutmayın.

    ApiKey alanı yalnızca BIR API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir.

  14. Aşağıdaki uygulamayla PushDemo projesine Bootstrap.cs adlı boş bir Sınıf ekleyin.

    using System;
    using PushDemo.Services;
    
    namespace PushDemo
    {
        public static class Bootstrap
        {
            public static void Begin(Func<IDeviceInstallationService> deviceInstallationService)
            {
                ServiceContainer.Register(deviceInstallationService);
    
                ServiceContainer.Register<IPushDemoNotificationActionService>(()
                    => new PushDemoNotificationActionService());
    
                ServiceContainer.Register<INotificationRegistrationService>(()
                    => new NotificationRegistrationService(
                        Config.BackendServiceEndpoint,
                        Config.ApiKey));
            }
        }
    }
    

    Not

    Uygulama IDeviceInstallationService'in platforma özgü bir uygulamasını geçirmeyi başlattığında Begin yöntemi her platform tarafından çağrılır.

    NotificationRegistrationServiceapiKey oluşturucu bağımsız değişkeni yalnızca API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçerseniz gereklidir.

Platformlar arası kullanıcı arabirimini uygulama

  1. PushDemo projesinde MainPage.xaml dosyasını açın ve StackLayout denetimini aşağıdakilerle değiştirin.

    <StackLayout VerticalOptions="EndAndExpand"  
                 HorizontalOptions="FillAndExpand"
                 Padding="20,40">
        <Button x:Name="RegisterButton"
                Text="Register"
                Clicked="RegisterButtonClicked" />
        <Button x:Name="DeregisterButton"
                Text="Deregister"
                Clicked="DeregisterButtonClicked" />
    </StackLayout>
    
  2. Şimdi MainPage.xaml.cs,INotificationRegistrationService uygulamasına başvuruyu depolamak için salt okunur bir yedekleme alanı ekleyin.

    readonly INotificationRegistrationService _notificationRegistrationService;
    
  3. MainPage oluşturucusunda, ServiceContainer kullanarak INotificationRegistrationService uygulamasını çözümleyin ve notificationRegistrationService yedekleme alanına atayın.

    public MainPage()
    {
        InitializeComponent();
    
        _notificationRegistrationService =
            ServiceContainer.Resolve<INotificationRegistrationService>();
    }
    
  4. RegisterButton ve DeregisterButton düğmeleri için olay işleyicilerini uygulayın İlgili Kayıt/Kaydı Kaldırma yöntemlerini çağıran tıklanan olaylar.

    void RegisterButtonClicked(object sender, EventArgs e)
        => _notificationRegistrationService.RegisterDeviceAsync().ContinueWith((task)
            => { ShowAlert(task.IsFaulted ?
                    task.Exception.Message :
                    $"Device registered"); });
    
    void DeregisterButtonClicked(object sender, EventArgs e)
        => _notificationRegistrationService.DeregisterDeviceAsync().ContinueWith((task)
            => { ShowAlert(task.IsFaulted ?
                    task.Exception.Message :
                    $"Device deregistered"); });
    
    void ShowAlert(string message)
        => MainThread.BeginInvokeOnMainThread(()
            => DisplayAlert("PushDemo", message, "OK").ContinueWith((task)
                => { if (task.IsFaulted) throw task.Exception; }));
    
  5. Şimdi App.xaml.cs aşağıdaki ad alanlarına başvuruldığından emin olun.

    using PushDemo.Models;
    using PushDemo.Services;
    using Xamarin.Essentials;
    using Xamarin.Forms;
    
  6. IPushDemoNotificationActionServiceActionTriggered olayı için olay işleyicisini uygulayın.

    void NotificationActionTriggered(object sender, PushDemoAction e)
        => ShowActionAlert(e);
    
    void ShowActionAlert(PushDemoAction action)
        => MainThread.BeginInvokeOnMainThread(()
            => MainPage?.DisplayAlert("PushDemo", $"{action} action received", "OK")
                .ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; }));
    
  7. Uygulama oluşturucusunda, ServiceContainer kullanarak IPushNotificationActionService uygulamasını çözümleyin ve IPushDemoNotificationActionServiceActionTriggered olayına abone olun.

    public App()
    {
        InitializeComponent();
    
        ServiceContainer.Resolve<IPushDemoNotificationActionService>()
            .ActionTriggered += NotificationActionTriggered;
    
        MainPage = new MainPage();
    }
    

    Not

    Bu yalnızca anında iletme bildirimi eylemlerinin alınmasını ve yayılmasını göstermek için yapılır. Bunlar genellikle, bu durumda kök Sayfa olan MainPage üzerinden uyarı görüntülemek yerine belirli bir görünüme gitme veya bazı verileri yenileme gibi sessiz bir şekilde işlenir.

Yerel Android projesini anında iletme bildirimleri için yapılandırma

Paket adını ve izinlerini doğrulama

  1. PushDemo.Android'de, Derlemebölümünden Proje Seçenekleri'ni ve ardından Android Uygulaması'nı açın.

  2. Paket adınınFirebase KonsoluPushDemo projesinde kullandığınız değerle eşleşip eşleşmediğini denetleyin. Paket adı biçimindeydicom.<organization>.pushdemo.

  3. En Düşük Android Sürümünü Android8.0 (API düzeyi 26) ve Hedef Android Sürümünü en son API düzeyine ayarlayın.

    Not

    Bu öğreticinin amaçları doğrultusunda yalnızca API düzeyi 26 ve üzerini çalıştıran cihazlar desteklenir, ancak eski sürümleri çalıştıran cihazları destekleyecek şekilde genişletebilirsiniz.

  4. Gerekli izinler altında İnternet ve READ_PHONE_STATEizinlerinin etkinleştirildiğinden emin olun.

  5. Tamam'a tıklayın

Xamarin Google Play Services tabanını ve Xamarin.Firebase.Messaging paketlerini ekleme

  1. PushDemo.Android'deDenetim + Paketler klasörünetıklayın ve ardından NuGet Paketlerini Yönet...'i seçin.

  2. Xamarin.GooglePlayServices.Base (Bodrum değil) araması yapıp işaretli olduğundan emin olun.

  3. Xamarin.Firebase.Messaging araması yapıp işaretli olduğundan emin olun.

  4. Paket Ekle'ye tıklayın ve ardından lisans koşullarını kabul etmek isteyip istemediğiniz sorulduğunda Kabul Et'e tıklayın.

Google Services JSON dosyasını ekleme

  1. Denetim + PushDemo.Android Projeye tıklayın, ardından Eklemenüsünden Mevcut Dosya... öğesini seçin.

  2. Firebase Konsolu'ndaPushDemo projesini ayarlarken indirdiğiniz google-services.json dosyasını seçin ve aç'a tıklayın.

  3. İstendiğinde, Dosyayı dizine kopyala'yı seçin.

  4. Denetim + Projenin içinden PushDemo.Androidgoogle-services.json dosyasına tıklayın, ardından GoogleServicesJson'unDerleme Eylemi olarak ayarlandığından emin olun.

Android için anında iletme bildirimlerini işleme

  1. Denetim + PushDemo.Android Projeye tıklayın, Eklemenüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Hizmetleri Kullanarak Ekle'ye tıklayın.

  2. Denetim + Hizmetler klasörüne tıklayın, ardından Eklemenüsünden Yeni Dosya... öğesini seçin.

  3. Genel>Boş Sınıf'ı seçin, Ad için DeviceInstallationService.cs girin ve ardından Aşağıdaki uygulamayı ekleyen Yeni'ye tıklayın.

    using System;
    using Android.App;
    using Android.Gms.Common;
    using PushDemo.Models;
    using PushDemo.Services;
    using static Android.Provider.Settings;
    
    namespace PushDemo.Droid.Services
    {
        public class DeviceInstallationService : IDeviceInstallationService
        {
            public string Token { get; set; }
    
            public bool NotificationsSupported
                => GoogleApiAvailability.Instance
                    .IsGooglePlayServicesAvailable(Application.Context) == ConnectionResult.Success;
    
            public string GetDeviceId()
                => Secure.GetString(Application.Context.ContentResolver, Secure.AndroidId);
    
            public DeviceInstallation GetDeviceInstallation(params string[] tags)
            {
                if (!NotificationsSupported)
                    throw new Exception(GetPlayServicesError());
    
                if (string.IsNullOrWhiteSpace(Token))
                    throw new Exception("Unable to resolve token for FCM");
    
                var installation = new DeviceInstallation
                {
                    InstallationId = GetDeviceId(),
                    Platform = "fcm",
                    PushChannel = Token
                };
    
                installation.Tags.AddRange(tags);
    
                return installation;
            }
    
            string GetPlayServicesError()
            {
                int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(Application.Context);
    
                if (resultCode != ConnectionResult.Success)
                    return GoogleApiAvailability.Instance.IsUserResolvableError(resultCode) ?
                               GoogleApiAvailability.Instance.GetErrorString(resultCode) :
                               "This device is not supported";
    
                return "An error occurred preventing the use of push notifications";
            }
        }
    }
    

    Not

    Bu sınıf, bildirim hub'ı kayıt yükünün bir parçası olarak benzersiz bir kimlik ( Secure.AndroidId kullanarak) sağlar.

  4. services klasörüne PushNotificationFirebaseMessagingService.cs adlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    using Android.App;
    using Android.Content;
    using Firebase.Messaging;
    using PushDemo.Services;
    
    namespace PushDemo.Droid.Services
    {
        [Service]
        [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
        public class PushNotificationFirebaseMessagingService : FirebaseMessagingService
        {
            IPushDemoNotificationActionService _notificationActionService;
            INotificationRegistrationService _notificationRegistrationService;
            IDeviceInstallationService _deviceInstallationService;
    
            IPushDemoNotificationActionService NotificationActionService
                => _notificationActionService ??
                    (_notificationActionService =
                    ServiceContainer.Resolve<IPushDemoNotificationActionService>());
    
            INotificationRegistrationService NotificationRegistrationService
                => _notificationRegistrationService ??
                    (_notificationRegistrationService =
                    ServiceContainer.Resolve<INotificationRegistrationService>());
    
            IDeviceInstallationService DeviceInstallationService
                => _deviceInstallationService ??
                    (_deviceInstallationService =
                    ServiceContainer.Resolve<IDeviceInstallationService>());
    
            public override void OnNewToken(string token)
            {
                DeviceInstallationService.Token = token;
    
                NotificationRegistrationService.RefreshRegistrationAsync()
                    .ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; });
            }
    
            public override void OnMessageReceived(RemoteMessage message)
            {
                if(message.Data.TryGetValue("action", out var messageAction))
                    NotificationActionService.TriggerAction(messageAction);
            }
        }
    }
    
  5. MainActivity.cs'da dosyanın en üstüne aşağıdaki ad alanlarının eklendiğinden emin olun.

    using System;
    using Android.App;
    using Android.Content;
    using Android.Content.PM;
    using Android.OS;
    using Android.Runtime;
    using Firebase.Iid;
    using PushDemo.Droid.Services;
    using PushDemo.Services;
    
  6. MainActivity.cs'da, Açıldığında MainActivity'in yeniden oluşturulmaması için LaunchModedeğerini SingleTop olarak ayarlayın.

    [Activity(
        Label = "PushDemo",
        LaunchMode = LaunchMode.SingleTop,
        Icon = "@mipmap/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    
  7. IPushNotificationActionService ve IDeviceInstallationService uygulamalarına başvuruyu depolamak için özel özellikler ve karşılık gelen yedekleme alanları ekleyin.

    IPushDemoNotificationActionService _notificationActionService;
    IDeviceInstallationService _deviceInstallationService;
    
    IPushDemoNotificationActionService NotificationActionService
        => _notificationActionService ??
            (_notificationActionService =
            ServiceContainer.Resolve<IPushDemoNotificationActionService>());
    
    IDeviceInstallationService DeviceInstallationService
        => _deviceInstallationService ??
            (_deviceInstallationService =
            ServiceContainer.Resolve<IDeviceInstallationService>());
    
  8. Firebase belirtecini almak ve depolamak için IOnSuccessListener arabirimini uygulayın.

    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, Android.Gms.Tasks.IOnSuccessListener
    {
        ...
    
        public void OnSuccess(Java.Lang.Object result)
            => DeviceInstallationService.Token =
                result.Class.GetMethod("getToken").Invoke(result).ToString();
    }
    
  9. Belirli bir Intent'inaction adlı fazladan bir değere sahip olup olmadığını denetleyecek ProcessNotificationActions adlı yeni bir yöntem ekleyin. IPushDemoNotificationActionService uygulamasını kullanarak bu eylemi koşullu olarak tetikleyin.

    void ProcessNotificationActions(Intent intent)
    {
        try
        {
            if (intent?.HasExtra("action") == true)
            {
                var action = intent.GetStringExtra("action");
    
                if (!string.IsNullOrEmpty(action))
                    NotificationActionService.TriggerAction(action);
            }
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message);
        }
    }
    
  10. ProcessNotificationActions yöntemini çağırmak için OnNewIntent yöntemini geçersiz kılın.

    protected override void OnNewIntent(Intent intent)
    {
        base.OnNewIntent(intent);
        ProcessNotificationActions(intent);
    }
    

    Not

    Etkinlik için LaunchModeSingleTop olarak ayarlandığından, Var olan Etkinlik örneğine OnCreate yöntemi yerine OnNewIntent yöntemi aracılığıyla bir Amaç gönderilir ve bu nedenle hem OnCreate hem de OnNewIntent yöntemlerinde gelen bir amacı işlemeniz gerekir.

  11. OnCreate yönteminiBootstrap.Begin, IDeviceInstallationService'in platformabase.OnCreate özgü uygulamasını geçirme çağrısından hemen sonra çağıracak şekilde güncelleştirin.

    Bootstrap.Begin(() => new DeviceInstallationService());
    
  12. Aynı yöntemde, çağrısından hemen sonra FirebaseApp örneğinde GetInstanceId öğesini koşullu olarak çağırın Bootstrap.Beginve MainActivity öğesini IOnSuccessListener olarak ekleyin.

    if (DeviceInstallationService.NotificationsSupported)
    {
        FirebaseInstanceId.GetInstance(Firebase.FirebaseApp.Instance)
            .GetInstanceId()
            .AddOnSuccessListener(this);
    }
    
  13. Hala OnCreate'ta, geçerli Amaç'ı geçirmek için LoadApplication çağrıdan hemen sonra ProcessNotificationActions'ı çağırın.

    ...
    
    LoadApplication(new App());
    
    ProcessNotificationActions(Intent);
    

Not

Anında iletme bildirimleri almaya devam etmek için uygulamayı her çalıştırdığınızda yeniden kaydetmeniz ve hata ayıklama oturumundan durdurmanız gerekir.

Yerel iOS projesini anında iletme bildirimleri için yapılandırma

Info.plist ve Entitlements.plist'i yapılandırma

  1. Visual Studio> Tercihleri'nde Apple Geliştirici Hesabınızda oturum açtığınızdan emin olun...>Yayımlama>Apple Geliştirici Hesapları ve uygun Sertifika ve Sağlama Profili indirildi. Bu varlıkları önceki adımların bir parçası olarak oluşturmuş olmanız gerekirdi.

  2. PushDemo.iOS'taInfo.plist dosyasını açın ve BundleIdentifier'ınApple Geliştirici Portalı'nda ilgili sağlama profili için kullanılan değerle eşleştiğinden emin olun. BundleIdentifier biçimindeydicom.<organization>.PushDemo.

  3. Aynı dosyada En düşük sistem sürümünü13.0 olarak ayarlayın.

    Not

    Bu öğreticinin amaçları doğrultusunda yalnızca iOS 13.0 ve üzerini çalıştıran cihazlar desteklenir, ancak eski sürümleri çalıştıran cihazları destekleyecek şekilde genişletebilirsiniz.

  4. PushDemo.iOS için Proje Seçenekleri'ni açın (projeye çift tıklayın).

  5. Proje Seçenekleri'nde, Derleme > iOS Paket İmzalama'nın altında Ekip altında Geliştirici hesabınızın seçili olduğundan emin olun. Ardından" İmzalamayı otomatik olarak yönet" seçeneğinin belirlendiğinden ve İmzalama Sertifikanızın ve Sağlama Profilinizin otomatik olarak seçildiğinden emin olun.

    Not

    İmzalama Sertifikanız ve Sağlama Profiliniz otomatik olarak seçilmediyse, El ile Sağlama'yı seçin, ardından Paket İmzalama Seçenekleri'ne tıklayın. Ekibinizinİmzalama Kimliği için seçildiğinden ve Hem Hata Ayıklama hem de Yayın yapılandırmaları için Sağlama Profili için PushDemo'ya özgü sağlama profilinizin seçildiğinden emin olun ve her iki durumda da Platform için iPhone'un seçili olduğundan emin olun.

  6. PushDemo.iOS'taEntitlements.plist dosyasını açın ve Yetkilendirmeler sekmesinde görüntülendiğinde Anında İletme Bildirimlerini Etkinleştir seçeneğinin işaretli olduğundan emin olun. Ardından, Kaynak sekmesinde görüntülendiğinde APS Ortamı ayarının geliştirme olarak ayarlandığından emin olun.

iOS için anında iletme bildirimlerini işleme

  1. Denetim + PushDemo.iOS projesine tıklayın, Eklemenüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Hizmetleri Kullanarak Ekle'ye tıklayın.

  2. Denetim + Hizmetler klasörüne tıklayın, ardından Eklemenüsünden Yeni Dosya... öğesini seçin.

  3. Genel>Boş Sınıf'ı seçin, Ad için DeviceInstallationService.cs girin ve ardından Aşağıdaki uygulamayı ekleyen Yeni'ye tıklayın.

    using System;
    using PushDemo.Models;
    using PushDemo.Services;
    using UIKit;
    
    namespace PushDemo.iOS.Services
    {
        public class DeviceInstallationService : IDeviceInstallationService
        {
            const int SupportedVersionMajor = 13;
            const int SupportedVersionMinor = 0;
    
            public string Token { get; set; }
    
            public bool NotificationsSupported
                => UIDevice.CurrentDevice.CheckSystemVersion(SupportedVersionMajor, SupportedVersionMinor);
    
            public string GetDeviceId()
                => UIDevice.CurrentDevice.IdentifierForVendor.ToString();
    
            public DeviceInstallation GetDeviceInstallation(params string[] tags)
            {
                if (!NotificationsSupported)
                    throw new Exception(GetNotificationsSupportError());
    
                if (string.IsNullOrWhiteSpace(Token))
                    throw new Exception("Unable to resolve token for APNS");
    
                var installation = new DeviceInstallation
                {
                    InstallationId = GetDeviceId(),
                    Platform = "apns",
                    PushChannel = Token
                };
    
                installation.Tags.AddRange(tags);
    
                return installation;
            }
    
            string GetNotificationsSupportError()
            {
                if (!NotificationsSupported)
                    return $"This app only supports notifications on iOS {SupportedVersionMajor}.{SupportedVersionMinor} and above. You are running {UIDevice.CurrentDevice.SystemVersion}.";
    
                if (Token == null)
                    return $"This app can support notifications but you must enable this in your settings.";
    
    
                return "An error occurred preventing the use of push notifications";
            }
        }
    }
    

    Not

    Bu sınıf benzersiz bir kimlik ( UIDevice.IdentifierForVendor değerini kullanarak) ve bildirim hub'ı kayıt yükünü sağlar.

  4. PushDemo.iOS projesine Uzantılar adlı yeni bir klasör ekleyin ve ardından aşağıdaki uygulamayla bu klasöre NSDataExtensions.cs adlı boş bir Sınıf ekleyin.

    using System.Text;
    using Foundation;
    
    namespace PushDemo.iOS.Extensions
    {
        internal static class NSDataExtensions
        {
            internal static string ToHexString(this NSData data)
            {
                var bytes = data.ToArray();
    
                if (bytes == null)
                    return null;
    
                StringBuilder sb = new StringBuilder(bytes.Length * 2);
    
                foreach (byte b in bytes)
                    sb.AppendFormat("{0:x2}", b);
    
                return sb.ToString().ToUpperInvariant();
            }
        }
    }
    
  5. AppDelegate.cs'da dosyanın en üstüne aşağıdaki ad alanlarının eklendiğinden emin olun.

    using System;
    using System.Diagnostics;
    using System.Threading.Tasks;
    using Foundation;
    using PushDemo.iOS.Extensions;
    using PushDemo.iOS.Services;
    using PushDemo.Services;
    using UIKit;
    using UserNotifications;
    using Xamarin.Essentials;
    
  6. IPushDemoNotificationActionService, INotificationRegistrationService ve IDeviceInstallationService uygulamalarına başvuruyu depolamak için özel özellikleri ve bunların ilgili yedekleme alanlarını ekleyin.

    IPushDemoNotificationActionService _notificationActionService;
    INotificationRegistrationService _notificationRegistrationService;
    IDeviceInstallationService _deviceInstallationService;
    
    IPushDemoNotificationActionService NotificationActionService
        => _notificationActionService ??
            (_notificationActionService =
            ServiceContainer.Resolve<IPushDemoNotificationActionService>());
    
    INotificationRegistrationService NotificationRegistrationService
        => _notificationRegistrationService ??
            (_notificationRegistrationService =
            ServiceContainer.Resolve<INotificationRegistrationService>());
    
    IDeviceInstallationService DeviceInstallationService
        => _deviceInstallationService ??
            (_deviceInstallationService =
            ServiceContainer.Resolve<IDeviceInstallationService>());
    
  7. Kullanıcı bildirim ayarlarını kaydetmek için RegisterForRemoteNotifications yöntemini ve ardından APNS ile uzaktan bildirimler için ekleyin.

    void RegisterForRemoteNotifications()
    {
        MainThread.BeginInvokeOnMainThread(() =>
        {
            var pushSettings = UIUserNotificationSettings.GetSettingsForTypes(
                UIUserNotificationType.Alert |
                UIUserNotificationType.Badge |
                UIUserNotificationType.Sound,
                new NSSet());
    
            UIApplication.SharedApplication.RegisterUserNotificationSettings(pushSettings);
            UIApplication.SharedApplication.RegisterForRemoteNotifications();
        });
    }
    
  8. Özellik değerini ayarlamak IDeviceInstallationService.Token için CompleteRegistrationAsync yöntemini ekleyin. Kaydı yenileyin ve cihaz belirtecini en son depolandığından beri güncelleştirildiyse önbelleğe alın.

    Task CompleteRegistrationAsync(NSData deviceToken)
    {
        DeviceInstallationService.Token = deviceToken.ToHexString();
        return NotificationRegistrationService.RefreshRegistrationAsync();
    }
    
  9. NSDictionary bildirim verilerini işlemek ve NotificationActionService.TriggerAction'ı koşullu olarak çağırmak için ProcessNotificationActions yöntemini ekleyin.

    void ProcessNotificationActions(NSDictionary userInfo)
    {
        if (userInfo == null)
            return;
    
        try
        {
            var actionValue = userInfo.ObjectForKey(new NSString("action")) as NSString;
    
            if (!string.IsNullOrWhiteSpace(actionValue?.Description))
                NotificationActionService.TriggerAction(actionValue.Description);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }
    
  10. DeviceToken bağımsız değişkenini CompleteRegistrationAsync yöntemine geçirerek RegisteredForRemoteNotifications yöntemini geçersiz kılın.

    public override void RegisteredForRemoteNotifications(
        UIApplication application,
        NSData deviceToken)
        => CompleteRegistrationAsync(deviceToken).ContinueWith((task)
            => { if (task.IsFaulted) throw task.Exception; });
    
  11. UserInfo bağımsız değişkenini ProcessNotificationActions yöntemine geçirerek ReceivedRemoteNotification yöntemini geçersiz kılın.

    public override void ReceivedRemoteNotification(
        UIApplication application,
        NSDictionary userInfo)
        => ProcessNotificationActions(userInfo);
    
  12. Hatayı günlüğe kaydetmek için FailedToRegisterForRemoteNotifications yöntemini geçersiz kılın.

    public override void FailedToRegisterForRemoteNotifications(
        UIApplication application,
        NSError error)
        => Debug.WriteLine(error.Description);
    

    Not

    Bu çok yer tutucudur. Üretim senaryoları için düzgün günlük kaydı ve hata işleme uygulamak isteyeceksiniz.

  13. IDeviceInstallationService'in platforma Bootstrap.Begin özgü uygulamasını geçirmek için çağrısından hemen sonra çağrısı yapmak için Forms.InitFinishedLaunching yöntemini güncelleştirin.

    Bootstrap.Begin(() => new DeviceInstallationService());
    
  14. Aynı yöntemde koşullu olarak yetkilendirme isteyin ve hemen sonra Bootstrap.Beginuzaktan bildirimlere kaydolun.

    if (DeviceInstallationService.NotificationsSupported)
    {
        UNUserNotificationCenter.Current.RequestAuthorization(
                UNAuthorizationOptions.Alert |
                UNAuthorizationOptions.Badge |
                UNAuthorizationOptions.Sound,
                (approvalGranted, error) =>
                {
                    if (approvalGranted && error == null)
                        RegisterForRemoteNotifications();
                });
    }
    
  15. Hala FinishedLaunching'de, seçenekler bağımsız değişkeni uiApplication.LaunchOptionsRemoteNotificationKey değerinin sonuçta elde edilen userInfo nesnesini geçirmesini içeriyorsa çağrısından LoadApplication hemen sonra ProcessNotificationActions öğesini çağırın.

    using (var userInfo = options?.ObjectForKey(
        UIApplication.LaunchOptionsRemoteNotificationKey) as NSDictionary)
            ProcessNotificationActions(userInfo);
    

Çözümü test etme

Artık arka uç hizmeti aracılığıyla bildirim göndermeyi test edebilirsiniz.

Test bildirimi gönderme

  1. Postman'de yeni bir sekme açın.

  2. İsteği POST olarak ayarlayın ve aşağıdaki adresi girin:

    https://<app_name>.azurewebsites.net/api/notifications/requests
    
  3. İSTEMCIlerin kimliğini doğrulama bölümünü API Anahtarı kullanarak tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırdığınızdan emin olun.

    Anahtar Değer
    apikey <your_api_key>
  4. Gövde için ham seçeneği belirleyin, ardından biçim seçenekleri listesinden JSON'u seçin ve ardından bazı yer tutucu JSON içeriği ekleyin:

    {
        "text": "Message from Postman!",
        "action": "action_a"
    }
    
  5. Pencerenin sağ üst kısmındaki Kaydet düğmesinin altındaki Kod düğmesini seçin. İstek , HTML için görüntülendiğinde aşağıdaki örneğe benzer görünmelidir ( apikey üst bilgisi ekleyip eklemediğinize bağlı olarak):

    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. PushDemo uygulamasını hedef platformlardan birinde veya her ikisinde (Android ve iOS) çalıştırın.

    Not

    Android'de test ediyorsanız Hata Ayıklama'da çalışmadığınızdan emin olun veya uygulama çalıştırılarak dağıtıldıysa, uygulamayı kapatıp başlatıcıdan yeniden başlatmaya zorlayın.

  7. PushDemo uygulamasında Kaydet düğmesine dokunun.

  8. Postman'e geri dönün, Kod Parçacıkları Oluştur penceresini kapatın (henüz yapmadıysanız) ardından Gönder düğmesine tıklayın.

  9. Postman'de200 Tamam yanıtı aldığınızı ve uygulamada ActionA eyleminin alındığını gösteren uyarının görüntülendiğini doğrulayın.

  10. PushDemo uygulamasını kapatın, ardından Postman'daGönder düğmesine yeniden tıklayın.

  11. Postman'deyeniden 200 Ok yanıtı aldığınızdan doğrulayın. PushDemo uygulamasının bildirim alanında doğru iletiyle bir bildirimin göründüğünü doğrulayın.

  12. Uygulamayı açtığını ve EylemA eylemi alındı uyarısını görüntülediğini onaylamak için bildirime dokunun.

  13. Postman'e geri döndüğünüzde, eylemdeğeri içinaction_a yerine action_b belirten sessiz bir bildirim göndermek için önceki istek gövdesini değiştirin.

    {
        "action": "action_b",
        "silent": true
    }
    
  14. Uygulama hala açıkken Postman'deGönder düğmesine tıklayın.

  15. Postman'de200 Tamam yanıtı aldığınızı ve uyarının uygulamada ActionA eylemi alındı yerine Alınan EylemB eylemini gösteren görüntülendiğini doğrulayın.

  16. PushDemo uygulamasını kapatın, ardından Postman'daGönder düğmesine yeniden tıklayın.

  17. Postman'de200 Ok yanıtı aldığınızdan ve sessiz bildirimin bildirim alanında görünmediğini doğrulayın.

Sorun giderme

Arka uç hizmetinden yanıt yok

Yerel olarak test ederken arka uç hizmetinin çalıştığından ve doğru bağlantı noktasını kullandığından emin olun.

Azure API Uygulaması'na karşı test ediyorsanız hizmetin çalıştığını ve dağıtıldığını ve hatasız olarak başlatıldığını denetleyin.

İstemci aracılığıyla test ederken Postman'da veya mobil uygulama yapılandırmasında temel adresi doğru belirttiğinizden emin olun. Temel adres, yerel olarak https://<api_name>.azurewebsites.net/ test ederken veya https://localhost:5001/ şeklinde olmalıdır.

Hata ayıklama oturumunu başlattıktan veya durdurduktan sonra Android'de bildirim alınmıyor

Hata ayıklama oturumunu başlattıktan veya durdurduktan sonra yeniden kaydolduğunuzdan emin olun. Hata ayıklayıcısı yeni bir Firebase belirtecinin oluşturulmasına neden olur. Bildirim hub'ı yüklemesinin de güncelleştirilmiş olması gerekir.

Arka uç hizmetinden 401 durum kodu alma

apikey istek üst bilgisini ayarladığınızı ve bu değerin arka uç hizmeti için yapılandırdığınız değerle eşleşip eşleşmediğini doğrulayın.

Yerel olarak test ederken bu hatayı alırsanız, istemci yapılandırmasında tanımladığınız anahtar değerinin API tarafından kullanılan Authentication:ApiKey kullanıcı ayarı değeriyle eşleştiğinden emin olun.

Bir API Uygulaması ile test ediyorsanız, istemci yapılandırma dosyasındaki anahtar değerinin API Uygulamasında kullandığınız Authentication:ApiKey uygulama ayarıyla eşleştiğinden emin olun.

Not

Arka uç hizmetini dağıttıktan sonra bu ayarı oluşturduysanız veya değiştirdiyseniz, etkili olması için hizmeti yeniden başlatmanız gerekir.

İSTEMCIleri API Anahtarı kullanarak doğrulama bölümünü tamamlamamayı seçtiyseniz, NotificationsController sınıfına Authorize özniteliğini uygulamadığınızdan emin olun.

Arka uç hizmetinden 404 durum kodu alma

Uç noktanın ve HTTP istek yönteminin doğru olduğunu doğrulayın. Örneğin uç noktaların şu şekilde olması gerekir:

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

Veya yerel olarak test ederken:

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

İstemci uygulamasında temel adresi belirtirken ile sona erdiğinden /emin olun. Temel adres, yerel olarak https://<api_name>.azurewebsites.net/ test ederken veya https://localhost:5001/ şeklinde olmalıdır.

Kaydedilemiyor ve bildirim hub'ı hata iletisi görüntüleniyor

Test cihazının ağ bağlantısı olduğunu doğrulayın. Ardından, HttpResponse içindeki StatusCode özellik değerini incelemek için bir kesme noktası ayarlayarak Http yanıt durum kodunu belirleyin.

Durum koduna göre uygun olduğunda önceki sorun giderme önerilerini gözden geçirin.

İlgili API için bu özel durum kodlarını döndüren satırlarda bir kesme noktası ayarlayın. Ardından yerel olarak hata ayıklarken arka uç hizmetini çağırmayı deneyin.

Uygun yükü kullanarak Postman aracılığıyla arka uç hizmetinin beklendiği gibi çalıştığını doğrulayın. Söz konusu platform için istemci kodu tarafından oluşturulan gerçek yükü kullanın.

Hiçbir adımın kaçırılmadığından emin olmak için platforma özgü yapılandırma bölümlerini gözden geçirin. Uygun platform için ve token değişkenleri için installation id uygun değerlerin çözümlenip çözümlenmediğini denetleyin.

Cihaz kimliği çözümlenemiyor hata iletisi görüntüleniyor

Hiçbir adımın kaçırılmadığından emin olmak için platforma özgü yapılandırma bölümlerini gözden geçirin.

Sonraki adımlar

Artık bir arka uç hizmeti aracılığıyla bir bildirim hub'ına bağlı temel bir Xamarin.Forms uygulamasına sahip olmanız ve bildirim gönderip alabilmeniz gerekir.

Büyük olasılıkla bu öğreticide kullanılan örneği kendi senaryonuza uyacak şekilde uyarlamanız gerekir. Daha güçlü hata işleme, yeniden deneme mantığı ve günlüğe kaydetme de önerilir.

Visual Studio App Center , sorun gidermeye yardımcı olmak için analiz ve tanılama sağlayan mobil uygulamalara hızlıca eklenebilir.