ios - Rocketchat 嵌入式布局未在 iphone (ios) 中显示麦克风按钮
问题描述
我们正在使用 Rocketchat 嵌入式 URL 将聊天添加到我们的应用程序 android 和 ios 我们需要的控件是上传图像、录制视频、录制音频图像和视频工作正常问题是 iphone 中的布局没有显示麦克风按钮在android中它工作正常谁能告诉我是什么原因?
Rocket.Chat 服务器版本:2.4.0 操作系统:linux 部署方式:tar 运行实例数:1 DB Replicaset Oplog:已启用 NodeJS 版本:v8.17.0 MongoDB 版本:4.0.14
解决方案
我花了很长时间试图找出解决这个问题的方法,但我找不到直接的解决方案,因为它是特定于平台的(带有 UIWebView 的 iOS 或新的 WKWebView),由于某些原因 iOS 阻止上传文件(音频,视频...)使用这两个视图。
如果您尝试在 iOS-Chrome 上打开火箭聊天嵌入式布局,您将面临同样的问题,但如果您使用 Safari 打开它,您会发现一切正常(上传文件、音频、视频......)。
因此,这里出现了可以让我们的生活更轻松的解决方法,尽管它会花费我们一些 UI 牺牲。
如果您愿意,您需要开发一个功能来录制语音或视频,并将音频/视频文件保存在某处,然后使用 Rocket Chat API 将其上传到所需的频道。
上传时,您需要告诉火箭聊天后端您的文件是什么类型。这是解决方案:
- 使用靠近嵌入式设备的麦克风录制声音
一旦您对文件没有问题并将其保存在本地某处,您需要使用以下函数上传它:
private void SendFileToRocketChat(string groupId, string filePath, string fileType) { var url = "your-rocket-chat-domain.com" + "/api/v1/rooms.upload/" + groupId; string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.ContentType = "multipart/form-data; boundary=" + boundary; request.Method = "POST"; request.KeepAlive = true; request.Headers.Add("X-Auth-Token", UserAuth); //your user 'admin' authentication token request.Headers.Add("X-User-Id", UserId); //your user 'admin' authentication user ID Stream memStream = new System.IO.MemoryStream(); var boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); var endBoundaryBytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--"); string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; string headerTemplate = "Content-Disposition: form-data; name=\"file\"; filename=\"{1}\"\r\n" + "Content-Type: " + fileType + "\r\n\r\n"; memStream.Write(boundarybytes, 0, boundarybytes.Length); var header = string.Format(headerTemplate, "file", filePath); var headerbytes = System.Text.Encoding.UTF8.GetBytes(header); memStream.Write(headerbytes, 0, headerbytes.Length); using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { var buffer = new byte[1024]; var bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { memStream.Write(buffer, 0, bytesRead); } } memStream.Write(endBoundaryBytes, 0, endBoundaryBytes.Length); request.ContentLength = memStream.Length; using (Stream requestStream = request.GetRequestStream()) { memStream.Position = 0; byte[] tempBuffer = new byte[memStream.Length]; memStream.Read(tempBuffer, 0, tempBuffer.Length); memStream.Close(); requestStream.Write(tempBuffer, 0, tempBuffer.Length); } using (var response = request.GetResponse()) { Stream stream2 = response.GetResponseStream(); StreamReader reader2 = new StreamReader(stream2); string res = reader2.ReadToEnd(); } }
现在您可以按如下方式调用您的函数:
SendFileToRocketChat("yourgroupID","/file/audio/sample.mp3","audio/mp3");
如果您需要上传视频,请使用相同的功能:
SendFileToRocketChat("yourgroupID","/file/video/sample.mp4","video/mp4");
我希望这将成为一种解决方法,直到我们找到解决此问题的适当解决方案。
推荐阅读
- python - Django Rest Framework:如何使用 url 传递值并执行计算
- php - 实时更改 Wordpress
- jsf - 是否需要在 JSF 自定义组件的 decode() 中调用 setValid(true)?
- python - How to reverse the (key,value)'s order of a dict in the output?
- java - 使用@sql spring boot test从资源文件夹以外的自定义位置读取.sql文件
- sql-server - asp.net core code first 无法打开登录请求的数据库“DbName”。登录失败
- javascript - jquery按钮箭头功能
- apache - Apache 重写 XSS 保护问题
- python - 不止一次在 Apache Flink 中计算时间属性
- html - 绘制后订购 svg 元素