[Android] [Messagerie instantanée IM] Démarrage rapide de l'intégration du développement Android

Connexion de référence

https://blog.csdn.net/qq_32090185/article/details/89307710

 

Intégration SDK

La messagerie instantanée Yunxin Android-SDK prend en charge deux méthodes d'intégration:

  • Intégration automatique via Gradle (recommandé)

  • En téléchargeant le SDK , puis intégrez-le manuellement dans votre projet.

De plus, afin de permettre aux développeurs d'intégrer facilement et rapidement les fonctions de messagerie instantanée dans l'application, nous fournissons également des composants d'interface utilisateur open source , qui peuvent réaliser la fonction de chat grâce à une configuration simple.

Intégration Gradle

Tout d'abord, dans le fichier build.gradle de l'ensemble du projet, configurez les référentiels, utilisez jcenter ou maven, choisissez l'un des deux, comme suit:

allprojects {
    repositories {
        jcenter() // 或者 mavenCentral()
    }
}

Ensuite, dans le fichier build.gradle du projet principal, ajoutez des dépendances.

android {
   defaultConfig {
       ndk {
           //设置支持的SO库架构
           abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64"
        }
   }
}

Ajoutez ensuite différentes dépendances en fonction des besoins de votre propre projet. Remarque: les numéros de version des composants de Yunxin doivent être cohérents. Vous pouvez vérifier la dernière version actuelle sur la page de téléchargement du SDK . Prenons l'exemple de la version xxx:

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    // 添加依赖。注意,版本号必须一致。

    // 基础功能 (必需)
    implementation 'com.netease.nimlib:basesdk:x.x.x'

    // 聊天室需要
    implementation 'com.netease.nimlib:chatroom:x.x.x'

    // 通过云信来集成小米等厂商推送需要
    implementation 'com.netease.nimlib:push:x.x.x'

    // 超大群需要
    implementation 'com.netease.nimlib:superteam:x.x.x'

    // 全文检索插件
    implementation 'com.netease.nimlib:lucene:x.x.x'

    // 数据库加密
    implementation 'net.zetetic:android-database-sqlcipher:3.5.9'
}

Intégration manuelle

Accédez d'abord à la page de téléchargement du SDK pour terminer le téléchargement, puis copiez les fichiers SDK correspondants dans le répertoire libs de votre projet si nécessaire pour terminer la configuration.

La description du fichier SDK est la suivante:

libs
├── arm64-v8a
│   ├── libne_audio.so          //语音消息录制功能,必需
│   ├── traceroute.so          //网络探测功能,必需
├── armeabi-v7a
│   ├── libne_audio.so
│   ├── traceroute.so
├── x86
│   ├── libne_audio.so
│   ├── traceroute.so
├── x86_64
│   ├── libne_audio.so
│   ├── traceroute.so
│
├── nim-basesdk-x.x.x.jar       //IM基础功能,必需
├── nim-chatroom-x.x.x.jar      //聊天室功能
├── nim-lucene-x.x.x.jar        //全文检索插件
├── nim-push-x.x.x.jar          //通过云信来集成小米等厂商推送时需要

Remarque :

  1. Pour utiliser la fonction de chiffrement de la base de données , vous devez également importer la bibliothèque dépendante «net.zetetic: android-database-sqlcipher: 3.5.9» via gradle.
  2. traceroute.so doit être téléchargé séparément, adresse de téléchargement

Autorisations et composants

