Push bildirishnomalar
Push bildirishnomalar
Push imkoniyatini (capability) yoqing, foydalanuvchidan ruxsat so‘rang va qurilma tokenlarini olish uchun APNs’da ro‘yxatdan o‘ting.
Ruxsat so‘rash
Foydalanuvchiga push bildirishnomalar yuborish uchun ruxsat so‘rang.
Sintaksis:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound])
Misol
import SwiftUI
import UserNotifications
struct PushPermissionDemo: View {
@State private var status: UNAuthorizationStatus? = nil
var body: some View {
VStack(spacing: 12) {
Text("Status: \(statusLabel)")
Button("Request Permission") {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound]) { _, _ in
UNUserNotificationCenter.current().getNotificationSettings { s in
DispatchQueue.main.async { status = s.authorizationStatus }
}
}
}
}
.padding()
.onAppear {
UNUserNotificationCenter.current().getNotificationSettings { s in
DispatchQueue.main.async { status = s.authorizationStatus }
}
}
}
private var statusLabel: String {
switch status { case .authorized?: return "authorized"
case .denied?: return "denied"
case .notDetermined?: return "notDetermined"
case .provisional?: return "provisional"
case .ephemeral?: return "ephemeral"
default: return "unknown" }
}
}
import SwiftUI
struct ContentView: View { var body: some View { PushPermissionDemo() } }
import SwiftUI
@main
struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } } }
Yuqoridagi misolda ruxsat so‘rash tugmasi va joriy holatni ko‘rsatuvchi yorliqqa ega oddiy push ruxsati so‘rovi ko‘rsatilgan.
Ilova faol bo‘lganda (foreground) ko‘rsatish
Ilova faol (foreground) holatda bo‘lganda bildirishnomalarni ko‘rsating.
Sintaksis:
UNUserNotificationCenter.current().getNotificationSettings { s in ... }
Misol
import SwiftUI
struct ForegroundPresentationDemo: View {
@State private var last = "(none)"
var body: some View {
VStack(spacing: 12) {
Text("Last received: \(last)")
Button("Simulate Delivery") { last = Date().formatted() }
Text("Tip: Use UNUserNotificationCenterDelegate in your app to choose banner/sound when active.")
.font(.footnote)
.foregroundStyle(.secondary)
}
.padding()
}
}
import SwiftUI
struct ContentView: View { var body: some View { ForegroundPresentationDemo() } }
import SwiftUI
@main
struct MyApp: App { var body: some Scene { WindowGroup { ContentView() } } }
Yuqoridagi misolda yetkazib berishni simulyatsiya qiluvchi tugma va oxirgi olingan bildirishnomani ko‘rsatuvchi yorliqqa ega oddiy foreground ko‘rsatish namunasi berilgan.
Ruxsat so‘rash (authorization)
Foydalanuvchidan ruxsat so‘rang va masofaviy (remote) bildirishnomalar uchun ro‘yxatdan o‘ting.
Sintaksis:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound])
Misol
import SwiftUI
import UserNotifications
import UIKit
@main
struct MyApp: App {
init() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound]) { granted, _ in
if granted {
DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() }
}
}
}
var body: some Scene { WindowGroup { ContentView() } }
}
import UIKit
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
print("Device token: \(deviceToken)")
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("APNs registration failed: \(error)")
}
}
Ushbu misol bildirishnomalar uchun ruxsat so‘raydi, APNs’da ro‘yxatdan o‘tadi va qurilma tokeni uchun muvaffaqiyat/muvaffaqiyatsizlik callback funksiyalarini qayta ishlaydi.
SwiftUI App + AppDelegate ko‘prigi
SwiftUI’da token callback funksiyalari yetib kelishi uchun AppDelegate ni ilovaga ulang (bridge):
Misol
import SwiftUI
import UserNotifications
import UIKit
@main
struct MyApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
init() {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.badge,.sound]) { granted, _ in
if granted {
DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() }
}
}
UNUserNotificationCenter.current().delegate = appDelegate
}
var body: some Scene { WindowGroup { ContentView() } }
}
Yetkazilgan bildirishnomalarni qayta ishlash (foreground/background)
Foreground’da ko‘rsatishni boshqarish va bosishlarni qayta ishlash uchun UNUserNotificationCenterDelegate dan foydalaning:
Misol
import UserNotifications
import UIKit
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
// Foreground delivery: choose how to present when app is active
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.banner, .sound, .badge])
}
// User taps a notification
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
// Navigate to a screen based on response.notification.request.content.userInfo
completionHandler()
}
}
Yuqoridagi misolda yetkazib berishni simulyatsiya qiluvchi tugma va oxirgi olingan bildirishnomani ko‘rsatuvchi yorliqqa ega oddiy foreground ko‘rsatish namunasi berilgan.
Kategoriyalar va amallar
Amallarni (tugmalarni) e’lon qiling va bildirishnomalarga kategoriyalar biriktiring:
Misol
import UserNotifications
let reply = UNTextInputNotificationAction(identifier: "REPLY",
title: "Reply",
options: [])
let mark = UNNotificationAction(identifier: "MARK",
title: "Mark Read",
options: [.authenticationRequired])
let category = UNNotificationCategory(identifier: "MESSAGE",
actions: [reply, mark],
intentIdentifiers: [],
options: [])
UNUserNotificationCenter.current().setNotificationCategories([category])
// Include "category": "MESSAGE" in your APNs payload to use these actions.
Yuqoridagi misolda yetkazib berishni simulyatsiya qiluvchi tugma va oxirgi olingan bildirishnomani ko‘rsatuvchi yorliqqa ega oddiy foreground ko‘rsatish namunasi berilgan.
Testlash va muammolarni bartaraf etish
- Simulator: Masofaviy push’larni qabul qila olmaydi; haqiqiy qurilmadan foydalaning. Simulator’da lokal bildirishnomalarni sinab ko‘rishingiz mumkin.
- Muhitlar: Qurilma tokenlari sandbox va production muhitlarida farq qiladi; mos APNs muhitiga yuboring.
- Kalitlar/sertifikatlar: APNs Auth Key (yoki sertifikatlar) yaroqli va jamoangizga bog‘langanligiga ishonch hosil qiling; serveringizda key ID va Team ID’dan foydalaning.
- Imkoniyatlar (capabilities): Push Notifications imkoniyati yoqilgan bo‘lsin; kontent yangilanishlari uchun Background Modes → Remote notifications ni ham yoqing.
- Ma’lumotlar (payload) hajmi: Payload hajmini APNs cheklovlaridan oshirmang; yashirin (silent) push’lar uchun
content-available: 1ni qo‘shing. - Loglash: Token/ro‘yxatdan o‘tish xatolarini aniqlash uchun ro‘yxatdan o‘tish paytida Xcode’da qurilma loglarini kuzatib boring.
Maslahat: Bildirishnomalarni serveringiz orqali kalitingiz va ilovangizning qurilma tokenlaridan foydalanib APNs HTTP/2 API’si yordamida yuboring.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
