Firebase Push Notification (iOS)

Nalan Duman
LCW Digital
Published in
9 min readOct 16, 2023
Photo by Jamie Street on Unsplash

Herkese selamlar 🖖

Bu makalede iOS uygulamalarına Firebase ile Push Notification entegrasyonunu nasıl yapabileceğinizi uçtan uca açıklamaya çalışacağım. Programlama dili olarak Swift kullanacağım. Firebase SDK entegrasyonunu ise hem CocoaPods ile hem de Swift Package Manager ile nasıl yapıldığını göstereceğim.

Proje Kurulumu

İlk olarak projeyi sıfırdan kuracaklar için XCode’u açtıktan sonra “Create Project” diyip “App” kısmını seçmeniz gerekiyor. Seçtikten sonra altta yer alan ekran görüntüsündeki alan açılacak ve proje adını girmeniz beklenecek. Buna göre de unique bir “Bundle Identifier” oluşacak. Bu Bundle Id, Firebase panelinde iOS projesi oluşturulurken kullanılacak. Ayrıca şimdilik ben “Team” alanına dokunmadım. Orayı Apple Developer hesabımı açtıktan sonra proje içerisinde Targets alanından değiştireceğim. Apple Developer hesabınız varsa direk kendi hesabınızı seçip ilerleyebilirsiniz.

Hali hazırda projesi olanlar için de bu Bundle Id bilgisine şu şekilde erişebilirsiniz:

Firebase SDK Entegrasyonu

Projemize Firebase SDK kurulumunu yapmamız gerekmektedir. Burada iki yöntem ile nasıl yapabileceğimizi göstereceğim. Size uyan yönteme göre ikisinden biri ile kurulumu yapmanız yeterli.

1. CocoaPods ile Kurulum

Öncesinde Podfile yüklenmemiş proje için ilk olarak aşağıdaki kod satırını terminalde proje dosyasının içerisindeyken çalıştırıyoruz.

pod init

Podfile dosyası oluştuktan sonra dosyayı açıp eklemek istediğimiz Firebase SDK’sını yazıp dosyayı kapatıyoruz.

target 'notification' do
use_frameworks!
pod 'FirebaseMessaging' /// Bildirim için gerekli olan pod eklenmeli
end

Son olarak yine terminalde aşağıdaki kod satırını çalıştırıp pod’ların yüklenmesini sağlıyoruz.

pod install

Artık .xcworkspace uzantılı proje dosyasını açıp projede kaldığınız yerden devam edebilirsiniz.

2. Swift Package Manager ile Kurulum

Bu yolla Firebase kütüphanesini kurmak istiyorsan XCode da File > Add Package Dependencies bölümüne gitmemiz gerekmektedir. Search kısmına Firebase iOS SDK linkini yazıp SDK’yı yüklememiz lazım. “Dependency Rules” kısmında “Up to Next Major Version” ya da “Up to Next Minor Version” seçersek ileride kolay bir şekilde güncel versiyona yükseltebiliriz. Diğer türlü ileride versiyon yükseltmek istediğimizde Project > Package Dependencies kısmından yükseltmek istediğimiz versiyonu manuel olarak belirtip yükseltme istemini yapmamız gerekir.

Manuel olarak SDK yükseltmek
Manuel olarak SDK yükseltmek

Özellikle Firebase gibi kapsamlı projelerde içerisinde yer alan bütün kütüphaneleri yüklemek istemeyebiliriz. Bu durumda “Add to Target” kısmında istemediğimiz kütüphaneleri “None” olarak seçebiliriz. Ayrıca biz uygulamamıza Firebase aracılığıyla bildirim göndermek istediğimiz için “FirebaseMessaging” paketini projemize entegre etmeliyiz, bunu seçmeyi unutmayalım.

Firebase Kurulumu

Kütüphane kurulumunu yaptığımıza göre artık Firebase’de proje oluşturup projemizi entegre edebiliriz. Firebase Console kısmına gidip “Add Project” kısmına tıklayıp projemize isim vermeliyiz. İsterseniz Analytics kısmını aktive edip devamında “Default Account for Firebase” kısmını seçebilirsiniz. Artık Firebase Console’da projemiz oluşmuş oluyor. Elimizdeki iOS projesini panele entegre etme kısmına geçebiliriz.

Biz burada iOS projesini entegre edeceğimiz için iOS seçip ilerliyoruz. Bizden burada “Apple Bundle ID” bilgisini vermemizi bekliyor. Bu ID bilgisine yazının başında da belirttiğim kısımdan ulaşabiliriz. Bu bilginin doğru olması çok önemli. Hem Firebase için hem de Apple Developer için bu ID’yi kullanacağız ve entegrasyonun doğru tamamlanabilmesi için hepsinin aynı olması gerekiyor.