En AndroidManifest.xmlajoutant la configuration suivante ( veuillez remplacer com.netease.nim.demo par votre propre nom de package ) :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.netease.nim.demo">

    <!-- 权限声明 -->
    <!-- 访问网络状态-->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <!-- 外置存储存取权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <!-- 多媒体相关 -->
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <!-- 控制呼吸灯,振动器等,用于新消息提醒 -->
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.VIBRATE" />

    <!-- 8.0+系统需要-->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />


    <!-- 下面的 uses-permission 一起加入到你的 AndroidManifest 文件中。 -->
    <permission
        android:name="com.netease.nim.demo.permission.RECEIVE_MSG"
        android:protectionLevel="signature"/>

     <uses-permission android:name="com.netease.nim.demo.permission.RECEIVE_MSG"/>

    <application
        ...>
        <!-- APP key, 可以在这里设置,也可以在 SDKOptions 中提供。
            如果 SDKOptions 中提供了,则取 SDKOptions 中的值。 -->
        <meta-data
            android:name="com.netease.nim.appKey"
            android:value="key_of_your_app" />

        <!-- 云信后台服务,请使用独立进程。 -->
        <service
            android:name="com.netease.nimlib.service.NimService"
            android:process=":core"/>

       <!-- 云信后台辅助服务 -->
        <service
            android:name="com.netease.nimlib.service.NimService$Aux"
            android:process=":core"/>

        <!-- 云信后台辅助服务 -->
        <service
            android:name="com.netease.nimlib.job.NIMJobService"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:process=":core"/>

        <!-- 云信监视系统启动和网络变化的广播接收器,保持和 NimService 同一进程 -->
        <receiver android:name="com.netease.nimlib.service.NimReceiver"
            android:process=":core"
            android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

        <!-- 云信进程间通信 Receiver -->
        <receiver android:name="com.netease.nimlib.service.ResponseReceiver"/>

        <!-- 云信进程间通信service -->
        <service android:name="com.netease.nimlib.service.ResponseService"/>

        <!-- 云信进程间通信provider -->
        <provider
            android:name="com.netease.nimlib.ipc.NIMContentProvider"
            android:authorities="com.netease.nim.demo.ipc.provider"
            android:exported="false"
            android:process=":core" />

          <!-- 云信内部使用的进程间通信provider -->
          <!-- SDK启动时会强制检测该组件的声明是否配置正确,如果检测到该声明不正确,SDK会主动抛出异常引发崩溃 -->
        <provider
            android:name="com.netease.nimlib.ipc.cp.provider.PreferenceContentProvider"
            android:authorities="com.netease.nim.demo.ipc.provider.preference"
            android:exported="false" />
    </application>
</manifest>

Configuration obscurcie

Si votre apk finit par être obscurci, veuillez ajouter le code suivant au fichier de configuration proguard:

-dontwarn com.netease.**
-keep class com.netease.** {*;}

#如果你使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}

#如果你开启数据库功能,需要加入
-keep class net.sqlcipher.** {*;}

Mode d'emploi

Introduction de l'interface

Le SDK fournit deux types d'interfaces que les développeurs peuvent utiliser:

Le premier type consiste à lancer une demande activement,

La deuxième catégorie consiste à surveiller les événements et les changements en tant qu'observateurs.

Les premiers noms d'interface se Serviceterminent, par exemple AuthService,

Les noms d'interface de deuxième type se ServiceObserverterminent, par exemple AuthServiceObserver, les noms de classes longs individuels peuvent aller jusqu'à Observerla fin, par exemple SystemMessageObserver.

Les appels d'interface SDK doivent, appeler le processus principal dans les principales SDK XXXServiceméthodes de processus fournies,

