ਦਸਤਾਵੇਜ਼

iOS SDK

Respondo ਦੀ ਸਹਾਇਤਾ ਚੈਟ ਲਈ Swift ਅਤੇ SwiftUI ਉੱਤੇ ਬਣਿਆ ਨੇਟਿਵ ਕਲਾਇੰਟ, ਜਿਸ ਵਿੱਚ ਕੋਈ ਵੀ ਬਾਹਰੀ ਨਿਰਭਰਤਾ ਨਹੀਂ।

ਲੋੜਾਂ#

  • iOS 15.0+ (iOS 16+ ਉੱਤੇ ਸ਼ੀਟ ਦੇ ਬਾਰੀਕ detent, ਉਸ ਤੋਂ ਹੇਠਾਂ ਸਿਸਟਮ ਵਾਲਾ ਬਦਲ)।
  • Swift 5.9+.
  • ਕੋਈ ਬਾਹਰੀ ਨਿਰਭਰਤਾ ਨਹੀਂ — ਸਿਰਫ਼ Foundation, Swift Concurrency, SwiftUI ਅਤੇ UIKit।

ਤੁਸੀਂ RespondoSDK product ਉੱਤੇ ਨਿਰਭਰ ਹੁੰਦੇ ਹੋ, ਜੋ ਕਰਾਸ-ਪਲੇਟਫ਼ਾਰਮ RespondoCore ਨੂੰ ਅੱਗੇ ਐਕਸਪੋਰਟ ਕਰਦਾ ਹੈ।

ਇੰਸਟਾਲੇਸ਼ਨ#

ਪੈਕੇਜ ਨੂੰ Swift Package Manager ਨਾਲ ਜੋੜੋ। Xcode ਵਿੱਚ: File → Add Package Dependencies… ਖੋਲ੍ਹ ਕੇ https://github.com/respondo-app/sdk-ios ਦਿਓ, ਜਾਂ ਆਪਣੀ Package.swift ਵਿੱਚ ਇਸ ਦਾ ਐਲਾਨ ਕਰੋ, ਫਿਰ RespondoSDK product ਉੱਤੇ ਨਿਰਭਰਤਾ ਪਾਓ।

Package.swiftswift
dependencies: [
    .package(url: "https://github.com/respondo-app/sdk-ios", from: "0.1.0")
],
targets: [
    .target(
        name: "MyApp",
        dependencies: [
            .product(name: "RespondoSDK", package: "sdk-ios")
        ]
    )
]

ਫਿਰ ਕੋਡ ਵਿੱਚ ਇਸ ਨੂੰ import ਕਰੋ:

Swiftswift
import RespondoSDK

ਸ਼ੁਰੂਆਤੀ ਸੈੱਟਅੱਪ#

ਐਪ ਚੱਲਣ ਵੇਲੇ ਇੱਕ ਵਾਰ ਸ਼ੁਰੂਆਤੀ ਸੈੱਟਅੱਪ ਕਰੋ, ਫਿਰ Respondo.open() ਕਿਤੇ ਵੀ ਸੱਦ ਸਕਦੇ ਹੋ। ਲਾਈਫ਼ਸਾਈਕਲ ਵਾਲਾ ਮੈਥਡ initialize ਹੈ (ਸ਼ਬਦ init ਭਾਸ਼ਾ ਨੇ ਰਾਖਵਾਂ ਰੱਖਿਆ ਹੋਇਆ ਹੈ)।

MyApp.swiftswift
import SwiftUI
import RespondoSDK

@main
struct MyApp: App {
    init() {
        Respondo.initialize(
            RespondoConfig(
                agentId: "<agent-uuid>",
                channelId: "<channel-uuid>"
                // baseUrl nil ਹੋਵੇ -> https://api.respondo.ai
            )
        )
    }

    var body: some Scene {
        WindowGroup {
            Button("Support") { Respondo.open() }
        }
    }
}

Respondo ਫ਼ਸਾਡ ਥ੍ਰੈੱਡ-ਸੇਫ਼ ਹੈ। initialize ਤੋਂ ਤੁਰੰਤ ਬਾਅਦ ਕੀਤੀਆਂ ਕਾਲਾਂ ਕਤਾਰ ਵਿੱਚ ਲੱਗ ਜਾਂਦੀਆਂ ਹਨ ਅਤੇ async init ਪੂਰਾ ਹੁੰਦੇ ਸਾਰ ਲਾਗੂ ਹੋ ਜਾਂਦੀਆਂ ਹਨ।

