Aracılığıyla paylaş


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

Örnek İndirme Örnek indirme

Bu öğreticide, android ve iOShedefleyen Xamarin.Forms uygulamasına anında iletme bildirimleri göndermek için Azure Notification Hubs kullanacaksınız.

ASP.NET Core Web API arka ucu, en son ve en iyi Yükleme yaklaşımı kullanılarak istemci için cihaz kayıt 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 ayrıntılı bilgi Uygulama arka uç belgelerinden kaydolma bölümünde verilmiştir.

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

Önkoşullar

Takip etmek için şunlar gerekir:

  • Kaynakları oluşturabileceğiniz ve yönetebileceğiniz 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 da .NET ile ASP.NET ve web geliştirme iş yükleri yüklü Mobil geliştirmesi olmalıdır.
  • Uygulamayı Android (fiziksel veya öykünücü cihazlar) veya iOS (yalnızca fiziksel cihazlar) üzerinde çalıştırma olanağı.

Android için sahip olmanız gerekenler:

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

iOS için sahip olmanız gerekenler:

  • Etkin bir Apple Geliştirici Hesabı.
  • geliştirici hesabınıza(iOS 13.0 ve üzerini çalıştıran) kayıtlı fiziksel bir iOS cihazı.
  • anahtarlığınıza yüklenmiş bir .p12geliştirme sertifikasıfiziksel bir cihazda uygulama çalıştırmanıza olanak sağlar.

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 çalıştırmanız gerekmez.

Bu ilk ilkeler örneğindeki adımları önceden deneyim olmadan izleyebilirsiniz. Ancak, aşağıdaki yönlerden bilgi sahibi olmanın avantajını elde edersiniz.

Önemli

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

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

Bu bölümde, Firebase Cloud Messaging (FCM) ve Apple Anında İletme Bildirimi Hizmetleri (APNS)ayarlayın. 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 konsolundaoturum açın. Proje adı olarak PushDemo giren yeni bir Firebase projesi oluşturun.

    Not

    Sizin için benzersiz bir ad oluşturulur. Varsayılan olarak bu, sağladığınız adın küçük harfli bir değişkenini ve tireyle ayrılmış olarak oluşturulan bir sayıyı içerir. Hala 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 ekleme sayfasında aşağıdaki adımları izleyin.

    1. Android paket 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 İleriseçin.

      İndirme google-services.json

    4. sonrakiseçin.

    5. Konsola devam 'ı seçin

      Not

      Konsola devam et düğmesi etkinleştirilmemişse, yüklemeyi doğrulama onay , Bu adımı atla'ı seçin.

  4. Firebase konsolunda projenizin dişlisini seçin. Ardından proje ayarlarıseçin.

    Proje Ayarlarını Seç

    Not

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

  5. Üstteki Cloud Messaging sekmesine geçin. daha sonra kullanmak üzere Server anahtarı kopyalayın ve kaydedin. Bildirim hub'ınızı yapılandırmak için bu değeri kullanırsınız.

    Sunucu anahtarını kopyalama

iOS uygulamanızı anında iletme bildirimleri için 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 kaydolmadıysanız Apple Geliştirici Merkezi'ndeki iOS Sağlama Portalı göz atın. Apple Kimliğiniz ile portalda oturum açın, Sertifikalar, Tanımlayıcılar & Profilleradresine gidin ve ardından Tanımlayıcılaröğesini seçin. Yeni bir uygulama kaydetmek için +'e 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ındandevam seçin.

    iOS Sağlama Portalı kayıt yeni kimlik sayfası

  3. Yeni uygulamanız için aşağıdaki üç değeri güncelleştirin ve ardından devamseçin:

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

    • Paket Kimliği: com formun Paket Kimliğini girin.<organization_identifier>. Uygulama Dağıtım Kılavuzubelirtildiği gibi<product_name>. Aşağıdaki ekran görüntüsünde, mobcat değeri kuruluş tanımlayıcısı olarak kullanılır ve ürün adı olarak PushDemo değeri kullanılır.

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

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

      Yeni bir Uygulama Kimliği kaydetmek için Formu

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

      Yeni Uygulama Kimliğini Onayla

      Kaydet seçtikten sonra, yeni Uygulama Kimliğini Sertifikaları, Tanımlayıcılar & Profilleri sayfasında satır öğesi olarak görürsünüz.

  4. Sertifikaları, Tanımlayıcılar & Profilleri sayfasında, Tanımlayıcılaraltında, oluşturduğunuz Uygulama Kimliği satır öğesini bulun. Ardından, Uygulama Kimliği Yapılandırmanızı düzenle 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 Bildirimi Hizmetleri (APNS) çalışmasını sağlamak için bir sertifika gereklidir ve iki yoldan biriyle sağlanabilir:

  1. Doğrudan Notification Hub'e 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)

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