En cours d'enregistrement de l' XXXServiceObserverobservateur principal (un changement d'événement, rappelle le thread principal du processus principal).

Si votre module s'exécute dans un processus non principal, veuillez implémenter la communication entre le processus principal et le processus non principal par vous-même ( AIDL/Messenger/ContentProvider/BroadcastReceiver等IPC渠道) transmettre les données renvoyées par le rappel ou la surveillance du processus principal au processus non principal.

Le SDK fournit trois valeurs de retour d'interface:

Type de données de base (interface synchrone),

InvocationFuture (interface asynchrone)

AbortableFuture (interface asynchrone).

Les interfaces asynchrones sont essentiellement appelées à partir du processus principal, puis exécutées dans le processus d'arrière-plan, et finalement le résultat est renvoyé au processus principal.

Valeur de retour de l'interface SDK La description
Type de données de base Interface synchrone
InvocationFutur Interface asynchrone
AbortableFutur Interface asynchrone, utilisée lorsque cela prend beaucoup de temps ou lors du transfert d'une grande quantité de données, vous pouvez utiliser la méthode abort () pour interrompre la requête. Par exemple, téléchargez et téléchargez, connectez-vous, etc.

L'interface asynchrone peut définir la fonction de rappel, en fournissant deux méthodes: RequestCallback et RequestCallbackWrapper.

Fonction de rappel d'interface asynchrone La description
Demande de rappel Nécessité d'implémenter 3 interfaces:
succès en cas de succès, échec en cas d'échec, exception en cas d'exception
RequestCallbackWrapper Besoin d'implémenter onResult. Trois interfaces de succès, d'échec et d'exception sont encapsulées et les paramètres sont distingués
  • Amélioration de la structure des appels d'API du SDK 4.4.0:
    • Prend en charge les appels d'API asynchrones lancés par des threads non-UI avec Looper et rappelle directement le thread de l'appelant. L'ancienne version rappellera le thread de l'interface utilisateur par défaut.
    • Fournissez une interface pour la conversion forcée d'asynchrone à synchrone: NIMClient # syncRequest, qui vous permet de définir le temps d'attente de synchronisation maximal et prend en charge les scénarios qui nécessitent des appels synchrones à l'API Yunxin dans des threads non-UI.
    • Ajoutez la classe NIMSDK générée automatiquement, les développeurs peuvent utiliser directement la méthode NIMSDK # getXXXService pour obtenir l'interface de service, plus besoin de passer XXXService.class, simplifier la méthode d'appel API. Les classes d'entrée d'appel générées automatiquement par d'autres plug-ins sont: NIMChatRoomSDK, NIMLuceneSDK. Exemple, en utilisant le NIMSDK.getAuthService().login()remplacement NIMClient.getService(AuthService.class).login().

Répertoire du cache de données

Lorsqu'un message multimédia est reçu, le SDK télécharge par défaut certains fichiers associés.

Dans le même temps, le SDK enregistre également certains fichiers journaux clés, de sorte que le SDK a besoin d'un répertoire de cache de données.

Le répertoire peut être initialisé lorsque le SDK est SDKOptions#sdkStorageRootPathdéfini.

Dans la version de démarrage du SDK 4.4.0, si une configuration de développeur Context#getExternalCacheDiret Context#getExternalFilesDirsous des applications telles que le répertoire de cache stocké étendu (ie /sdcard/Android/data/{package}),

L'autorisation d'écriture ne sera plus vérifiée dans le SDK. Il convient de noter que les fichiers du répertoire de cache seront supprimés lors de la désinstallation de l'application et peuvent également être effacés manuellement par l'utilisateur dans l'interface de configuration.

S'il n'est pas défini, la valeur par défaut est /{外卡根目录}/{应用包名}/nim/, où le répertoire racine du caractère générique est obtenu Environment.getExternalStorageDirectory().getPath().

Si votre APP doit effacer la fonction de cache, vous pouvez analyser les fichiers de ce répertoire et nettoyer selon les règles. Par le SDK, l'initialisation est terminée après l' NimClient#getSdkStorageDirPathobtention du répertoire de cache de données du SDK.

Le répertoire du cache de données du SDK contient:

Sous-répertoire teneur
Journal Fichier journal du SDK: tel que nim_sdk.log, la taille ne dépasse généralement pas 8 Mo.
image Image originale dans le message image
l'audio Audio dans les messages vocaux
vidéo Vidéo originale dans un message vidéo
pouce Miniatures dans les messages image / vidéo
déposer Fichier dans le message de fichier

initialisation

initialisation

Après avoir intégré le SDK dans le client, vous devez terminer le travail d'initialisation avant d'utiliser le SDK.

De plus, veuillez noter: à partir de la v6.9.0, la bibliothèque de prise en charge d'AndroidX est utilisée, l'API cible passe à 28 et la bibliothèque de prise en charge n'est plus prise en charge .

Recommandé dans les applications Application#onCreatedans le code d'initialisation du SDK:

/**
 * 在Application#onCreate()中初始化SDK
 *
 * @param context 调用上下文
 * @param info 登录用户信息。如果提供,将同时进行自动登录。如果当前还没有登录用户,请传入null。详见自动登录章节。
 * @param options 初始化配置参数
 */
public static void init(Context context, LoginInfo info, SDKOptions options);

Exemple:

public class NimApplication extends Application {
/**
     * 注意:每个进程都会创建自己的Application 然后调用onCreate()方法,
     * 如果用户有自己的逻辑需要写在Application#onCreate()(还有Application的其他方法)中,一定要注意判断进程,不能把业务逻辑写在core进程,
     * 理论上,core进程的Application#onCreate()(还有Application的其他方法)只能做与im sdk 相关的工作
     */
    public void onCreate() {
        // ... your codes

        // SDK初始化(启动后台服务,若已经存在用户登录信息, SDK 将进行自动登录)。不能对初始化语句添加进程判断逻辑。
        NIMClient.init(this, loginInfo(), options());

        // ... your codes

        // 使用 `NIMUtil` 类可以进行主进程判断。
        // boolean mainProcess = NIMUtil.isMainProcess(context)
        if (NIMUtil.isMainProcess(this)) {
            // 注意:以下操作必须在主进程中进行
            // 1、UI相关初始化操作
            // 2、相关Service调用
        }
    }

    // 如果提供,将同时进行自动登录。如果当前还没有登录用户,请传入null。详见自动登录章节。
    private LoginInfo loginInfo() {
        return null;
    }

    // 设置初始化配置参数,如果返回值为 null,则全部使用默认参数。
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();
        ...
        // 配置是否需要预下载附件缩略图,默认为 true
        options.preloadAttach = true;
        ...

        return options;
    }
}