ਵਰਤੋਂਕਾਰਾਂ ਦੀ ਪਛਾਣ#

ਮੂਲ ਰੂਪ ਵਿੱਚ ਹਰ ਵਿਜ਼ਿਟਰ ਗੁਮਨਾਮ ਹੁੰਦਾ ਹੈ। ਪਹਿਲੀ ਵਾਰ ਚੱਲਣ ਉੱਤੇ SDK ਇੱਕ ਸਥਿਰ visitor_id ਬਣਾਉਂਦਾ ਹੈ ਅਤੇ ਉਸ ਨੂੰ keychain ਵਿੱਚ ਸਾਂਭ ਲੈਂਦਾ ਹੈ, ਇਸ ਲਈ ਵਾਪਸ ਆਉਣ ਵਾਲੇ ਵਰਤੋਂਕਾਰ ਨੂੰ ਆਪਣੀ ਗੱਲਬਾਤ ਦੁਬਾਰਾ ਮਿਲ ਜਾਂਦੀ ਹੈ। ਕੋਈ API ਕੁੰਜੀ ਜੋੜਨ ਦੀ ਲੋੜ ਨਹੀਂ — ਹਰ ਗੱਲਬਾਤ ਆਪਣੇ ਵੱਖਰੇ ਸੈਸ਼ਨ ਟੋਕਨ ਨਾਲ ਸੁਰੱਖਿਅਤ ਹੁੰਦੀ ਹੈ, ਜਿਸ ਨੂੰ backend ਜਾਰੀ ਕਰਦਾ ਹੈ ਅਤੇ ਹਰ ਸੁਨੇਹੇ ਉੱਤੇ ਅੱਗੇ ਸਰਕਾ ਦਿੰਦਾ ਹੈ, ਸੋ ਗੁਮਨਾਮ ਵਿਜ਼ਿਟਰ ਨੂੰ ਕਦੇ ਦੁਬਾਰਾ ਪ੍ਰਮਾਣੀਕਰਨ ਨਹੀਂ ਕਰਨਾ ਪੈਂਦਾ।

ਜਿਵੇਂ ਹੀ ਤੁਹਾਡਾ ਵਰਤੋਂਕਾਰ ਲੌਗ-ਇਨ ਕਰ ਲਵੇ, identify ਸੱਦੋ। ਇਸ ਨਾਲ ਉਸ ਦੀ ਅਸਲ ਪਛਾਣ ਜੁੜ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਜੋ ਉਸ ਦਾ ਇਤਿਹਾਸ ਵੱਖ-ਵੱਖ ਡਿਵਾਈਸਾਂ ਅਤੇ ਮੁੜ-ਇੰਸਟਾਲ ਕਰਨ ਦੇ ਬਾਵਜੂਦ ਉਸ ਦੇ ਨਾਲ ਚੱਲੇ, ਅਤੇ ਤੁਹਾਡੇ ਇਨਬਾਕਸ ਵਿੱਚ ਗੱਲਬਾਤ ਦੇ ਨਾਲ ਗੁਮਨਾਮ ਵਿਜ਼ਿਟਰ ਦੀ ਥਾਂ ਉਸ ਦਾ ਨਾਂ ਅਤੇ email ਦਿਸਣ।

userHash ਇੱਕ ਦਸਤਖ਼ਤ ਹੈ, ਜਿਸ ਨੂੰ ਤੁਹਾਡਾ backend ਏਜੰਟ ਦੇ identity_secret ਤੋਂ ਕੱਢਦਾ ਹੈ — HMAC-SHA256(secret, userId) (ਜਾਂ ਜਦੋਂ userId ਨਾ ਹੋਵੇ ਤਾਂ email ਉੱਤੇ), ਅਤੇ ਨਤੀਜਾ ਛੋਟੇ ਅੱਖਰਾਂ ਵਾਲੇ hex ਵਿੱਚ ਹੁੰਦਾ ਹੈ। ਗੁਪਤ ਕੁੰਜੀ ਹੀ ਸਾਬਤ ਕਰਦੀ ਹੈ ਕਿ ਪਛਾਣ ਅਸਲੀ ਹੈ, ਇਸ ਲਈ ਇਹ ਸਿਰਫ਼ ਤੁਹਾਡੇ backend ਉੱਤੇ ਰਹਿਣੀ ਚਾਹੀਦੀ ਹੈ ਅਤੇ ਕਦੇ ਵੀ ਐਪ ਵਿੱਚ ਨਹੀਂ ਭੇਜੀ ਜਾਂਦੀ। ਪੂਰਾ ਫ਼ਾਰਮੂਲਾ ਅਤੇ ਸਰਵਰ ਵਾਲੀਆਂ ਉਦਾਹਰਨਾਂ ਲਈ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਪੰਨਾ ਵੇਖੋ।