Bundle ID’yi doğru girdikten sonra projemize koymamızı istediği bir “GoogleService-Info.plist” dosyası veriyor. İleride projenin Bundle Id’sinin değişmesi durumunda bu dosyanında yeniden indirilip projeye yüklenmesi gerekir. Dosyayı indirip projede ilgili yere taşıdıktan sonra biz Firebase SDK’yı önceden kurduğumuz için bu adımı geçip projede “AppDelegate” dosyasına eklenmesi gereken kodları ekliyoruz.

import UIKit
import FirebaseCore /// Firebase import edilmeli

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure() /// Bu kod satırı eklenmeli
return true
}
}

Projemizi başarılı bir şekilde Firebase paneline eklemesini yapmış olduk. Artık bildirim göndermek için gerekli olan adımları uygulamaya geçebiliriz.

APNs Elde Etme

Firebase de bildirimler için hem “APNs Auth Key” hem de “APNs Certificate” ile bağlantı kurulup bildirim gönderilebilir. Ben ikisinin de oluşturulma ve panele yüklenme aşamasını göstereceğim.

1. APNs Auth Key

Apple Developer Account’da hesabın yoksa öncelikle kayıt olmalısın, kaydı olanlar için ilerleyecek olursak “Certificates, IDs & Profiles” başlığının altında yer alan ”Keys” kısmına gidiyoruz.

Not: “Certificates, IDs & Profiles” alanı bazen güncellenen ama henüz onaylanmayan sözleşmeler vs olduğunda görünür olmayabiliyor. Sayfanın en üstünde onaylamanı bekledikleri belgeleri onayladıktan sonra bu alan görünür olacaktır.

Push Notification için daha öncesinde oluşturduğun bir key yoksa “+” butonuna tıklayıp yeni key oluşturman gerekiyor. Genel bir key ismi belirledikten sonra APNs seçip “Continue” butonuna tıklıyorsun.

Ardından “Register” butonuna tıklayıp key’i oluşturuyorsun ve indiriyorsun.

Uyarıda da yazdığı gibi bu dosyayı yeniden indiremezsin o yüzden güvenli bir yerde saklaman gerekiyor. Sınırlı sayıda key üretme hakkın var. Bu key’i tüm projelerinde kullanabilirsin.

Elimizde APNs Auth Key oluşturduğumuza göre artık bu key’i Firebase paneline yükleyebiliriz.

Firebase de Project Settings > Cloud Messaging bölümüne gidip APNs Key’deki Upload butonuna tıklamalısınız.

Upload butonuna tıkladıktan sonra aşağıdaki pencere açılıyor ve burada az önce oluşturduğumuz key yüklenmeli. Burada Key ID’yi dosyanın adından da erişebiliriz ya da Apple Developer hesabındaki “Keys” alanında oluşturduğumuz key’in içerisinde bu bilgi yer almaktadır.

Team ID’yi ise Apple Developer Account sayfasının sonundaki “Membership Details” alanında yer almaktadır.

Artık “Upload” butonuna tıklayarak key’i panele yüklemiş olacağız.

APNs Auth Key başarılı bir şekilde Firebase paneline yüklenmiş oldu. İsterseniz APNs Certificate oluşturma aşamasını atlayıp direk kod tarafında yapılan düzenlemeler kısmına geçebilirsiniz.

2. APNs Certificate

APNs Certificate oluşturmak isteyenler için yine Apple Developer Account sitesine gidip bu sefer “Certificates, IDs & Profiles” başlığının altında yer alan ”Identifiers” kısmına gidiyoruz. İlk olarak projemiz için AppID oluşturmamız gerekiyor. “+” butonuna tıkladıktan sonra “App IDs” seçmeli ve devam etmeliyiz. Ardından type olarak “App” seçmeliyiz.

App ID’yi kayıt etme sayfası karşımıza çıkacak. Burada doğru Bundle ID’yi yazmamız çok önemli. Devam diyip projenin App ID’sini kayıt etmeliyiz.

Kayıt ettikten sonra projenin ilgili App ID’sine tıklayınca karşımıza düzenleme sayfası açılacak. Bu sayfada “Capabilities” bölümünden “Push Notification” kısmını işaretlemeliyiz.

Seçince “Configure” kısmı etkinleşiyor. Bu butona da tıklayınca Development ya da Production için SSL sertifikası oluşturup yüklememizi beklemektedir.

  • Certificate Signing Request (CSR) Oluşturmak

Bilgisayar üzerinden “Keychain Access” uygulamasını açtıktan sonra Keychain Access > Certificate Assistant > Request a Certificate from a Certificate Authority kısmına gitmeliyiz.

Açılan pencerede geçerli bir mail adresi girip bilgisayara kaydetmeliyiz.

Artık elimizde sertifika oluştururken kullanmak için CSR dosyası oluşturulmuş oldu.

Sertifika kısmına dönecek olursak bilgisayardaki dosyalardan oluşturduğumuz CSR dosyasını seçip sertifikayı oluşturalım.

Oluşturduğumuz sertifika artık indirmeye hazır!