SEÇENEK 1: Doğrudan Notification Hub'a yüklenebilecek 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şimiseçin, sertifika yardımcısıgenişletin ve Sertifika Yetkilisinden Sertifika İsteseçeneğini belirleyin.

    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 Dünya Çapında 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ı E-posta Adresiniziseçin, Ortak Ad değerinizi girin, diskkaydedilen belirttiğinizden emin olun ve ardından Devamseçeneğini belirleyin. ca e-posta adresi gerekli olmadığından boş bırakın.

    beklenen sertifika bilgilerini

  4. Farklı Kaydet Sertifika İmzalama İsteği (CSR) dosyası için bir ad girin, Wherekonumundaki konumu seçin ve ardından Kaydetöğesini seçin.

    Sertifika için bir dosya adı seçin

    Bu eylem, CSR dosyasını seçili konuma kaydeder. Varsayılan konum Desktop'dir. Dosya için seçilen konumu unutmayın.

  5. iOS Sağlama PortalıSertifikalar, Tanımlayıcılar & Profilleri sayfasına dönün, ekranı aşağı kaydırarak işaretli Anında İletme Bildirimleri seçeneğine gidin 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ındaki 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. DosyaSeç'i seçin, CSR dosyasınıkaydettiğiniz konuma gidin ve yüklemek için sertifika adına çift tıklayın. Ardındandevam seçin.

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

    Oluşturulan sertifika indirme sayfası

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

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

    Not

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

  9. İndirilen anında iletme sertifikasına 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 sertifika gösteren Anahtarlık erişim sertifikaları listesini

    Not

    Sertifikanızdaki ad farklı olsa da, ad apple geliştirme iOS anında iletme hizmetleri ön ekinde yer alır ve onunla ilişkili uygun paket tanımlayıcısına sahip olur.

  10. Anahtarlık Erişimi'nde Denetimi + Sertifikalar kategorisinde oluşturduğunuz yeni anında iletme sertifikasında tıklayın. Dışarı Aktar'ı seçin, dosyayı adlandırın, p12 biçimini seçin ve ardındankaydet'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'e tıklayın. Dışarı aktarılan p12 sertifikasının dosya adını ve konumunu not edin. BUNLAR, APN'lerle kimlik doğrulamasını etkinleştirmek için kullanılır.

    Not

    p12 dosya adınız ve konumunuz bu öğreticide görüntülenenden 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 & Profiller,Anahtarlarıöğesine tıklayın.

    Not

    APNSiçin yapılandırılmış bir anahtarınız varsa, indirdiğiniz p8 sertifikasını oluşturulduktan hemen sonra yeniden kullanabilirsiniz. Bu durumda, 3 ile 5arasında adımları yoksayabilirsiniz.

  3. Yeni bir anahtar oluşturmak için düğmesine (veya Anahtar oluştur düğmesi ) 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 tıklayın ve ardından sonraki ekranda kaydet'i .

  5. İndir'e tıklayın ve p8 dosyasını (AuthKey_ön ekli) güvenli bir yerel dizine taşıyın ve ardından bittitı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, 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 Codegibi uygun bir uygulamada açın. Anahtar değerini not edin (-----BEGIN PRIVATE KEY----- ile -----END PRIVATE KEY-----arasında).

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

    Not

    Bu, daha sonra Bildirim Hub'ınıyapılandırmak için kullanılacak belirteci değeridir.

