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

Örnek indir Örneği indirin

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

en son ve en iyi yükleme yaklaşımını kullanarak istemci için cihaz kaydını işlemek üzere bir ASP.NET Core Web apı arka ucu kullanılır. Hizmet, anında iletme bildirimlerini de platformlar arası bir şekilde gönderir.

Bu işlemler, arka uç işlemleri için NOTIFICATION HUBS SDKkullanılarak işlenir. Genel yaklaşımla ilgili daha fazla ayrıntı, uygulama arka ucu belgelerinden kayıt sırasında verilmiştir.

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

Önkoşullar

Bu arada izlemek için şunları yapmanız gerekir:

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

Android için şunları yapmanız gerekir:

  • Bir geliştirici fiziksel cihaz ya da öykünücü (API 26 ve üzeri Google Play Hizmetleri yüklü) olarakaçıldı.

İOS için, şunları yapmanız gerekir:

Not

İOS simülatörü uzak bildirimleri desteklemez ve bu nedenle iOS üzerinde bu örnek araştırılırken fiziksel bir cihaz gereklidir. Ancak, bu öğreticiyi tamamlayabilmeniz için uygulamayı hem Android hem de iOS üzerinde çalıştırmanız gerekmez.

Önceki deneyimler olmadan bu ilk ilkeler örneğinde bulunan adımları izleyebilirsiniz. Ancak, aşağıdaki yönlere sahip olmanın avantajlarından yararlanabilirsiniz.

Önemli

belirtilen adımlar Mac için Visual Studioözeldir. Visual Studio 2019 ' i kullanarak takip edebilirsiniz, ancak mutabık kılınacak 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 Iletme Bildirim Hizmetleri ve Azure Notification Hub 'ı ayarlama

Bu bölümde, Firebase Cloud Messaging (FCM) ve Apple Push bildirim hizmetleri (APNs)ayarlarsınız. Daha sonra bu hizmetlerle çalışmak için bir Bildirim Hub 'ı oluşturup yapılandırırsınız.

Firebase projesi oluşturma ve Android için Firebase bulut mesajlaşma özelliğini etkinleştirme

  1. Firebase konsolunda oturum açın. Project adıolarak pushdemo girerek yeni bir firebase projesi oluşturun.

    Not

    Sizin için benzersiz bir ad oluşturulacaktır. Bu, varsayılan olarak, belirttiğiniz adın küçük harfli bir türevi ve bir kısa çizgiyle ayrılmış üretilmiş bir sayı ile oluşur. Yine de genel olarak benzersiz olmasını istiyorsanız bunu değiştirebilirsiniz.

  2. Projenizi oluşturduktan sonra Firebase’i Android uygulamanıza ekleyin’i seçin.

    Firebase’i Android uygulamanıza ekleyin

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

    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 indiröğesini seçin. Sonra dosyayı daha sonra kullanmak için yerel bir klasöre kaydedin ve İleri' yi seçin.

      Google-Services. JSON indirin

    4. İleri’yi seçin.

    5. Konsola devam et ' i seçin

      Not

      Konsola devam et düğmesi etkin değilse, yüklemeyi doğrula denetimi nedeniyle Bu adımı atla' yı seçin.

  4. Firebase konsolunda projenizin dişli simgesini seçin. Sonra, Proje Ayarları’nı seçin.

    Proje Ayarları’nı seçin

    Not

    Google-Services. JSON dosyasını indirmediyseniz bu sayfada indirebilirsiniz.

  5. En üstteki bulut mesajlaşma sekmesine geçin. Daha sonra kullanmak üzere sunucu anahtarını kopyalayın ve kaydedin. Bu değeri, Bildirim Hub 'ınızı yapılandırmak için kullanırsınız.

    Sunucu anahtarını Kopyala

İOS uygulamanızı anında iletme bildirimleri için kaydedin

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

  1. Uygulamanızı henüz kaydetmediyseniz, Apple Geliştirici Merkezi ' nde IOS sağlama portalı ' na gidin. Apple KIMLIĞINIZLE portalda oturum açın, Sertifikalar, tanımlayıcılar profiller' e gidin ve tanımlayıcılar' ı seçin. +Yeni bir uygulama kaydetmek için tıklayın.

    iOS Hazırlama Portalı Uygulama Kimlikleri sayfası

  2. Yeni bir tanımlayıcı kaydet ekranında, uygulama kimlikleri radyo düğmesini seçin. Daha sonra Devam seçeneğini belirleyin.

    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 devam' ı seçin:

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

    • Paket kimliği: com. Organization_identifier BIÇIMINDE bir paket kimliği girin . <><' nda belirtildiği gibi product_name. Aşağıdaki ekran görüntüsünde, mobcat değer bir kuruluş tanımlayıcısı olarak ve mobcat değeri de ürün adı olarak kullanılır.

      iOS sağlama portalı kayıt uygulama KIMLIĞI sayfası

    • Anında Iletme bildirimleri: yetenekler bölümündeki anında iletme bildirimleri seçeneğini işaretleyin.

      Yeni Uygulama Kimliği kaydetme formu

      Bu eylem, uygulama KIMLIĞINIZI ve bilgileri onaylamak için isteklerinizi oluşturur. Devam' ı seçin ve ardından yenı uygulama kimliğini onaylamak için Kaydet ' i seçin.

      Yeni uygulama KIMLIĞINI Onayla

      Kaydet' i seçtikten sonra, yenı uygulama kimliğini Sertifikalar, tanımlayıcılar profiller sayfasında bir 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, kendi satırını seçerek uygulama kimliği yapılandırmasını düzenleme ekranınızı görüntüleyin.

Notification Hubs için sertifika oluşturma

Bildirim Hub 'ının Apple Push bildirim hizmetleri (APNs) ile çalışmasını sağlamak için bir sertifika gerekir ve iki şekilde bulunabilir:

  1. Doğrudan Bildirim Hub 'ına (özgün yaklaşım) yüklenebilen bir P12 Push sertifikası oluşturma

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

Yeni yaklaşım, APNs Için belirteç tabanlı (http/2) kimlik doğrulamasındaaçıklanmak üzere çeşitli avantajlar içerir. Daha az adım gereklidir, ancak belirli senaryolar için de uygulanan. Ancak, Bu öğreticinin amaçları doğrultusunda çalışdıklarından her iki yaklaşım için de adımlar sunulmaktadır.