Initialiser les paramètres de configuration

Lors de l'initialisation, il prend SDKOptionsen charge la définition de certains attributs pour répondre aux différentes exigences de l'entreprise.

Description du paramètre SDKOptions:

paramètre La description
appKey Définissez l'appKey du SDK Yunxin. La clé appKey peut également être définie dans le fichier AndroidManifest via des méta-données.
statusBarNotificationConfig Configuration du rappel de message encapsulé Yunxin
userInfoProvider Fournisseur d'informations utilisateur, actuellement principalement utilisé pour afficher les pseudonymes et les avatars des utilisateurs dans la barre de notification
messageNotifierCustomization Personnalisation de la rédaction des rappels de la barre de notification
sdkStorageRootPath Répertoire racine de stockage externe pour stocker les fichiers de messages multimédias
preloadAttach Avez-vous besoin du SDK pour précharger automatiquement les pièces jointes des messages multimédias?
miniatureTaille La taille de la vignette du message
sessionReadAck S'il faut ouvrir la synchronisation multi-terminaux de la session de lecture
améliorerSDKProcessPriority S'il faut augmenter la priorité du processus SDK (augmenté par défaut, peut réduire la probabilité que le processus principal du SDK soit recyclé par le système)
serverConfig Configurer l'adresse du serveur privatisé
preLoadServers Service de préchargement, la valeur par défaut est true, il n'est pas recommandé de définir sur false, la connexion de préchargement peut optimiser le processus de connexion
teamNotificationMessageMarkUnread Si les messages de notification de groupe sont comptés comme non lus, la valeur par défaut n'est pas comptée comme non lue
useXLog Utilisez le mode journal du SDK avec de meilleures performances. Le mode journal normal est utilisé par défaut.
animatedImageThumbnailEnabled Activer la prise en charge des miniatures GIF, la valeur par défaut est false et la première image est capturée
asyncInitSDK S'il faut initialiser le SDK de manière asynchrone, la valeur par défaut est false. Activez-le pour réduire le temps de réponse de synchronisation de la fonction d'initialisation du SDK dans Application # onCreate
réduitIM Qu'il s'agisse d'une scène de messagerie instantanée faible, la valeur par défaut est false. Si votre application utilise uniquement les fonctionnalités de messagerie instantanée à la demande dans certains scénarios (vous n'avez pas besoin de vous connecter automatiquement au démarrage de l'application) et que vous n'avez pas besoin d'assurer les performances en temps réel des notifications et des données de message, vous pouvez remplir vrai ici. Dans le scénario de messagerie instantanée faible, le processus de transmission adopte une stratégie de démarrage paresseux (retardé à l'étape de connexion de l'utilisateur). Après le démarrage, son cycle de vie suivra le processus de l'interface utilisateur, réduisant la consommation d'énergie en arrière-plan de l'application dans le scénario de messagerie instantanée faible.
checkMainifestConfig S'il faut vérifier si la configuration du fichier manifeste est terminée lorsque le SDK est initialisé, la valeur par défaut est false, il est recommandé aux développeurs de l'activer pendant la phase de débogage et de la désactiver une fois en ligne
mixPushConfig Configurer l'ID d'application, la clé d'application et le certificat push tiers
enableBackOffReconnectStrategy Que ce soit pour utiliser la stratégie de reconnexion d'interruption aléatoire, la valeur par défaut est true, il est fortement recommandé de l'activer. Si vous devez le fermer, veuillez consulter le support technique de Yunxin.
enableLBSOptimize S'il faut activer la stratégie d'optimisation de la connexion réseau, elle est activée par défaut.
enableTeamMsgAck Activer ou non la fonction de lecture des messages de groupe, elle est désactivée par défaut
shouldConsiderRevokedMessageUnreadCount Lecture non lue moins un lorsque le message est retiré
mNosTokenSceneConfig configuration de scénario de jeton nos
loginCustomTag 登录时的自定义字段 , 登陆成功后会同步给其他端 ,获取可参考 AuthServiceObserver#observeOtherClients()
disableAwake 禁止后台进程唤醒ui进程
fetchServerTimeInterval 获取服务器时间连续请求间隔时间, 最小1000ms, 默认2000ms
customPushContentType 离线推送不显示详情时,要显示的文案对应的类型名称
notifyStickTopSession 置顶会话是否同步
databaseEncryptKey 数据库加密秘钥,用于消息数据库加密。
如果不设置,数据库不开启加密存储。设置后,数据库开启加密存储;如果开启时有旧数据,旧数据自动迁移为加密数据。一旦开启加密,无法退回到不加密状态。
如果开启数据库加密,需要手动拷贝相应so和jar文件,并需要增加相应'混淆配置'。'StatusCode'增加一个新状态值'DATA_UPGRADE',标明当前数据库需要迁移到加密。

