https://blog.csdn.net/qq_32090185/article/details/89307710
SDK統合
YunxinインスタントメッセージングAndroid-SDKは、次の2つの統合方法をサポートしています。
-
Gradleを介した自動統合(推奨)
-
SDKをダウンロードし、その後、手動でプロジェクトに統合。
さらに、開発者がIM機能をアプリに簡単かつ迅速に統合できるようにするために、簡単な構成でチャット機能を実現できるオープンソースのUIコンポーネントも提供しています。
Gradle統合
まず、プロジェクト全体のbuild.gradleファイルで、リポジトリを構成し、jcenterまたはmavenを使用して、次のように2つのうちの1つを選択します。
allprojects {
repositories {
jcenter() // 或者 mavenCentral()
}
}
次に、メインプロジェクトのbuild.gradleファイルに依存関係を追加します。
android {
defaultConfig {
ndk {
//设置支持的SO库架构
abiFilters "armeabi-v7a", "x86","arm64-v8a","x86_64"
}
}
}
次に、独自のプロジェクトのニーズに応じてさまざまな依存関係を追加します。注:Yunxinのコンポーネントバージョン番号は一貫している必要があります。SDKのダウンロードページで現在の最新バージョンを確認できます。例として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'
}
手動統合
最初にSDKダウンロードページに入ってダウンロードを完了し、次に必要に応じて対応するSDKファイルをプロジェクトのlibsディレクトリにコピーして構成を完了します。
SDKファイルの説明は次のとおりです。
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 //通过云信来集成小米等厂商推送时需要
注:
- データベース暗号化機能を使用するには、gradleを介して依存ライブラリ「net.zetetic:android-database-sqlcipher:3.5.9」もインポートする必要があります。
- traceroute.soは個別にダウンロードする必要があります。ダウンロードアドレス
権限とコンポーネント
ではAndroidManifest.xml
、以下の設定を追加(com.netease.nim.demo独自のパッケージ名に置き換えてください):
<?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>
難読化された構成
APKが最終的に難読化される場合は、次のコードをproguard構成ファイルに追加してください。
-dontwarn com.netease.**
-keep class com.netease.** {*;}
#如果你使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}
#如果你开启数据库功能,需要加入
-keep class net.sqlcipher.** {*;}
使用説明書
インターフェイスの紹介
SDKは、開発者が使用できる2種類のインターフェースを提供します。
最初のタイプは、リクエストをアクティブに開始することです。
2番目のカテゴリは、オブザーバーとしてイベントと変更を監視することです。
Service
たとえばAuthService
、最初のインターフェイス名は終了します。
2番目のタイプのインターフェース名はServiceObserver
終わりです。たとえばAuthServiceObserver
、個々の長いクラス名はObserver
、たとえば、終わりをSystemMessageObserver
指す場合があります。
SDKインターフェイスの呼び出しでは、SDK XXXService
提供されているメインプロセスメソッドでメインプロセスを呼び出す必要があります。
メインXXXServiceObserver
オブザーバーを登録するプロセス(イベントの変更、メインプロセスのメインスレッドへのコールバック)。
モジュールが非メインプロセスで実行されている場合は、メインプロセスと非メインプロセス間の通信を自分で実装してください(AIDL/Messenger/ContentProvider/BroadcastReceiver等IPC渠道
)メインプロセスのコールバックまたは監視によって返されたデータを非メインプロセスに渡します。
SDKは、次の3つのインターフェイス戻り値を提供します。
基本データ型(同期インターフェース)、
InvocationFuture(非同期インターフェース)
AbortableFuture(非同期インターフェース)。
非同期インターフェースは基本的にメインプロセスから呼び出され、バックグラウンドプロセスで実行され、最終的に結果がメインプロセスに返されます。
SDKインターフェイスの戻り値 | 説明 |
---|---|
基本データ型 | 同期インターフェース |
InvocationFuture | 非同期インターフェース |
AbortableFuture | 時間がかかる場合や大量のデータを転送する場合に使用される非同期インターフェースで、abort()メソッドを使用してリクエストを中断できます。たとえば、アップロードとダウンロード、ログインなどです。 |
非同期インターフェースはコールバック関数を設定でき、RequestCallbackとRequestCallbackWrapperの2つのメソッドを提供します。
非同期インターフェースコールバック関数 | 説明 |
---|---|
RequestCallback | 3つのインターフェースを実装する必要があります: 成功onSuccess、失敗onFailed、例外onException |
RequestCallbackWrapper | onResultを実装する必要があります。成功、失敗、例外の3つのインターフェイスがカプセル化され、パラメータが区別されます |
- SDK 4.4.0 API呼び出しフレームワークの機能強化:
- Looperを使用して非UIスレッドによって開始された非同期API呼び出しをサポートし、呼び出し元のスレッドに直接コールバックします。古いバージョンは、デフォルトでUIスレッドにコールバックします。
- 非同期から同期への強制変換用のインターフェースを提供します:NIMClient#syncRequest。これにより、最大同期待機時間を設定でき、非UIスレッドでYunxinAPIへの同期呼び出しを必要とするシナリオをサポートします。
- 自動生成されたNIMSDKクラスを追加すると、開発者はNIMSDK#getXXXServiceメソッドを直接使用してサービスインターフェイスを取得できます。XXXService.classを渡す必要がなくなり、API呼び出しメソッドが簡素化されます。他のプラグインによって自動的に生成されるコールエントリクラスは、NIMChatRoomSDK、NIMLuceneSDKです。例、
NIMSDK.getAuthService().login()
置換を使用しNIMClient.getService(AuthService.class).login()
ます。
データキャッシュディレクトリ
マルチメディアメッセージを受信すると、SDKはデフォルトでいくつかの関連ファイルをダウンロードします。
同時に、SDKはいくつかの主要なログファイルも記録するため、SDKにはデータキャッシュディレクトリが必要です。
SDKのSDKOptions#sdkStorageRootPath
設定時にディレクトリを初期化できます。
開始SDK4.4.0バージョンでは、開発者構成でContext#getExternalCacheDir
、Context#getExternalFilesDir
拡張保存キャッシュディレクトリ(つまり/sdcard/Android/data/{package}
)などのアプリケーションの下にある場合、
SDK内で書き込み権限がチェックされなくなります。キャッシュディレクトリ内のファイルは、アプリがアンインストールされると削除され、設定インターフェイスでユーザーが手動でクリアすることもできます。
設定されていない場合、デフォルトは/{外卡根目录}/{应用包名}/nim/
で、ワイルドカードのルートディレクトリが取得されEnvironment.getExternalStorageDirectory().getPath()
ます。
APPでキャッシュ機能をクリアする必要がある場合は、このディレクトリ内のファイルをスキャンして、ルールに従ってクリーンアップできます。NimClient#getSdkStorageDirPath
SDKデータキャッシュディレクトリを取得した後、SDKによる初期化が完了します。
SDKデータキャッシュディレクトリには次のものが含まれます。
サブディレクトリ | コンテンツ |
---|---|
ログ | SDKログファイル:nim_sdk.logなど、サイズは通常8Mを超えません。 |
画像 | 画像メッセージの元の画像 |
オーディオ | 音声メッセージの音声 |
ビデオ | ビデオメッセージの元のビデオ |
親指 | 画像/ビデオメッセージのサムネイル |
ファイル | ファイル内のファイルメッセージ |
初期化
初期化
SDKをクライアントに統合した後、SDKを使用する前に初期化作業を完了する必要があります。
さらに、次の点に注意してください。v6.9.0以降、AndroidXサポートライブラリが使用され、Target APIが28に変更され、サポートライブラリはサポートされなくなりました。
Application#onCreate
SDK初期化コードのアプリケーションで推奨:
/**
* 在Application#onCreate()中初始化SDK
*
* @param context 调用上下文
* @param info 登录用户信息。如果提供,将同时进行自动登录。如果当前还没有登录用户,请传入null。详见自动登录章节。
* @param options 初始化配置参数
*/
public static void init(Context context, LoginInfo info, SDKOptions options);
例:
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;
}
}
構成パラメーターを初期化します
初期化中に、SDKOptions
さまざまなビジネス要件を満たすためにいくつかの属性を設定することをサポートします。
SDKOptionsパラメーターの説明:
パラメータ | 説明 |
---|---|
appKey | YunxinSDKのappKeyを設定します。appKeyは、メタデータを介してAndroidManifestファイルに設定することもできます。 |
statusBarNotificationConfig | Yunxinカプセル化メッセージリマインダー構成 |
userInfoProvider | ユーザー情報プロバイダー。現在、主に通知バーにユーザーのニックネームとアバターを表示するために使用されます。 |
messageNotifierCustomization | 通知バーのリマインダーコピーライティングのカスタマイズ |
sdkStorageRootPath | マルチメディアメッセージファイルを保存するための外部ストレージルートディレクトリ |
preloadAttach | マルチメディアメッセージの添付ファイルを自動的にプリロードするためにSDKが必要ですか? |
サムネイルのサイズ | メッセージサムネイルのサイズ |
sessionReadAck | 読み取りセッションのマルチターミナル同期を開くかどうか |
ImprovementSDKProcessPriority | SDKプロセスの優先度を上げるかどうか(デフォルトで上げると、SDKコアプロセスがシステムによってリサイクルされる可能性を減らすことができます) |
serverConfig | 民営化されたサーバーアドレスを構成する |
preLoadServers | プリロードサービス、デフォルトはtrue、falseに設定することはお勧めしません、プリロード接続はログインプロセスを最適化できます |
teamNotificationMessageMarkUnread | グループ通知メッセージが未読としてカウントされるかどうかにかかわらず、デフォルトは未読としてカウントされません |
useXLog | パフォーマンスが向上したSDKログモードを使用します。デフォルトでは、通常のログモードが使用されます。 |
AnimationImageThumbnailEnabled | GIFサムネイルのサポートを有効にします。デフォルトはfalseで、最初のフレームがキャプチャされます |
asyncInitSDK | SDKを非同期で初期化するかどうかにかかわらず、デフォルトはfalseです。これをオンにすると、Application#onCreateのSDK初期化関数の同期応答時間が短縮されます。 |
reduceIM | 弱いIMシーンであるかどうかに関係なく、デフォルトはfalseです。一部のシナリオでAPPがオンデマンドでIM機能のみを使用し(アプリケーションの起動時に自動的にログインする必要がない)、メッセージ通知とデータのリアルタイムパフォーマンスを保証する必要がない場合は、次のように入力できます。ここで本当です。弱いIMシナリオでは、プッシュプロセスは遅延起動戦略を採用します(ユーザーログイン段階まで遅延します)。起動後、そのライフサイクルはUIプロセスに従い、弱いIMシナリオでのAPPのバックグラウンド消費電力を削減します。 |
checkMainifestConfig | SDKの初期化時にマニフェストファイルの構成が完了しているかどうかを確認するかどうか(デフォルトはfalse)。開発者はデバッグ段階でマニフェストファイルをオンにし、オンラインでオフにすることをお勧めします。 |
mixPushConfig | サードパーティのプッシュappid、appkey、certificateを構成します |
enableBackOffReconnectStrategy | ランダムバックオフ再接続戦略を使用するかどうかにかかわらず、デフォルトはtrueです。これを有効にすることを強くお勧めします。閉じる必要がある場合は、Yunxinテクニカルサポートにご相談ください。 |
enableLBSOptimize | ネットワーク接続最適化戦略を有効にするかどうかにかかわらず、デフォルトで有効になっています。 |
enableTeamMsgAck | グループメッセージ読み取り機能を有効にするかどうか、デフォルトでは無効になっています |
shouldConsiderRevokedMessageUnreadCount | メッセージが取り下げられたときの未読の読みから1を引いたもの |
mNosTokenSceneConfig | 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();
本篇文档内容是否对您有帮助?