SEÇENEK 1: doğrudan Bildirim Hub 'ına yüklenebilen bir P12 Push sertifikası oluşturma
  1. Mac’inizde Anahtar Zinciri Erişimi aracını çalıştırın. Bu, yardımcı programlar klasöründen veya başlatma panelindeki diğer klasörden açılabilir.

  2. Anahtarlık erişimiseçin, sertifika Yardımcısı' nı genişletin ve bir sertifika yetkilisinden sertifika iste' yi seçin.

    Anahtarlık Erişimi kullanarak yeni sertifika isteğinde bulunma

    Not

    Varsayılan olarak, Anahtarlık erişimi listedeki ilk öğeyi seçer. Bu, Sertifikalarkategorisindeyseniz ve Apple Dünya genelinde geliştirici Ilişkileri sertifika yetkilisiyseniz listedeki ilk öğe değilse bir sorun olabilir. CSR 'yi (sertifika Imzalama Isteği) oluşturmadan önce, anahtar olmayan bir öğeye sahip olduğunuzdan veya Apple Dünya genelinde geliştirici Ilişkileri sertifika yetkilisi anahtarının seçildiğinden emin olun.

  3. Kullanıcı e-posta adresiniziseçin, ortak ad değerini girin, diske kaydedilmiş' ı belirttiğinizden emin olun ve ardından devam' ı seçin. CA e-posta adresini gerekli olmadığından boş bırakın.

    Beklenen sertifika bilgileri

  4. Farklı kaydet' de sertifika IMZALAMA isteği (CSR) dosyası için bir ad girin, konum ' useçin ve ardından Kaydet' i seçin.

    Sertifika için bir dosya adı seçin

    Bu eylem, CSR dosyasını seçilen konuma kaydeder. Varsayılan konum Desktop' dır. Bu dosya için seçilen konumu unutmayın.

  5. IOS sağlama portalındakiSertifikalar, tanımlayıcılar profilleri sayfasına dönün, denetlenen anında iletme bildirimleri seçeneğine gidin ve ardından sertifikayı oluşturmak için Yapılandır ' ı seçin.

    Uygulama Kimliğini Düzenle sayfası

  6. Apple Anında Iletilen bildirim HIZMETI TLS/SSL sertifikaları penceresi görüntülenir. GELIŞTIRME TLS/SSL sertifikası bölümünün altında sertifika oluştur düğmesini seçin.

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

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

    Not

    Bu öğretici geliştirme sertifikası kullanır. Aynı işlem üretim sertifika kaydedildiğinde de kullanılır. Bildirimleri gönderirken aynı sertifika türünü kullandığınızdan kesinlikle emin olun.

  7. Dosya Seç' i seçin, CSR dosyasınıkaydettiğiniz konuma gidin ve ardından bu sertifikayı yüklemek için sertifika adına çift tıklayın. Daha sonra Devam seçeneğini belirleyin.

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

    Oluşturulan sertifika indirme sayfası

    Sertifika indirilir ve indirmeler klasörünüzde bilgisayarınıza kaydedilir.

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

    Not

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

  9. İndirilen aps_development.cer bildirim sertifikasına çift tıklayın. Bu eylem yeni sertifikayı Anahtar Zinciri’ne aşağıdaki resimde gösterildiği gibi yüklenir:

    Yeni sertifikanın gösterildiği anahtarlık erişim sertifikaları listesi

    Not

    Sertifikanıza ilişkin ad farklı olabilir, ancak bu ada Apple Development IOS anında Iletme Hizmetleri ön eki alınır ve ilgili paket tanımlayıcısı onunla ilişkilendirilmiş olur.

  10. Anahtarlık erişimi ' nde,Sertifikalar kategorisinde oluşturduğunuz yeni gönderim sertifikasınatıklayın . Dışarı aktar' ı seçin, dosyayı adlandırın, P12 biçimini seçin ve ardından Kaydet' i seçin.

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

    Sertifikayı parolayla korumayı seçebilirsiniz, ancak parola isteğe bağlıdır. Parola oluşturmayı atlamak istiyorsanız Tamam ' ı tıklatın. Aktarılmış P12 sertifikasının dosya adını ve konumunu bir yere unutmayın. Bunlar, APNs ile kimlik doğrulamayı etkinleştirmek için kullanılır.

    Not

    P12 dosyanızın adı 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ı unutmayın:

    • Uygulama kimliği öneki (Takım Kimliği)
    • Paket Kimliği
  2. Sertifikalar, tanımlayıcılar profilleri' ne geri dönüp anahtarlar' a tıklayın.

    Not

    APNsiçin yapılandırılmış bir anahtarınız zaten varsa, oluşturulduktan sonra doğrudan indirdiğiniz P8 sertifikasını yeniden kullanabilirsiniz. Bu durumda 3 ile 5arasındaki adımları yoksayabilirsiniz.

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

  4. Uygun bir anahtar adı değeri sağlayın, ardından Apple Anında iletilen BILDIRIM hizmeti (APNs) seçeneğini işaretleyin ve ardından devam' a ve ardından bir sonraki ekrana Kaydol ' a tıklayın.

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

    Not

    P8 dosyanızı güvenli bir yerde sakladığınızdan emin olun (ve bir yedek kaydedin). Anahtarınızı indirdikten sonra sunucu kopyası kaldırıldığından yeniden karşıdan yüklenemez.

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

  7. Anahtar kimliği değerini bir yere getirin.

  8. p8 sertifikanızı Visual Studio Codegibi tercih ettiğiniz uygun bir uygulamada açın. Anahtar değerini ( -----Başlangıç özel anahtarı----- ve -----son özel anahtar-----) unutmayın.

    -----ÖZEL ANAHTARA-----BAŞLA
    <key_value>
    -----SON ÖZEL ANAHTAR-----

    Not

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

Bu adımların sonunda, Bildirim Hub 'ıNıZı APNs bilgileriyle yapılandırmabölümünde daha sonra kullanmak için aşağıdaki bilgilere sahip olmanız gerekir:

  • Takım Kimliği (bkz. 1. adım)
  • Paket kimliği (bkz. 1. adım)
  • Anahtar kimliği (bkz. Adım 7)
  • Belirteç değeri (P8 anahtar değeri, 5. adımda elde edilir)

Uygulama için bir sağlama profili oluşturun

  1. IOS sağlama portalı' na dönün, Sertifikalar, tanımlayıcılar profilleri' ni seçin, sol menüden profiller ' i seçin ve ardından Yeni bir profil oluşturmak için öğesini seçin. Yeni bir sağlama profili kaydet ekranı görüntülenir.

  2. Sağlama profili türü olarak geliştirme bölümünde iOS uygulama geliştirmeyi seçin ve ardından devam' ı seçin.

    Sağlama profili listesi

  3. Ardından, uygulama kimliği açılır listesinden oluşturduğunuz uygulama kimliğini seçin ve devam' ı seçin.

    Uygulama Kimliği'ni seçin

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

    Not

    Bu sertifika, önceki adımdaoluşturduğunuz gönderim sertifikası değil. Bu, geliştirme sertifikasıdır. Bir tane yoksa, bu öğretici için bir Önkoşul olduğundan, oluşturmanız gerekir. Geliştirici sertifikaları Apple Geliştirici PortalındaXcode aracılığıyla veya Visual Studiooluşturulabilir.

  5. Sertifikalar, tanımlayıcılar profilleri sayfasına dönün, sol menüden profiller ' i seçin ve ardından Yeni bir profil oluşturmak için öğesini seçin. Yeni bir sağlama profili kaydet ekranı görüntülenir.

  6. Sertifika seç penceresinde, oluşturduğunuz geliştirme sertifikasını seçin. Daha sonra Devam seçeneğini belirleyin.

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

  8. Son olarak, sağlama profili adıbölümünde profil için bir ad seçin ve Oluştur' u seçin.

    Sağlama profili adını seçin

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

  10. Sağlama profilinin konumuna gidin ve bunu geliştirme makinenize yüklemek için çift tıklayın.