任意位置初始化SDK

v5.0.0版本开始支持在任意位置初始化SDK,一方面能够降低在Application.onCreate中初始化的耗时,另一方面为了更充分的支持按需使用的弱IM场景。采用此方式初始化SDK,将采用以下两个接口:

  • NIMClient#config, 在Application#onCreate()中配置SDK(仅仅是配置,不影响性能)
  • NIMClient#initSDK, 在UI进程主线程上按需使用的初始化SDK,但不要放在Application#onCreate中。

还可以通过以下配置,

  • 通过SDKOptions#asyncInitSDK 支持SDK的异步初始化(NIMClient#initSDK)
  • 通过SDKOptions#reducedIM 支持延迟加载push进程服务

与在Application#onCreate中初始化SDK相比,新的方式不再需要做进程判断,SDKOptions的应用方式相同。

初始化状态监听

可以通过以下接口来监听当前登录状态:

/**
 * 监听主进程初始化状态<br>
 * 注册时,如果主进程以及处于初始化完成状态,Observer的onEvent方法会被立即调用一次,告知观察者当前状态。
 *
 * @param observer 观察者, 参数为当前状态
 * @param register true为注册,false为注销
 */
void observeMainProcessInitCompleteResult(Observer<Boolean> observer, boolean register);
  • 示例
NIMClient.getService(SdkLifecycleObserver.class).observeMainProcessInitCompleteResult(new Observer<Boolean>() {
    @Override
    public void onEvent(Boolean aBoolean) {
            if (aBoolean != null && aBoolean) {
                                // 主进程初始化完毕,可以开始访问数据库
                                ...
            }
    }
}, true);

登录

在调用SDK登录接口之前,需要先完成IM账号的注册(注册一次即可),为应用下的每一位IM用户注册一个唯一的账号(account,又称accid)。推荐开发者首先阅读这里)来加深对云信账号体系流程的认知。 目前,云信提供两种注册方式:

  • 方式1:调用服务端API注册接口完成注册,目前推荐使用该方式。
  • 方式2:网易云信控制台页面手动注册。进入相应的云信应用->功能管理->IM免费版->账号管理。注意:此方法仅为调试阶段使用。IM专业版暂不支持此功能。

