【问题标题】:Is there any way to track an event using firebase in electron + react有没有办法在电子+反应中使用firebase跟踪事件
【发布时间】:2020-11-03 11:18:42
【问题描述】:

我想问一下如何使用 firebase 和 electron.js 发送事件。我的一个朋友在使用 firebase 分析和电子时遇到问题,电子似乎没有向调试器控制台发送任何事件。当我看到网络时,该功能似乎没有发送任何内容,但文本成功进入控制台。有人可以帮我弄清楚吗?任何解决方法都可以,因为他说他尝试在这个主题中实施解决方案

  1. firebase-analytics-log-event-not-working-in-production-build-of-electron
  2. electron-google-analytics

这是我在第 2 点尝试使用 A 解决方案时遇到的错误

关于信息,我的朋友用这个作为样板electron-react-boilerplate

上述解决方案仍然失败。有人可以帮我解决这个问题吗?

编辑 1:

如上图所示,第一张图是我朋友的代码,当你运行它时,它会给出一个非常基本的例子,就像图 2 中带有一个发送事件的按钮。

啊,仅供参考,他使用了这个 firebase 包:

https://www.npmjs.com/package/firebase

【问题讨论】:

    标签: firebase-realtime-database electron


    【解决方案1】:

    您可以通过提供的方法拦截 HTTP 协议并处理您的静态内容,它允许您对内容 URL 使用 http:// 协议。什么应该使 Firebase Analytics 像第一个问题中提供的那样工作。

    参考文献

    示例

    这是一个示例,说明如何通过 HTTP 协议加载本地应用程序并模拟常规浏览器工作以将 http 协议与捆绑的 Web 应用程序一起使用。这将允许您添加 Firebase Analytics。它支持较差的 HTTP 数据上传,但您可以根据目标自行完成。

    index.js

    const {app, BrowserWindow, protocol} = require('electron')
    const http = require('http')
    const {createReadStream, promises: fs} = require('fs')
    const path = require('path')
    const {PassThrough} = require('stream')
    
    const mime = require('mime')
    
    const MY_HOST = 'somehostname.example'
    
    app.whenReady()
    .then(async () => {
      await protocol.interceptStreamProtocol('http', (request, callback) => {
        const url = new URL(request.url)
        const {hostname} = url
    
        const isLocal = hostname === MY_HOST
    
        if (isLocal) {
          serveLocalSite({...request, url}, callback)
        }
        else {
          serveRegularSite({...request, url}, callback)
        }
      })
    
      const win = new BrowserWindow()
      win.loadURL(`http://${MY_HOST}/index.html`)
    })
    .catch((error) => {
      console.error(error)
      app.exit(1)
    })
    
    async function serveLocalSite(request, callback) {
      try {
        const {pathname} = request.url
        const filepath = path.join(__dirname, path.resolve('/', pathname))
        const stat = await fs.stat(filepath)
    
        if (stat.isFile() !== true) {
          throw new Error('Not a file')
        }
    
        callback(
          createResponse(
            200,
            {
              'content-type': mime.getType(path.extname(pathname)),
              'content-length': stat.size,
            },
            createReadStream(filepath)
          )
        )
      }
      catch (err) {
        callback(
          errorResponse(err)
        )
      }
    }
    
    function serveRegularSite(request, callback) {
      try {
        console.log(request)
        const req = http.request({
          url: request.url,
          host: request.url.host,
          port: request.url.port,
          method: request.method,
          headers: request.headers,
        })
    
        if (req.uploadData) {
          req.write(request.uploadData.bytes)
        }
    
        req.on('error', (error) => {
          callback(
            errorResponse(error)
          )
        })
    
        req.on('response', (res) => {
          console.log(res.statusCode, res.headers)
          callback(
            createResponse(
              res.statusCode,
              res.headers,
              res,
            )
          )
        })
    
        req.end()
      }
      catch (err) {
        callback(
          errorResponse(err)
        )
      }
    }
    
    function toStream(body) {
      const stream = new PassThrough()
    
      stream.write(body)
      stream.end()
    
      return stream
    }
    
    function errorResponse(error) {
      return createResponse(
        500,
        {
          'content-type': 'text/plain;charset=utf8',
        },
        error.stack
      )
    }
    
    function createResponse(statusCode, headers, body) {
      if ('content-length' in headers === false) {
        headers['content-length'] = Buffer.byteLength(body)
      }
      return {
        statusCode,
        headers,
        data: typeof body === 'object' ? body : toStream(body),
      }
    }
    
    • MY_HOST 是任何不存在的主机(如something.example)或由管理员控制的主机(在我的情况下可能是electron-app.rumk.in)。此主机将替代 localhost。

    index.html

    <html>
    <body>
       Hello
    </body>
    </html>
    

    【讨论】:

    • 嗨,保罗,谢谢您的回复,但是,您能举个例子吗?我的朋友不明白哪个“内容”以及什么时候会被截获,或者一些 repo 链接会很有帮助!,啊我已经编辑了帖子,给出了我朋友项目的代码示例
    • @RakishFrisky 我已经添加了如何提供与 Electron 捆绑的文件的完整示例,就像它们是通过网络加载的一样。
    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多