Swiftswift
// userHash ਤੁਹਾਡੇ backend ਤੋਂ ਆਉਂਦਾ ਹੈ (userId ਉੱਤੇ HMAC-SHA256) —
// ਇਸ ਨੂੰ ਕਦੇ ਵੀ ਐਪ ਵਿੱਚ ਨਾ ਬਣਾਓ।
Respondo.identify(
    RespondoIdentity(
        userId: session.userId,
        email: session.email,
        name: session.fullName,
        userHash: session.respondoUserHash
    )
)

// ਲੌਗਆਊਟ ਉੱਤੇ: ਸੈਸ਼ਨ ਰੱਦ ਕਰੋ ਅਤੇ ਨਵਾਂ ਗੁਮਨਾਮ ਵਿਜ਼ਿਟਰ ਸ਼ੁਰੂ ਕਰੋ।
Respondo.reset()

ਜੇ ਹੈਸ਼ ਗ਼ੈਰ-ਮੌਜੂਦ ਜਾਂ ਗ਼ਲਤ ਹੋਵੇ ਤਾਂ ਕੁਝ ਵੀ ਟੁੱਟਦਾ ਨਹੀਂ: backend ਚੁੱਪਚਾਪ ਵਿਜ਼ਿਟਰ ਨੂੰ ਗੁਮਨਾਮ ਹੀ ਰੱਖਦਾ ਹੈ, ਚੈਟ ਚੱਲਦੀ ਰਹਿੰਦੀ ਹੈ, ਅਤੇ ਸਹੀ ਹੈਸ਼ ਮਿਲਣ ਤੱਕ ਤੁਸੀਂ ਸਿਰਫ਼ ਡਿਵਾਈਸਾਂ ਵਿਚਕਾਰਲਾ ਜੋੜ ਗੁਆ ਬੈਠਦੇ ਹੋ। ਪੁਸ਼ਟੀ ਸਿਰਫ਼ ਉਦੋਂ ਚੱਲਦੀ ਹੈ ਜਦੋਂ ਏਜੰਟ ਲਈ identity_secret ਸੈੱਟ ਹੋਵੇ — ਵਿਕਾਸ ਦੌਰਾਨ ਇਸ ਨੂੰ ਖਾਲੀ ਛੱਡੋ, ਫਿਰ userId / email ਜਿਵੇਂ ਦੇ ਤਿਵੇਂ ਮੰਨ ਲਏ ਜਾਂਦੇ ਹਨ।

ਆਬਜ਼ਰਵੇਬਲ ਤੇ ਡੈਲੀਗੇਟ#

ਸਥਿਤੀ ਨੂੰ ਸਿੰਕ੍ਰੋਨਸ getter ਵਜੋਂ, ਰੀਐਕਟਿਵ AsyncStream ਵਜੋਂ, ਜਾਂ RespondoDelegate ਰਾਹੀਂ ਪੜ੍ਹੋ। ਸਟ੍ਰੀਮ ਅਤੇ ਡੈਲੀਗੇਟ ਕਾਲਬੈਕ ਮੇਨ ਐਕਟਰ ਉੱਤੇ ਆਉਂਦੇ ਹਨ।

Swiftswift
// ਨਾ-ਪੜ੍ਹੇ ਸੁਨੇਹਿਆਂ ਦੀ ਗਿਣਤੀ ਦੀ ਰੀਐਕਟਿਵ ਸਟ੍ਰੀਮ।
Task {
    for await count in Respondo.unreadCountStream {
        updateBadge(count)
    }
}

// ਬੈਜਾਂ ਅਤੇ deep link ਦੇ ਬਦਲ ਲਈ ਡੈਲੀਗੇਟ।
final class SupportCoordinator: RespondoDelegate {
    init() { Respondo.delegate = self }
    func respondoUnreadChanged(_ count: Int) {
        UIApplication.shared.applicationIconBadgeNumber = count
    }
}

ਸਕਰੀਨ ਟਰੈਕਿੰਗ#

