protocol

    进程:主进程

    实现与 file:// 协议具有相同效果的协议的示例:

    注意: 除了指定的方法, 其他方法只能在 app 模块的 ready 事件被触发后使用。

    一个 protocol 是注册到特定 Electron 的 对象。 如果你不指定一个 session,那 protocol 将使用 Electron 默认提供的 session 。 然而, 如果你定义了 partition 或者 session 在你的 browserWindowwebPreferences, 对应 window 将使用不同的 session 。同时如果你使用 electron.protocol.XXX ,则自定义的 protocol 将不会工作

    要使自定义协议与自定义会话相结合,你需要明确注册该会话。

    1. const { session, app, protocol } = require('electron')
    2. const path = require('path')
    3. app.whenReady().then(() => {
    4. const partition = 'persist:example'
    5. const ses = session.fromPartition(partition)
    6. ses.protocol.registerFileProtocol('atom', (request, callback) => {
    7. const url = request.url.substr(7)
    8. callback({ path: path.normalize(`${__dirname}/${url}`) })
    9. })
    10. mainWindow = new BrowserWindow({ webPreferences: { partition } })
    11. })

    方法

    protocol 模块具有以下方法:

    • customSchemes

    注意. 此方法只能在 appready 事件触发前调用,且只能调用一次

    scheme 注册为标准、安全、绕过资源的内容安全策略、允许注册 ServiceWorker 、支持获取 API 以及视频/音频流式传输。 指定一个值为 true 的特权,以启用该功能。

    下面是一个注册特权协议的示例代码,可以绕过内容安全策略:

    标准scheme遵循 RFC 3986 所设定的 URI泛型语法。 例如, httphttps 是标准协议, 而 file 不是。

    按标准将一个scheme注册, 将保证相对和绝对资源在使用时能够得到正确的解析。 否则, 该协议将表现为 file 协议, 而且,这种文件协议将不能解析相对路径。

    例如, 当您使用自定义协议加载以下内容时,如果你不将其注册为标准scheme, 图片将不会被加载, 因为非标准scheme无法识别相对 路径:

    1. <body>
    2. <img src='test.png'>
    3. </body>

    注册一个scheme作为标准scheme将允许其通过访问文件。 否则, 渲染器将会因为该scheme,而抛出一个安全性错误。

    在非标准 schemes 下,网络存储 Api (localStorage, sessionStorage, webSQL, indexedDB, cookies) 默认是被禁用的。 所以一般来说如果你想注册一个自定义协议来替换http协议,你必须将其注册为标准 scheme:

    如果 Protocols 需要使用流 (http 和 stream 协议) 应设置 stream: true<video><audio> HTML 元素默认需要协议缓冲其响应内容。 stream 标志将这些元素配置为正确的流媒体响应

    protocol.registerFileProtocol(scheme, handler)

    Returns Boolean - 当前协议是否注册成功

    要处理 request, 应当使用文件的路径或具有 path 属性的对象来调用 callback。例如:callback(filePath)callback({ path: filePath }). filePath 必须是绝对路径

    默认情况下, scheme 被当作 http:对待,与遵循”通用URI语法”的协议(如 file:)有不同的解析过程。

    protocol.registerBufferProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否注册成功

    注册一个 scheme 协议, 将 Buffer作为响应发送

    用法类似于 registerFileProtocol ,只是callback 会被Readable对象或者带有data属性的对象调用。

    示例:

    protocol.registerStringProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否注册成功

    注册一个 scheme 协议, 将 String 作为响应发送

    除了 callback 只能被String 或拥有 data 属性的对象调用,使用方法与registerFileProtocol 相同

    protocol.registerHttpProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否注册成功

    注册一个 scheme 协议, 将 HTTP 请求作为响应发送

    除了 callback 只能被拥有 url 属性的对象调用外,使用方法与 registerFileProtocol相同。

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否注册成功

    注册一个 scheme 的协议将发送一个流作为响应。

    除了 callback 方法只能被 对象或拥有 data 属性的对象调用外,使用方法与 registerFileProtocol 相同。

    示例:

    1. const { protocol } = require('electron')
    2. const { PassThrough } = require('stream')
    3. function createStream (text) {
    4. const rv = new PassThrough() // PassThrough is also a Readable stream
    5. rv.push(text)
    6. rv.push(null)
    7. return rv
    8. }
    9. protocol.registerStreamProtocol('atom', (request, callback) => {
    10. statusCode: 200,
    11. headers: {
    12. 'content-type': 'text/html'
    13. },
    14. data: createStream('<h5>Response</h5>')
    15. })
    16. })

    protocol.unregisterProtocol(scheme)

    • scheme String

    Returns Boolean - 协议是否成功取消注册

    取消对自定义scheme的注册

    protocol.isProtocolRegistered(scheme)

    • scheme String

    Returns Boolean - 当前 scheme 是否已注册

    protocol.interceptFileProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否被拦截成功

    终止 scheme 协议, 并将 handler 作为该protocol新的处理方式,即返回一个file。

    protocol.interceptStringProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否被拦截成功

    终止 scheme 协议, 并将 handler 作为该protocol新的处理方式,即返回一个String

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否被拦截成功

    终止 scheme 协议, 并将 handler 作为该protocol新的处理方式,即返回一个Buffer

    protocol.interceptHttpProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否被拦截成功

    终止 scheme 协议, 并将 handler 作为该protocol新的处理方式,即返回一个新 HTTP 请求。

    protocol.interceptStreamProtocol(scheme, handler)

    • scheme String
    • handler 函数

    Returns Boolean - 当前协议是否被拦截成功

    它与 registerStreamProtocol方法相同, 不过它是用来替换现有的protocol处理方式。

    protocol.uninterceptProtocol(scheme)

    • scheme String

    Returns Boolean - 当前协议是否已成功解除拦截

    移除为 scheme 安装的拦截器,并还原其原始处理方式。

    protocol.isProtocolIntercepted(scheme)

    Returns Boolean - 表示是否已拦截了