适用于 Android 的 React Native

Contact Center AI 平台 (CCAI Platform) 可通过多种方法(包括 React)与移动应用集成。本文档介绍了如何集成 React Native for Android。

在按照这些特定于 Android 的说明操作之前,请先完成 React Native 移动 SDK 中的说明。

将 SDK 集成到 Android 中

如需将 SDK 集成到 Android 中,请按以下步骤操作:

  1. AndroidManifest.xml 文件的 <application> 内添加以下代码:

    <application>
      <activity
        android:name="co.ujet.android.activity.UjetActivity"
        android:exported="true">
        <intent-filter>
          <action android:name="android.intent.action.VIEW"/>
          <category android:name="android.intent.category.DEF```AULT"/>
          <category android:name="android.intent.category.BROWSABLE"/>
          <data
            android:host="com.sampleapp"
            android:path="/smartchannel"
            android:scheme="ujet" />
        </intent-filter>
      </activity>
    
      <meta-data
            android:name="co.ujet.android.companyKey"
            android:value="@string/ujet_company_key"/>
      <meta-data
          android:name="co.ujet.android.companyName"
          android:value="@string/ujet_company_name"/>
      <meta-data
          android:name="co.ujet.android.subdomain"
          android:value="@string/ujet_subdomain"/>
      <meta-data
          android:name="co.ujet.android.companyUrl"
          android:value="@string/ujet_company_url"/>
    </application>
    
  2. 更新 android/build.gradle

    allprojects {
      repositories {
        google()
        mavenCentral()
        maven {
          url "https://sdk.ujet.co/android/"
        }
      }
    }
    
  3. 更新 android/app/build.gradle

      def ujetSdkVersion = "x.y.z"
      implementation "co.ujet.android:ujet-android:$ujetSdkVersion"
      implementation "co.ujet.android:cobrowse:$ujetSdkVersion"
    }
    
  4. 运行 res/values/strings.xml

    <resources>
      <string name="ujet_company_key">YOUR_COMPANY_KEY</string>
      <string name="ujet_company_name">YOUR_COMPANY_NAME</string>
    
      <!-- If your tenant / portal url ends with "ujet.co" then set ujet_subdomain string only (ignore
          ujet_company_url), otherwise set ujet_company_url only (ignore ujet_subdomain) following below instructions. -->
      <!-- To get subdomain, extract string content between 'https://' and first '.' of your tenant/portal URL. 
          Example, If your tenant url is https://XXX.YYY.ZZZ/ then subdomain will be XXX -->
      <string name="ujet_subdomain">YOUR_SUBDOMAIN</string>
    
      <!-- Use tenant url as company url here, it should be in format of https://XXX.YYY.ZZZ/api/v2
          (here XXX should match with your subdomain) -->
      <string name="ujet_company_url">YOUR_COMPANY_URL</string>
    </resources>
    
  5. 下载 google-service.json 文件并将其放置在项目中的以下位置:/android/app/google-services.json

注册模块

如需详细了解如何注册模块,请参阅注册模块(特定于 Android)

  1. 打开 ReactApplication 并更新 getPackages 函数。

    override fun getPackages(): List<ReactPackage> {
      return PackageList(this).packages.apply {
        add(MyAppPackage())
      }
    }
    
  2. 创建 MyAppPackage

    import android.view.View
    import com.facebook.react.ReactPackage
    import com.facebook.react.bridge.NativeModule
    import com.facebook.react.bridge.ReactApplicationContext
    import com.facebook.react.uimanager.ReactShadowNode
    import com.facebook.react.uimanager.ViewManager
    
    class MyAppPackage: ReactPackage {
      override fun createViewManagers(
        reactContext: ReactApplicationContext
      ): MutableList<ViewManager<View, ReactShadowNode<*>>> = mutableListOf()
    
      override fun createNativeModules(
        reactContext: ReactApplicationContext
      ): MutableList<NativeModule> = listOf(
        UJETModule(reactContext)
      ).toMutableList()
    }
    

实现回调

从您的应用中实现 UjetRequestListenerReactInstanceEventListener

class YourApplication: Application(), ReactApplication, UjetRequestListener, ReactInstanceEventListener {
  private var reactContext: ReactContext? = null