ਹਰ ਨੈਵੀਗੇਸ਼ਨ ਉੱਤੇ ਮੌਜੂਦਾ ਸਕਰੀਨ ਦੀ ਸੂਚਨਾ ਦਿਓ, ਤਾਂ ਜੋ ਪਹਿਲ ਕਰਨ ਵਾਲੇ ਟੀਜ਼ਰ ਅਤੇ ਪੰਨਾ-ਪੱਧਰੀ ਟਾਰਗੇਟਿੰਗ ਇਸ ਨਾਲ ਮੇਲ ਕਰ ਸਕਣ (static func setCurrentScreen(_ name: String?))। ਖ਼ਾਲੀ ਕਰਨ ਲਈ nil ਭੇਜੋ; ਹਰ ਬਦਲਾਅ ਉੱਤੇ ਨਵੀਂ ਸਕਰੀਨ ਲਈ ਪਹਿਲ ਕਰਨ ਵਾਲਾ ਟੀਜ਼ਰ ਮੁੜ ਪਰਖਿਆ ਜਾਂਦਾ ਹੈ।

ਇਹੀ ਨਾਂ ਪੌਪ-ਅੱਪ ਸਰਵੇਖਣਾਂ ਦੇ ਸਕ੍ਰੀਨ ਨਿਯਮਾਂ ਨਾਲ ਮਿਲਾਇਆ ਜਾਂਦਾ ਹੈ, ਇਸ ਲਈ ਅਨੁਵਾਦਿਤ ਸਿਰਲੇਖਾਂ ਦੀ ਥਾਂ «Checkout» ਵਰਗੇ ਸਥਿਰ ਪਛਾਣਕਰਤਾ ਵਰਤੋ। ਪੰਨੇ ਦੇ ਪਤੇ ਦੇ ਨਿਯਮ ਸਿਰਫ਼ ਵੈੱਬਸਾਈਟਾਂ ’ਤੇ ਲਾਗੂ ਹੁੰਦੇ ਹਨ।

Swiftswift
Respondo.setCurrentScreen("pricing")

ਕੋਡ ਤੋਂ ਸਰਵੇਖਣ ਖੋਲ੍ਹੋ#

ਉਪਭੋਗਤਾ ਕਿਸੇ ਵੀ ਸਕ੍ਰੀਨ ਉੱਤੇ ਹੋਵੇ, ਇੱਕ ਚਾਲੂ ਪੌਪ-ਅੱਪ ਸਰਵੇਖਣ ਤੁਰੰਤ ਖੋਲ੍ਹਦਾ ਹੈ, ਅਤੇ Show on, ਸਕ੍ਰੀਨ ਨਿਯਮ, ਸਕ੍ਰੀਨ ’ਤੇ ਸਮਾਂ, ਟ੍ਰਿਗਰ ਇਵੈਂਟ ਅਤੇ ਦਰਸ਼ਕਾਂ ਨੂੰ ਛੱਡ ਦਿੰਦਾ ਹੈ। ਆਈਡੀ ਸਰਵੇਖਣ ਐਡੀਟਰ ਤੋਂ ਕਾਪੀ ਕਰੋ (Additional ways to share)। ਜਿਸ ਸਰਵੇਖਣ ਦਾ ਉਪਭੋਗਤਾ ਜਵਾਬ ਦੇ ਚੁੱਕਾ ਹੈ, ਉਹ ਦੁਬਾਰਾ ਨਹੀਂ ਦਿਖਾਇਆ ਜਾਂਦਾ।

Swiftswift
Respondo.startSurvey("<survey-id>")

ਅੱਗੇ ਦੇ ਕਦਮ#

ਪੁਸ਼ ਸੂਚਨਾਵਾਂ ਅਤੇ ਪਛਾਣ ਦੀ ਪੁਸ਼ਟੀ ਜੋੜ ਲਵੋ। UIKit ਰੈਪਰ RespondoChatViewController, ਪੂਰੀ ਡੈਲੀਗੇਟ ਸਤ੍ਹਾ ਅਤੇ ਸਮੱਸਿਆ-ਨਿਵਾਰਨ iOS SDK ਦੀ ਸ਼ੁਰੂਆਤੀ ਗਾਈਡ ਵਿੱਚ ਦਿੱਤੇ ਹਨ; SDK ਦੇ ਸਰੋਤ GitHub ਉੱਤੇ ਜਨਤਕ ਹਨ।