手动登录

在新设备上初次登录,以及被踢、切换账号与注销登录后下一次登录,需要使用手动登录。对应用户手动输入登录账号密码的场景。

/**
 * 登录接口。sdk会自动连接服务器,传递用户信息,返回登录结果。
 * 该操作中途可取消。如果因为网络比较差,或其他原因导致服务器迟迟没有返回,用户也没有主动取消,
 * 在45秒后AbortableFuture的onFailed会被调用到。
 *
 * @param info 登录的用户信息
 * @return AbortableFuture
 */
public AbortableFuture<LoginInfo> login(LoginInfo info);
  • 参数说明
LoginInfo 参数 说明
account 用户帐号
token 登录 token
appKey(可选) 当前应用的 appKey,一个 appKey 对应一个账号体系。
如果不填,则优先使用 SDKOptions 中配置的 appKey,
如果没有则使用 AndroidManifest 中配置的appKey
customClientType(可选) 自定义客户端类型
  • 示例
public class LoginActivity extends Activity {
    public void doLogin() {
        LoginInfo info = new LoginInfo(); 
        RequestCallback<LoginInfo> callback =
            new RequestCallback<LoginInfo>() {
                    @Override
                    public void onSuccess(LoginInfo param) {
                        LogUtil.i(TAG, "login success");
                        // your code
                    }

                    @Override
                    public void onFailed(int code) {
                        if (code == 302) {
                            LogUtil.i(TAG, "账号密码错误");
                            // your code
                        } else {
                            // your code
                        }
                    }

                    @Override
                    public void onException(Throwable exception) {
                        // your code
                    }
        };

        //执行手动登录
        NIMClient.getService(AuthService.class).login(info).setCallback(callback);
    }
}

针对 onFailed 中的错误码说明如下:

错误码 说明
302 appKey/account/token 三者不对应导致
408 连接超时
415 网络断开或者与云信服务器建立连接失败
416 调用频次过高
1000 登录成功之前,调用本地数据库相关接口(手动登录的情况下数据库未打开)

自动登录

手动登录成功后,保存至本地的用户账号和密码,可用作自动登录时使用。自动登录主要针对应用被清理掉后,如再次点击图标等启动时,无需输入用户名密码即可完成登录的场景。此时可以在无网络,未登录成功的状态下直接访问用户本地SDK数据。

// 在初始化SDK的时候,将本地所存的account与token传入loginInfo(),用以自动登录
NIMClient.init(this, loginInfo(), options());
  • 示例
public class NimApplication extends Application {

    public void onCreate() {
        // ... your codes

        NIMClient.init(this, loginInfo(), options());

        // ... your codes
    }

    private LoginInfo loginInfo() {
        // 从本地读取上次登录成功时保存的用户登录信息
        String account = Preferences.getUserAccount();
        String token = Preferences.getUserToken();

        if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
            DemoCache.setAccount(account.toLowerCase());
            return new LoginInfo(account, token);
        } else {
            return null;
        }
    }
}

登录状态监听

可以通过以下接口来监听当前登录状态:

/**
 * 注册/注销在线状态变化观察者。
 * 注册后,Observer的onEvent方法会被立即调用一次,告知观察者当前状态。
 *
 * @param observer 观察者, 参数为当前状态
 * @param register true为注册,false为注销
 */
public void observeOnlineStatus(Observer<StatusCode> observer, boolean register);
  • 参数说明

StatusCode为一个包含多个属性的枚举类型,每个属性包含一个int类型的value和一个String类型的desc。服务端踢人时如果配置描述字段,在此回调中会表现在desc变量中。