Bu adımların sonunda, bildirim hub'ınızı APNS bilgileriyle yapılandırmadaha sonra 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ıdönün, Sertifikalar, Tanımlayıcılar & Profilleriöğesini seçin, sol 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 altında iOS Uygulama Geliştirme seçin ve ardındandevam 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 Et'i seçin.

    Uygulama Kimliği seçin

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

    Not

    Bu sertifika,önceki adımda oluşturduğunuz gönderme sertifikası değildir. Bu, geliştirme sertifikanızdır. Yoksa, bu öğretici için bir önkoşul olduğundan bunu oluşturmanız gerekir. Geliştirici sertifikaları, Xcode aracılığıyla veya Visual Studioaracılığıyla Apple Geliştirici Portalıoluşturulabilir.

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

  6. Sertifikaları seçin penceresinde, oluşturduğunuz geliştirme sertifikasını seçin. Ardındandevam seçin.

  7. Ardından, test için kullanılacak cihazları seçin ve Devamseçeneğini belirleyin.

  8. Son olarak, Sağlama Profili Adıiçinde profil için bir ad seçin ve Oluşturseçin.

    Sağlama profili adı seçin

  9. Yeni sağlama profili oluşturulduğunda İndirseç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 APNSile 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. azureoturum açın.

  2. Kaynakoluştur'a tıklayın, bildirim hub'ıarayın ve seçin, ardındanoluştur'a tıklayın.

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

    TEMEL AYRINTILAR

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

    AD ALANı AYRıNTıLARı

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

    Not

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

    BİlDİrİm HUB'I AYRINTILARI

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

    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ızagidin.

  6. Listeden Erişim İlkeleri seçin (yönetaltı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 Hizmetlerialtında, Apple seçin ve 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

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

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

  1. sertifikaseçin.

  2. Dosya simgesini seçin.

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

  4. Gerekirse doğru parolayı belirtin.

  5. Korumalı alan modunu seçin.

  6. Kaydetöğesini seçin.

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

  1. belirteçseçin.

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

    • Anahtar Kimliği
    • Paket Kimliği
    • Ekip Kimliği
    • Belirteci
  3. korumalı alanseçin.

  4. Kaydetöğesini seçin.

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

  1. Soldaki menünün Ayarlar bölümünde Google (GCM/FCM) seçin.
  2. Google Firebase Console 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 kayıt işlemek ve Xamarin.Forms mobil uygulamasına bildirim göndermek için arka uç ASP.NET Core Web API'sini oluşturacaksınız.

Web projesi oluşturma

  1. Visual Studio'nde DosyaYeni Çözümseçin.

  2. sonraki.NET CoreAppASP.NET CoreAPI'sini seçin.

  3. yeni ASP.NET Core Web API'nizi yapılandırma .NET Core 3.1hedef çerçeve seçin.

  4. Proje Adı için PushDemoApi girin veOluştur'u seçin.

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

    Not

    Şablonlu uygulama, launchUrlolarak WeatherForecastController kullanacak şekilde yapılandırılmıştır. Bu, Özellikler>launchSettings.jsonayarlanı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 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ükleme ve güvenme istendiğinde Evet 'e tıklayın ve anahtarlığınızın parolasını girin.

  6. Denetleyicileri klasörünü genişletin ve WeatherForecastController.cssilin.

  7. WeatherForecast.cssilin.

  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 sonlanmamasını sağlar. Terminal'i açın 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 edindiniz. Aksi takdirde, bunları azureiçinde arayabilirsiniz.

    NotificationHub:Name:
    Genel Bakışüst kısmındaki Temel Parçalar özetinde Ad bölümüne bakın.

    NotificationHub:ConnectionString:
    Erişim İlkeleri'nde DefaultFullSharedAccessSignature bakın

    Not

    Üretim senaryolarında, bağlantı dizesini 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 eklenecektir.

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ına uygun olacaktır. API anahtarı, ASP.NET Ara Yazılımaracı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 yer tutucunuzla değiştirmeniz ve not edin.

  2. DenetimiPushDemoApi projesinde tıklayın, Ekle menüsünden Yeni Klasör seçin, sonra Kimlik Doğrulaması kullanarak Ekle'ye Klasör Adıolarak tıklayın.

  3. DenetimKimlik Doğrulaması klasöründeki tıklayın, ardından Ekle menüsünden Yeni Dosya... seçin.

  4. GenelBoş Sınıfseçin, Adıiçin ApiKeyAuthOptions.cs girin, ardından yeni tıklayın ve 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. Kimlik Doğrulaması klasörüne ApiKeyAuthHandler.csadlı başka bir Boş Sınıf ekleyin ve 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.csadlı Kimlik Doğrulaması klasörüne başka 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 daha kolay takip edilebilir hale getirir.

  7. Startup.csiçinde, hizmetlerine yapılan çağrının altındaki API Anahtarı kimlik doğrulamasını yapılandırmak için ConfigureServices yöntemini güncelleştirin. 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.csiçinde, uygulamanın IApplicationBuilderUseAuthentication çağırmak ve UseAuthorization uzantısı yöntemlerini için Yapılandırma yöntemini güncelleştirin. Bu yöntemlerin UseRouting sonra ve uygulamadan önce çağrıldığından emin olun.Uç Noktaları kullanın.

    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). Bu, kimlik doğrulaması yapılan kullanıcılara bağlı 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 Inversion of Control (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ş durumdadır. Hizmet kaydedilir ve uygun bir soyutlama aracılığıyla kullanılabilir hale getirilir.

  1. denetimBağımlılıklar klasöründe tıklayın, ardından NuGet Paketlerini Yönet...seçin.

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

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

  4. DenetimiPushDemoApi projesinde tıklayın, Ekle menüsünden Yeni Klasör seçin, ardından Modelleri kullanarak ekle Klasör Adı olaraköğesine tıklayın.

  5. DenetimiModelleri klasöründeki tıklayın, ardından Ekle menüsünden Yeni Dosya... seçin.

  6. GenelBoş Sınıföğesini seçin, Adıiçin PushTemplates.cs girin, ardından yeni tıklayın ve 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ükler, 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. Modelleri klasörüne DeviceInstallation.csadlı 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. Modelleri klasörüne NotificationRequest.csadlı başka bir Boş Sınıf ekleyin ve 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. Modelleri klasörüne NotificationHubOptions.csadlı başka bir Boş Sınıf ekleyin ve 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 Servicesadlı yeni bir klasör ekleyin.

  11. Services klasörüne INotificationService.csadlı Boş 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.csadlı Boş Sınıf ekleyin ve 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.csConfigureServices yöntemini güncelleştirerek NotificationHubsServiceINotificationServiceuygulamasının 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. DenetimDenetleyicileri klasöründeki tıklayın, ardından Ekle menüsünden Yeni Dosya... seçin.

  2. Adıiçin ASP.NET CoreWeb API Denetleyicisi SınıfıNotificationsController girin ve yenitıklayın.

    Not

    Visual Studio 2019ile takip ediyorsanız okuma/yazma eylemleri şablonu içeren API Denetleyicisi'ni 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 türetilen ve ApiController özniteliğiyle süslenen şekilde güncelleştirin.

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

    Not

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

  5. API Anahtarı kullanarak Kimlik Doğrulaması istemcilerini tamamlamayı seçtiyseniz, NotificationsController Authorize özniteliğiyle de süslemeniz gerekir.

    [Authorize]
    
  6. INotificationService'nin 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), RegistrationsControllerRoute özniteliğinde belirtilen URL ile eşleşecek şekilde launchUrlweatherforecast olan api/notifications değiştirin.

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

    Not

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

  9. Yeni bir Postman sekmesinde, isteği GETolarak ayarlayın. applicationUrl <> yer tutucusunu Özellikler>launchSettings.jsonbulunan https applicationUrl ile değiştirerek aşağıdaki adresi girin.

    <applicationUrl>/api/notifications
    

    Not

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

  10. API Anahtarı kullanarak istemcilerin kimliğini doğrulama 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 sertifika doğrulaması uyarısı alırsanız, Ayarları'nde Postman ayarı SSL sertifikası doğrulama isteği ayarını kapatabilirsiniz.

  12. NotificationsController.cs ş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'nde bir API Uygulaması oluşturacaksınız.

  1. Azure portalındaoturum açın.

  2. Kaynakoluştur'a tıklayın, ardından API Uygulaması'ni arayıp seçin, ardındanOluştur'u tıklayın.

  3. Aşağıdaki alanları güncelleştirin, ardındanoluştur'u tıklayın.

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

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

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

    App Service Planı/Konumu:
    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ışüst kısmındaki Essentials özetindeki URL özelliğini not edin. Bu URL, bu öğreticinin ilerleyen bölümlerinde kullanılacak arka uç uç nokta.

    Not

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

  6. Listeden Yapılandırma seçin (ayarlaraltında).

  7. Aşağıdaki ayarların her biri için, Adı ve Değergirmek için Yeni uygulama ayarı 'e tıklayın ve ardından tamamtı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 api anahtarı kullanarak istemcilerin kimliğini doğrulama tamamlamayı seçtiğinizde gereklidir. Üretim senaryoları için Azure KeyVaultgibi seçeneklere bakabilirsiniz. Bunlar, bu örnekte kolaylık sağlamak için uygulama ayarları olarak eklenmiştir.

  8. Tüm uygulama ayarları eklendikten sonraKaydet'e tıklayın ve ardındanDevam Et'i .

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'te yayımlama .

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

  2. Denetimi PushDemoApi projesini tıklayın ve ardından Yayımla menüsünden Azure'da Yayımla... seçin.

  3. İstenirse kimlik doğrulama akışını izleyin. API Uygulaması bölümünü oluşturmak önceki bölümde kullandığınız hesabı kullanın.

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

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

Yayımlanan API'yi doğrulama

  1. Postman yeni bir sekme açın, isteği PUT olarak ayarlayın ve aşağıdaki adresi girin. Yer tutucusunu önceki arka uç hizmeti 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 https://<app_name>.azurewebsites.net/ biçiminde olmalıdır

  2. API Anahtarı kullanarak istemcilerin kimliğini doğrulama 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övdeiçin ham seçeneğini belirleyin, ardından biçim seçenekleri listesinden JSON seçin ve ardından JSON içeriği yer tutucu ekleyin:

    {}
    
  4. Gönder'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, platformlar arası bir şekilde anında iletme bildirimleri 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 kayıt silme) 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ı yazmadan/girişlerin kaydını kaldırmadan gerçekleştirirsiniz. Ancak bu örnek, bu işlevselliğin daha kolay keşfedilmesine ve test edilmesine izin vermek için açık kullanıcı girişi gerektirir.

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

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

    Not

    Boş Formlar Uygulamanızı yapılandırma iletişim kutusunda, Kuruluş Tanımlayıcısı daha önce kullandığınız değerle eşleştiğinden ve hem Android hem de iOS hedeflerinin işaretlendiğinden emin olun.

  2. DenetimiPushDemo çözümünde tıklayın ve nuget paketlerini güncelleştirseçin.

  3. Denetimi + PushDemo çözümünde tıklayın ve ardından NuGet Paketlerini Yönet'i seçin...

  4. Newtonsoft.Json arayın ve işaretli olduğundan emin olun.

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

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

Platformlar arası bileşenleri uygulama

  1. DenetimiPushDemo projesinde tıklayın, Ekle menüsünden Yeni Klasör'seçin ve ardından Klasör Adıolarak Modelleri kullanarak ekle tıklayın.

  2. DenetimiModelleri klasöründeki tıklayın, ardından Ekle menüsünden Yeni Dosya... seçin.

  3. Genel>Boş Sınıfseçin, DeviceInstallation.csgirin 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ı Modelleri klasörüne Boş Numaralandırma ekleyin.

    namespace PushDemo.Models
    {
        public enum PushDemoAction
        {
            ActionA,
            ActionB
        }
    }
    
  5. PushDemo projesine Services adlı yeni bir klasör ekleyin ardından aşağıdaki uygulamayla ServiceContainer.cs adlı klasöre Boş 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.csadlı Services klasörüne Boş Arabirim ekleyin ve 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 daha sonra platforma özgü işlevselliği sağlamak ve arka uç hizmeti tarafından gereken DeviceInstallation bilgilerini için her hedef tarafından uygulanır ve önyüklenir.

  7. INotificationRegistrationService.csadlı Services klasörüne başka bir boş arabirim ekleyin ve 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. Services klasörüne INotificationActionService.csadlı başka bir boş arabirim ekleyin ve 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'dan türetilen IPushDemoNotificationActionService.cs adlı Services klasörüne Boş 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 kesin olarak türlenmiş bir şekilde tetiklenen eylemi tanımlamak için PushDemoAction numaralandırmasını kullanır.

  10. Services klasörüne aşağıdaki kodla INotificationRegistrationService uygulayarak NotificationRegistrationService.cs adlı Boş 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 Api Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir.

  11. IPushDemoNotificationActionService aşağıdaki kodla uygulayarak PushDemoNotificationActionService.cs adlı Services klasörüne Boş 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ş 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 sonraki adımda yapacaksınız.

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

  13. Bu kez aşağıdaki uygulamayla PushDemo projesine 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 gerekir. API Uygulaması URL'si https://<api_app_name>.azurewebsites.net/olmalıdır. Bu dosyanın işlenmesini önlemek için gitignore dosyanıza *.local_secrets.* eklemeyi unutmayın.

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

  14. Aşağıdaki uygulamayla Bootstrap.cs adlı PushDemo projesine Boş 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

    Begin yöntemi, uygulama IDeviceInstallationServiceplatforma özgü bir uygulama geçirmeyi başlattığında 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 tamamlamayı seçtiğinizde gereklidir.

Platformlar arası kullanıcı arabirimini uygulama

  1. PushDemo projesinde MainPage.xaml 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'de, 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 karşılık gelen Register/Deregister 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.csiçinde 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ün 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 makbuzunu ve yayılmasını göstermek için yapılır. Bunlar genellikle, bu durumda MainPage kök Sayfasıaracılığıyla uyarı görüntülemek yerine belirli bir görünüme gitme veya bazı verileri yenileme gibi sessizce işlenir.

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

Paket adını ve izinlerini doğrulama

  1. PushDemo.Androidbölümünde Proje Seçenekleri'ni açın ardından Derleme bölümünden Android Uygulama .

  2. Paketi adınınFirebase KonsoluPushDemo projesinde kullandığınız değerle eşleşip eşleşmediğini denetleyin. Paketi adıcom.<organization>.pushdemobiçimindeydi.

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

    Not

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

  4. internet ve READ_PHONE_STATE izinlerinin Gerekli izinleraltında etkinleştirildiğinden emin olun.

  5. Tamam tıklayın

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

  1. PushDemo.Androidbölümünde, DenetimPaketleri klasöründeki tıklayın ve ardından NuGet Paketlerini Yönet...seçin.

  2. Xamarin.GooglePlayServices.Base (Bodrumdeğil) arayın ve işaretli olduğundan emin olun.

  3. Xamarin.Firebase.Messaging arayın ve işaretli olduğundan emin olun.

  4. paket ekletıklayın, 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. Denetimi projesinde tıklayın, ardından Ekle menüsünden Var Olan Dosya... seçin.

  2. Firebase Konsolu'nda PushDemo projesini ayarlarken indirdiğiniz google-services.json dosyasını seçinAç'a tıklayın.

  3. İstendiğinde, Dosyayıdizinine kopyalama'yı seçin.

  4. Denetimi projesinin içinden google-services.json dosyasındaki tıklayın, ardından GoogleServicesJson Derleme Eylemiolarak ayarlandığından emin olun.

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

  1. Denetimi projesinde tıklayın, Ekle menüsünden Yeni Klasör seçin ve Klasör Adı olarak Hizmetleri kullanarak ekle'yetıklayın.

  2. DenetimiHizmetleri klasöründeki tıklayın, ardından Ekle menüsünden Yeni Dosya... seçin.

  3. GenelBoş Sınıfseçin, Adıiçin DeviceInstallationService.cs girin, ardından yeni tıklayın ve aşağıdaki uygulamayı ekleyin.

    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.AndroidIdkullanarak) sağlar.

  4. Services klasörüne PushNotificationFirebaseMessagingService.csadlı başka Boş Sınıf ekleyin ve 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.csiçinde, 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, LaunchMode SingleTop olarak ayarlayın, böylece MainActivity açıldığında yeniden oluşturulmaz.

    [Activity(
        Label = "PushDemo",
        LaunchMode = LaunchMode.SingleTop,
        Icon = "@mipmap/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    
  7. IPushNotificationActionService başvuruyu depolamak ve IDeviceInstallationService uygulamalarını 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 Intenteylemiadlı ek 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

    Etkinliği için LaunchMode SingleTopolarak ayarlandığından, mevcut Etkinliği örneğine aracılığıyla bir Amacı gönderilir OnCreate yöntemi yerine OnNewIntent yöntemini ve bu nedenle hem OnCreate hem de OnNewIntent yöntemlerinde gelen bir amacı işlemeniz gerekir.

  11. OnCreate yöntemini, IDeviceInstallationServiceplatforma özgü uygulamasını geçirerek base.OnCreate çağrısından hemen sonra Bootstrap.Begin çağıracak şekilde güncelleştirin.

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

    if (DeviceInstallationService.NotificationsSupported)
    {
        FirebaseInstanceId.GetInstance(Firebase.FirebaseApp.Instance)
            .GetInstanceId()
            .AddOnSuccessListener(this);
    }
    
  13. Hala OnCreateiçinde, geçerli Amacınıgeçirme çağrısından hemen sonra ProcessNotificationActions öğesini ç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ı oturum açtığınızdan emin olun...>Apple Geliştirici Hesapları>Yayımlama ve uygun Sertifikası ve Sağlama Profili indirildi. Bu varlıkları önceki adımların bir parçası olarak oluşturmuş olmanız gerekir.

  2. PushDemo.iOSInfo.plist açın ve BundleIdentifierApple Geliştirici Portalıilgili sağlama profili için kullanılan değerle eşleştiğinden emin olun. BundleIdentifiercom.<organization>.PushDemobiçimindeydi.

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

    Not

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

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

  5. Proje Seçeneklerialtında, Derleme > iOS Paket İmzalamaaltında, Geliştirici hesabınızın Teamaltında seçildiğinden emin olun. Ardından "İmzalama işlemini 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 Profili otomatik olarak seçilmediyse, El ile Sağlama'i seçin ve ardındanPaket İmzalama Seçenekleri'ni tıklayın. İmzalama Kimliği için Team'nizin ve PushDemo belirli sağlama profilinizin hem Hata Ayıklama hem de Yayın yapılandırmaları için Sağlama Profili için seçildiğinden emin olun ve her iki durumda da Platformu için iPhone seçildiğinden emin olun.

  6. PushDemo.iOSbölümünde, Entitlements.plist açın ve Yetkilendirmeler sekmesinde görüntülendiğinde anında iletme bildirimlerini etkinleştir denetlendiğinden 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. DenetimiPushDemo.iOS projesinde tıklayın, Ekle menüsünden Yeni Klasör'seçin, ardından Klasör Adı olarak Hizmetleri kullanarak ekle'yi .

  2. DenetimiHizmetleri klasöründeki tıklayın, ardından Ekle menüsünden Yeni Dosya... seçin.

  3. GenelBoş Sınıfseçin, Adıiçin DeviceInstallationService.cs girin, ardından yeni tıklayın ve aşağıdaki uygulamayı ekleyin.

    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ğeri kullanılarak) ve bildirim hub'ı kayıt yükünü sağlar.

  4. PushDemo.iOS projesine Uzantıları adlı yeni bir klasör ekleyin ardından aşağıdaki uygulamayla NSDataExtensions.cs adlı klasöre Boş 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.csiçinde, 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, INotificationRegistrationServiceve IDeviceInstallationService uygulamalarına yönelik bir 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 ve ardından APNSile uzaktan bildirimler için RegisterForRemoteNotifications yöntemini 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. IDeviceInstallationService.Token özellik değerini ayarlamak için CompleteRegistrationAsync yöntemini ekleyin. Kaydı yenileyin ve cihaz belirtecini en son depolandıktan sonra 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.TriggerActionkoş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 uygun günlüğe kaydetme ve hata işleme uygulamak isteyeceksiniz.

  13. FinishedLaunching yöntemini, IDeviceInstallationServiceplatforma özgü uygulamadan Forms.Init geçirme çağrısından hemen sonra Bootstrap.Begin çağıracak şekilde güncelleştirin.

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

    if (DeviceInstallationService.NotificationsSupported)
    {
        UNUserNotificationCenter.Current.RequestAuthorization(
                UNAuthorizationOptions.Alert |
                UNAuthorizationOptions.Badge |
                UNAuthorizationOptions.Sound,
                (approvalGranted, error) =>
                {
                    if (approvalGranted && error == null)
                        RegisterForRemoteNotifications();
                });
    }
    
  15. Hala FinishedLaunchingiçinde, seçenekleri bağımsız değişkeni uiApplication.LaunchOptionsRemoteNotificationKey sonuç userInfo nesnesini geçirme içeriyorsa, çağrısından hemen sonra ProcessNotificationActions çağırın.

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

Çözümü test edin

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

Test bildirimi gönderme

  1. Postmaniçinde yeni bir sekme açın.

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

    https://<app_name>.azurewebsites.net/api/notifications/requests
    
  3. API Anahtarı kullanarak istemcilerin kimliğini doğrulama 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övdeiçin ham seçeneğini belirleyin, ardından biçim seçenekleri listesinden JSON seçin ve ardından JSON içeriği yer tutucu 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 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 üzerinde test ediyorsanız Hata Ayıklamaiçinde ç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şlatın.

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

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

  9. Postman'da 200 Tamam yanıtı aldığınızı ve uyarının uygulamadaalınan EylemA eylemini gösteren bir uyarı görüntülendiğini doğrulayın.

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

  11. Postman'da 200 Tamam 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ı onaylamak için bildirime dokunun ve uyarı alınan EylemA eylemini görüntüleyin.

  13. postmangeri dönün, önceki istek gövdesini değiştirerek eylemi değeri için action_a yerine action_b belirten sessiz bir bildirim gönderin.

    {
        "action": "action_b",
        "silent": true
    }
    
  14. Uygulama hala açık durumdayken, Postmaniçindeki Gönder düğmesine tıklayın.

  15. Postman'nde 200 Tamam yanıtı aldığınızı ve uyarının uygulamadaalınan EylemA eylemi yerine EylemB eyleminin gösterildiğini doğrulayın .

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

  17. Postman200 Tamam yanıtı alacağınızı 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ıkarşı test ediyorsanız hizmetin çalışıp çalışmadığını ve dağıtıldığını ve hatasız olarak başlatıldığını denetleyin.

İstemci aracılığıyla test ederken Postman veya mobil uygulama yapılandırmasında temel adresi doğru belirttiğinizden emin olun. Temel adres, yerel olarak test ederken https://<api_name>.azurewebsites.net/ veya https://localhost:5001/ 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ı yeni bir Firebase belirtecinin oluşturulmasına neden olur. Bildirim hub'ı yüklemesi de güncelleştirilmelidir.

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 Authentication:ApiKeyAPItarafından kullanılan kullanıcı ayarı değeriyle eşleştiğinden emin olun.

API Uygulamasıile test ediyorsanız, istemci yapılandırma dosyasındaki anahtar değerinin API Uygulaması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, hizmetin etkili olması için hizmeti yeniden başlatmanız gerekir.

API Anahtarı kullanarak istemcilerin kimliğini doğrulama 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>
  • [POST]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>
  • [POST]https://localhost:5001/api/notifications/requests

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

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

Test cihazının ağ bağlantısı olduğunu doğrulayın. Ardından, HttpResponseiç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 installation id ve token değişkenleri için uygun değerlerin çözümlenip çözümlenmediğini denetleyin.

Cihaz için kimlik çö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 sağlam 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.