  override fun onCreate() {
    super.onCreate()

    Ujet.init(this)

    reactNativeHost.reactInstanceManager.addReactInstanceEventListener(this)
  }

  override fun onReactContextInitialized(reactContext: ReactContext?) {
    this.reactContext = reactContext
  }

  override fun onSignPayloadRequest(
    payload: MutableMap<String, Any?>,
    ujetPayloadType: UjetPayloadType,
    callback: UjetTokenCallback
  ) {
    if (reactContext == null) {
      callback.onError()
      return
    }

    when (ujetPayloadType) {
      UjetPayloadType.AuthToken -> {
        UJETModule.authTokenCallback = callback
        createMapAndSendEvent("authToken", payload)
      }
      UjetPayloadType.CustomData -> {
        UJETModule.customDataCallback = callback
        createMapAndSendEvent("customData", payload)
      }
      else -> callback.onError()
    }
  }

  override fun onRequestPushToken(): String? {
    sendEvent(reactContext ?: return, "onRequestAndroidPushToken", null)
  }

  private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap?) {
    reactContext
      .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
      .emit(eventName, params)
  }

  private fun createMapAndSendEvent(typeName: String, payload: Map<String, Any?>) {
    val writableMap = Arguments.createMap()
    for ((key, value) in payload) {
      writableMap.putString(key, value.toString())
    }

    val params = Arguments.createMap()
    params.putString("type", typeName)
    params.putMap("data", writableMap)
    sendEvent(reactContext ?: return, "onSignPayloadRequest", params)
  }
}

设置推送通知

如需以原生方式集成推送通知,请按以下步骤操作:

  1. 创建实现 FirebaseMessagingServiceMyFirebaseMessagingService

    import android.util.Log
    import co.ujet.android.Ujet
    import com.google.firebase.messaging.FirebaseMessagingService
    import com.google.firebase.messaging.RemoteMessage
    
    class MyFirebaseMessagingService: FirebaseMessagingService() {
      private var firebaseTokenManager: FirebaseTokenManager? = null
    
      override fun onCreate() {
        super.onCreate()
        firebaseTokenManager = FirebaseTokenManager(this)
      }
    
      override fun onNewToken(token: String) {
        firebaseTokenManager?.updateToken(token)
      }
    
      override fun onMessageReceived(message: RemoteMessage) {
        if (Ujet.canHandlePush(message.data)) {
          Log.d("Firebase", "Handle the push message by UJET")
        } else {
          // Handle your notifications
        }
      }
    }
    
  2. 更新 AndroidManifest.xml

    <application>
      <service
        android:name=".firebase.MyFirebaseMessagingService"
        android:exported="false">
        <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
      </service>
    </application>
    
  3. 创建 FirebaseTokenManager

    import android.content.Context
    import com.google.android.gms.tasks.Task
    import com.google.firebase.messaging.FirebaseMessaging
    
    class FirebaseTokenManager(context: Context) {
      private val sharedPreferences = context.getSharedPreferences("${context.packageName}_preferences", Context.MODE_PRIVATE)
      private var token: String? = null
    
      fun getToken(): String? {
        token = sharedPreferences.getString("firebaseToken", null)
        if (token == null) {
          FirebaseMessaging.getInstance().token.addOnCompleteListener { task: Task<String?> ->
            if (!task.isSuccessful || task.result == null) {
              return@addOnCompleteListener
            }
            token = task.result
            updateToken(token)
          }
        }
        return token
      }
    
      fun updateToken(token: String?) {
        sharedPreferences
          .edit()
          .putString("firebaseToken", token)
          .apply()
      }
    }
    
  4. 更新 android/build.gradle

    buildscript {
      dependencies {
        classpath("com.google.gms:google-services:4.4.1")
      }
    }
    
  5. 更新 android/app/build.gradle

    apply plugin: 'com.google.gms.google-services'
    
    dependencies {
      implementation platform("com.google.firebase:firebase-bom:32.7.3")
      implementation 'com.google.firebase:firebase-messaging'
    }
    
  6. Application.onCreate 中初始化 Firebase。

    class YourApplication: Application(), ReactApplication {
      override fun onCreate() {
        super.onCreate()
    
        firebaseTokenManager = FirebaseTokenManager(this)
      }
    }