Mobil SDK-nı iOS tətbiqinə qoşmaq

Son yeniləmə: 9 oktyabr 2026 · 10 dəq oxunur

iOS SDK yalnız sistem framework-lərini işlədir, privacy manifest ilə gəlir. Clomni iOS push-larını sizin .p8 açarınızla birbaşa APNs-ə göndərir: iOS-da Firebase lazım deyil.

Addımlar

  1. 1

    Tələblər

    • iOS 15 və ya daha yeni, Xcode 15 və ya daha yeni.
    • Panelin Quraşdırma bölməsindən App ID və iOS API açarı (ios_…).
    • Push üçün Apple Developer hesabı və APNs açarı.
  2. 2

    Paketi əlavə edin

    Swift Package Manager: Xcode › File › Add Package Dependencies, https://github.com/clomni/clomni-mobile-sdk.git yazın, 1.0.4-dən «Up to Next Major Version» seçin və ClomniMessenger məhsulunu tətbiq hədəfinə əlavə edin. Package.swift-də:

    dependencies: [
        .package(url: "https://github.com/clomni/clomni-mobile-sdk.git", from: "1.0.4"),
    ],
    targets: [
        .target(name: "App", dependencies: [
            .product(name: "ClomniMessenger", package: "clomni-mobile-sdk"),
        ]),
    ]

    CocoaPods: SDK CocoaPods trunk-da yoxdur, pod-u repozitoriyanın tag-indən götürün. pod 'ClomniMessenger', '1.0.4' yazılsa, CocoaPods paketi tapmır.

    # Podfile, in your app's target
    pod 'ClomniMessenger', :git => 'https://github.com/clomni/clomni-mobile-sdk.git', :tag => '1.0.4'

    İstifadəçi söhbətdə şəkil göndərə bilir. Info.plist-ə icazə mətnlərini əlavə edin:

    <key>NSPhotoLibraryUsageDescription</key>
    <string>To send photos to support</string>
    <key>NSCameraUsageDescription</key>
    <string>To take a photo and send it to support</string>
    <key>NSMicrophoneUsageDescription</key>
    <string>To send voice messages to support</string>

    NSCameraUsageDescription yoxdursa, Messenger kamera seçimini göstərmir. NSMicrophoneUsageDescription yoxdursa, mikrofon düyməsi görünmür (səsli mesaj SDK 1.0.2-dən).

  3. 3

    SDK-nı başladın

    initialize-i tətbiq açılanda bir dəfə çağırın. SwiftUI tətbiqində AppDelegate-i @UIApplicationDelegateAdaptor ilə verin, push üçün onsuz da lazımdır.

    import SwiftUI
    
    @main
    struct ExampleApp: App {
        @UIApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
    
        var body: some Scene {
            WindowGroup { ContentView() }
        }
    }

    Metodları istənilən thread-dən çağırmaq olar, callback-lər əsas thread-də gəlir. İkinci initialize nəzərə alınmır. Tam AppDelegate aşağıdakı push hissəsindədir.

  4. 4

    İstifadəçi və Messenger

    let user = ClomniUser(userId: "12345", email: "[email protected]", name: "Aysel")
    Clomni.loginUser(user, userHash: hashFromYourServer)   // the hash comes from your server
    Clomni.updateUser(language: "az", customAttributes: ["plan": "premium"])
    
    // Together with your app's own logout:
    Clomni.logout()
    // SwiftUI
    Button("Support") { Clomni.present(source: "profile_support") }
    
    // UIKit
    @objc private func supportTapped() {
        Clomni.present(source: "profile_support")
    }

    Messenger ən üstdəki ekranın üzərində açılır. present-i ekran göstəriləndən sonra çağırın, didFinishLaunching-də yox. Digər çağırışlar: presentNewConversation(source:), presentConversation(_:), dismiss(). Oxunmamış mesajların sayı: let token = Clomni.addUnreadCountListener { count in ... }, sonra Clomni.removeUnreadCountListener(token). Üzən düymə: Clomni.setLauncherVisible(true), Clomni.setBottomPadding(72) (point).

    Tətbiq hər açılanda, istifadəçi daxil olubsa, loginUser-i yenidən çağırın, istifadəçi təzə daxil olmuş kimi. Eyni istifadəçi üçün SDK saxlanmış sessiyanı işlədir.

  5. 5

    Hadisələr, linklər, dil və görünüş

    Messenger-in hadisələrini dinləmək üçün:

    Clomni.onMessengerOpened = { source in print("opened from \(source ?? "-")") }
    Clomni.onMessengerClosed = { print("closed") }
    Clomni.onConversationStarted = { id in print("conversation \(id)") }
    Clomni.onFlowCompleted = { flowId in print("flow \(flowId) completed") }
    Clomni.onUnreadCountChanged = { count in print("unread \(count)") }

    Hər hadisənin bir dinləyicisi olur, nil onu silir.

    Xəbərin düyməsi veb ünvanı və ya tətbiqin deep link-ini aça bilər. onLink təyin olunubsa, hər link tətbiqə gəlir və onu tətbiq açır. Təyin olunmayıbsa, linkləri sistem açır.

    Clomni.onLink = { url in
        if url.scheme == "example" {
            // route inside your app
        } else {
            UIApplication.shared.open(url)
        }
    }

    Dil, səslər və tətbiqin öz rəngi:

    Clomni.setLanguage("en")          // az, en or ru; nil follows the phone
    Clomni.setSoundsEnabled(false)
    Clomni.setTheme(primaryColor: "#0A66C2", typeface: "Montserrat", mode: .dark)
    • setLanguage paneldə yandırılmış dillərdən birini seçir (Görünüş › «Dillər»). Boş və ya sönülü dil verilsə, telefonun dili, o da yoxdursa panelin əsas dili işlənir.
    • Səslər: söhbət açıq olanda göndərilən və gələn mesajın qısa səsi. Telefonun səssiz rejiminə tabedir.
    • setTheme panelin rənginin, şriftinin və rejiminin üstünə tətbiqin özününkünü qoyur. Rəng #RRGGBB formatındadır, brendin digər rəngləri ondan törədilir. Hər çağırış əvvəlkini əvəz edir, verilməyən dəyər panelinki qalır. Format səhvdirsə, logda setTheme: primaryColor "…" is not #RRGGBB çıxır.
    • Şrift tətbiqin bundle-ındakı və Info.plist-də UIAppFonts altında yazılmış şriftin ailə adıdır (Montserrat-Regular.ttf faylı üçün "Montserrat"). Mətn Dynamic Type-a yenə tabedir. Yalnız şrift üçün: Clomni.setTypeface("Montserrat"). Şrift tapılmasa, logda font family "…" is not in the app; the system font stays çıxır və sistem şrifti qalır.
  6. 6

    Push: capability

    Xcode › Project navigator › layihə › TARGETS › tətbiq › Signing & Capabilities › + Capability › Push Notifications. Konfiqurasiya «All» olsun.

  7. 7

    Push: AppDelegate

    import ClomniMessenger
    import UIKit
    import UserNotifications
    
    final class AppDelegate: NSObject, UIApplicationDelegate, @preconcurrency UNUserNotificationCenterDelegate {
        func application(_ application: UIApplication,
                         didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
            Clomni.initialize(appId: "app_…", apiKey: "ios_…")
            UNUserNotificationCenter.current().delegate = self
            Task {
                let center = UNUserNotificationCenter.current()
                let granted = try? await center.requestAuthorization(options: [.alert, .sound, .badge])
                if granted == true { UIApplication.shared.registerForRemoteNotifications() }
            }
            return true
        }
    
        func application(_ application: UIApplication,
                         didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
            Clomni.setDeviceToken(deviceToken)
        }
    
        // A push while the app is open. Clomni pushes stay hidden while the Messenger is open.
        @MainActor
        func userNotificationCenter(
            _ center: UNUserNotificationCenter,
            willPresent notification: UNNotification
        ) async -> UNNotificationPresentationOptions {
            Clomni.shouldShowForeground(notification.request.content.userInfo) ? [.banner, .list, .sound] : []
        }
    
        // A tap: a Clomni push opens its conversation.
        @MainActor
        func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    didReceive response: UNNotificationResponse) async {
            if Clomni.handlePush(response.notification.request.content.userInfo) { return }
            // your app's own push
        }
    }
    • Hər iki delegate metodu @MainActor qalsın, nonisolated yox. Yoxsa bildirişə toxunanda tətbiq «Call must be made on main thread» ilə dayanır.
    • Bildiriş icazəsini istifadəçiyə uyğun anda istəyin. Nümunə qısalıq üçün açılışda istəyir.
    • Clomni.isClomniPush(userInfo) push-un Clomni-yə aid olub-olmadığını deyir.
  8. 8

    Sandbox və production

    SDK hər cihazın APNs mühitini özü bildirir: Xcode-dan işə salınan build sandbox, TestFlight, App Store və Ad Hoc isə production işlədir. Bir .p8 açarı ikisinə də xidmət edir, bir şərtlə ki Sandbox & Production üçün yaradılsın. Bir mühitlə məhdud açar o biri mühitdə BadEnvironmentKeyInToken verir. «Test bildirişi» siyahısı hər cihazın mühitini göstərir.

    Operatorun şəkli bildirişdə görünsün istəyirsinizsə, Notification Service Extension əlavə edin. Clomni hər push-u mutable-content: 1 və avatar_url ilə göndərir. Extension-un hazır kodu tam təlimatın iOS bölməsindədir, ona Clomni SDK lazım deyil.

  9. 9

    Yoxlayın

    1. Tətbiqi real iPhone-da işə salın (simulyator Clomni-dən APNs push-u qəbul etmir), bildirişlərə icazə verin və Messenger-i bir dəfə açın.
    2. Panel › kanalınız › ayarlar sütunu › Push › «Test bildirişi» › cihazı seçin › «Göndər».

    Loglar Xcode konsolunda və Console.app-də: subsystem ai.clomni.messenger, category Clomni. Tez-tez rastlaşanlar:

    • api_key səhvdir və ya bu platforma üçün deyil: ios_… açarını işlədin. Paneldəki «iOS Bundle ID» tətbiqinkindən fərqlidirsə də belə olur.
    • no window to present the messenger from yet: present-i ekran göstəriləndən sonra çağırın.
    • «Test bildirişi» BadEnvironmentKeyInToken: Sandbox & Production açarı yaradın. DeviceTokenNotForTopic: Push bölməsindəki Bundle ID tətbiqinki deyil.
  10. 10

    Tam təlimat

Sənəd