Библиотека Pushed Messaging для iOS
Полнофункциональная библиотека для интеграции сервиса Pushed Messaging в нативные iOS-приложения. Поддерживает как классические уведомления APNs, так и обмен сообщениями по WebSocket (iOS 13+).
Возможности
APNs
- Автоматическая регистрация устройства
- Подтверждение доставки и открытия сообщений
- Rich-уведомления (изображения, действия)
- Поддержка background-уведомлений
WebSocket (iOS 13+)
- Постоянное соединение для мгновенной доставки
- Автоматическое переподключение
- Колбэки статуса и входящих сообщений
Notification Service Extension
- Подтверждение сообщений в фоне
- Безопасное хранение токенов в Keychain
Безопасность
- Хранение токенов в Keychain
- Шифрованные соединения
Установка через CocoaPods
- Добавьте строку в
Podfile
:
pod 'PushedMessagingiOSLibrary', :git => 'https://github.com/PushedLab/Pushed.Messaging.iOS.Library.git'
- Выполните:
pod install
Минимальные требования: iOS 11+, Xcode 12+, Swift 5.0. WebSocket-функциональность доступна с iOS 13.
Быстрый старт
Настройка основного приложения
import SwiftUI
import PushedMessagingiOSLibrary
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
// Делегат уведомлений
UNUserNotificationCenter.current().delegate = self
// Инициализация библиотеки
PushedMessagingiOSLibrary.setup(self,
askPermissions: true,
loggerEnabled: true)
// При необходимости WebSocket
if PushedMessagingiOSLibrary.isWebSocketAvailable {
PushedMessagingiOSLibrary.enableWebSocket()
setupWebSocketCallbacks()
}
return true
}
// Получение клиентского токена
@objc
func isPushedInited(didRecievePushedClientToken pushedToken: String) {
print("Client token: \(pushedToken)")
}
// Входящие push-уведомления
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("Push: \(userInfo)")
completionHandler(.newData)
}
// Клик по уведомлению
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
PushedMessagingiOSLibrary.confirmMessage(response)
completionHandler()
}
// Колбэки WebSocket
private func setupWebSocketCallbacks() {
PushedMessagingiOSLibrary.onWebSocketStatusChange = { status in
print("WebSocket status: \(status.rawValue)")
}
PushedMessagingiOSLibrary.onWebSocketMessageReceived = { json in
print("WebSocket message: \(json)")
return true // сообщение обработано приложением
}
}
}
Notification Service Extension (рекомендуется)
- Создайте новый target Notification Service Extension в Xcode.
- Замените содержимое
NotificationService.swift
на пример ниже. - Включите Keychain Sharing у основного приложения и Extension с одинаковой группой.
import UserNotifications
import Security
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent
if let messageId = request.content.userInfo["messageId"] as? String {
confirm(messageId: messageId)
}
contentHandler(bestAttemptContent ?? request.content)
}
override func serviceExtensionTimeWillExpire() {
if let handler = contentHandler,
let content = bestAttemptContent {
handler(content)
}
}
private func confirm(messageId: String) {
guard let token = fetchToken() else { return }
let creds = "\(token):\(messageId)".data(using: .utf8)!.base64EncodedString()
var req = URLRequest(url: URL(string: "https://pub.multipushed.ru/v2/confirm?transportKind=Apns")!)
req.httpMethod = "POST"
req.setValue("Basic \(creds)", forHTTPHeaderField: "Authorization")
URLSession.shared.dataTask(with: req).resume()
}
private func fetchToken() -> String? {
let query: [CFString: Any] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: "pushed_token",
kSecAttrService: "pushed_messaging_service",
kSecReturnData: true
]
var ref: AnyObject?
guard SecItemCopyMatching(query as CFDictionary, &ref) == errSecSuccess,
let data = ref as? Data,
let token = String(data: data, encoding: .utf8) else { return nil }
return token
}
}
Управление WebSocket
// Проверка доступности
if PushedMessagingiOSLibrary.isWebSocketAvailable {
PushedMessagingiOSLibrary.enableWebSocket()
}
// Статус
let status = PushedMessagingiOSLibrary.webSocketStatus
Управление APNs
// Включить / выключить
PushedMessagingiOSLibrary.enableAPNS()
PushedMessagingiOSLibrary.disableAPNS()
API Reference (основные методы)
// Инициализация
PushedMessagingiOSLibrary.setup(self, askPermissions: true)
// Клиентский токен
let token = PushedMessagingiOSLibrary.clientToken
// Подтверждение уведомления
PushedMessagingiOSLibrary.confirmMessage(response)
Полную сигнатуру всех методов смотрите в заголовочных файлах библиотеки.
Отладка и логи
let logs = PushedMessagingiOSLibrary.getLog()
Лицензия
Библиотека распространяется под лицензией MIT.