Bildirim Hub 'ı oluşturma

Bu bölümde, bir Bildirim Hub 'ı oluşturur ve APNsile kimlik doğrulaması yapılandırırsınız. Bir P12 Push Sertifikası veya belirteç tabanlı kimlik doğrulaması kullanabilirsiniz. Zaten oluşturduğunuz bir Bildirim Hub 'ı kullanmak istiyorsanız, 5. adıma geçebilirsiniz.

  1. Azure'da oturum açın.

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

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

    TEMEL AYRıNTıLAR

    Abonelik: Açılan listeden hedef aboneliği seçin
    Kaynak grubu: Yeni bir kaynak grubu oluştur (veya mevcut olanı seç)

    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 seçildiğinden emin olun.

    BILDIRIM HUB 'ı AYRıNTıLARı

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

    Not

    Ücretsiz katmanda maksimum hub sayısına Ulaşmadığınız müddetçe.

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

  5. Yeni Bildirim Hub 'ınızagidin.

  6. Listeden erişim ilkeleri ' ni seçin ( Yönetaltında).

  7. Ilke adı değerlerini karşılık gelen bağlantı dizesi değerleriyle birlikte unutmayın.

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

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

Not

Yalnızca uygulamanızı mağazadan satın alan kullanıcılara anında iletme bildirimleri göndermek istiyorsanız uygulama modu için üretimi kullanın.

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

  1. Sertifika’yı seçin.

  2. Dosya simgesini seçin.

  3. Daha önce verdiğiniz. P12 dosyasını seçin ve sonra ' ı seçin.

  4. Gerekirse, doğru parolayı belirtin.

  5. Korumalı alan modunu seçin.

  6. Kaydet’i seçin.

Seçenek 2: belirteç tabanlı kimlik doğrulaması kullanma

  1. Belirteçseçin.

  2. Daha önce aldığınız aşağıdaki değerleri girin:

    • Anahtar KIMLIĞI
    • Paket Kimliği
    • Takım KIMLIĞI
    • Belirteç
  3. Korumalı alanöğesini seçin.

  4. Kaydet’i seçin.

Notification Hub 'ınızı FCM bilgileriyle yapılandırma

  1. soldaki menüdeki Ayarlar bölümünde Google (GCM/fcm) seçeneğini belirleyin.
  2. Google Firebase konsolundannot ettiğiniz sunucu anahtarını girin.
  3. Araç çubuğunda Kaydet’i seçin.

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

bu bölümde, cihaz kaydını işleyecek ve Xamarin. Forms mobil uygulamasına bildirimlerin gönderilmesi için ASP.NET Core Web apı arka ucu oluşturacaksınız.

Web projesi oluşturma

  1. Visual Studio, dosyayeni çözüm' ü seçin.

  2. bir sonraki .net CoreAppASP.NET Coreapı 'siniseçin .

  3. yeni ASP.NET Core Web apı 'nizi yapılandırın iletişim kutusunda, .net Core 3,1hedef çatısı ' nı seçin.

  4. Project adı için pushdemoapı girip oluştur' u seçin.

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

    Not

    Şablonlu uygulama, Launchurl 'siolarak dalgalı bir denetleyiciyi kullanacak şekilde yapılandırılmıştır. Bu, launchsettings. JSONözelliklerinde ayarlanır.

    Geçersiz bir geliştirme sertifikası bulundu iletisi sorulursa:

    1. Bu hatayı giderecek ' DotNet dev-CERT https ' aracını çalıştırmayı kabul etmek için Evet ' e tıklayın. ' DotNet dev-CERT https ' aracı daha sonra sertifika için bir parola ve anahtarlarınızın parolasını girmenizi ister.

    2. Yeni sertifikaya yüklenip güvenmesiniisteyip Istemediğiniz sorulduğunda Evet ' e tıklayın, ardından anahtarınıza ait parolayı girin.

  6. Controllers klasörünü genişletin ve ardından dalgalı olarak Controller. csöğesini silin.

  7. Hava tahminini sil. cs.

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

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

    Yer tutucu değerlerini kendi Bildirim Hub 'ı adı ve bağlantı dizesi değerlerinizle değiştirin. Bildirim Hub 'ı oluşturma bölümünde bunları bir yere göz önünde yaptınız. Aksi takdirde, bunları Azure'da bulabilirsiniz.

    Notificationshub: ad:
    Genel bakış' ın en üstündeki Essentials özetinde adı inceleyin.

    Notificationhub: ConnectionString:
    Erişim IlkelerindeDefaultfullsharedaccesssignature öğesine bakın

    Not

    Üretim senaryolarında, bağlantı dizesini güvenli bir şekilde depolamak için Azure Keykasası gibi seçeneklere bakabilirsiniz. Basitlik sağlamak için gizli dizileri Azure App Service uygulama ayarlarına eklenecektir.

API anahtarı kullanarak istemcilerin kimliğini doğrulama (Isteğe bağlı)

