Netease Yunxin SDK에 액세스할 때 Unity에서 발생하는 몇 가지 문제와 경험을 기록하세요.

앞부분에 적힌 내용은 초보 프로그램이라 너무 잘해서 문제가 많이 발생할 수 있으니 여기서는 개인적인 기록일 뿐입니다. 더 나은 해결책을 가지고 있는 큰 사람이 있다면 저를 도와주고 싶습니다.

1. 유니티 충돌

예외를 잡아내지 못했기 때문일 수도 있지만, Yunxin SDK가 초기화된 후 Unity가 오류를 보고하거나 다른 문제로 인해 프로그램이 정상적으로 종료되지 않는 한 Unity는 직접 정지됩니다.

2. SDK 사용 시 주의할 점은 무엇인가요?

SDK에서 제공하는 인터페이스는 모두 비동기식 인터페이스이며, 실행 결과는 콜백 함수를 통해 수신되며, 콜백 함수에서 UI 객체를 직접 조작할 수는 없으며, 업데이트 함수에서 결과를 저장하고 업데이트하거나, 다른 방법으로 업데이트할 수 있습니다. . (이 기능을 구현하기 위해 데모에는 Loom 클래스가 제공됩니다.)

3. 네트워크 메시지 언박싱 문제

Yunxin SDK의 네트워크 메시지의 기본 클래스는 NIMIMMessage이며 NIMAudioMessage, NIMTextMessage, NIMImageMessage, NIMTipMessage 등과 같은 다른 유형의 네트워크 메시지는 기본적으로 여기에서 파생됩니다. 그러나 메시지에서 승인한 콜백 매개변수에 반환되는 것은 NIMIMMessage 유형의 개체입니다.

// 消息接受的回调
    public void OnMessageReceived( object sender, NIMReceiveMessageEventArgs args )
// 这是消息回调中,回调回来的参数 NIMReceiveMessageEventArgs 类的定义。
    public class NIMReceiveMessageEventArgs : EventArgs
    {
    
    
        public NIMReceiveMessageEventArgs(NIMReceivedMessage msg)
        {
    
    
            Message = msg;
        }
        public NIMReceivedMessage Message {
    
     get; set; }
    }
// 这是 NIMReceivedMessage 类的定义
    public class NIMReceivedMessage : NimJsonObject<NIMReceivedMessage>
    {
    
    
        internal const string MessageContentPath = "content";
        ...

        [JsonProperty(MessageContentPath)]
        public NIMIMMessage MessageContent {
    
     get; set; }
        ...
// 安卓工程 manifests 权限
    <!-- Enable internet for app!!!. -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Getting the state of internet for app!!!. -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- write or read user data file for app!!!. -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    <uses-permission android:name="android.permission.READ_PHONE_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.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.CAMERA" />

4. 안드로이드 권한 획득 문제

실제 장치 테스트를 위해 Android 프로젝트에 처음 패키징되었을 때 SDK를 초기화할 때 create_path를 사용할 수 없다는 오류가 보고되었습니다. 그러다가 테스트 머신을 바꿔보니 정상적으로 초기화가 되는 걸 발견했습니다. 그럼 권한획득 문제를 확인하러 가보세요.

5. 안드로이드 매니페스트의 함정

正常来说 Unity 导出安卓工程后,工程中的 manifests.xml 中 作为应用程序启动入口的 Activity 应该是 Unity 生成的 UnityPlayerActivity,然而接入了云信SDK后的 导出的安卓工程中的 manifests 应该是修改了原本 Unity 生成的
// 以下是接入云信SDK后的安卓工程的 manifests.xml 中活动的声明
       <activity
       // 主要是 name 这里的区别 
            **android:name="com.netease.nimlib.MainActivity"** 
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density"
            android:hardwareAccelerated="false"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="fullSensor">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
            <meta-data
                android:name="unityplayer.ForwardNativeEventsToDalvik"
                android:value="false" />
        </activity>
        <activity
            android:name="com.netease.nimlib.MainActivity"
            android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:screenOrientation="fullSensor">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="unityplayer.UnityActivity"
                android:value="true" />
            <meta-data
                android:name="unityplayer.ForwardNativeEventsToDalvik"
                android:value="false" />
        </activity>

6. 오디오 경로를 녹음하고 로컬 오디오 경로를 보냅니다.

I/Unity: 音频信息:StopCapture rescode:200
file_path:/sdcard/com.netease.nim_unity_android_demo/NIM/audio/181366001.aac
file_ext:aac

위 내용은 녹음 완료 후 입력되는 오디오 정보의 일부입니다. file_path는 오디오 경로입니다.

//如果是发送本地文件,请给LocalFilePath赋值
msg.LocalFilePath="c:\\audio.aac";

오디오 네트워크 메시지를 보내려면 위 그림과 같이 파일의 절대 경로가 필요합니다. 구체적인 이유는 Unity가 "/"의 파일 경로를 인식할 수 없기 때문일 수 있습니다.

7. 메시지 첨부 파일의 로컬 경로

이 인터페이스는 Unity 통합 문서에는 언급되어 있지 않으며, 이 SDK에 처음 접속하고 Unity에 먼저 접속하는 경우에는 첨부 파일이 어디서 다운로드되는지 알 수 없기 쉽습니다.

        /// <summary>
        /// 从消息的中获取附件(图片、语音、视频等)的本地路径
        /// </summary>
        /// <param name="msg">消息对象</param>
        /// <returns>消息如果有附件,不管是否已下载,返回附件的本地路径;消息如果没有附件,返回空字符串""</returns>
        public static string GetAttachmentPathFromMsg(NIMIMMessage msg)
        {
    
    
            var jsonMsg = msg.Serialize();
            var ptr = TalkNativeMethods.nim_talk_get_attachment_path_from_msg(jsonMsg);
            NimUtility.Utf8StringMarshaler marshaler = new NimUtility.Utf8StringMarshaler();
            var path = marshaler.MarshalNativeToManaged(ptr) as string;
            GlobalAPI.FreeBuffer(ptr);
            return path;
        }

8. Yunxin 서버 API 문제

채팅방을 생성하려면 Yunxin 서버의 API를 호출해야 합니다. Yunxin 서버는 Http Post 요청만 허용합니다. Yunxin에서 제공하는 서버측 API 호출 데모 예제를 다운로드했는데 C# 데모가 작성되지 않는 것 같습니다. 매개변수 추가 호출 방법(Java 버전만 해당) 그래서 우리 프로젝트에서 참조하는 타사 도구인 BestHttp를 사용했고, 정상적으로 Yunxin 서버로 요청을 보낼 수 있습니다.

완료되지 않았습니다. 회사에서 인스턴트 메시징 제품을 변경해야 하므로 이 문서는 일시적으로 끝났으며, 향후 시간이 있으면 계속 업데이트하고 개선할 것입니다.

추천

출처blog.csdn.net/a525324105/article/details/106518085