Öğretici: Arka uç hizmeti aracılığıyla Azure Notification Hubs kullanarak Xamarin.Forms uygulamalarına anında iletme bildirimleri gönderme
Örnek indirme
- Xamarin.Forms
- Flutter
- React Native
Bu öğreticide, android ve
ASP.NET Core Web API arka ucu, en son ve en iyi Yükleme yaklaşımı kullanılarak istemci için cihaz kayıt işlemek için kullanılır. Hizmet ayrıca platformlar arası bir şekilde anında iletme bildirimleri gönderir.
Bu işlemler,arka uç işlemleri için
Bu öğreticide aşağıdaki adımlar izlenir:
- Anında İletme Bildirim Hizmetleri'ni ve Azure Notification Hubs'ı ayarlayın.
- ASP.NET Core Web API arka uç uygulaması oluşturun.
- Platformlar arası Xamarin.Forms uygulaması oluşturun.
- Anında iletme bildirimleri için yerel Android projesini yapılandırın.
- Anında iletme bildirimleri için yerel iOS projesini yapılandırın.
- Çözümü test edin.
Önkoşullar
Takip etmek için şunlar gerekir:
- Kaynakları oluşturabileceğiniz ve yönetebileceğiniz Azure aboneliği.
Mac için Visual Studio yüklü bir Mac veya visual studio 2019çalıştıran bir bilgisayar. Visual Studio 2019 kullanıcıların da .NET ileASP.NET ve web geliştirme iş yükleri yüklüMobil geliştirmesi olmalıdır. - Uygulamayı Android (fiziksel veya öykünücü cihazlar) veya iOS (yalnızca fiziksel cihazlar) üzerinde çalıştırma olanağı.
Android için sahip olmanız gerekenler:
- Bir geliştirici,fiziksel cihazın veya öykünücü
(Google Play Hizmetleri yüklü api 26 ve üzerini çalıştırıyor) kilidini açtı.
iOS için sahip olmanız gerekenler:
- Etkin bir Apple Geliştirici Hesabı.
- geliştirici hesabınıza
(iOS 13.0 ve üzerini çalıştıran) kayıtlı fiziksel bir iOS cihazı. anahtarlığınıza yüklenmiş bir fiziksel bir cihazda uygulama çalıştırmanıza.p12 geliştirme sertifikası olanak sağlar.
Not
iOS Simülatörü uzaktan bildirimleri desteklemez ve bu nedenle iOS'ta bu örneği keşfederken fiziksel bir cihaz gerekir. Ancak, bu öğreticiyi tamamlamak için uygulamayı hem Android hem de
Bu ilk ilkeler örneğindeki adımları önceden deneyim olmadan izleyebilirsiniz. Ancak, aşağıdaki yönlerden bilgi sahibi olmanın avantajını elde edersiniz.
- Apple Geliştirici Portalı
- ASP.NET Core ve web API
- Google Firebase Konsolu
- Microsoft Azure ve Azure Notification Hubskullanarak iOS uygulamalarına anında iletme bildirimleri gönderme.
- Xamarin ve Xamarin.Forms.
Önemli
Sağlanan adımlar mac için Visual Studio
Anında İletme Bildirim Hizmetleri'ni ve Azure Notification Hub'ı ayarlama
Bu bölümde, Firebase Cloud Messaging (FCM) ve Apple Anında İletme Bildirimi Hizmetleri (APNS)ayarlayın. Ardından bu hizmetlerle çalışmak için bir bildirim hub'ı oluşturup yapılandırabilirsiniz.
Firebase projesi oluşturma ve Android için Firebase Cloud Messaging'i etkinleştirme
Firebase konsolundaoturum açın.
Proje adı olarak PushDemo .giren yeni bir Firebase projesi oluşturun Not
Sizin için benzersiz bir ad oluşturulur. Varsayılan olarak bu, sağladığınız adın küçük harfli bir değişkenini ve tireyle ayrılmış olarak oluşturulan bir sayıyı içerir. Hala genel olarak benzersiz olması koşuluyla bunu değiştirebilirsiniz.
Projenizi oluşturduktan sonra,Android uygulamanıza Firebase ekle'yi
seçin. Android uygulamanıza Firebase ekleme sayfasında aşağıdaki adımları izleyin.
Android paket adı için paketiniz için bir ad girin. Örneğin: com.<organization_identifier>.<package_name>
.uygulamayıkaydet'i
seçin. google-services.json
İndir'i seçin. Ardından dosyayı daha sonra kullanmak üzere yerel bir klasöre kaydedin ve İleri seçin. sonraki
seçin. Konsola devam 'ı seçin
Not
Konsola devam et düğmesi etkinleştirilmemişse, yüklemeyi doğrulama onay, Bu adımı atla 'ı seçin.
Firebase konsolunda projenizin dişlisini seçin. Ardından proje ayarları
seçin. Not
google-services.json dosyasını indirmediyseniz bu sayfadan indirebilirsiniz.
Üstteki Cloud Messaging sekmesine geçin. daha sonra kullanmak üzere Server anahtarı kopyalayın ve kaydedin. Bildirim hub'ınızı yapılandırmak için bu değeri kullanırsınız.
iOS uygulamanızı anında iletme bildirimleri için kaydetme
Bir iOS uygulamasına anında iletme bildirimleri göndermek için uygulamanızı Apple'a kaydedin ve anında iletme bildirimlerine kaydolun.
Uygulamanızı henüz kaydolmadıysanız Apple Geliştirici Merkezi'ndeki iOS Sağlama Portalı göz atın. Apple Kimliğiniz ile portalda oturum açın, Sertifikalar, Tanımlayıcılar & Profilleradresine gidin ve ardından Tanımlayıcılaröğesini seçin. Yeni bir uygulama kaydetmek için +'e tıklayın.
Yeni Tanımlayıcı Kaydet
ekranında devamUygulama Kimlikleri radyo düğmesini seçin. Ardındanseçin. 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 formun Paket Kimliğini girin.<organization_identifier>. Uygulama Dağıtım Kılavuzubelirtildiği gibi<product_name>. Aşağıdaki ekran görüntüsünde,
mobcat
değeri kuruluş tanımlayıcısı olarak kullanılır ve ürün adı olarak PushDemo değeri kullanılır.anında iletme bildirimleri
: Özellikler bölümündekiAnında İletme Bildirimleri seçeneğini işaretleyin.Yeni bir Uygulama Kimliği kaydetmek için
Formu Bu eylem Uygulama Kimliğinizi oluşturur ve bilgileri onaylamanızı talep eder. yeni Uygulama Kimliğini onaylamak için
Devam 'i ve ardından kaydet'iseçin. Kaydet
seçtikten sonra, yeni Uygulama Kimliğini Sertifikaları, Tanımlayıcılar & Profilleri sayfasında satır öğesi olarak görürsünüz.
Sertifikaları, Tanımlayıcılar & Profilleri sayfasında, Tanımlayıcılaraltında, oluşturduğunuz Uygulama Kimliği satır öğesini bulun. Ardından, Uygulama Kimliği Yapılandırmanızı düzenle ekranını görüntülemek için satırını seçin.
Notification Hubs için sertifika oluşturma
Bildirim hub'ının Apple Anında İletme Bildirimi Hizmetleri (APNS) çalışmasını sağlamak için bir sertifika gereklidir ve iki yoldan biriyle sağlanabilir:
Doğrudan Notification Hub 'e yüklenebilen bir p12 anında iletme sertifikası oluşturma ( özgün yaklaşımı) Belirteç tabanlı kimlik doğrulaması için kullanılabilecek bir p8 sertifikası oluşturma (daha yeni ve önerilen yaklaşım)
Daha yeni yaklaşımın, APNSiçin
SEÇENEK 1: Doğrudan Notification Hub'a yüklenebilecek bir p12 anında iletme sertifikası oluşturma
Mac bilgisayarınızda Anahtarlık Erişimi aracını çalıştırın.
Yardımcı Programlar klasöründen veya Başlatma Çubuğundaki Diğerklasöründen açılabilir. Anahtarlık Erişimi
seçin, sertifika yardımcısı genişletin ve Sertifika Yetkilisinden Sertifika İste seçeneğini belirleyin.istemek için Anahtarlık Erişimi'ni kullanma
Not
Varsayılan olarak, AnahtarLık Erişimi listedeki ilk öğeyi seçer. Sertifikaları kategorisindeyseniz ve Apple Dünya Çapında Geliştirici İlişkileri Sertifika Yetkilisi listedeki ilk öğe değilse bu sorun olabilir. CSR(Sertifika İmzalama İsteği) oluşturmadan önce anahtar olmayan bir öğeye sahip olduğunuzdan veya Apple Worldwide Developer Relations Certification Authority anahtarının
seçildiğinden emin olun. Kullanıcı E-posta Adresinizi seçin,Ortak Ad değerinizi girin, diskkaydedilenbelirttiğinizden emin olun ve ardından Devam seçeneğini belirleyin. ca e-posta adresi gerekli olmadığındanboş bırakın. beklenen sertifika bilgilerini
Farklı Kaydet Sertifika İmzalama İsteği (CSR) dosyası için bir ad girin, Where konumundaki konumu seçin ve ardındanKaydet öğesini seçin.için bir dosya adı seçin
Bu eylem, CSR dosyasını seçili konuma kaydeder. Varsayılan konum Desktop'dir. Dosya için seçilen konumu unutmayın.
iOS Sağlama Portalı Sertifikalar, Tanımlayıcılar & Profilleri sayfasına dönün, ekranı aşağı kaydırarak işaretliAnında İletme Bildirimleri seçeneğine gidin ve sertifikayı oluşturmak için yapılandır'ıseçin. Uygulama Kimliğini Düzenle sayfası
Apple Anında İletme Bildirimi hizmeti TLS/SSL Sertifikaları penceresi görüntülenir. Geliştirme TLS/SSL Sertifikası bölümünün altındaki Sertifika Oluştur düğmesini seçin.
yeni sertifika oluştur
ekranı görüntülenir. Not
Bu öğreticide bir geliştirme sertifikası kullanılır. Üretim sertifikası kaydederken de aynı işlem kullanılır. Bildirim gönderirken aynı sertifika türünü kullandığınızdan emin olmanız gerekir.
DosyaSeç'i seçin, CSR dosyasınıkaydettiğiniz konuma gidin ve yüklemek için sertifika adına çift tıklayın. Ardındandevam
seçin. Portal sertifikayı oluşturdıktan sonra İndir düğmesini seçin. Sertifikayı kaydedin ve kaydedildiği konumu unutmayın.
Sertifika indirilir ve bilgisayarınıza İndirmeler klasörünüze kaydedilir.
Not
Varsayılan olarak, indirilen geliştirme sertifikası aps_development.cerolarak adlandırılır.
İndirilen anında iletme sertifikasına aps_development.cerçift tıklayın. Bu eylem, aşağıdaki görüntüde gösterildiği gibi yeni sertifikayı Anahtarlık'a yükler:
Yeni sertifika gösteren Anahtarlık erişim sertifikaları listesini
Not
Sertifikanızdaki ad farklı olsa da, ad apple geliştirme iOS anında iletme hizmetleri
ön ekinde yer alır ve onunla ilişkili uygun paket tanımlayıcısına sahip olur. Anahtarlık Erişimi'nde Denetimi + Sertifikalar kategorisinde oluşturduğunuz yeni anında iletme sertifikasında tıklayın. Dışarı Aktar'ı
seçin, dosyayı adlandırın, p12 biçimini seçin ve ardındankaydet'iseçin. Sertifikayı parolayla korumayı seçebilirsiniz, ancak parola isteğe bağlıdır. Parola oluşturmayı atlamak istiyorsanız Tamam'e tıklayın. Dışarı aktarılan p12 sertifikasının dosya adını ve konumunu not edin. BUNLAR, APN'lerle kimlik doğrulamasını etkinleştirmek için kullanılır.
Not
p12 dosya adınız ve konumunuz bu öğreticide görüntülenenden farklı olabilir.
SEÇENEK 2: Belirteç tabanlı kimlik doğrulaması için kullanılabilecek bir p8 sertifikası oluşturma
Aşağıdaki ayrıntıları not edin:
- Uygulama Kimliği Ön Eki (Ekip Kimliği)
- Paket Kimliği
Sertifikalar, Tanımlayıcılar & Profiller,Anahtarlarıöğesine tıklayın.
Not
APNSiçin yapılandırılmış bir anahtarınız varsa, indirdiğiniz p8 sertifikasını oluşturulduktan hemen sonra yeniden kullanabilirsiniz. Bu durumda, 3 ile
5 arasındaadımları yoksayabilirsiniz. Yeni bir anahtar oluşturmak için
düğmesine (veya Anahtar oluştur düğmesi ) tıklayın. Uygun bir
Anahtar Adı değeri sağlayın, ardındanApple Anında İletme Bildirimleri hizmeti (APNS) seçeneğini işaretleyin ve ardındanDevam 'a tıklayın ve ardından sonraki ekranda kaydet'i. İndir 'e tıklayın vep8 dosyasını (AuthKey_ ön ekli) güvenli bir yerel dizine taşıyın ve ardından bittitıklayın. Not
p8 dosyanızı güvenli bir yerde tuttuğunuzdan emin olun (ve yedek kaydedin). Anahtarınızı indirdikten sonra, sunucu kopyası kaldırıldıktan sonra yeniden indirilemez.
Anahtarlar, oluşturduğunuz anahtara (veya bunun yerine kullanmayı seçtiyseniz mevcut bir anahtara) tıklayın.
Anahtar Kimliği değerini not edin.
p8 sertifikanızı Visual Studio Codegibi uygun bir uygulamada açın. Anahtar değerini not edin (-----BEGIN PRIVATE KEY----- ile -----END PRIVATE KEY-----arasında).
-----BEGIN ÖZEL ANAHTAR-----
<key_value>
-----END ÖZEL ANAHTAR-----Not
Bu, daha sonra
Bildirim Hub'ını yapılandırmak için kullanılacakbelirteci değeridir.
Bu adımların sonunda, bildirim hub'ınızı APNS bilgileriyle yapılandırma
- Ekip Kimliği
(bkz. 1. adım) - Paket Kimliği
(bkz. 1. adım) - Anahtar Kimliği (bkz. 7. adım)
- Belirteç değeri (8. adımda alınan p8 anahtar değeri)
Uygulama için sağlama profili oluşturma
iOS Sağlama Portalı dönün,Sertifikalar, Tanımlayıcılar & Profilleri öğesini seçin, sol menüdenProfiller'i seçin ve ardından yeni bir profil oluşturmak için seçin. Yeni Sağlama Profili Kaydet ekranı görüntülenir. Sağlama profili türü olarak
Geliştirme altında iOS Uygulama Geliştirmeseçin ve ardındandevam seçin. Ardından, Uygulama Kimliği açılan listesinden oluşturduğunuz uygulama kimliğini seçin ve Devam Et'i seçin.
seçin
Sertifikaları seçin penceresinde, kod imzalama için kullandığınız geliştirme sertifikasını seçin ve Devam Et'i seçin.
Not
Bu sertifika,önceki
adımda oluşturduğunuz gönderme sertifikası değildir. Bu, geliştirme sertifikanızdır. Yoksa, bu öğretici için bir önkoşul olduğundan bunu oluşturmanız gerekir. Geliştirici sertifikaları, Xcode aracılığıyla veya Visual Studioaracılığıyla Apple Geliştirici Portalıoluşturulabilir. Sertifikaları, Tanımlayıcılar & Profiller sayfasına dönün, sol menüden Profiller'ni seçin ve ardından yeni bir profil oluşturmak için + seçin. Yeni Sağlama Profili Kaydet ekranı görüntülenir.
Sertifikaları seçin penceresinde, oluşturduğunuz geliştirme sertifikasını seçin. Ardındandevam
seçin. Ardından, test için kullanılacak cihazları seçin ve Devamseçeneğini belirleyin.
Son olarak, Sağlama Profili Adıiçinde profil için bir ad seçin ve Oluşturseçin.
Yeni sağlama profili oluşturulduğunda İndir
seçin. Kaydedildiği konumu unutmayın. Sağlama profilinin konumuna göz atın ve ardından geliştirme makinenize yüklemek için çift tıklayın.
Bildirim Hub'ı oluşturma
Bu bölümde bir bildirim hub'ı oluşturacak ve APNSile kimlik doğrulamayı yapılandıracaksınız. p12 anında iletme sertifikası veya belirteç tabanlı kimlik doğrulaması kullanabilirsiniz. Önceden oluşturduğunuz bir bildirim hub'ını kullanmak istiyorsanız 5. adıma atlayabilirsiniz.
azure
oturum açın. Kaynak oluştur'a tıklayın, bildirim hub'ıarayın ve seçin, ardındanoluştur'a tıklayın. Aşağıdaki alanları güncelleştirin ve ardındanoluştur'
tıklayın: TEMEL AYRINTILAR
aboneliği : Açılan listeden hedef Aboneliği seçin
Kaynak Grubu: yeni Kaynak Grubu oluşturma (veya var olan bir kaynak grubunu seçin)AD ALANı AYRıNTıLARı
Bildirim Hub'ı Ad Alanı:Bildirim Hub'ı ad alanı için genel olarak benzersiz bir ad girin
Not
Bu alan için Yeni oluştur seçeneğinin
emin olun. BİlDİrİm HUB'I AYRINTILARI
Bildirim Hub'ını :Bildirim Hub'ı için bir ad girin
Konumu: Açılan listeden uygun bir konum seçin
Fiyatlandırma Katmanı: Varsayılan Ücretsiz seçeneğini koruyunNot
Ücretsiz katmanda hub sayısı üst sınırına ulaşmadığınız sürece.
Bildirim Hub'ı sağlandıktan sonra bu kaynağa gidin.
yeni Bildirim Hub'ınızagidin.
Listeden
Erişim İlkeleri seçin (yönetaltında). İlke Adı değerlerini ve karşılık gelen Bağlantı Dizesi değerlerini not edin.
ApNS bilgileriyle Bildirim Hub'ınızı yapılandırma
Not
Yalnızca uygulamanızı mağazadan satın alan kullanıcılara anında iletme bildirimleri göndermek istiyorsanız Uygulama Modu için Üretim kullanın.
SEÇENEK 1: .p12 anında iletme sertifikası kullanma
sertifika
seçin. Dosya simgesini seçin.
Daha önce dışarı aktardığınız .p12 dosyasını seçin ve ardından Aç'ı seçin.
Gerekirse doğru parolayı belirtin.
Korumalı alan modunu
seçin. Kaydetöğesini seçin.
SEÇENEK 2: Belirteç tabanlı kimlik doğrulamayı kullanma
belirteç
seçin. Daha önce edindiğiniz aşağıdaki değerleri girin:
- Anahtar Kimliği
- Paket Kimliği
- Ekip Kimliği
- Belirteci
korumalı alan
seçin. Kaydetöğesini seçin.
Bildirim hub'ınızı FCM bilgileriyle yapılandırma
- Soldaki menünün
Ayarlar bölümünde Google (GCM/FCM)seçin. Google Firebase Console not ettiğinizsunucu anahtarını girin. - Araç çubuğunda kaydet'i
seçin.
ASP.NET Core Web API arka uç uygulaması oluşturma
Bu bölümde,
Web projesi oluşturma
Visual Studio 'nde DosyaYeni Çözüm seçin. sonraki
.NET Core App ASP.NET Core API'sini seçin. yeni ASP.NET Core Web API'nizi yapılandırma
.NET Core 3.1 hedef çerçeveseçin. Proje Adı içinPushDemoApi girin veOluştur'useçin. Şablonlu uygulamayı test etmek için hata ayıklamayı (Command + Enter) başlatın.
Not
Şablonlu uygulama, launchUrlolarak WeatherForecastController kullanacak şekilde yapılandırılmıştır. Bu, Özellikler>launchSettings.jsonayarlanır.
Geçersiz geliştirme sertifikası bulundu iletisi istenirse:
Bunu düzeltmek için 'dotnet dev-certs https' aracını çalıştırmayı kabul etmek için Evet
tıklayın. 'dotnet dev-certs https' aracı daha sonra sertifika için bir parola ve Anahtar zincirinizin parolasını girmenizi ister. Yeni sertifikayükleme ve güvenme
istendiğinde Evet 'e tıklayın ve anahtarlığınızın parolasını girin.
Denetleyicileri klasörünü genişletin ve WeatherForecastController.cssilin.
WeatherForecast.cssilin.
Gizli Dizi Yöneticisi aracını kullanarak yerel yapılandırma değerlerini ayarlayın. Gizli dizileri çözümden ayırma, bunların kaynak denetiminde sonlanmamasını sağlar. Terminal'i açın proje dosyasının dizinine gidin ve aşağıdaki komutları çalıştırın: dotnet user-secrets init dotnet user-secrets set "NotificationHub:Name" <value> dotnet user-secrets set "NotificationHub:ConnectionString" <value>
Yer tutucu değerlerini kendi bildirim hub'ı adınızla ve bağlantı dizesi değerleriyle değiştirin. bildirim hub'ı oluşturma bölümünde bunları not edindiniz. Aksi takdirde, bunları azure
içinde arayabilirsiniz. NotificationHub:Name:
Genel Bakışüst kısmındaki Temel Parçalar özetinde Ad bölümüne bakın.NotificationHub:ConnectionString:
Erişim İlkeleri 'nde DefaultFullSharedAccessSignaturebakın Not
Üretim senaryolarında, bağlantı dizesini güvenli bir şekilde depolamak için Azure KeyVault
gibi seçeneklere bakabilirsiniz. Kolaylık olması için gizli diziler Azure App Service uygulama ayarlarınaeklenecektir.
API Anahtarı kullanarak istemcilerin kimliğini doğrulama (İsteğe bağlı)
API anahtarları belirteçler kadar güvenli değildir, ancak bu öğreticinin amaçlarına uygun olacaktır. API anahtarı, ASP.NET Ara Yazılımaracılığıyla kolayca yapılandırılabilir.
API anahtarını yerel yapılandırma değerlerine ekleyin.
dotnet user-secrets set "Authentication:ApiKey" <value>
Not
Yer tutucu değerini kendi yer tutucunuzla değiştirmeniz ve not edin.
Denetimi tıklayın,PushDemoApi projesindeEkle menüsünden Yeni Klasörseçin, sonra Ekle'yeKimlik Doğrulaması kullanarakKlasör Adı olarak tıklayın.Denetim tıklayın, ardındanKimlik Doğrulaması klasöründekiEkle menüsünden Yeni Dosya...seçin. Genel Boş Sınıf seçin,Adı içinApiKeyAuthOptions.cs girin, ardından yenitıklayın ve aşağıdaki uygulamayı ekleyin. using Microsoft.AspNetCore.Authentication; namespace PushDemoApi.Authentication { public class ApiKeyAuthOptions : AuthenticationSchemeOptions { public const string DefaultScheme = "ApiKey"; public string Scheme => DefaultScheme; public string ApiKey { get; set; } } }
Kimlik Doğrulaması klasörüne ApiKeyAuthHandler.csadlı başka bir Boş Sınıf ekleyin ve aşağıdaki uygulamayı ekleyin.
using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text.Encodings.Web; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace PushDemoApi.Authentication { public class ApiKeyAuthHandler : AuthenticationHandler<ApiKeyAuthOptions> { const string ApiKeyIdentifier = "apikey"; public ApiKeyAuthHandler( IOptionsMonitor<ApiKeyAuthOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) {} protected override Task<AuthenticateResult> HandleAuthenticateAsync() { string key = string.Empty; if (Request.Headers[ApiKeyIdentifier].Any()) { key = Request.Headers[ApiKeyIdentifier].FirstOrDefault(); } else if (Request.Query.ContainsKey(ApiKeyIdentifier)) { if (Request.Query.TryGetValue(ApiKeyIdentifier, out var queryKey)) key = queryKey; } if (string.IsNullOrWhiteSpace(key)) return Task.FromResult(AuthenticateResult.Fail("No api key provided")); if (!string.Equals(key, Options.ApiKey, StringComparison.Ordinal)) return Task.FromResult(AuthenticateResult.Fail("Invalid api key.")); var identities = new List<ClaimsIdentity> { new ClaimsIdentity("ApiKeyIdentity") }; var ticket = new AuthenticationTicket( new ClaimsPrincipal(identities), Options.Scheme); return Task.FromResult(AuthenticateResult.Success(ticket)); } } }
Not
Kimlik Doğrulama İşleyicisi, bir düzenin davranışını uygulayan bir türdür ve bu durumda özel bir API Anahtar düzenidir.
ApiKeyAuthenticationBuilderExtensions.csadlı Kimlik Doğrulaması klasörüne başka Boş Sınıf ekleyin ve ardından aşağıdaki uygulamayı ekleyin.
using System; using Microsoft.AspNetCore.Authentication; namespace PushDemoApi.Authentication { public static class AuthenticationBuilderExtensions { public static AuthenticationBuilder AddApiKeyAuth( this AuthenticationBuilder builder, Action<ApiKeyAuthOptions> configureOptions) { return builder .AddScheme<ApiKeyAuthOptions, ApiKeyAuthHandler>( ApiKeyAuthOptions.DefaultScheme, configureOptions); } } }
Not
Bu uzantı yöntemi, ara yazılım yapılandırma kodunu Startup.cs basitleştirerek daha okunabilir ve genel olarak daha kolay takip edilebilir hale getirir.
Startup.csiçinde, hizmetlerine yapılan çağrının altındaki API Anahtarı kimlik doğrulamasını yapılandırmak için ConfigureServices yöntemini güncelleştirin. AddControllers yöntemi.
using PushDemoApi.Authentication; using PushDemoApi.Models; using PushDemoApi.Services; public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = ApiKeyAuthOptions.DefaultScheme; options.DefaultChallengeScheme = ApiKeyAuthOptions.DefaultScheme; }).AddApiKeyAuth(Configuration.GetSection("Authentication").Bind); }
Hala
Startup.cs içinde, uygulamanınIApplicationBuilder UseAuthentication çağırmak ve UseAuthorization uzantısı yöntemleriniiçin Yapılandırma yöntemini güncelleştirin. Bu yöntemlerin UseRoutingsonra ve uygulamadan önce çağrıldığından emin olun. Uç Noktaları kullanın.public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
Not
UseAuthentication
çağrısı, önceden kaydedilmiş kimlik doğrulama düzenlerini kullanan ara yazılımı kaydeder ( ConfigureServices ). Bu, kimlik doğrulaması yapılan kullanıcılara bağlı herhangi bir ara yazılımdan önce çağrılmalıdır.
Bağımlılık ekleme ve hizmetleri yapılandırma
ASP.NET Core, sınıflar ve bağımlılıkları arasında Inversion of Control (IoC) elde etmeye yönelik bir teknik olan bağımlılık ekleme (DI) yazılım tasarımı desenini destekler.
arka uç işlemleri için bildirim hub'ının ve
denetim
tıklayın, ardından NuGet Paketlerini Yönet...Bağımlılıklar klasöründeseçin. Microsoft.Azure.NotificationHubs
arayın ve işaretli olduğundan emin olun. Paket Ekle'yi
ve ardından lisans koşullarını kabul etmek isteyip istemediğiniz sorulduğunda Kabul Et'e tıklayın. Denetimi tıklayın,PushDemoApi projesindeEkle menüsünden Yeni Klasörseçin, ardından ekleModelleri kullanarak Klasör Adı olarak öğesine tıklayın.Denetimi tıklayın, ardındanModelleri klasöründekiEkle menüsünden Yeni Dosya...seçin. Genel Boş Sınıf öğesini seçin,Adı içinPushTemplates.cs girin, ardından yenitıklayın ve aşağıdaki uygulamayı ekleyin. namespace PushDemoApi.Models { public class PushTemplates { public class Generic { public const string Android = "{ \"notification\": { \"title\" : \"PushDemo\", \"body\" : \"$(alertMessage)\"}, \"data\" : { \"action\" : \"$(alertAction)\" } }"; public const string iOS = "{ \"aps\" : {\"alert\" : \"$(alertMessage)\"}, \"action\" : \"$(alertAction)\" }"; } public class Silent { public const string Android = "{ \"data\" : {\"message\" : \"$(alertMessage)\", \"action\" : \"$(alertAction)\"} }"; public const string iOS = "{ \"aps\" : {\"content-available\" : 1, \"apns-priority\": 5, \"sound\" : \"\", \"badge\" : 0}, \"message\" : \"$(alertMessage)\", \"action\" : \"$(alertAction)\" }"; } } }
Not
Bu sınıf, bu senaryonun gerektirdiği genel ve sessiz bildirimler için belirteçli bildirim yüklerini içerir. Yükler, hizmet aracılığıyla mevcut yüklemeleri güncelleştirmek zorunda kalmadan denemelere izin vermek için Yükleme dışında tanımlanır. Yüklemelerdeki değişiklikleri bu şekilde işlemek, bu öğreticinin kapsamı dışındadır. Üretim içinözel şablonlar
göz önünde bulundurun. Modelleri klasörüneDeviceInstallation.cs adlı başka bir Boş Sınıfekleyin ve ardından aşağıdaki uygulamayı ekleyin. using System.Collections.Generic; using System.ComponentModel.DataAnnotations; namespace PushDemoApi.Models { public class DeviceInstallation { [Required] public string InstallationId { get; set; } [Required] public string Platform { get; set; } [Required] public string PushChannel { get; set; } public IList<string> Tags { get; set; } = Array.Empty<string>(); } }
Modelleri klasörüneNotificationRequest.cs adlı başka bir Boş Sınıfekleyin ve aşağıdaki uygulamayı ekleyin. using System; namespace PushDemoApi.Models { public class NotificationRequest { public string Text { get; set; } public string Action { get; set; } public string[] Tags { get; set; } = Array.Empty<string>(); public bool Silent { get; set; } } }
Modelleri klasörüne NotificationHubOptions.csadlı başka bir Boş Sınıf ekleyin ve aşağıdaki uygulamayı ekleyin.
using System.ComponentModel.DataAnnotations; namespace PushDemoApi.Models { public class NotificationHubOptions { [Required] public string Name { get; set; } [Required] public string ConnectionString { get; set; } } }
PushDemoApi projesine Servicesadlı yeni bir klasör ekleyin.
Services klasörüne INotificationService.csadlı Boş Arabirim ekleyin ve ardından aşağıdaki uygulamayı ekleyin.
using System.Threading; using System.Threading.Tasks; using PushDemoApi.Models; namespace PushDemoApi.Services { public interface INotificationService { Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation, CancellationToken token); Task<bool> DeleteInstallationByIdAsync(string installationId, CancellationToken token); Task<bool> RequestNotificationAsync(NotificationRequest notificationRequest, CancellationToken token); } }
Services klasörüne NotificationHubsService.csadlı Boş Sınıf ekleyin ve INotificationService arabirimini uygulamak için aşağıdaki kodu ekleyin:
using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Azure.NotificationHubs; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using PushDemoApi.Models; namespace PushDemoApi.Services { public class NotificationHubService : INotificationService { readonly NotificationHubClient _hub; readonly Dictionary<string, NotificationPlatform> _installationPlatform; readonly ILogger<NotificationHubService> _logger; public NotificationHubService(IOptions<NotificationHubOptions> options, ILogger<NotificationHubService> logger) { _logger = logger; _hub = NotificationHubClient.CreateClientFromConnectionString( options.Value.ConnectionString, options.Value.Name); _installationPlatform = new Dictionary<string, NotificationPlatform> { { nameof(NotificationPlatform.Apns).ToLower(), NotificationPlatform.Apns }, { nameof(NotificationPlatform.Fcm).ToLower(), NotificationPlatform.Fcm } }; } public async Task<bool> CreateOrUpdateInstallationAsync(DeviceInstallation deviceInstallation, CancellationToken token) { if (string.IsNullOrWhiteSpace(deviceInstallation?.InstallationId) || string.IsNullOrWhiteSpace(deviceInstallation?.Platform) || string.IsNullOrWhiteSpace(deviceInstallation?.PushChannel)) return false; var installation = new Installation() { InstallationId = deviceInstallation.InstallationId, PushChannel = deviceInstallation.PushChannel, Tags = deviceInstallation.Tags }; if (_installationPlatform.TryGetValue(deviceInstallation.Platform, out var platform)) installation.Platform = platform; else return false; try { await _hub.CreateOrUpdateInstallationAsync(installation, token); } catch { return false; } return true; } public async Task<bool> DeleteInstallationByIdAsync(string installationId, CancellationToken token) { if (string.IsNullOrWhiteSpace(installationId)) return false; try { await _hub.DeleteInstallationAsync(installationId, token); } catch { return false; } return true; } public async Task<bool> RequestNotificationAsync(NotificationRequest notificationRequest, CancellationToken token) { if ((notificationRequest.Silent && string.IsNullOrWhiteSpace(notificationRequest?.Action)) || (!notificationRequest.Silent && (string.IsNullOrWhiteSpace(notificationRequest?.Text)) || string.IsNullOrWhiteSpace(notificationRequest?.Action))) return false; var androidPushTemplate = notificationRequest.Silent ? PushTemplates.Silent.Android : PushTemplates.Generic.Android; var iOSPushTemplate = notificationRequest.Silent ? PushTemplates.Silent.iOS : PushTemplates.Generic.iOS; var androidPayload = PrepareNotificationPayload( androidPushTemplate, notificationRequest.Text, notificationRequest.Action); var iOSPayload = PrepareNotificationPayload( iOSPushTemplate, notificationRequest.Text, notificationRequest.Action); try { if (notificationRequest.Tags.Length == 0) { // This will broadcast to all users registered in the notification hub await SendPlatformNotificationsAsync(androidPayload, iOSPayload, token); } else if (notificationRequest.Tags.Length <= 20) { await SendPlatformNotificationsAsync(androidPayload, iOSPayload, notificationRequest.Tags, token); } else { var notificationTasks = notificationRequest.Tags .Select((value, index) => (value, index)) .GroupBy(g => g.index / 20, i => i.value) .Select(tags => SendPlatformNotificationsAsync(androidPayload, iOSPayload, tags, token)); await Task.WhenAll(notificationTasks); } return true; } catch (Exception e) { _logger.LogError(e, "Unexpected error sending notification"); return false; } } string PrepareNotificationPayload(string template, string text, string action) => template .Replace("$(alertMessage)", text, StringComparison.InvariantCulture) .Replace("$(alertAction)", action, StringComparison.InvariantCulture); Task SendPlatformNotificationsAsync(string androidPayload, string iOSPayload, CancellationToken token) { var sendTasks = new Task[] { _hub.SendFcmNativeNotificationAsync(androidPayload, token), _hub.SendAppleNativeNotificationAsync(iOSPayload, token) }; return Task.WhenAll(sendTasks); } Task SendPlatformNotificationsAsync(string androidPayload, string iOSPayload, IEnumerable<string> tags, CancellationToken token) { var sendTasks = new Task[] { _hub.SendFcmNativeNotificationAsync(androidPayload, tags, token), _hub.SendAppleNativeNotificationAsync(iOSPayload, tags, token) }; return Task.WhenAll(sendTasks); } } }
Not
SendTemplateNotificationAsync için sağlanan etiket ifadesi 20 etiketle sınırlıdır. Çoğu işleç için 6 ile sınırlıdır, ancak ifade bu durumda yalnızca OR'leri (||) içerir. İstekte 20'den fazla etiket varsa, bunların birden çok isteğe bölünmesi gerekir. Daha fazla ayrıntı için Yönlendirme ve Etiket İfadeleri belgelerine bakın.
Startup.csConfigureServices yöntemini güncelleştirerek NotificationHubsServiceINotificationServiceuygulamasının tek bir uygulaması olarak ekleyin.
using PushDemoApi.Models; using PushDemoApi.Services; public void ConfigureServices(IServiceCollection services) { ... services.AddSingleton<INotificationService, NotificationHubService>(); services.AddOptions<NotificationHubOptions>() .Configure(Configuration.GetSection("NotificationHub").Bind) .ValidateDataAnnotations(); }
Bildirimler API'sini oluşturma
Denetim
tıklayın, ardındanDenetleyicileri klasöründekiEkle menüsünden Yeni Dosya...seçin. Adı içinASP.NET Core Web API Denetleyicisi Sınıfı NotificationsController girin ve yenitıklayın. Not
Visual Studio 2019 ile takip ediyorsanız okuma/yazma eylemleri şablonu içerenAPI Denetleyicisi'ni seçin. 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;
Şablonlu denetleyiciyi, ControllerBase türetilen ve ApiController özniteliğiyle süslenen şekilde güncelleştirin.
[ApiController] [Route("api/[controller]")] public class NotificationsController : ControllerBase { // Templated methods here }
Not
Controller temel sınıfı görünümler için destek sağlar, ancak bu durumda bu gerekli değildir ve bunun yerine ControllerBase kullanılabilir. Visual Studio 2019ile takip ediyorsanız bu adımı atlayabilirsiniz.
API Anahtarı kullanarak
Kimlik Doğrulaması istemcilerini tamamlamayı seçtiyseniz, NotificationsController Authorize özniteliğiyle de süslemeniz gerekir.[Authorize]
INotificationService'nin kayıtlı örneğini bağımsız değişken olarak kabul etmek ve salt okunur bir üyeye atamak için oluşturucuyu güncelleştirin.
readonly INotificationService _notificationService; public NotificationsController(INotificationService notificationService) { _notificationService = notificationService; }
launchSettings.json'da (Özellikler klasöründe), RegistrationsControllerRoute özniteliğinde belirtilen URL ile eşleşecek şekilde launchUrl
weatherforecast
olan api/notifications değiştirin.Uygulamanın yeni NotificationsController ile çalıştığını doğrulamak ve 401 Yetkisiz durumu döndürmek için hata ayıklamayı başlatın (Command + Enter).
Not
Visual Studio, uygulamayı tarayıcıda otomatik olarak başlatamayabilir. Api'yi bu noktadan sonra test etmek için Postman kullanacaksınız.
Yeni bir
sekmesinde, isteği GETPostman olarak ayarlayın. applicationUrl <> yer tutucusunu Özellikler>launchSettings.jsonbulunan https applicationUrl ile değiştirerek aşağıdaki adresi girin. <applicationUrl>/api/notifications
Not
applicationUrl varsayılan profil için 'https://localhost:5001' olmalıdır. IIS kullanıyorsanız (Windows Visual Studio 2019 varsayılandır), bunun yerine iisSettings öğesinde belirtilen applicationUrl kullanmalısınız. Adres yanlışsa 404 yanıtı alırsınız.
API Anahtarı kullanarak istemcilerin kimliğini doğrulama
tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırdığınızdan emin olun.Anahtar Değer apikey <your_api_key> Gönder düğmesine tıklayın.
Not
Bazı JSON içeriğiyle 200 Tamam durumu almalısınız.
SSL sertifika doğrulaması uyarısı alırsanız,Ayarları 'nde Postman ayarıSSL sertifikası doğrulama isteği ayarını kapatabilirsiniz. NotificationsController.cs şablonlu sınıf yöntemlerini aşağıdaki kodla değiştirin.
[HttpPut] [Route("installations")] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest)] [ProducesResponseType((int)HttpStatusCode.UnprocessableEntity)] public async Task<IActionResult> UpdateInstallation( [Required]DeviceInstallation deviceInstallation) { var success = await _notificationService .CreateOrUpdateInstallationAsync(deviceInstallation, HttpContext.RequestAborted); if (!success) return new UnprocessableEntityResult(); return new OkResult(); } [HttpDelete()] [Route("installations/{installationId}")] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest)] [ProducesResponseType((int)HttpStatusCode.UnprocessableEntity)] public async Task<ActionResult> DeleteInstallation( [Required][FromRoute]string installationId) { var success = await _notificationService .DeleteInstallationByIdAsync(installationId, CancellationToken.None); if (!success) return new UnprocessableEntityResult(); return new OkResult(); } [HttpPost] [Route("requests")] [ProducesResponseType((int)HttpStatusCode.OK)] [ProducesResponseType((int)HttpStatusCode.BadRequest)] [ProducesResponseType((int)HttpStatusCode.UnprocessableEntity)] public async Task<IActionResult> RequestPush( [Required]NotificationRequest notificationRequest) { if ((notificationRequest.Silent && string.IsNullOrWhiteSpace(notificationRequest?.Action)) || (!notificationRequest.Silent && string.IsNullOrWhiteSpace(notificationRequest?.Text))) return new BadRequestResult(); var success = await _notificationService .RequestNotificationAsync(notificationRequest, HttpContext.RequestAborted); if (!success) return new UnprocessableEntityResult(); return new OkResult(); }
API uygulamasını oluşturma
Artık arka uç hizmetini barındırmak için Azure App Service'nde bir API Uygulaması oluşturacaksınız.
Azure portalındaoturum açın.
Kaynak oluştur'a tıklayın, ardındanAPI Uygulaması 'ni arayıp seçin, ardındanOluştur'utıklayın. Aşağıdaki alanları güncelleştirin, ardındanoluştur'u
tıklayın. Uygulama adı:
API Uygulaması için genel olarak benzersiz bir ad girinAboneliği:
Bildirim hub'ını oluşturduğunuz Abonelikaynı hedefi seçin. Kaynak Grubu:
Bildirim hub'ını oluşturduğunuz kaynak grubuseçin. App Service Planı/Konumu:
Yeni bir App Service Planı oluşturmaNot
Varsayılan seçenekten SSL desteği içeren bir plana geçin. Aksi takdirde, http isteklerinin engellenmesini önlemek için mobil uygulamayla çalışırken uygun adımları uygulamanız gerekir.
Application Insights':
Önerilen seçeneği koruyun (bu ad kullanılarak yeni bir kaynak oluşturulur) veya mevcut bir kaynağı seçin.API Uygulaması sağlandıktan sonra bu kaynağa gidin.
Genel Bakışüst kısmındaki Essentials özetindeki URL özelliğini not edin. Bu URL, bu öğreticinin ilerleyen bölümlerinde kullanılacak arka uç uç nokta.
Not
URL, daha önce belirttiğiniz API uygulama adını
https://<app_name>.azurewebsites.net
biçiminde kullanır.Listeden
Yapılandırma seçin (ayarlaraltında). Aşağıdaki ayarların her biri için,
Adı veDeğer girmek için Yeni uygulama ayarı'e tıklayın ve ardından tamam tıklayın. Ad Değer Authentication:ApiKey
<api_key_value> NotificationHub:Name
<hub_name_value> NotificationHub:ConnectionString
<hub_connection_string_value> Not
Bunlar, daha önce kullanıcı ayarlarında tanımladığınız ayarlarla aynıdır. Bunları kopyalayabilirsiniz.
Authentication:ApiKey ayarı, yalnızca api anahtarı kullanarak istemcilerin kimliğini doğrulamatamamlamayı seçtiğinizde gereklidir. Üretim senaryoları için Azure KeyVaultgibi seçeneklere bakabilirsiniz. Bunlar, bu örnekte kolaylık sağlamak için uygulama ayarları olarak eklenmiştir. Tüm uygulama ayarları eklendikten sonraKaydet'e
tıklayın ve ardındanDevam Et'i .
Arka uç hizmetini yayımlama
Ardından, uygulamayı tüm cihazlardan erişilebilir hale getirmek için API Uygulamasına dağıtacaksınız.
Not
Aşağıdaki adımlar Mac için Visual Studio
Henüz yapmadıysanız yapılandırmanızı Hata AyıklamaSürüm olarak değiştirin.
Denetimi
tıklayın ve ardındanPushDemoApi projesiniYayımla menüsünden Azure'da Yayımla...seçin. İstenirse kimlik doğrulama akışını izleyin. API Uygulaması bölümünü oluşturmak
önceki bölümde kullandığınız hesabı kullanın. Listeden yayımlama hedefiniz olarak daha önce oluşturduğunuz Azure App Service API Uygulaması seçin ve Yayımlaöğesine tıklayın.
Sihirbazı tamamladıktan sonra uygulamayı Azure'da yayımlar ve ardından uygulamayı açar. Henüz yapmadıysanız URL not edin. Bu URL, bu öğreticinin sonraki bölümlerinde kullanılan arka uç uç.
Yayımlanan API'yi doğrulama
yeni bir sekme açın, isteği PUTPostman olarak ayarlayın ve aşağıdaki adresi girin. Yer tutucusunu önceki arka uç hizmeti yayımlama bölümünde not ettiğiniz temel adresle değiştirin. https://<app_name>.azurewebsites.net/api/notifications/installations
Not
Temel adres
https://<app_name>.azurewebsites.net/
biçiminde olmalıdırAPI Anahtarı kullanarak istemcilerin kimliğini doğrulama
tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırdığınızdan emin olun.Anahtar Değer apikey <your_api_key> Gövde içinham seçeneğini belirleyin, ardından biçim seçenekleri listesindenJSON seçin ve ardından JSON içeriğiyer tutucu ekleyin: {}
Gönder'
tıklayın. Not
Hizmetten 422 UnprocessableEntity durumu almalısınız.
1-4 arası adımları yeniden uygulayın, ancak bu kez 400 Hatalı İstek yanıtı aldığınızı doğrulamak için istekler uç noktasını belirtin.
https://<app_name>.azurewebsites.net/api/notifications/requests
Not
Bunun için istemci mobil uygulamasından platforma özgü bilgiler gerekeceğinden API'yi geçerli istek verileri kullanarak test etmek henüz mümkün değildir.
Platformlar arası Xamarin.Forms uygulaması oluşturma
Bu bölümde, platformlar arası bir şekilde anında iletme bildirimleri uygulayan bir Xamarin.Forms mobil uygulaması oluşturacaksınız.
Oluşturduğunuz arka uç hizmeti aracılığıyla bir bildirim hub'ından kaydolmanızı ve kaydını kaldırmanızı sağlar.
Bir eylem belirtildiğinde ve uygulama ön planda olduğunda bir uyarı görüntülenir. Aksi takdirde bildirimler bildirim merkezinde görünür.
Not
Kayıt (ve kayıt silme) eylemlerini genellikle uygulama yaşam döngüsünde uygun bir noktada (veya ilk çalıştırma deneyiminizin bir parçası olarak) açık kullanıcı yazmadan/girişlerin kaydını kaldırmadan gerçekleştirirsiniz. Ancak bu örnek, bu işlevselliğin daha kolay keşfedilmesine ve test edilmesine izin vermek için açık kullanıcı girişi gerektirir.
Xamarin.Forms çözümünü oluşturma
Visual Studio 'nde, şablon olarak Boş Formlar Uygulaması'kullanarak yeni bir Xamarin.Forms çözümü oluşturun veProje Adı için PushDemogirin. Not
Boş Formlar Uygulamanızı yapılandırma iletişim kutusunda, Kuruluş Tanımlayıcısı daha önce kullandığınız değerle eşleştiğinden ve hem Android hem de iOS hedeflerinin işaretlendiğinden emin olun.
Denetimi tıklayın ve nuget paketlerini güncelleştirPushDemo çözümündeseçin. Denetimi + PushDemo çözümünde tıklayın ve ardından NuGet Paketlerini Yönet'i seçin...
Newtonsoft.Json arayın ve işaretli olduğundan emin olun.
Paket Ekle'yi
ve ardından lisans koşullarını kabul etmek isteyip istemediğiniz sorulduğunda Kabul Et'e tıklayın. Şablonlu uygulama çalıştırmalarını cihazınızda test etmek için her hedef platformda (Command + Enter) uygulamayı derleyin ve çalıştırın.
Platformlar arası bileşenleri uygulama
Denetimi tıklayın,PushDemo projesindeEkle menüsünden Yeni Klasör'seçin ve ardından Klasör Adı olarakModelleri kullanarak ekle tıklayın. Denetimi tıklayın, ardındanModelleri klasöründekiEkle menüsünden Yeni Dosya...seçin. Genel>Boş Sınıfseçin, DeviceInstallation.csgirin ve aşağıdaki uygulamayı ekleyin.
using System.Collections.Generic; using Newtonsoft.Json; namespace PushDemo.Models { public class DeviceInstallation { [JsonProperty("installationId")] public string InstallationId { get; set; } [JsonProperty("platform")] public string Platform { get; set; } [JsonProperty("pushChannel")] public string PushChannel { get; set; } [JsonProperty("tags")] public List<string> Tags { get; set; } = new List<string>(); } }
Aşağıdaki uygulamayla PushDemoAction.cs adlı Modelleri klasörüne Boş Numaralandırma ekleyin.
namespace PushDemo.Models { public enum PushDemoAction { ActionA, ActionB } }
PushDemo projesine Services adlı yeni bir klasör ekleyin ardından aşağıdaki uygulamayla ServiceContainer.cs adlı klasöre Boş Sınıf ekleyin.
using System; using System.Collections.Generic; namespace PushDemo.Services { public static class ServiceContainer { static readonly Dictionary<Type, Lazy<object>> services = new Dictionary<Type, Lazy<object>>(); public static void Register<T>(Func<T> function) => services[typeof(T)] = new Lazy<object>(() => function()); public static T Resolve<T>() => (T)Resolve(typeof(T)); public static object Resolve(Type type) { { if (services.TryGetValue(type, out var service)) return service.Value; throw new KeyNotFoundException($"Service not found for type '{type}'"); } } } }
Not
Bu, XamCAT deposundan ServiceContainer sınıfının kırpılmış bir sürümüdür. Hafif bir IoC (Denetimin Tersine Çevrilmesi) kapsayıcısı olarak kullanılacaktır.
IDeviceInstallationService.csadlı Services klasörüne Boş Arabirim ekleyin ve aşağıdaki kodu ekleyin.
using PushDemo.Models; namespace PushDemo.Services { public interface IDeviceInstallationService { string Token { get; set; } bool NotificationsSupported { get; } string GetDeviceId(); DeviceInstallation GetDeviceInstallation(params string[] tags); } }
Not
Bu arabirim daha sonra platforma özgü işlevselliği sağlamak ve arka uç hizmeti tarafından gereken DeviceInstallation bilgilerini
için her hedef tarafından uygulanır ve önyüklenir. INotificationRegistrationService.cs adlıServices klasörüne başka bir boş arabirimekleyin ve aşağıdaki kodu ekleyin. using System.Threading.Tasks; namespace PushDemo.Services { public interface INotificationRegistrationService { Task DeregisterDeviceAsync(); Task RegisterDeviceAsync(params string[] tags); Task RefreshRegistrationAsync(); } }
Not
Bu, istemci ve arka uç hizmeti arasındaki etkileşimi işler.
Services klasörüne INotificationActionService.csadlı başka bir boş arabirim ekleyin ve aşağıdaki kodu ekleyin.
namespace PushDemo.Services { public interface INotificationActionService { void TriggerAction(string action); } }
Not
Bu, bildirim eylemlerinin işlenmesini merkezileştirmek için basit bir mekanizma olarak kullanılır.
aşağıdaki uygulamayla INotificationActionService'dan türetilen IPushDemoNotificationActionService.cs adlı Services klasörüne Boş Arabirim ekleyin.
using System; using PushDemo.Models; namespace PushDemo.Services { public interface IPushDemoNotificationActionService : INotificationActionService { event EventHandler<PushDemoAction> ActionTriggered; } }
Not
Bu tür, PushDemo uygulamasına özgüdür ve kesin olarak türlenmiş bir şekilde tetiklenen eylemi tanımlamak için PushDemoAction numaralandırmasını kullanır.
Services klasörüne aşağıdaki kodla INotificationRegistrationService uygulayarak NotificationRegistrationService.cs adlı Boş Sınıf ekleyin.
using System; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Newtonsoft.Json; using PushDemo.Models; using Xamarin.Essentials; namespace PushDemo.Services { public class NotificationRegistrationService : INotificationRegistrationService { const string RequestUrl = "api/notifications/installations"; const string CachedDeviceTokenKey = "cached_device_token"; const string CachedTagsKey = "cached_tags"; string _baseApiUrl; HttpClient _client; IDeviceInstallationService _deviceInstallationService; public NotificationRegistrationService(string baseApiUri, string apiKey) { _client = new HttpClient(); _client.DefaultRequestHeaders.Add("Accept", "application/json"); _client.DefaultRequestHeaders.Add("apikey", apiKey); _baseApiUrl = baseApiUri; } IDeviceInstallationService DeviceInstallationService => _deviceInstallationService ?? (_deviceInstallationService = ServiceContainer.Resolve<IDeviceInstallationService>()); public async Task DeregisterDeviceAsync() { var cachedToken = await SecureStorage.GetAsync(CachedDeviceTokenKey) .ConfigureAwait(false); if (cachedToken == null) return; var deviceId = DeviceInstallationService?.GetDeviceId(); if (string.IsNullOrWhiteSpace(deviceId)) throw new Exception("Unable to resolve an ID for the device."); await SendAsync(HttpMethod.Delete, $"{RequestUrl}/{deviceId}") .ConfigureAwait(false); SecureStorage.Remove(CachedDeviceTokenKey); SecureStorage.Remove(CachedTagsKey); } public async Task RegisterDeviceAsync(params string[] tags) { var deviceInstallation = DeviceInstallationService?.GetDeviceInstallation(tags); await SendAsync<DeviceInstallation>(HttpMethod.Put, RequestUrl, deviceInstallation) .ConfigureAwait(false); await SecureStorage.SetAsync(CachedDeviceTokenKey, deviceInstallation.PushChannel) .ConfigureAwait(false); await SecureStorage.SetAsync(CachedTagsKey, JsonConvert.SerializeObject(tags)); } public async Task RefreshRegistrationAsync() { var cachedToken = await SecureStorage.GetAsync(CachedDeviceTokenKey) .ConfigureAwait(false); var serializedTags = await SecureStorage.GetAsync(CachedTagsKey) .ConfigureAwait(false); if (string.IsNullOrWhiteSpace(cachedToken) || string.IsNullOrWhiteSpace(serializedTags) || string.IsNullOrWhiteSpace(DeviceInstallationService.Token) || cachedToken == DeviceInstallationService.Token) return; var tags = JsonConvert.DeserializeObject<string[]>(serializedTags); await RegisterDeviceAsync(tags); } async Task SendAsync<T>(HttpMethod requestType, string requestUri, T obj) { string serializedContent = null; await Task.Run(() => serializedContent = JsonConvert.SerializeObject(obj)) .ConfigureAwait(false); await SendAsync(requestType, requestUri, serializedContent); } async Task SendAsync( HttpMethod requestType, string requestUri, string jsonRequest = null) { var request = new HttpRequestMessage(requestType, new Uri($"{_baseApiUrl}{requestUri}")); if (jsonRequest != null) request.Content = new StringContent(jsonRequest, Encoding.UTF8, "application/json"); var response = await _client.SendAsync(request).ConfigureAwait(false); response.EnsureSuccessStatusCode(); } } }
Not
apiKey bağımsız değişkeni, yalnızca Api Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir.
IPushDemoNotificationActionService aşağıdaki kodla uygulayarak PushDemoNotificationActionService.cs adlı Services klasörüne Boş Sınıf ekleyin.
using System; using System.Collections.Generic; using System.Linq; using PushDemo.Models; namespace PushDemo.Services { public class PushDemoNotificationActionService : IPushDemoNotificationActionService { readonly Dictionary<string, PushDemoAction> _actionMappings = new Dictionary<string, PushDemoAction> { { "action_a", PushDemoAction.ActionA }, { "action_b", PushDemoAction.ActionB } }; public event EventHandler<PushDemoAction> ActionTriggered = delegate { }; public void TriggerAction(string action) { if (!_actionMappings.TryGetValue(action, out var pushDemoAction)) return; List<Exception> exceptions = new List<Exception>(); foreach (var handler in ActionTriggered?.GetInvocationList()) { try { handler.DynamicInvoke(this, pushDemoAction); } catch (Exception ex) { exceptions.Add(ex); } } if (exceptions.Any()) throw new AggregateException(exceptions); } } }
Aşağıdaki uygulamayla PushDemo projesine Config.cs adlı Boş Sınıf ekleyin.
namespace PushDemo { public static partial class Config { public static string ApiKey = "API_KEY"; public static string BackendServiceEndpoint = "BACKEND_SERVICE_ENDPOINT"; } }
Not
Bu, gizli dizileri kaynak denetiminin dışında tutmanın basit bir yolu olarak kullanılır. Bu değerleri otomatik bir derlemenin parçası olarak değiştirebilir veya yerel bir kısmi sınıf kullanarak geçersiz kılabilirsiniz. Bunu sonraki adımda yapacaksınız.
ApiKey alanı, yalnızca Api Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir.
Bu kez aşağıdaki uygulamayla
PushDemo projesineConfig.local_secrets.cs adlı başka bir Boş Sınıfekleyin. namespace PushDemo { public static partial class Config { static Config() { ApiKey = "<your_api_key>"; BackendServiceEndpoint = "<your_api_app_url>"; } } }
Not
Yer tutucu değerlerini kendi değerlerinizle değiştirin. Arka uç hizmetini oluştururken bunları not almış olmanız gerekir. API Uygulaması URL'si
https://<api_app_name>.azurewebsites.net/
olmalıdır. Bu dosyanın işlenmesini önlemek için gitignore dosyanıza*.local_secrets.*
eklemeyi unutmayın.ApiKey alanı, yalnızca Api Anahtarı kullanarak istemcilerin kimliğini doğrulama bölümünü tamamlamayı seçtiğinizde gereklidir.
Aşağıdaki uygulamayla Bootstrap.cs adlı PushDemo projesine Boş Sınıf ekleyin.
using System; using PushDemo.Services; namespace PushDemo { public static class Bootstrap { public static void Begin(Func<IDeviceInstallationService> deviceInstallationService) { ServiceContainer.Register(deviceInstallationService); ServiceContainer.Register<IPushDemoNotificationActionService>(() => new PushDemoNotificationActionService()); ServiceContainer.Register<INotificationRegistrationService>(() => new NotificationRegistrationService( Config.BackendServiceEndpoint, Config.ApiKey)); } } }
Not
Begin yöntemi, uygulama IDeviceInstallationServiceplatforma özgü bir uygulama geçirmeyi başlattığında her platform tarafından çağrılır.
NotificationRegistrationService apiKey oluşturucu bağımsız değişkeni, yalnızca API Anahtarı kullanarak istemcilerin kimliğini doğrulamatamamlamayı seçtiğinizde gereklidir.
Platformlar arası kullanıcı arabirimini uygulama
PushDemo projesinde MainPage.xamlaçın ve StackLayout denetimini aşağıdakilerle değiştirin.<StackLayout VerticalOptions="EndAndExpand" HorizontalOptions="FillAndExpand" Padding="20,40"> <Button x:Name="RegisterButton" Text="Register" Clicked="RegisterButtonClicked" /> <Button x:Name="DeregisterButton" Text="Deregister" Clicked="DeregisterButtonClicked" /> </StackLayout>
Şimdi
MainPage.xaml.cs 'de,INotificationRegistrationService uygulamasına başvuruyu depolamak için salt okunur biryedekleme alanı ekleyin. readonly INotificationRegistrationService _notificationRegistrationService;
MainPage oluşturucusunda,ServiceContainer kullanarak INotificationRegistrationService uygulamasınıçözümleyin ve yedekleme alanına atayın.notificationRegistrationService public MainPage() { InitializeComponent(); _notificationRegistrationService = ServiceContainer.Resolve<INotificationRegistrationService>(); }
RegisterButton ve DeregisterButton düğmeleri için olay işleyicilerini uygulayın karşılık gelen Register/Deregister yöntemlerini çağıran Tıklanan olayları.
void RegisterButtonClicked(object sender, EventArgs e) => _notificationRegistrationService.RegisterDeviceAsync().ContinueWith((task) => { ShowAlert(task.IsFaulted ? task.Exception.Message : $"Device registered"); }); void DeregisterButtonClicked(object sender, EventArgs e) => _notificationRegistrationService.DeregisterDeviceAsync().ContinueWith((task) => { ShowAlert(task.IsFaulted ? task.Exception.Message : $"Device deregistered"); }); void ShowAlert(string message) => MainThread.BeginInvokeOnMainThread(() => DisplayAlert("PushDemo", message, "OK").ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; }));
Şimdi App.xaml.csiçinde aşağıdaki ad alanlarına başvuruldığından emin olun.
using PushDemo.Models; using PushDemo.Services; using Xamarin.Essentials; using Xamarin.Forms;
IPushDemoNotificationActionServiceActionTriggered olayı için olay işleyicisini uygulayın.
void NotificationActionTriggered(object sender, PushDemoAction e) => ShowActionAlert(e); void ShowActionAlert(PushDemoAction action) => MainThread.BeginInvokeOnMainThread(() => MainPage?.DisplayAlert("PushDemo", $"{action} action received", "OK") .ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; }));
Uygulama oluşturucusunda,ServiceContainer kullanarak IPushNotificationActionService uygulamasınıçözün ve IPushDemoNotificationActionService ActionTriggered olayına abone olun.public App() { InitializeComponent(); ServiceContainer.Resolve<IPushDemoNotificationActionService>() .ActionTriggered += NotificationActionTriggered; MainPage = new MainPage(); }
Not
Bu yalnızca anında iletme bildirimi eylemlerinin makbuzunu ve yayılmasını göstermek için yapılır. Bunlar genellikle, bu durumda MainPage
kök Sayfası aracılığıyla uyarı görüntülemek yerine belirli bir görünüme gitme veya bazı verileri yenileme gibi sessizce işlenir.
Yerel Android projesini anında iletme bildirimleri için yapılandırma
Paket adını ve izinlerini doğrulama
PushDemo.Android bölümündeProje Seçenekleri'ni açın ardındanDerleme bölümünden Android Uygulama. Paketi adınınFirebase KonsoluPushDemo projesinde kullandığınız değerle eşleşip eşleşmediğini denetleyin. Paketi adı
com.<organization>.pushdemo
biçimindeydi.En Düşük Android Sürüm Android 8.0 (API düzeyi 26) veHedef Android Sürümü en sonAPI düzeyine ayarlayın. Not
Bu öğreticinin amaçları doğrultusunda yalnızca API düzeyi 26 ve üzeri
çalıştıran cihazlar desteklenir, ancak eski sürümleri çalıştıran cihazları destekleyecek şekilde genişletebilirsiniz. internet ve READ_PHONE_STATE izinlerinin Gerekli izinleraltında etkinleştirildiğinden emin olun.
Tamam
tıklayın
Xamarin Google Play Services tabanını ve Xamarin.Firebase.Messaging paketlerini ekleyin
PushDemo.Android bölümünde, Denetim tıklayın ve ardından NuGet Paketlerini Yönet...Paketleri klasöründekiseçin. Xamarin.GooglePlayServices.Base (Bodrumdeğil) arayın ve işaretli olduğundan emin olun. Xamarin.Firebase.Messaging arayın ve işaretli olduğundan emin olun.
paket ekle
tıklayın, ardından lisans koşullarını kabul etmek isteyip istemediğiniz sorulduğundaKabul Et'e tıklayın.
Google Services JSON dosyasını ekleme
Denetimi tıklayın, ardındanprojesinde Ekle menüsünden Var Olan Dosya...seçin. Firebase Konsolu'nda PushDemo projesini ayarlarken indirdiğiniz google-services.json dosyasını seçinAç'a tıklayın.
İstendiğinde, Dosyayıdizinine kopyalama'yı seçin.
Denetimi tıklayın, ardından GoogleServicesJsonprojesinin içinden google-services.json dosyasındakiDerleme Eylemi olarak ayarlandığından emin olun.
Android için anında iletme bildirimlerini işleme
Denetimi tıklayın,projesinde Ekle menüsünden Yeni Klasörseçin ve ekle'yetıklayın.Klasör Adı olarak Hizmetleri kullanarak Denetimi tıklayın, ardındanHizmetleri klasöründekiEkle menüsünden Yeni Dosya...seçin. Genel Boş Sınıf seçin,Adı içinDeviceInstallationService.cs girin, ardından yenitıklayın ve aşağıdaki uygulamayı ekleyin. using System; using Android.App; using Android.Gms.Common; using PushDemo.Models; using PushDemo.Services; using static Android.Provider.Settings; namespace PushDemo.Droid.Services { public class DeviceInstallationService : IDeviceInstallationService { public string Token { get; set; } public bool NotificationsSupported => GoogleApiAvailability.Instance .IsGooglePlayServicesAvailable(Application.Context) == ConnectionResult.Success; public string GetDeviceId() => Secure.GetString(Application.Context.ContentResolver, Secure.AndroidId); public DeviceInstallation GetDeviceInstallation(params string[] tags) { if (!NotificationsSupported) throw new Exception(GetPlayServicesError()); if (string.IsNullOrWhiteSpace(Token)) throw new Exception("Unable to resolve token for FCM"); var installation = new DeviceInstallation { InstallationId = GetDeviceId(), Platform = "fcm", PushChannel = Token }; installation.Tags.AddRange(tags); return installation; } string GetPlayServicesError() { int resultCode = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(Application.Context); if (resultCode != ConnectionResult.Success) return GoogleApiAvailability.Instance.IsUserResolvableError(resultCode) ? GoogleApiAvailability.Instance.GetErrorString(resultCode) : "This device is not supported"; return "An error occurred preventing the use of push notifications"; } } }
Not
Bu sınıf, bildirim hub'ı kayıt yükünün bir parçası olarak benzersiz bir kimlik (Secure.AndroidId
kullanarak) sağlar. Services klasörüne PushNotificationFirebaseMessagingService.csadlı başka Boş Sınıf ekleyin ve aşağıdaki uygulamayı ekleyin.
using Android.App; using Android.Content; using Firebase.Messaging; using PushDemo.Services; namespace PushDemo.Droid.Services { [Service] [IntentFilter(new[] { "com.google.firebase.MESSAGING_EVENT" })] public class PushNotificationFirebaseMessagingService : FirebaseMessagingService { IPushDemoNotificationActionService _notificationActionService; INotificationRegistrationService _notificationRegistrationService; IDeviceInstallationService _deviceInstallationService; IPushDemoNotificationActionService NotificationActionService => _notificationActionService ?? (_notificationActionService = ServiceContainer.Resolve<IPushDemoNotificationActionService>()); INotificationRegistrationService NotificationRegistrationService => _notificationRegistrationService ?? (_notificationRegistrationService = ServiceContainer.Resolve<INotificationRegistrationService>()); IDeviceInstallationService DeviceInstallationService => _deviceInstallationService ?? (_deviceInstallationService = ServiceContainer.Resolve<IDeviceInstallationService>()); public override void OnNewToken(string token) { DeviceInstallationService.Token = token; NotificationRegistrationService.RefreshRegistrationAsync() .ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; }); } public override void OnMessageReceived(RemoteMessage message) { if(message.Data.TryGetValue("action", out var messageAction)) NotificationActionService.TriggerAction(messageAction); } } }
MainActivity.csiçinde, dosyanın en üstüne aşağıdaki ad alanlarının eklendiğinden emin olun.
using System; using Android.App; using Android.Content; using Android.Content.PM; using Android.OS; using Android.Runtime; using Firebase.Iid; using PushDemo.Droid.Services; using PushDemo.Services;
MainActivity.cs 'da,LaunchMode SingleTopolarak ayarlayın, böylece MainActivity açıldığında yeniden oluşturulmaz.[Activity( Label = "PushDemo", LaunchMode = LaunchMode.SingleTop, Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
IPushNotificationActionService başvuruyu depolamak ve IDeviceInstallationService uygulamalarınıiçin özel özellikler ve karşılık gelen yedekleme alanları ekleyin. IPushDemoNotificationActionService _notificationActionService; IDeviceInstallationService _deviceInstallationService; IPushDemoNotificationActionService NotificationActionService => _notificationActionService ?? (_notificationActionService = ServiceContainer.Resolve<IPushDemoNotificationActionService>()); IDeviceInstallationService DeviceInstallationService => _deviceInstallationService ?? (_deviceInstallationService = ServiceContainer.Resolve<IDeviceInstallationService>());
Firebase belirtecini almak ve depolamak için IOnSuccessListener arabirimini uygulayın.
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, Android.Gms.Tasks.IOnSuccessListener { ... public void OnSuccess(Java.Lang.Object result) => DeviceInstallationService.Token = result.Class.GetMethod("getToken").Invoke(result).ToString(); }
Belirli bir Intenteylemiadlı ek bir değere sahip olup olmadığını denetleyecek ProcessNotificationActions adlı yeni bir yöntem ekleyin. IPushDemoNotificationActionService uygulamasını kullanarak bu eylemi koşullu olarak tetikleyin.
void ProcessNotificationActions(Intent intent) { try { if (intent?.HasExtra("action") == true) { var action = intent.GetStringExtra("action"); if (!string.IsNullOrEmpty(action)) NotificationActionService.TriggerAction(action); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } }
ProcessNotificationActions yöntemini çağırmak için OnNewIntent yöntemini geçersiz kılın.
protected override void OnNewIntent(Intent intent) { base.OnNewIntent(intent); ProcessNotificationActions(intent); }
Not
Etkinliği içinLaunchMode SingleTop olarak ayarlandığından, mevcutEtkinliği örneğinearacılığıyla bir yöntemini ve bu nedenle hem OnCreateAmacı gönderilir OnCreate yöntemi yerine OnNewIntenthem de OnNewIntent yöntemlerinde gelen bir amacı işlemeniz gerekir.OnCreate yöntemini, IDeviceInstallationServiceplatforma özgü uygulamasını geçirerek
base.OnCreate
çağrısından hemen sonraBootstrap.Begin
çağıracak şekilde güncelleştirin.Bootstrap.Begin(() => new DeviceInstallationService());
Aynı yöntemde,
çağrısından hemen sonra FirebaseApp örneğinde GetInstanceIdkoşullu olarak çağırın ve IOnSuccessListener olarakMainActivity ekleyin.if (DeviceInstallationService.NotificationsSupported) { FirebaseInstanceId.GetInstance(Firebase.FirebaseApp.Instance) .GetInstanceId() .AddOnSuccessListener(this); }
Hala
OnCreate içinde, geçerliAmacını geçirme çağrısından hemen sonraProcessNotificationActions öğesini çağırın. ... LoadApplication(new App()); ProcessNotificationActions(Intent);
Not
Anında iletme bildirimleri almaya devam etmek için uygulamayı her çalıştırdığınızda yeniden kaydetmeniz ve hata ayıklama oturumundan durdurmanız gerekir.
Yerel iOS projesini anında iletme bildirimleri için yapılandırma
Info.plist ve Entitlements.plist'i yapılandırma
Visual Studio>Tercihleri'nde Apple Geliştirici Hesabı oturum açtığınızdan emin olun...>Apple Geliştirici Hesapları>Yayımlama ve uygun Sertifikası ve Sağlama Profili indirildi. Bu varlıkları önceki adımların bir parçası olarak oluşturmuş olmanız gerekir.
PushDemo.iOSInfo.plist açın ve BundleIdentifierApple Geliştirici Portalıilgili sağlama profili için kullanılan değerle eşleştiğinden emin olun. BundleIdentifier
com.<organization>.PushDemo
biçimindeydi.Aynı dosyada, En düşük sistem sürümü13.0olarak ayarlayın.
Not
Yalnızca iOS 13.0 ve üzeri çalıştıran cihazlar bu öğreticinin amaçları doğrultusunda desteklenir, ancak eski sürümleri çalıştıran cihazları destekleyecek şekilde genişletebilirsiniz.
PushDemo.iOS için Proje Seçenekleri açın (projeye çift tıklayın).
Proje Seçeneklerialtında, Derleme > iOS Paket İmzalamaaltında, Geliştirici hesabınızın Teamaltında seçildiğinden emin olun. Ardından "İmzalama işlemini otomatik olarak yönet" seçeneğinin belirlendiğinden ve İmzalama Sertifikanızın ve Sağlama Profilinizin otomatik olarak seçildiğinden emin olun.
Not
İmzalama Sertifikanız veSağlama Profili otomatik olarak seçilmediyse, El ile Sağlama'i seçin ve ardındanPaket İmzalama Seçenekleri'ni tıklayın. İmzalama Kimliği için Team'nizin ve PushDemo belirli sağlama profilinizin hem Hata Ayıklama hem de Yayın yapılandırmaları için Sağlama Profili için seçildiğinden emin olun ve her iki durumda da Platformu için iPhone seçildiğinden emin olun. PushDemo.iOS bölümünde,Entitlements.plist açın veYetkilendirmeler sekmesinde görüntülendiğinde anında iletme bildirimlerini etkinleştirdenetlendiğinden emin olun. Ardından, Kaynak sekmesinde görüntülendiğindeAPS Ortamı ayarının geliştirmeolarak ayarlandığından emin olun.
iOS için anında iletme bildirimlerini işleme
Denetimi tıklayın,PushDemo.iOS projesindeEkle menüsünden Yeni Klasör'seçin, ardından Klasör Adı olarak .Hizmetleri kullanarak ekle'yi Denetimi tıklayın, ardındanHizmetleri klasöründekiEkle menüsünden Yeni Dosya...seçin. Genel Boş Sınıf seçin,Adı içinDeviceInstallationService.cs girin, ardından yenitıklayın ve aşağıdaki uygulamayı ekleyin. using System; using PushDemo.Models; using PushDemo.Services; using UIKit; namespace PushDemo.iOS.Services { public class DeviceInstallationService : IDeviceInstallationService { const int SupportedVersionMajor = 13; const int SupportedVersionMinor = 0; public string Token { get; set; } public bool NotificationsSupported => UIDevice.CurrentDevice.CheckSystemVersion(SupportedVersionMajor, SupportedVersionMinor); public string GetDeviceId() => UIDevice.CurrentDevice.IdentifierForVendor.ToString(); public DeviceInstallation GetDeviceInstallation(params string[] tags) { if (!NotificationsSupported) throw new Exception(GetNotificationsSupportError()); if (string.IsNullOrWhiteSpace(Token)) throw new Exception("Unable to resolve token for APNS"); var installation = new DeviceInstallation { InstallationId = GetDeviceId(), Platform = "apns", PushChannel = Token }; installation.Tags.AddRange(tags); return installation; } string GetNotificationsSupportError() { if (!NotificationsSupported) return $"This app only supports notifications on iOS {SupportedVersionMajor}.{SupportedVersionMinor} and above. You are running {UIDevice.CurrentDevice.SystemVersion}."; if (Token == null) return $"This app can support notifications but you must enable this in your settings."; return "An error occurred preventing the use of push notifications"; } } }
Not
Bu sınıf benzersiz bir kimlik (UIDevice.IdentifierForVendor değeri kullanılarak) ve bildirim hub'ı kayıt yükünü sağlar.
PushDemo.iOS projesine Uzantıları adlı yeni bir klasör ekleyin ardından aşağıdaki uygulamayla NSDataExtensions.cs adlı klasöre Boş Sınıf ekleyin.
using System.Text; using Foundation; namespace PushDemo.iOS.Extensions { internal static class NSDataExtensions { internal static string ToHexString(this NSData data) { var bytes = data.ToArray(); if (bytes == null) return null; StringBuilder sb = new StringBuilder(bytes.Length * 2); foreach (byte b in bytes) sb.AppendFormat("{0:x2}", b); return sb.ToString().ToUpperInvariant(); } } }
AppDelegate.csiçinde, dosyanın en üstüne aşağıdaki ad alanlarının eklendiğinden emin olun.
using System; using System.Diagnostics; using System.Threading.Tasks; using Foundation; using PushDemo.iOS.Extensions; using PushDemo.iOS.Services; using PushDemo.Services; using UIKit; using UserNotifications; using Xamarin.Essentials;
IPushDemoNotificationActionService, INotificationRegistrationServiceve IDeviceInstallationService uygulamalarına yönelik bir başvuruyu depolamak için özel özellikleri ve bunların ilgili yedekleme alanlarını ekleyin.
IPushDemoNotificationActionService _notificationActionService; INotificationRegistrationService _notificationRegistrationService; IDeviceInstallationService _deviceInstallationService; IPushDemoNotificationActionService NotificationActionService => _notificationActionService ?? (_notificationActionService = ServiceContainer.Resolve<IPushDemoNotificationActionService>()); INotificationRegistrationService NotificationRegistrationService => _notificationRegistrationService ?? (_notificationRegistrationService = ServiceContainer.Resolve<INotificationRegistrationService>()); IDeviceInstallationService DeviceInstallationService => _deviceInstallationService ?? (_deviceInstallationService = ServiceContainer.Resolve<IDeviceInstallationService>());
Kullanıcı bildirim ayarlarını kaydetmek ve ardından
APNS ile uzaktan bildirimler için RegisterForRemoteNotifications yönteminiekleyin. void RegisterForRemoteNotifications() { MainThread.BeginInvokeOnMainThread(() => { var pushSettings = UIUserNotificationSettings.GetSettingsForTypes( UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, new NSSet()); UIApplication.SharedApplication.RegisterUserNotificationSettings(pushSettings); UIApplication.SharedApplication.RegisterForRemoteNotifications(); }); }
IDeviceInstallationService.Token
özellik değerini ayarlamak için CompleteRegistrationAsync yöntemini ekleyin. Kaydı yenileyin ve cihaz belirtecini en son depolandıktan sonra güncelleştirildiyse önbelleğe alın.Task CompleteRegistrationAsync(NSData deviceToken) { DeviceInstallationService.Token = deviceToken.ToHexString(); return NotificationRegistrationService.RefreshRegistrationAsync(); }
NSDictionary bildirim verilerini işlemek ve NotificationActionService.TriggerActionkoşullu olarak çağırmak için ProcessNotificationActions yöntemini ekleyin.
void ProcessNotificationActions(NSDictionary userInfo) { if (userInfo == null) return; try { var actionValue = userInfo.ObjectForKey(new NSString("action")) as NSString; if (!string.IsNullOrWhiteSpace(actionValue?.Description)) NotificationActionService.TriggerAction(actionValue.Description); } catch (Exception ex) { Debug.WriteLine(ex.Message); } }
deviceToken bağımsız değişkenini CompleteRegistrationAsync yöntemine geçirerek RegisteredForRemoteNotifications yöntemini geçersiz kılın.
public override void RegisteredForRemoteNotifications( UIApplication application, NSData deviceToken) => CompleteRegistrationAsync(deviceToken).ContinueWith((task) => { if (task.IsFaulted) throw task.Exception; });
userInfo bağımsız değişkeniniProcessNotificationActions yöntemine geçirerek ReceivedRemoteNotificationyöntemini geçersiz kılın. public override void ReceivedRemoteNotification( UIApplication application, NSDictionary userInfo) => ProcessNotificationActions(userInfo);
Hatayı günlüğe kaydetmek için FailedToRegisterForRemoteNotifications yöntemini
geçersiz kılın. public override void FailedToRegisterForRemoteNotifications( UIApplication application, NSError error) => Debug.WriteLine(error.Description);
Not
Bu çok yer tutucudur. Üretim senaryoları için uygun günlüğe kaydetme ve hata işleme uygulamak isteyeceksiniz.
FinishedLaunching yöntemini, IDeviceInstallationServiceplatforma özgü uygulamadan
Forms.Init
geçirme çağrısından hemen sonraBootstrap.Begin
çağıracak şekilde güncelleştirin.Bootstrap.Begin(() => new DeviceInstallationService());
Aynı yöntemde koşullu olarak yetkilendirme isteyin ve
Bootstrap.Begin
hemen sonra uzak bildirimlere kaydolun.if (DeviceInstallationService.NotificationsSupported) { UNUserNotificationCenter.Current.RequestAuthorization( UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (approvalGranted, error) => { if (approvalGranted && error == null) RegisterForRemoteNotifications(); }); }
Hala
FinishedLaunching içinde,seçenekleri bağımsız değişkeni uiApplication.LaunchOptionsRemoteNotificationKey sonuçuserInfo nesnesini geçirmeiçeriyorsa, çağrısından hemen sonra ProcessNotificationActions çağırın.using (var userInfo = options?.ObjectForKey( UIApplication.LaunchOptionsRemoteNotificationKey) as NSDictionary) ProcessNotificationActions(userInfo);
Çözümü test edin
Artık arka uç hizmeti aracılığıyla bildirim göndermeyi test edebilirsiniz.
Test bildirimi gönderme
Postmaniçinde yeni bir sekme açın.
İsteği POST
olarak ayarlayın ve aşağıdaki adresi girin: https://<app_name>.azurewebsites.net/api/notifications/requests
API Anahtarı kullanarak istemcilerin kimliğini doğrulama
tamamlamayı seçtiyseniz, istek üst bilgilerini apikey değerinizi içerecek şekilde yapılandırdığınızdan emin olun.Anahtar Değer apikey <your_api_key> Gövde içinham seçeneğini belirleyin, ardından biçim seçenekleri listesindenJSON seçin ve ardından JSON içeriğiyer tutucu ekleyin: { "text": "Message from Postman!", "action": "action_a" }
Pencerenin sağ üst kısmındaki Kaydet düğmesinin altındaki Kod düğmesini seçin. İstek, HTML görüntülendiğinde aşağıdaki örneğe benzer görünmelidir (apikey üst bilgisi ekleyip eklemediğinize bağlı olarak):
POST /api/notifications/requests HTTP/1.1 Host: https://<app_name>.azurewebsites.net apikey: <your_api_key> Content-Type: application/json { "text": "Message from backend service", "action": "action_a" }
PushDemo uygulamasını hedef platformlardan birinde veya her ikisinde (Android veiOS ) çalıştırın. Not
Android üzerinde test ediyorsanız Hata Ayıklamaiçinde çalışmadığınızdan emin olun veya uygulama çalıştırılarak dağıtıldıysa uygulamayı kapatıp başlatıcıdan yeniden başlatın.
PushDemo uygulamasında Kaydet düğmesine dokunun.
'a geri dönün, Kod Parçacıkları OluşturPostman penceresini kapatın (henüz yapmadıysanız) Gönder düğmesine tıklayın. 'daPostman 200 Tamam yanıtı aldığınızı ve uyarının uygulamadaalınanEylemA eylemini gösteren bir uyarı görüntülendiğini doğrulayın. PushDemo uygulamasını kapatın, ardından Postman'nde Gönder düğmesine yeniden tıklayın.
'daPostman 200 Tamam yanıtı aldığınızdan doğrulayın. PushDemo uygulamasının bildirim alanında doğru iletiyle bir bildirimin göründüğünü doğrulayın.Uygulamayı açtığını onaylamak için bildirime dokunun ve uyarı alınan
EylemA eylemini görüntüleyin. postman
geri dönün, önceki istek gövdesini değiştirerek eylemi değeri içinaction_a yerineaction_b belirten sessiz bir bildirim gönderin.{ "action": "action_b", "silent": true }
Uygulama hala açık durumdayken, Postmaniçindeki Gönder düğmesine tıklayın.
'ndePostman 200 Tamam yanıtı aldığınızı ve uyarının uygulamadaalınan EylemA eylemi yerineEylemB eyleminin gösterildiğini doğrulayın . PushDemo uygulamasını kapatın, ardından Postman'nde Gönder düğmesine yeniden tıklayın.
Postman200 Tamam yanıtı alacağınızı ve sessiz bildirimin bildirim alanında görünmediğini doğrulayın.
Sorun giderme
Arka uç hizmetinden yanıt yok
Yerel olarak test ederken arka uç hizmetinin çalıştığından ve doğru bağlantı noktasını kullandığından emin olun.
Azure API Uygulamasıkarşı test ediyorsanız hizmetin çalışıp çalışmadığını ve dağıtıldığını ve hatasız olarak başlatıldığını denetleyin.
İstemci aracılığıyla test ederken Postman veya mobil uygulama yapılandırmasında temel adresi doğru belirttiğinizden emin olun. Temel adres, yerel olarak test ederken https://<api_name>.azurewebsites.net/
veya https://localhost:5001/
olmalıdır.
Hata ayıklama oturumunu başlattıktan veya durdurduktan sonra Android'de bildirim alınmıyor
Hata ayıklama oturumunu başlattıktan veya durdurduktan sonra yeniden kaydolduğunuzdan emin olun. Hata ayıklayıcı yeni bir Firebase belirtecinin oluşturulmasına neden olur. Bildirim hub'ı yüklemesi de güncelleştirilmelidir.
Arka uç hizmetinden 401 durum kodu alma
apikey istek üst bilgisini ayarladığınızı ve bu değerin arka uç hizmeti için yapılandırdığınız değerle eşleşip eşleşmediğini doğrulayın.
Yerel olarak test ederken bu hatayı alırsanız, istemci yapılandırmasında tanımladığınız anahtar değerinin Authentication:ApiKeyAPItarafından kullanılan kullanıcı ayarı değeriyle eşleştiğinden emin olun.
API Uygulamasıile test ediyorsanız, istemci yapılandırma dosyasındaki anahtar değerinin API Uygulamasıkullandığınız Authentication:ApiKey uygulama ayarıyla eşleştiğinden emin olun.
Not
Arka uç hizmetini dağıttıktan sonra bu ayarı oluşturduysanız veya değiştirdiyseniz, hizmetin etkili olması için hizmeti yeniden başlatmanız gerekir.
API Anahtarı kullanarak istemcilerin kimliğini doğrulama
Arka uç hizmetinden 404 durum kodu alma
Uç noktanın ve HTTP istek yönteminin doğru olduğunu doğrulayın. Örneğin uç noktaların şu şekilde olması gerekir:
-
[PUT]
https://<api_name>.azurewebsites.net/api/notifications/installations
-
[DELETE]
https://<api_name>.azurewebsites.net/api/notifications/installations/<installation_id>
-
[POST]
https://<api_name>.azurewebsites.net/api/notifications/requests
Veya yerel olarak test ederken:
-
[PUT]
https://localhost:5001/api/notifications/installations
-
[DELETE]
https://localhost:5001/api/notifications/installations/<installation_id>
-
[POST]
https://localhost:5001/api/notifications/requests
İstemci uygulamasında temel adresi belirtirken, /
ile sona erdiğinden emin olun. Temel adres, yerel olarak test ederken https://<api_name>.azurewebsites.net/
veya https://localhost:5001/
olmalıdır.
Kaydedilemiyor ve bir bildirim hub'ı hata iletisi görüntüleniyor
Test cihazının ağ bağlantısı olduğunu doğrulayın. Ardından, HttpResponseiçindeki StatusCode özellik değerini incelemek için bir kesme noktası ayarlayarak Http yanıt durum kodunu belirleyin.
Durum koduna göre uygun olduğunda önceki sorun giderme önerilerini gözden geçirin.
İlgili API için bu özel durum kodlarını döndüren satırlarda bir kesme noktası ayarlayın. Ardından yerel olarak hata ayıklarken arka uç hizmetini çağırmayı deneyin.
Uygun yükü kullanarak Postman aracılığıyla arka uç hizmetinin beklendiği gibi çalıştığını doğrulayın. Söz konusu platform için istemci kodu tarafından oluşturulan gerçek yükü kullanın.
Hiçbir adımın kaçırılmadığından emin olmak için platforma özgü yapılandırma bölümlerini gözden geçirin. uygun platform için installation id
ve token
değişkenleri için uygun değerlerin çözümlenip çözümlenmediğini denetleyin.
Cihaz için kimlik çözümlenemiyor hata iletisi görüntüleniyor
Hiçbir adımın kaçırılmadığından emin olmak için platforma özgü yapılandırma bölümlerini gözden geçirin.
İlgili bağlantılar
- Azure Notification Hubs'a genel bakış
- Mac için Visual Studio'yu yükleme
- Windows'a Xamarin Yükleme
- Arka uç işlemleri için Notification Hubs SDK'sını
- GitHub'da Notification Hubs SDK'sı
- Uygulama arka ucuna kaydolma
- Kayıt yönetimi
- Etiketlerle çalışma
- Özel şablonlarla çalışma
Sonraki adımlar
Artık bir arka uç hizmeti aracılığıyla bir bildirim hub'ına bağlı temel bir Xamarin.Forms uygulamasına sahip olmanız ve bildirim gönderip alabilmeniz gerekir.
Büyük olasılıkla bu öğreticide kullanılan örneği kendi senaryonuza uyacak şekilde uyarlamanız gerekir. Daha sağlam hata işleme, yeniden deneme mantığı ve günlüğe kaydetme de önerilir.
Visual Studio App Center, sorun gidermeye yardımcı olmak için analiz ve tanılama sağlayan mobil uygulamalara hızlıca eklenebilir.