rongcloud / rongcloud-im-flutter-sdk

IM Flutter SDK of RongCloud
MIT License
199 stars 56 forks source link

接收方该如何判断三种消息类型 #29

Closed speanut-land closed 5 years ago

speanut-land commented 5 years ago

为了快速解决问题,在寻求帮助的时候,请提供以下信息,方便我们快速定位问题

[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2) • Android SDK at /Users/speanut/Library/Android/sdk • Android NDK location not configured (optional; useful for native profiling support) • Platform android-29, build-tools 29.0.2 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405) • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 10.2.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 10.2.1, Build version 10E1001 • CocoaPods version 1.7.3

[✓] iOS tools - develop for iOS devices • ios-deploy 1.9.4

[✓] Android Studio (version 3.5) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 38.2.3 • Dart plugin version 191.8423 • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)

[✓] Connected device (1 available) • speanut • 925d906d24fc7bfc700785e65ca0a0da59662cd8 • ios • iOS 12.3

• No issues found!

loginSin commented 5 years ago

可以参考代码中展示消息 widget 的逻辑,参见 message_item_factory.dart 的 messageItem 方法,具体如下

Widget messageItem() { if (message.content is TextMessage) { return textMessageItem(); } else if (message.content is ImageMessage){ return imageMessageItem(); } else if (message.content is VoiceMessage) { return voiceMessageItem(); } else { return Text("无法识别消息 "+message.content.getObjectName()); } }

speanut-land commented 5 years ago

如果能够正常的使用 我会关闭这个issues 感谢作者的及时回复!!

speanut-land commented 5 years ago

可以参考代码中展示消息 widget 的逻辑,参见 message_item_factory.dart 的 messageItem 方法,具体如下

Widget messageItem() { if (message.content is TextMessage) { return textMessageItem(); } else if (message.content is ImageMessage){ return imageMessageItem(); } else if (message.content is VoiceMessage) { return voiceMessageItem(); } else { return Text("无法识别消息 "+message.content.getObjectName()); } }

询问作者 用flutter_sound录取音频(不是example中的audio_recorder) 然后通过IM插件发送语音之后 ios 会退出程序 以下是发送音频的代码

void onSendVoiceMessage(String voicePath) async {
    VoiceMessage voiceMessage = VoiceMessage();
    voiceMessage.localPath = voicePath;
    Message msg = await RongcloudImPlugin.sendMessage(
        RCConversationType.Private,
        id,
        voiceMessage);
  }

通过flutter_sound生成的本地音频路径为 file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a

不知是否符合 还有一个就是之前下载example是可以运行的 现在不知是否是audio_recorder这个插件的问题example也无法运行 经过下午的测试 可以正常的发送图片与文本信息 希望作者看看是什么问题🙏🙏

loginSin commented 5 years ago

初步猜测可能是本地路径的问题,audio_recorder 录制的是没有 ”file://“ 头的,Android 需要加 ”file://“ 头,iOS 不需要,但是根据你上面的描述,貌似 flutter_sound 全都是给加了 ”file://“,可能是这个原因,可以按照这个思路排查 但是如果需要具体的定位问题,请提供必要的 log

speanut-land commented 5 years ago

初步猜测可能是本地路径的问题,audio_recorder 录制的是没有 ”file://“ 头的,Android 需要加 ”file://“ 头,iOS 不需要,但是根据你上面的描述,貌似 flutter_sound 全都是给加了 ”file://“,可能是这个原因,可以按照这个思路排查 但是如果需要具体的定位问题,请提供必要的 log

flutter: 按下按钮啦
flutter: file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
flutter: 抬起手指啦
flutter: 停止录音
flutter: file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
flutter: 发送语音
flutter: file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
[RC-Flutter-IM] iOS sendMessage start param:{
    content = "{\"localPath\":\"file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a\",\"duration\":null,\"extra\":null}";
    conversationType = 1;
    objectName = "RC:HQVCMsg";
    pushContent = "";
    pushData = "";
    targetId = 1154228491220512769;
}
Lost connection to device.
Exited (sigterm)

用的是IOS真机测试 用flutter_sound可以本地保存语音并且可以播放 但调用IM发送语音接口就退出系统 不知这样的log是否可行