Sertifikayı indirip dosyaya çift tıklayınca .cer dosyası Keychain Access’e kaydedilecektir. Kaydedilen dosyanın adını “Apple Sandbox Push Services: <Bundle ID>” olarak sertifika bölümünde kaydedilmiş bir şekilde görmeniz lazım.

Bunu .p12 dosyası olarak export etmek için sertifikaya sağ tıklayıp ardından “Export” seçeneğini seçmemiz gerekiyor.

Dosya formatının .p12 olarak seçili olmasına dikkat ettikten sonra dosyayı bilgisayarda istediğimiz yere kaydedilmesini sağlıyoruz.

Kaydet dedikten sonra karşımıza şifre oluşturma penceresi açılıyor. Bu dosyayı şifreliyoruz. Bu şifreyi unutmamanız gerekiyor. Bu dosyayı kullanmak istediğimiz zaman bu şifre gerekli olacak. Örneğin, Firebase Console’da bu dosyayı kaydederken şifreyi soracak.

Şifre oluşturduktan sonra bilgisayarın şifresini girdikten sonra dosyamız belirttiğimiz yere kaydedilmiş olacak.

Eveeet artık APNs Certificate elimizde bulunmaktadır. Elde ettiğimiz sertifikayı panele yükleme zamanı🕺🏻

Firebase de Project Settings > Cloud Messaging kısmına gidince aşağıda bizi böyle bir alan karşılıyor.

“Upload” butonuna tıklayınca aşağıdaki pencere açılıyor.

Oluşturduğumuz .p12 uzantılı dosyayı yükleyip sertifika için oluşturduğumuz şifreyi girdikten “Upload” butonuna basabiliriz.

APNs sertifikamız artık Firebase panelimize yüklenmiş oldu. Artık kod tarafındaki eksiklerimizi tamamlamaya geçebiliriz.

FCM Token Elde Etme

import UIKit
import FirebaseCore
import FirebaseMessaging /// Bu eklenmeli

@main
class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()

/// Bu kod satırları eklenmeli
Messaging.messaging().delegate = self
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(options: authOptions,
completionHandler: { _, _ in })
application.registerForRemoteNotifications()
return true
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken /// Token bilgisini göndermek için bu kod gerekli
}
}

Projede Targets > Signing&Capabilities alanından “Capabilities” eklememiz gerekiyor.

Sağ üstteki “+” butonuna tıklayıp “Push Notifications” capability’sini bulup projede ilgili alana sürükleyip bırakmalıyız.

Aynı şekilde “Background Modes” olanı da eklemeliyiz.

Ardından aşağıdaki resimde belirtilen iki durumun seçili olması gerekiyor.

Not: Bu Capabilities’ler projeye yüklenmezse “Error in application:didFailToRegisterForRemoteNotificationsWithError: uygulama için geçerli bir “aps-environment” yetki anahtarı bulunamadı” hatası alabilirsiniz.

Bildirim Gönderme Denemeleri

Firebase > Messaging alanına gidip “Create your first campaign” butonuna tıklamamız ve ardından çıkan pencerede ise “Firebase Notification messages” alanına tıklayıp bildirim içeriğini oluşturmak için gerekli olan sayfaya ulaşmamız lazım.

Açılan sayfada bildirim başlığını ve istiyorsak detaylı açıklama alanını girip 2. alan olan “Target” bölümüne geçiyoruz.

Target kısmında oluşturduğumuz iOS projesini seçip “Next” butonuna tıklıyoruz ve ne zaman gönderileceğini belirliyoruz. Ardından “Review” butonuna tıklıyoruz.

Artık “Publish” butonuna tıklayarak bildirimimizi gönderebiliriz 🤩

İsterseniz kod üzerinden deviceToken bilgisini alıp direk ilgili cihaza bildirim gönderebiliriz. O da şu şekilde yapılmaktadır. Projede AppDelegate dosyası içerisinde ki “didRegisterForRemoteNotificationsWithDeviceToken” metodu içerisindeki “deviceToken” kısmını loglayıp cihazın token bilgisine ulaşabilirsiniz. Daha sonrasında bu token’ı bildirim paneline gidip 1. bölümde yer alan “Send test message” butonuna tıklayınca açılan pencerede token ekleme alanından eklemesini yapıyoruz. Bu token’ı kaydettikten sonra “Test” butonuna tıklarsak direk token bilgisi eşleşen cihaza bildirim göndermiş olacağız.

SONUÇ 👀

Eveeet başarılı bir entegrasyondan sonra bildirimimiz cihazımıza ulaştı🕺🏻💃🏻

Umarım bu yazı sizin için yol gösterici nitelikte ve açıklayıcı olmuştur. Yeni yazılarda görüşmek üzere 👋

Photo by Junseong Lee on Unsplash

--

--

Nalan Duman
LCW Digital

ITU — Mathematical Engineering / Mobile Application Developer