You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
apply-assistant-v3/root/NEUIKit/App.vue

316 lines
8.9 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script lang="ts">
import RootStore from "@xkit-yx/im-store-v2";
import V2NIM, { V2NIMConst } from "nim-web-sdk-ng/dist/v2/NIM_UNIAPP_SDK";
import {
customRedirectTo,
customReLaunch,
customSwitchTab,
customNavigateTo
} from "./utils/customNavigate";
import { getMsgContentTipByType } from "./utils/msg";
import { STORAGE_KEY } from "./utils/constants";
import { isWxApp } from "./utils";
import {
V2NIMMessage,
V2NIMMessagePushConfig,
} from "nim-web-sdk-ng/dist/v2/NIM_UNIAPP_SDK/V2NIMMessageService";
// #ifdef APP-PLUS
// 推送插件
const nimPushPlugin = uni.requireNativePlugin("NIMUniPlugin-PluginModule");
// 音视频通话插件
const nimCallKit = (uni.$UIKitCallKit =
uni.requireNativePlugin("netease-CallKit"));
// #endif
export default {
onLaunch() {
// #ifdef APP-PLUS
// 关闭启动画面,锁定竖屏
plus.navigator.closeSplashscreen();
plus.screen.lockOrientation("portrait-primary");
// #endif
if (
uni?.$UIKitStore?.connectStore?.connectStatus ===
V2NIMConst.V2NIMConnectStatus.V2NIM_CONNECT_STATUS_CONNECTED
) {
return;
}
const imOptions = uni.getStorageSync(STORAGE_KEY);
if (imOptions) {
this.initNim(imOptions);
} else {
// 需要登录 im
customRedirectTo({
url: isWxApp ? "/pages/index/index" : "/pages/Login/index",
});
}
},
onShow() {
// #ifdef APP-PLUS
uni?.$UIKitNIM?.V2NIMSettingService?.setAppBackground(false);
// #endif
},
onHide() {
// #ifdef APP-PLUS
uni?.$UIKitNIM?.V2NIMSettingService?.setAppBackground(true);
// #endif
},
methods: {
initNim(opts: { account: string; token: string }) {
// 保存登录信息
uni.setStorage({
key: STORAGE_KEY,
data: opts,
success: function () {
console.log("保存登录信息success");
},
});
const nim = (uni.$UIKitNIM = V2NIM.getInstance(
{
appkey: "",
needReconnect: true,
// "reconnectionAttempts": 5,
debugLevel: "debug",
apiVersion: "v2",
},
{
V2NIMLoginServiceConfig: {
lbsUrls: isWxApp
? ["https://lbs.netease.im/lbs/wxwebconf.jsp"]
: ["https://lbs.netease.im/lbs/webconf.jsp"],
linkUrl: isWxApp ? "wlnimsc0.netease.im" : "weblink.netease.im",
/**
* 使用固定设备ID
*/
isFixedDeviceId: true,
},
}
));
const store = (uni.$UIKitStore = new RootStore(
nim,
{
// 添加好友是否需要验证
addFriendNeedVerify: false,
// 是否需要显示 p2p 消息、p2p会话列表消息已读未读默认 false
p2pMsgReceiptVisible: true,
// 是否需要显示群组消息已读未读,默认 false
teamMsgReceiptVisible: true,
// 群组被邀请模式,默认需要验证
teamAgreeMode:
V2NIMConst.V2NIMTeamAgreeMode.V2NIM_TEAM_AGREE_MODE_NO_AUTH,
// 发送消息前回调, 可对消息体进行修改,添加自定义参数
sendMsgBefore: async (options: {
msg: V2NIMMessage;
conversationId: string;
serverExtension?: Record<string, unknown>;
}) => {
const pushContent = getMsgContentTipByType({
text: options.msg.text,
messageType: options.msg.messageType,
});
const yxAitMsg = options.serverExtension
? options.serverExtension.yxAitMsg
: { forcePushIDsList: "[]", needForcePush: false };
// 如果是 at 消息,需要走离线强推
const { forcePushIDsList, needForcePush } = yxAitMsg
? // @ts-ignore
store.msgStore._formatExtAitToPushInfo(
yxAitMsg,
options.msg.text
)
: { forcePushIDsList: "[]", needForcePush: false };
console.log("forcePushIDsList: ", forcePushIDsList);
const { conversationId } = options;
const conversationType =
nim.V2NIMConversationIdUtil.parseConversationType(conversationId);
const targetId =
nim.V2NIMConversationIdUtil.parseConversationTargetId(
conversationId
);
const pushPayload = JSON.stringify({
// oppo
oppoField: {
click_action_type: 4, // 参考 oppo 官网
click_action_activity: "", // 各端不一样 TODO
action_parameters: {
sessionId: targetId,
sessionType: conversationType,
}, // 自定义
},
// vivo
vivoField: {
pushMode: 0, //推送模式 0正式推送1测试推送不填默认为0
},
// huawei
hwField: {
click_action: {
type: 1,
action: "", // 各端不一样 TODO
},
androidConfig: {
category: "IM",
data: JSON.stringify({
sessionId: targetId,
sessionType: conversationType,
}),
},
},
// 通用
sessionId: targetId,
sessionType: conversationType,
});
const pushConfig: V2NIMMessagePushConfig = {
pushEnabled: true,
pushNickEnabled: true,
forcePush: needForcePush,
forcePushContent: pushContent,
forcePushAccountIds: forcePushIDsList,
pushPayload: "{}",
pushContent,
};
return { ...options, pushConfig };
},
},
"UniApp"
));
// #ifdef APP-PLUS
// 注册推送
nim.V2NIMSettingService.setOfflinePushConfig(nimPushPlugin, {
miPush: {
appId: "",
appKey: "",
certificateName: "",
},
hwPush: {
appId: "",
certificateName: "",
},
oppoPush: {
appId: "",
appKey: "",
certificateName: "",
secret: "",
},
vivoPush: {
appId: "",
appKey: "",
certificateName: "",
},
fcmPush: {
certificateName: "",
},
mzPush: {
appId: "",
appKey: "",
certificateName: "",
},
apns: {
certificateName: "",
},
});
// 初始化音视频通话插件
console.log("-------------callkit init 开始", opts.account, opts.token);
nimCallKit.initConfig(
{
appKey: "", // 请填写你的appkey
account: opts.account, // 请填写你的account
token: opts.token, // 请填写你的token
apnsCername: "",
pkCername: "",
},
(ret: any) => {
console.log("-------------callkit 回调", ret);
if (ret.code != 200) {
console.log("-------------callkit init失败\n错误码");
} else {
console.log("-------------callkit 开始登录------------");
nimCallKit.login(
{
account: opts.account,
token: opts.token,
},
function (ret: any) {
if (ret.code != 200) {
console.log("-------------callkit 登录失败------------", ret);
} else {
console.log(
"-------------callkit 登录成功------------ ",
ret
);
}
}
);
}
}
);
// #endif
nim.V2NIMLoginService.login(opts.account, opts.token).then(() => {
customNavigateTo({
url: "/pages/Conversation/index",
});
});
nim.V2NIMMessageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {
console.log('初始化监听会话:',messages)
})
},
logout() {
uni.removeStorageSync(STORAGE_KEY);
try {
nimCallKit.logout({}, (ret: any) => {
if (ret.code != 200) {
console.log("音视频通话插件退出失败");
} else {
console.log("音视频通话插件退出成功");
}
});
} catch (error) {
console.log("音视频通话插件退出失败", error);
}
uni.$UIKitNIM.V2NIMLoginService.logout().then(() => {
uni.$UIKitStore.destroy();
customReLaunch({
url: "/pages/Login/index",
});
});
},
},
};
</script>
<style lang="scss">
@import "./base.scss";
uni-page-body {
height: 100%;
}
uni-page-body > uni-view {
height: 100%;
}
</style>