首页 > 解决方案 > 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

标签: iosaudiorocket.chat

解决方案


我花了很长时间试图找出解决这个问题的方法,但我找不到直接的解决方案,因为它是特定于平台的(带有 UIWebView 的 iOS 或新的 WKWebView),由于某些原因 iOS 阻止上传文件(音频,视频...)使用这两个视图。

如果您尝试在 iOS-Chrome 上打开火箭聊天嵌入式布局,您将面临同样的问题,但如果您使用 Safari 打开它,您会发现一切正常(上传文件、音频、视频......)。

因此,这里出现了可以让我们的生活更轻松的解决方法,尽管它会花费我们一些 UI 牺牲。

如果您愿意,您需要开发一个功能来录制语音或视频,并将音频/视频文件保存在某处,然后使用 Rocket Chat API 将其上传到所需的频道。

上传时,您需要告诉火箭聊天后端您的文件是什么类型。这是解决方案:

  1. 使用靠近嵌入式设备的麦克风录制声音
  2. 一旦您对文件没有问题并将其保存在本地某处,您需要使用以下函数上传它:

    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();
        }
    }
    
  3. 现在您可以按如下方式调用您的函数:

    SendFileToRocketChat("yourgroupID","/file/audio/sample.mp3","audio/mp3");
    
  4. 如果您需要上传视频,请使用相同的功能:

    SendFileToRocketChat("yourgroupID","/file/video/sample.mp4","video/mp4");
    

我希望这将成为一种解决方法,直到我们找到解决此问题的适当解决方案。


推荐阅读