API anahtarları, belirteçler olarak güvenli değildir, ancak Bu öğreticinin amaçları doğrultusunda yeterli olacaktır. bir apı 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 ile değiştirmeniz ve bunu bir yere göz önünde geçirmeniz gerekir.

  2. DenetimPushdemoapi projesi ' ne tıklayın , Ekle menüsünde Yeni klasör ' i seçin ve ardından klasör adıolarak kimlik doğrulaması kullanarak Ekle ' ye tıklayın.

  3. DenetimKimlik doğrulama klasörü ' ne ve ardından Ekle menüsünde yeni dosya.. . ' ı seçin.

  4. Genelboş sınıf' ı seçin, adiçin apıkeyauthoptions. cs girin, ardından aşağıdaki uygulamayı eklemek için Yeni ' ye tıklayın.

    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. Apıkeyauthhandler. csadlı kimlik doğrulama klasörüne başka bir boş sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    using System;
    using 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

    Bir kimlik doğrulama işleyicisi , bu durumda özel bir API anahtar şeması olan bir düzenin davranışını uygulayan bir türdür.

  6. Apıkeyauthenticationbuilderextensions. csadlı kimlik doğrulama klasörüne başka bir boş sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

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

    Not

    Bu uzantı yöntemi Startup.cs'deki ara yazılım yapılandırma kodunu basitleştirerek daha okunabilir ve genellikle daha kolay takip edilebilir hale getirir.

  7. Startup.cs'de,Hizmetlere yapılan çağrının altında 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. Startup.cs'de,Configure yöntemini, uygulamanın IApplicationBuilder'sindeUseAuthentication ve UseAuthorization uzantısı yöntemlerini çağırarak güncelleştirin. Bu yöntemlerin UseRouting'den sonra ve uygulama öncesinde çağrıldıktan emin olmak. UseEndpoints.

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

    Not

    UseAuthentication çağrısı, önceden kaydedilmiş kimlik doğrulama düzenlerini kullanan ara yazılımı (ConfigureServices'den) kaydedmektedir. Bu, kullanıcıların kimlik doğrulamasına bağlı herhangi bir ara yazılımdan önce çağrılmalı.

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

ASP.NET Core sınıflar ve bağımlılıkları arasında Denetimin Ters Çevirmesi (IoC) elde etmek için bir teknik olan bağımlılık ekleme (DI) yazılım tasarım desenini destekler.

Arka uç işlemleri için bildirim hub' Notification Hubs SDK'sı kullanımı bir hizmet içinde kapsüllemektedir. Hizmet kaydedilir ve uygun bir soyutlama aracılığıyla kullanılabilir.

  1. DenetimBağımlılıklarklasörüne tıklayın ve ardından Paketleri Yönet... NuGet seçin.

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

  3. Paket Ekle'yetıklayın, ardından lisans koşullarını kabul etmek için istendiğinde Kabul Et'e tıklayın.

  4. DenetimPushDemoApi projesine tıklayın, Ekle menüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Modeller kullanarak ekle'ye tıklayın.

  5. DenetimModellerklasörüne tıklayın ve ekle menüsünden Yeni Dosya...öğesini seçin.

  6. Genel BoşSınıf'ıseçin, Ad alanına PushTemplates.cs girin ve ardından aşağıdaki uygulamanın ek olarak Yeni'ye tıklayın.

    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 senaryo için gereken genel ve sessiz bildirimler için belirteçleştirilmiş 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üklemelerde yapılan değişiklikleri bu şekilde işleme, bu öğreticinin kapsamı dışındadır. Üretim için özel şablonları göz önünde bulundurabilirsiniz.

  7. Models klasörüneDeviceInstallation.csadlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamasını ekleyin.

    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    
    namespace PushDemoApi.Models
    {
        public class DeviceInstallation
        {
            [Required]
            public string InstallationId { get; set; }
    
            [Required]
            public string Platform { get; set; }
    
            [Required]
            public string PushChannel { get; set; }
    
            public IList<string> Tags { get; set; } = Array.Empty<string>();
        }
    }
    
  8. Models klasörüneNotificationRequest.csadlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamasını ekleyin.

    using System;
    
    namespace PushDemoApi.Models
    {
        public class NotificationRequest
        {
            public string Text { get; set; }
            public string Action { get; set; }
            public string[] Tags { get; set; } = Array.Empty<string>();
            public bool Silent { get; set; }
        }
    }
    
  9. Models klasörüneNotificationHubOptions.csadlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamasını 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 Services adlı yeni bir klasör ekleyin.

  11. Hizmetler klasörüneINotificationService.csadlı boş bir arabirim ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    using System.Threading;
    using System.Threading.Tasks;
    using PushDemoApi.Models;
    
    namespace PushDemoApi.Services
    {
        public interface INotificationService
        {
            Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation, CancellationToken token);
            Task<bool> DeleteInstallationByIdAsync(string installationId, CancellationToken token);
            Task<bool> RequestNotificationAsync(NotificationRequest notificationRequest, CancellationToken token);
        }
    }
    
  12. NotificationHubsService.csadlı Hizmetler klasörüne Boş Bir Sınıf ekleyin, ardından INotificationService arabirimini uygulamak için aşağıdaki kodu ekleyin:

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

    Not

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

  13. Startup.cs'deConfigureServices yöntemini güncelleştirin ve NotificationHubsService'iINotificationService'intek 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. DenetimDenetleyicilerklasörüne tıklayın ve ekle menüsünden Yeni Dosya...öğesini seçin.

  2. Web API ASP.NET CoreSınıfını seçin,Ad için NotificationsController girin, ardından Yeni'ye tıklayın.

    Not

    Visual Studio 2019ile takip ediyorsanız, okuma/yazma eylemlerine sahip API Denetleyicisi şablonunu seçin.

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

    using System.ComponentModel.DataAnnotations;
    using System.Net;
    using System.Threading;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Mvc;
    using PushDemoApi.Models;
    using PushDemoApi.Services;
    
  4. ControllerBase'den türetilen ve ApiController özniteliğiyle birlikte dekore edilmiş şekilde şablonlu denetleyiciyi güncelleştirin.

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

    Not

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

  5. API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlarsanız NotificationsController'ı Yetkilendirme özniteliğiyle de süslemelisiniz.

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

    readonly INotificationService _notificationService;
    
    public NotificationsController(INotificationService notificationService)
    {
        _notificationService = notificationService;
    }
    
  7. launchSettings.json'da(Özellikler klasörünün içinde), launchUrl'yi RegistrationsController Route özniteliğinde belirtilen URL ile eş olacak şekilde api/notificationsolarak değiştirin.

  8. Uygulamanın yeniNotificationsController ile çalıştığını ve 401 Yetkisiz durumu döndürerek hata ayıklamayı başlat ( KomutEnter) .

    Not

    Visual Studio tarayıcıda otomatik olarak başlatılamayabilirsiniz. Postman'i kullanarak bu noktadan sonra API'yi test edin.

  9. Yeni bir Postman sekmesinde isteği GET olarak ayarlayın. ApplicationUrl > yer tutucusunu Properties launchSettings.json içinde bulunan https > ile değiştirerek aşağıdaki adresi girin.

    <applicationUrl>/api/notifications
    

    Not

    ApplicationUrl, varsayılan profil için '' olması gerekir. IIS kullanıyorsanız (varsayılan olarak Visual Studio 2019'da Windows), bunun yerine iisSettings öğesinde belirtilen applicationUrl'yi kullanabilirsiniz. Adres yanlışsa 404 yanıtı alırsınız.

  10. api Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlarsanız, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırabilirsiniz.

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

    Not

    JSON içeriğiyle birlikte 200 Tamamdurumu alasınız.

    SSL sertifikası doğrulama uyarısı alırsanız, istek SSL sertifikası doğrulama Postman ayarını ssl sertifika doğrulama Ayarlar.

  12. NotificationsController.cs'de ş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

Şimdi arka uç hizmetini barındırmakiçin Azure App Service api Uygulaması oluşturabilirsiniz.

  1. Azure Portal’ında oturum açın.

  2. Kaynak oluştur'a tıklayın,ardından API Uygulaması için arama ve seçme,ardından Oluştur'a tıklayın.

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

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

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

    Kaynak Grubu:
    Bildirim hub'larını oluşturduğunuz Kaynak Grubunu 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 değiştirme. Aksi takdirde, http isteklerinin engellenmiş olması için mobil uygulamayla çalışırken uygun adımları atması gerekir.

    Uygulama Analizler:
    Önerilen seçeneği kullanın (bu ad kullanılarak yeni bir kaynak oluşturulur) veya var olan bir kaynağı seçin.

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

  5. Genel Bakış'ın üst kısmında yer alan Temel Bilgiler özet kısmında URL özelliğini not edin. Bu URL, bu öğreticinin devamlarında kullanılacak arka uç uç noktanızdır.

    Not

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

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

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

    Name 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ımlandığı gibi ayarlardır. Bunları kopyalayıp kopyalamanız gerekir. Kimlik doğrulama: ApiKey AYARı yalnızca API anahtarı kullanarak kimlik doğrulama istemcilerinin tamamlanmasını tercih ediyorsanız gereklidir. Üretim senaryolarında Azure Keykasasıgibi seçeneklere bakabilirsiniz. Bunlar, bu durumda basitlik için uygulama ayarları olarak eklenmiştir.

  8. Tüm uygulama ayarları eklendikten sonra Kaydet' e tıklayın, sonra devam edin.

Arka uç hizmetini yayımlama

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

Not

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

  1. Daha önce yapmadıysanız, yapılandırmanızı hata ayıklamadanYayınla değiştirin.

  2. DenetimPushdemoapi projesi ' ne tıklayın ve ardından Yayımla menüsünde Azure 'a Yayımla... öğesini seçin.

  3. İstenirse, kimlik doğrulama akışını izleyin. Önceki API uygulaması oluşturma bölümünde kullandığınız hesabı kullanın.

  4. Daha önce oluşturduğunuz Azure App SERVICE API uygulamasını listeden Yayımla hedefi olarak seçin ve ardından Yayımla' ya tıklayın.

Sihirbazı tamamladıktan sonra, uygulamayı Azure 'da yayımlar ve ardından uygulamayı açar. Daha önce yapmadıysanız URL 'yi bir yere unutmayın. Bu URL, Bu öğreticinin ilerleyen kısımlarında kullanılan arka uç uç noktasıdır .

Yayınlanan API doğrulanıyor

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

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

    Not

    Taban adresi şu biçimde olmalıdır https://<app_name>.azurewebsites.net/

  2. API anahtarı kullanarak Istemci kimlik doğrulaması ' nı tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerini içerecek şekilde yapılandırmayı unutmayın.

    Anahtar Değer
    apikey <your_api_key>
  3. Gövdeiçin Ham seçeneğini belirleyin, sonra Biçim seçenekleri listesinden JSON ' ı seçin ve sonra bazı yer tutucu JSON içeriğini ekleyin:

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

    Not

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

  5. Adım 1-4 ' i yeniden yapın, ancak bu kez istekler uç noktasını belirterek 400 hatalı istek yanıtı alırsınız.

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

Not

İstemci mobil uygulamasından platforma özgü bilgiler gerektirdiğinden API 'nin geçerli istek verileri kullanılarak test olması 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 'ını kaydetmenizi ve kaydını kaydetmenizi 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üntülenir.

Not

Genellikle, uygulama yaşam döngüsünde (veya ilk çalıştırma deneyiminizin bir parçası olarak) açık Kullanıcı kaydı/kaydını silme işlemleri yapılmadan ilgili nokta sırasında kayıt (ve kaydı silme) eylemlerini gerçekleştirirsiniz. Ancak bu örnek, bu işlevselliğin daha kolay araştırmasını ve test yapılmasını sağlamak için açık Kullanıcı girişi gerektirir.

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

  1. Visual Studio, şablon olarak boş formlar uygulamasını kullanarak ve Project adıiçin pushdemo girerek yeni bir Xamarin. Forms çözümü oluşturun.

    Not

    Boş form uygulamanızı yapılandırma iletişim kutusunda, kuruluş tanımlayıcısının daha önce kullandığınız değerle eşleştiğinden ve hem Android hem de iOS hedeflerinin işaretli olduğundan emin olun.

  2. Denetimpushdemo çözümüne ve ardından NuGet paketlerini güncelleştir' i seçin.

  3. Denetimpushdemo çözümüne ve ardından NuGet paketlerini yönet... öğesini seçin.

  4. Newtonsoft. JSON araması yapın ve bunun işaretli olduğundan emin olun.

  5. Paket Ekle' ye tıklayın ve lisans koşullarını kabul etmek isteyip Istemediğiniz sorulduğunda kabul et ' e tıklayın.

  6. Kuruluşunuzda oluşturulan şablonlu uygulamayı test etmek için her hedef platformda (komutgirin) uygulamayı derleyin ve çalıştırın.

Platformlar arası bileşenleri uygulama

  1. DenetimPushdemo projesine tıklayın , Ekle menüsünde Yeni klasör ' i seçin ve ardından klasör adıolarak modeller kullanarak Ekle ' ye tıklayın.

  2. DenetimModeller klasörüne tıklayın ve ardından Ekle menüsünde yeni dosya.. . öğesini seçin.

  3. Genelboş sınıf' ı seçin, deviceınstallation. csgirin ve ardından 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ı modeller klasörüne boş bir sabit listesi ekleyin.

    namespace PushDemo.Models
    {
        public enum PushDemoAction
        {
            ActionA,
            ActionB
        }
    }
    
  5. Pushdemo projesine Hizmetler adlı yeni bir klasör ekleyin ve ardından şu uygulamayla ServiceContainer. cs adlı klasöre boş bir sınıf ekleyin.

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

    Not

    Bu, XamCAT deposundan ServiceContainer sınıfının kırpılmış bir sürümüdür. Bu, hafif bir IOC (denetim sürümü) kapsayıcısı olarak kullanılacaktır.

  6. Ideviceınstalservıce. csadlı Hizmetler klasörüne boş bir arabirim ekleyin, ardından aşağıdaki kodu ekleyin.

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

    Not

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

  7. Inocertificate Ationregistrationservice. csadlı Hizmetler klasörüne başka bir boş arabirim ekleyin, ardından aşağıdaki kodu ekleyin.

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

    Not

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

  8. Inocertificate Ationactionservice. csadlı Hizmetler klasörüne başka bir boş arabirim ekleyin, ardından aşağıdaki kodu ekleyin.

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

    Not

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

  9. Aşağıdaki uygulamayla, ınocertificate ationactionserviceöğesinden türetilen ıpushdemonocertificate ationactionservice. cs adlı Hizmetler klasörüne boş bir arabirim ekleyin.

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

    Not

    Bu tür, Pushdemo uygulamasına özeldir ve kesin olarak belirlenmiş bir şekilde tetiklenen eylemi belirlemek Için pushdemoaction sabit listesini kullanır.

  10. Inocertificate Ationregistrationservice öğesini aşağıdaki kodla uygulayan notificationregistrationservice. cs adlı Hizmetler klasörüne boş bir sınıf ekleyin.

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

    Not

    Apikey bağımsız DEĞIŞKENI yalnızca API anahtarı kullanarak kimlik doğrulama istemcilerinin tamamlanmasını tercih ediyorsanız gereklidir.

  11. Aşağıdaki kodla ıpushdemonocertificate actionservice . cs adlı pushdemonocertificate. cs adlı Hizmetler klasörüne boş bir sınıf ekleyin.

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

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

    Not

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

    Apikey alanı yalnızca API anahtarı kullanarak kimlik doğrulama istemcilerini tamamlamayı seçtiyseniz gereklidir.

  13. Aşağıdaki uygulamayla birlikte config.local_secrets. cs adlı bir boş sınıfıpushdemo projesine 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ı bir yere döndürmelisiniz. API uygulaması URL 'si olmalıdır . *.local_secrets.*Bu dosyayı kaydetmeden kaçınmak için gitignore dosyanıza eklemeyi unutmayın.

    Apikey alanı yalnızca API anahtarı kullanarak kimlik doğrulama istemcilerini tamamlamayı seçtiyseniz gereklidir.

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

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

    Not

    Begin yöntemi, uygulama bir ıdeviceınstalınstall hizmetininplatforma özgü uygulamasında geçiş 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 kimlik doğrulama istemcilerinin tamamlanmasını tercih ediyorsanız gereklidir.

Platformlar arası kullanıcı arabirimini uygulama

  1. Pushdemo projesinde MainPage. xaml ' yi açın ve StackLayout denetimini aşağıdaki kodla 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. csdosyasında, ınocertificate ationregistrationservice uygulamasına bir başvuruyu depolamak için salt okunur bir yedekleme alanı ekleyin.

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

    public MainPage()
    {
        InitializeComponent();
    
        _notificationRegistrationService =
            ServiceContainer.Resolve<INotificationRegistrationService>();
    }
    
  4. RegisterButton ve DeregisterButton Button öğesine tıklanankayıtkaldırma yöntemlerini çağıran olaylar için olay işleyicilerini uygulayın .

    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. csdosyasında aşağıdaki ad alanlarına başvurulduğundan emin olun.

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

    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şturucusu'nunIPushNotificationActionService uygulamasını ServiceContainer kullanarak çözümlenin ve IPushDemoNotificationActionServiceActionTriggered olayına abone olun.

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

    Not

    Bu yalnızca anında bildirim eylemlerinin makbuzunu ve yayılmasını göstermektir. Genellikle bunlar, bu örnekte kök Sayfa ,MainPage aracılığıyla bir uyarı görüntülemek yerine belirli bir görünüme gezinme veya bazı verileri yenileme gibi sessiz bir şekilde işleniyordu.

Anında iletişim bildirimleri için yerel Android projesini yapılandırma

Paket adını ve izinlerini doğrulama

  1. PushDemo.Android'deDerleme ProjectAndroid Uygulaması seçeneklerini açın.

  2. Paket adının Firebase Console PushDemo projesinde kullanılan değerleeşle eş olup olamayrın. Paket adı biçimindedir.

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

    Not

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

  4. Gerekli izinler altında İnternetve READ_PHONE_STATE izinlerin etkinleştirildiğinden emin olun.

  5. Tamam'a tıklayın

Xamarin Google Play Hizmetleri ve Xamarin.Firebase.Messaging paketlerini ekleme

  1. PushDemo.Android 'de,DenetimPackages klasörüne tıklayın, ardından Paketleri Yönet... NuGet seçin.

  2. Xamarin.GooglePlayServices.Base(Değil)araması ve işaretli olduğundan emin olun.

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

  4. Paket Ekle'yetıklayın, ardından lisans koşullarını kabul etmek için istendiğinde Kabul Et'e tıklayın.

Google Services JSON dosyasını ekleme

  1. DenetimProjeye tıklayın ve ekle menüsünden Mevcut Dosya... öğesini seçin.

  2. Firebase Konsolu'nun PushDemo projesini ayarlamak için daha önce indirdiğiniz google-services.json dosyasını seçin ve ardından Aç'a tıklayın.

  3. İstendiğinde, dosyayı dizinine kopyalamayı seçin.

  4. DenetimProje içinde google-services.json dosyasına tıklayın, ardından GoogleServicesJson dosyasının Derleme Eylemi olarak ayarlanmış olduğundan emin olun.

Android için anında bildirimlerini işleme

  1. DenetimProjeye tıklayın, Ekle menüsünden Yeni Klasör'etıklayın ve ardından Klasör Adı olarak Hizmetler'i kullanarak ekle'ye tıklayın.

  2. DenetimHizmetlerklasörüne tıklayın ve ekle menüsünden Yeni Dosya...öğesini seçin.

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

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

    Not

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

  4. Hizmetler klasörünePushNotificationFirebaseMessagingService.csadlı başka bir Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.

    using Android.App;
    using Android.Content;
    using Firebase.Messaging;
    using PushDemo.Services;
    
    namespace PushDemo.Droid.Services
    {
        [Service]
        [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })]
        public class PushNotificationFirebaseMessagingService : FirebaseMessagingService
        {
            IPushDemoNotificationActionService _notificationActionService;
            INotificationRegistrationService _notificationRegistrationService;
            IDeviceInstallationService _deviceInstallationService;
    
            IPushDemoNotificationActionService NotificationActionService
                => _notificationActionService ??
                    (_notificationActionService =
                    ServiceContainer.Resolve<IPushDemoNotificationActionService>());
    
            INotificationRegistrationService NotificationRegistrationService
                => _notificationRegistrationService ??
                    (_notificationRegistrationService =
                    ServiceContainer.Resolve<INotificationRegistrationService>());
    
            IDeviceInstallationService DeviceInstallationService
                => _deviceInstallationService ??
                    (_deviceInstallationService =
                    ServiceContainer.Resolve<IDeviceInstallationService>());
    
            public override void OnNewToken(string token)
            {
                DeviceInstallationService.Token = token;
    
                NotificationRegistrationService.RefreshRegistrationAsync()
                    .ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; });
            }
    
            public override void OnMessageReceived(RemoteMessage message)
            {
                if(message.Data.TryGetValue("action", out var messageAction))
                    NotificationActionService.TriggerAction(messageAction);
            }
        }
    }
    
  5. MainActivity.csiçinde, aşağıdaki ad alanlarının dosyanın en üstüne eklendiklerinden 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 içindeLaunchMode'uSingleTop olarak ayarladığınızda MainActivity yeniden oluşturulmaz.

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

    IPushDemoNotificationActionService _notificationActionService;
    IDeviceInstallationService _deviceInstallationService;
    
    IPushDemoNotificationActionService NotificationActionService
        => _notificationActionService ??
            (_notificationActionService =
            ServiceContainer.Resolve<IPushDemoNotificationActionService>());
    
    IDeviceInstallationService DeviceInstallationService
        => _deviceInstallationService ??
            (_deviceInstallationService =
            ServiceContainer.Resolve<IDeviceInstallationService>());
    
  8. Firebase belirteci almak ve depolamak için IOnSuccessListenerarabirimini uygulama.

    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. ProcessNotificationActions adlı yeni bir yöntem ekleyin. Bu yöntem, verilen Amacın action adlı fazladan bir değere sahip olup olmadığını kontrol eder. IPushDemoNotificationActionService uygulamasını kullanarak bu eylemi koşullu olarak tetikler.

    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ğırarak OnNewIntentyöntemini geçersiz kılın.

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

    Not

    Etkinlik için LaunchModeTekTopolarak ayar kurulduğundan, Amaç OnCreate yöntemi yerine OnNewIntent yöntemi aracılığıyla mevcut Etkinlik örneğine gönderilir ve bu nedenle hem OnCreate hem de OnNewIntent yöntemlerinde gelen amacı işlemeniz gerekir.

  11. base.OnCreatebase.OnCreateplatforma özgü uygulamasını geçirme çağrısının hemen ardından çağrısı yapmak için OnCreate yöntemini güncelleştirin.

    Bootstrap.Begin(() => new DeviceInstallationService());
    
  12. Aynı yöntemde, çağrısının hemen ardından FirebaseApp örneğinde GetInstanceId'yi koşullu olarak çağırarak MainActivity'yiIOnSuccessListenerolarak ekler.

    if (DeviceInstallationService.NotificationsSupported)
    {
        FirebaseInstanceId.GetInstance(Firebase.FirebaseApp.Instance)
            .GetInstanceId()
            .AddOnSuccessListener(this);
    }
    
  13. Hala OnCreate içinde,geçerli Amacı geçirme çağrısının hemen ardından ProcessNotificationActions'ıarayın.

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

