Перейти к основному содержимому

Библиотека Pushed Messaging для iOS

Полнофункциональная библиотека для интеграции сервиса Pushed Messaging в нативные iOS-приложения. Поддерживает как классические уведомления APNs, так и обмен сообщениями по WebSocket (iOS 13+).

Возможности

APNs

  • Автоматическая регистрация устройства
  • Подтверждение доставки и открытия сообщений
  • Rich-уведомления (изображения, действия)
  • Поддержка background-уведомлений

WebSocket (iOS 13+)

  • Постоянное соединение для мгновенной доставки
  • Автоматическое переподключение
  • Колбэки статуса и входящих сообщений

Notification Service Extension

  • Подтверждение сообщений в фоне
  • Безопасное хранение токенов в Keychain

Безопасность

  • Хранение токенов в Keychain
  • Шифрованные соединения

Установка через CocoaPods

  1. Добавьте строку в Podfile:
pod 'PushedMessagingiOSLibrary', :git => 'https://github.com/PushedLab/Pushed.Messaging.iOS.Library.git'
  1. Выполните:
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 (рекомендуется)

  1. Создайте новый target Notification Service Extension в Xcode.
  2. Замените содержимое NotificationService.swift на пример ниже.
  3. Включите 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.