StatusCode属性 说明
INVALID 未定义
UNLOGIN 未登录/登录失败
NET_BROKEN 网络连接已断开
CONNECTING 正在连接服务器
LOGINING 正在登录中
SYNCING 正在同步数据
LOGINED 已成功登录
KICKOUT 被其他端的登录踢掉,此时应该跳转至手动登录界面
KICK_BY_OTHER_CLIENT 被同时在线的其他端主动踢掉,此时应该跳转至手动登录界面
FORBIDDEN 被服务器禁止登录
VER_ERROR 客户端版本错误
PWD_ERROR 用户名或密码错误
DATA_UPGRADE 数据库需要迁移到加密状态(类似被踢出、账号被禁用、密码错误等情况,自动登录失败,需要返回到登录界面进行重新登录操作)
  • 示例
NIMClient.getService(AuthServiceObserver.class).observeOnlineStatus(
    new Observer<StatusCode> () {
        public void onEvent(StatusCode status) {
      //获取状态的描述
      String desc = status.getDesc();
            if (status.wontAutoLogin()) {
                // 被踢出、账号被禁用、密码错误等情况,自动登录失败,需要返回到登录界面进行重新登录操作
            }
        }
}, true);

主动查询登录状态

SDK支持主动查询当前账号是否处于在线状态:

/**
 * 获取当前用户状态
 *
 * @return 当前状态
 */
public static StatusCode getStatus();

数据同步

SDK 在登录成功后,会自动同步群信息,离线消息,漫游消息,系统通知等数据。数据同步过程可以通过以下接口监听:

/**
 * 注册/注销登录后同步数据过程通知
 *
 * @param observer 观察者,参数为同步数据的过程状态(开始/结束)
 * @param register true为注册,false为注销
 */
public void observeLoginSyncDataStatus(Observer<LoginSyncStatus> observer, boolean register);
  • 参数说明
LoginSyncStatus属性 说明
NO_BEGIN 未开始
BEGIN_SYNC 开始同步(正在同步)。
同步开始时,SDK 数据库中的数据可能还是旧数据。
(如果是首次登录,那么 SDK 数据库中还没有数据,
重新登录时 SDK 数据库中还是上一次退出时保存的数据)
在同步过程中,SDK 数据的更新会通过相应的监听接口发出数据变更通知。
SYNC_COMPLETED 同步完成 。SDK 数据库已完成更新
  • 示例
NIMClient.getService(AuthServiceObserver.class).observeLoginSyncDataStatus(new Observer<LoginSyncStatus>() {
    @Override
    public void onEvent(LoginSyncStatus status) {
        if (status == LoginSyncStatus.BEGIN_SYNC) {
            LogUtil.i(TAG, "login sync data begin");
        } else if (status == LoginSyncStatus.SYNC_COMPLETED) {
            LogUtil.i(TAG, "login sync data completed");
        }
    }
}, register);

在数据同步完成后,整个登录过程才算真正完成。

断网重连

SDK 提供了自动重连机制(自动重新建立与云信服务器的连接并重新登录),所有重连的登录状态变更都会在 observeOnlineStatus 方法中回调。

SDK 在两种场景下会自动进行重连:

  • 手动/自动登录成功后,网络不佳导致链接断开的情况。
  • 网络不佳时,账号密码本身正常(未被封禁,且账号密码均正确),启动App时调用自动登录接口的情况。

满足上述中一个条件,当用户遇到普通网络问题如连接超时等,会自动进行重连登录,不需要上层开发者去做额外的重登逻辑

多端登录与互踢

云信SDK支持配置多种多端登录策略:

  • 只允许一端登录
  • 桌面PC与Web端互踢、移动Android和iOS端互踢、桌面与移动端同时登录。
    • 如果SDK相同,互踢;
    • Windows SDK和Web SDK为一类,Android SDK和iOS SDK为另一类,这两类之间,同类互踢,不同类不互踢。
  • 各端均可以同时登录在线(最多10个设备同时在线)

多端登录监听

登录成功后,可以注册多端登录状态观察者。

/**
 * 注册/注销多端登录状态观察者。
 *
 * @param observer 观察者,参数为同时登录的其他端信息。
 *                 如果有其他端注销,参数为剩余的在线端。如果没有剩余在线端了,参数为null。
 * @param register true为注册,false为注销
 */
public void observeOtherClients(Observer<List<OnlineClient>> observer, boolean register);
  • 参数说明