Not

Anında anında bildirim almaya devam etmek için uygulamayı her çalıştırarak bir hata ayıklama oturumundan durdurarak uygulamayı yeniden kaydetmelisiniz.

Anında İlerlerken bildirimler için yerel iOS projesini yapılandırma

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

  1. Uygulama Tercihleri Visual Studio...YayımlamaApple Geliştirici Hesapları ve uygun Sertifika ve Sağlama Profili indirildi. Bu varlıkları önceki adımların bir parçası olarak oluşturulmuş olması gerekir.

  2. PushDemo.iOS'taInfo.plist'i açın ve BundleIdentifier'ınApplehizmet paketinde ilgili sağlama profili için kullanılan değerle eş Geliştirici Portalı. BundleIdentifier biçimindedir.

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

    Not

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

  4. PushDemo.iOSiçin Project Seçeneklerini açın (projeye çift tıklayın).

  5. Uygulama Project 'de, iOSPaket Paketi İmzalama'nın altında Geliştirici hesabınız'ın Takım altında seçildiğinden emin olun. Ardından "İmzalamayı otomatik olarak yönet" seçildiğinden ve İmzalama Sertifikası ve Sağlama Profiliniz'in otomatik olarak seçildiğinden emin olun.

    Not

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

  6. PushDemo.iOS'taEntitlements.plist'i açın ve Yetkilendirmeler sekmesinde görüntülendiğinde Anında İlerleti Bildirimleri Etkinleştir'in işaretli olduğundan emin olun. Ardından APS Ortamı ayarının Kaynak sekmesinde görüntüleyebilirsiniz.