speanut-land commented 5 years ago

现在又发现一个小小的问题 , 当发出文本信息后,无法判断是否发送成功,按照参照文档和example发送文本的状态码每次只能够得到10 也就是正在发送,但无法判断文本是否到达 (通过轮询也不现实吧?)

loginSin commented 5 years ago

一:语音消息发送崩溃的问题,有两种方案,任选一试试

  1. flutter_sound 录制的语音路径携带了 "file://" 头,iOS 试一下把 “file://” 头去掉试试
  2. 通过 flutter 命令运行项目可能无法拿到崩溃的堆栈,建议使用 Xcode 打开 ios/Runner.xcworkspace 直接运行,看一下是否能够拿到崩溃堆栈 二:无法知道消息发送结果 发送消息的接口会直接返回消息对象,状态是发送中,这样页面可以先行展示消息内容 然后会触发 onMessageSend 回调,告知刚发的消息的具体发送状态
speanut-land commented 5 years ago

一:语音消息发送崩溃的问题,有两种方案,任选一试试

  1. flutter_sound 录制的语音路径携带了 "file://" 头,iOS 试一下把 “file://” 头去掉试试
  2. 通过 flutter 命令运行项目可能无法拿到崩溃的堆栈,建议使用 Xcode 打开 ios/Runner.xcworkspace 直接运行,看一下是否能够拿到崩溃堆栈 二:无法知道消息发送结果 发送消息的接口会直接返回消息对象,状态是发送中,这样页面可以先行展示消息内容 然后会触发 onMessageSend 回调,告知刚发的消息的具体发送状态
2019-09-10 19:28:35.438350+0800 Runner[16388:2799816] flutter: 按下按钮啦
2019-09-10 19:28:35.939799+0800 Runner[16388:2799816] flutter: file:///private/var/mobile/Containers/Data/Application/6E73882E-38EC-429F-886E-6E68DA077B1F/tmp/sound.m4a
2019-09-10 19:28:42.633428+0800 Runner[16388:2799816] flutter: 抬起手指啦
2019-09-10 19:28:43.173115+0800 Runner[16388:2799816] flutter: 停止录音
2019-09-10 19:28:43.173314+0800 Runner[16388:2799816] flutter: file:///private/var/mobile/Containers/Data/Application/6E73882E-38EC-429F-886E-6E68DA077B1F/tmp/sound.m4a
2019-09-10 19:28:43.175733+0800 Runner[16388:2799816] flutter: 发送语音
2019-09-10 19:28:43.197701+0800 Runner[16388:2799652] [RC-Flutter-IM] iOS sendMessage start param:{
    content = "{\"localPath\":\"/private/var/mobile/Containers/Data/Application/6E73882E-38EC-429F-886E-6E68DA077B1F/tmp/sound.m4a\",\"duration\":null,\"extra\":null}";
    conversationType = 1;
    objectName = "RC:HQVCMsg";
    pushContent = "";
    pushData = "";
    targetId = 1154228491220512769;
}
2019-09-10 19:28:43.198006+0800 Runner[16388:2799652] -[NSNull longValue]: unrecognized selector sent to instance 0x2079017e0
libc++abi.dylib: terminate_handler unexpectedly threw an exception
(lldb) 

通过去除file://发现依旧是无法使用 然后用xcode来操作得出以上的log 以上是xcode的错误堆栈 Xcode错误堆栈

loginSin commented 5 years ago

VoiceMessage msg = VoiceMessage.obtain(path, duration); 可以参考上面的这个代码,根据描述是语音的时长没有给 语音时长是必要的参数,用来 UI 显示

speanut-land commented 5 years ago

经过测试后发现在IOS上用flutter_sound来录音,会自动带上file:// 导致无法发送语音,感谢作者的帮助🙏🙏 ,语音那里是看到文档没有以为和图片一样加上一个路径就可以了,没想过得需要duration ,最后想说说example是很不错的,几乎所有的API上面都有,如果有和我一样蠢的小伙伴可以考虑仔细看看example ,可能AudioRecorder这个第三方插件用不了,这个插件有毒,但可以考虑使用flutter_sound,再次感谢作者的快速解答