参数 说明
observer 观察者,参数为同时登录的其他端信息。
如果有其他端注销,参数为剩余的在线端。
如果没有剩余在线端了,参数为 null。
register 是否注册观察者,注册为 true, 注销为 false

OnlineClient 接口说明:

返回值 方法 说明
String getOs() 客户端的操作系统信息
int getClientType() 客户端类型
long getLoginTime() 登录时间
String getClientIp() 客户端 IP
String getCustomTag() 登录自定义属性
  • 示例
Observer<List<OnlineClient>> clientsObserver = new Observer<List<OnlineClient>>() {
        @Override
        public void onEvent(List<OnlineClient> onlineClients) {
            if (onlineClients == null || onlineClients.size() == 0) {
                return;
            }
            OnlineClient client = onlineClients.get(0);
            switch (client.getClientType()) {
                case ClientType.Windows:
                // PC端
                    break;
                case ClientType.MAC:
                // MAC端
                    break;
                case ClientType.Web:
                // Web端
                    break;
                case ClientType.iOS:
                // IOS端
                    break;
                case ClientType.Android:
                // Android端
                    break;
                default:
                    break;
            }
        }
    };

NIMClient.getService(AuthServiceObserver.class).observeOtherClients(clientsObserver, true);

互踢

SDK支持本端主动踢掉其他登录端:

/**
 * 踢掉多端同时在线的其他端
 * @param client 被踢端信息
 * @return InvocationFuture 可设置回调函数,监听操作结果。
 */
public InvocationFuture<Void> kickOtherClient(OnlineClient client);
  • 示例
NIMClient.getService(AuthService.class).kickOtherClient(client).setCallback(new RequestCallback<Void>() {
    @Override
    public void onSuccess(Void param) {
        // 踢出其他端成功
    }

    @Override
    public void onFailed(int code) {
        // 踢出其他端失败,返回失败code
    }

    @Override
    public void onException(Throwable exception) {
        // 踢出其他端错误
    }
});

当被其他端踢掉,可以通过observeOnlineStatus来监听。收到被踢回调后,建议进行注销并切换到登录界面。

此外,还可以通过 AuthService 的getKickedClientType() 方法来获取发起踢掉登录的客户端类型;通过getKickedCustomClientType()方法来获取发起踢掉登录的自定义客户端类型。

注销登录

应用登出/注销自己的账号时需要调用 SDK 的登出操作,该方法没有回调。注意: 登出操作,不要放在 Activity(Fragment) 的 onDestroy 方法中

/**
 * 注销接口
 */
public void logout();
  • 示例
NIMClient.getService(AuthService.class).logout();

其他辅助方法

  • 离线查看数据

对于一些弱 IM 场景,需要在登录成功前或者未登录状态下访问指定账号的数据(聊天记录、好友资料等)。 SDK 提供两种方案:

  • 使用自动登录。在登录成功前,可以访问 SDK 服务来读取本地数据(但不能发送数据)。

  • 使用 AuthService#openLocalCache 接口打开本地数据,这是一个同步方法,打开后即可读取 SDK 数据库中的记录。可以通过注销来切换账号查看本地数据。

/**
 * 离线时打开本地数据
 * 适用场景:在手动登录没有成功前(可能由于网络问题,登录时间较长),可以访问SDK本地数据。
 * 此外,不调用本接口,采用自动登录也能达到同样的效果。
 *
 * @return 是否成功打开SDK本地数据
 */
public boolean openLocalCache(String account);
  • 获取SDK版本号

NIMClient中提供获取版本号的方法:

/**
 * 运行时获取当前 SDK 版本号
 *
 */
public static java.lang.String getSDKVersion();
  • 查询云信服务器当前时间

MiscService中提供查询云信服务器当前时间的方法:

/**
 * 获取服务器时间 当前服务器时间戳,有频控限制。如果处于频控限制内,返回的时间为上一次获取时间+两次时间的偏移量。接口频控限制为1秒/次。
 *
 */
InvocationFuture<java.lang.Long> getServerTime();

本篇文档内容是否对您有帮助?

 

 

Je suppose que tu aimes

Origine blog.csdn.net/xfb1989/article/details/111637535
conseillé
Classement