iOS için anında İlerle bildirimleri işleme

  1. DenetimPushDemo.iOS projesine tıklayın, Ekle menüsünden Yeni Klasör'e tıklayın ve ardından Klasör Adı olarak Hizmetler kullanarak ekle'ye tıklayın.

  2. DenetimHizmetlerklasörüne tıklayın ve ekle menüsünden Yeni Dosya...öğesini seçin.

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

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

    Not

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

  4. PushDemo.iOS projesine Extensions adlı yeni bir klasör ekleyin ve ardından aşağıdaki uygulamayla NSDataExtensions.cs adlı klasöre Boş Bir Sınıf ekleyin.

    using System.Text;
    using Foundation;
    
    namespace PushDemo.iOS.Extensions
    {
        internal static class NSDataExtensions
        {
            internal static string ToHexString(this NSData data)
            {
                var bytes = data.ToArray();
    
                if (bytes == null)
                    return null;
    
                StringBuilder sb = new StringBuilder(bytes.Length * 2);
    
                foreach (byte b in bytes)
                    sb.AppendFormat("{0:x2}", b);
    
                return sb.ToString().ToUpperInvariant();
            }
        }
    }
    
  5. AppDelegate.cs içinde,aşağıdaki ad alanlarının dosyanın en üstüne eklendiklerine 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 bir başvuru depolamak için özel özellikler ve ilgili destek 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ı bildirimi 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. Özellik değerini ayarlamak için CompleteRegistrationAsync yöntemini ekleyin. Kaydı yenileyin ve son depolandığı zamandan beri güncelleştirilmişse cihaz belirteci önbelleğe alın.

    Task CompleteRegistrationAsync(NSData deviceToken)
    {
        DeviceInstallationService.Token = deviceToken.ToHexString();
        return NotificationRegistrationService.RefreshRegistrationAsync();
    }
    
  9. NSDictionary bildirim verilerini işlemeye ve NotificationActionService.TriggerAction'ıkoşullu olarak çağırmaya 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şkenlerini CompleteRegistrationAsync yöntemine geçirme 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şkenlerini ProcessNotificationActionsyö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 kaydedilirken FailedToRegisterForRemoteNotifications yöntemini geçersiz kılın.

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

    Not

    Bu çok fazla bir yer tutucudur. Üretim senaryoları için uygun günlüğe kaydetme ve hata işlemeyi uygulamak gerekir.

  13. IDeviceInstallationService platforma özgü uygulamasını geçirme çağrısının hemen ardından çağrısı yapmak için FinishedLaunchingForms.Init yöntemini Forms.Init

    Bootstrap.Begin(() => new DeviceInstallationService());
    
  14. Aynı yöntemde, koşullu olarak yetkilendirme isteğinde bulunduktan hemen sonra uzak bildirimlere Bootstrap.Begin kaydolacaksınız.

    if (DeviceInstallationService.NotificationsSupported)
    {
        UNUserNotificationCenter.Current.RequestAuthorization(
                UNAuthorizationOptions.Alert |
                UNAuthorizationOptions.Badge |
                UNAuthorizationOptions.Sound,
                (approvalGranted, error) =>
                {
                    if (approvalGranted && error == null)
                        RegisterForRemoteNotifications();
                });
    }
    
  15. Hala FinishedLaunchingiçinde, options bağımsız değişkeni sonuçta elde edilen userInfo nesnesini geçirerek UIApplication.LaunchOptionsRemoteNotificationKey içeriyorsa çağrısının hemen ardından ProcessNotificationActions'ı arayın.

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

Çözümü test etmek

Artık arka uç hizmeti aracılığıyla bildirim göndermeyi test etmek için sınabilirsiniz.

Test bildirimi gönderme

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

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

    https://<app_name>.azurewebsites.net/api/notifications/requests
    
  3. api Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlarsanız, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırabilirsiniz.

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

    {
        "text": "Message from Postman!",
        "action": "action_a"
    }
    
  5. Pencerenin sağ üst köşesindeki Kaydet düğmesinin altında yer alan Kod düğmesini seçin. HTML için görüntülendiğinde istek aşağıdaki örnekteki gibi görünmeli (apikey üst bilgisi ekli olup olmadığınıza 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 platformların(Android ve iOS) bir veya her ikisinde çalıştırın.

    Not

    Android'de test ediyorsanız Hata Ayıklama'da çalışmama veya uygulamayı çalıştırarak uygulamanın dağıtıldığından emin olun, ardından uygulamayı kapatmaya ve başlatıcıdan yeniden başlatmaya zorlarsınız.

  7. PushDemo uygulamasındaKimlik düğmesine dokunun.

  8. Postman'egeri dönüp Kod Parçacıkları Oluştur penceresini kapatın (henüz oluşturmadıysanız) Gönder düğmesine tıklayın.

  9. Postman'de200 Tamam yanıtı alınarak uygulamada ActionA eyleminin alınarak uyarı görüntülendiğinden ve.

  10. PushDemo uygulamasını kapatın ve Postman'de Gönder düğmesine yeniden tıklayın.

  11. Postman'de yeniden 200 Tamam yanıtı alasınız. PushDemo uygulamasının bildirim alanında doğru iletiyle bir bildirimin görüntülendiğinden emin olun.

  12. Bildirime dokunarak uygulamayı açtığını onaylayın ve ActionA eyleminin aldığı uyarıyı görüntülendi.

  13. Postman'egeri dönüp önceki istek gövdesini, eylem değeri yerine action_b belirten action_a bildirimi gönderecek şekilde değiştirebilirsiniz.

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

  15. Postman'de200 Tamam yanıtı alın ve uyarının uygulamada EylemA eylemi yerine alınan ActionB eylemlerini gösteren görüntülendiğinden onay alın.

  16. PushDemo uygulamasını kapatın ve Postman'de Gönder düğmesine yeniden tıklayın.

  17. Postman'de200 Tamam yanıtı alasınız ve sessiz bildirimin bildirim alanında görünmey olduğunu onaylarsınız.

Sorun giderme

Arka uç hizmetten yanıt yok

Yerel olarak test etmek için arka uç hizmetinin çalıştığını ve doğru bağlantı noktasının kullana olduğundan emin olun.

Azure API Uygulamasına karşı test ediyorsanız,hizmetin çalıştırıldığından ve dağıtıldığından ve hatasız başlatıldığından kontrol edin.

Postman'de veya istemci aracılığıyla test sırasında mobil uygulama yapılandırmasında temel adresi doğru belirttiğinizden emin olun. Temel adres, yerel olarak test etme sırasında https://<api_name>.azurewebsites.net/ veya https://localhost:5001/ olduğunu belirtmalıdır.

Hata ayıklama oturumu başladıktan veya durduktan sonra Android'de bildirim alınmuyor

Hata ayıklama oturumunu başlatıyor veya durdurduktan sonra yeniden kaydolarak emin olun. Hata ayıklayıcısı yeni bir Firebase belirteci oluşturulacak. Bildirim hub'ı yüklemesi de güncelleştirilmiş olması gerekir.

Arka uç hizmetten 401 durum kodu alma

apikey istek üst bilgisini ayarlayan ve bu değerin arka uç hizmeti için yapılandırmış olduğunuz değerle eş değer olduğunu doğrulama.

Yerel olarak test sırasında bu hatayı alırsanız, istemci yapılandırmasında tanımlandığı anahtar değerinin API tarafından kullanılan Authentication:ApiKey kullanıcı ayarı değeriyle eş olduğundan emin olursunuz.

Bir APIUygulaması ile test ediyorsanız, istemci yapılandırma dosyasındaki anahtar değerinin API Uygulamasında kullanmakta olan Authentication:ApiKey uygulama ayarıyla eş olduğundan emin olun.

Not

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

API Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamamayı seçtiyebilirsiniz. NotificationsController sınıfına Authorize özniteliğini uygulamamanız gerekir.

Arka uç hizmetten 404 durum kodu alma

Uç nokta ve HTTP isteği yönteminin doğru olduğunu doğrulayın. Örneğin, uç noktalar şu şekilde olmalıdır:

  • [PUT]
  • [DELETE]
  • [POST]

Veya yerel olarak test sırasında:

  • [PUT]
  • [DELETE]
  • [POST]

İstemci uygulamasında temel adresi belirtirken, sonunda bir olduğundan emin / olun. Temel adres, yerel olarak test etme sırasında https://<api_name>.azurewebsites.net/ veya https://localhost:5001/ olduğunu belirtmalıdır.

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

Test cihazın ağ bağlantısı olduğunu doğrulayın. Ardından HttpResponseiçinde StatusCode özellik değerini incelemek için bir kesme noktası ayarerek Http yanıt durum kodunu belirler.

Durum koduna bağlı olarak uygulanabilir olduğunda önceki sorun giderme önerilerini gözden geçirebilirsiniz.

Satırlarda ilgili API için bu belirli durum kodlarının dönüşlerini alan 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ğrulama. Söz konusu platform için istemci kodu tarafından oluşturulan gerçek yükü kullanın.

Hiçbir adımın atlanmaması için platforma özgü yapılandırma bölümlerini gözden geçirme. için uygun değerlerin çözümlenmiş olup olmadığını ve installation id uygun platform için değişkenleri token denetleyin.

Cihaz hata iletisi için kimlik çözümlenemiyor iletisi görüntüleniyor

Hiçbir adımın atlanmaması için platforma özgü yapılandırma bölümlerini gözden geçirme.

Sonraki adımlar

Artık bir arka uç hizmeti aracılığıyla bildirim hub'larına bağlı temel bir Xamarin.Forms uygulamasına sahip olmalı ve bildirim gönderebilirsiniz.

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

Visual Studio App Center, sorun gidermeye yardımcı olmak için analiz ve tanılama sağlayanmobil uygulamalara hızla dahil olabilir.