Electron和微信扫码登录重定向

这是本人在使用electron时遇到的坑,查阅了各大网址都没有具体的解决方法,最后通过自己的理解在electron版本6.0.0以上版本中找到个实验性api解决了该问题。

项目要求是这样的,公司将前端项目打包好后,放在服务器上并挂好域名,然后将electron当做一个壳子(可以理解为浏览器)访问该项目,通过electron-builder打包成一个桌面级应用。打包后功能一切正常,唯一不正常的功能就是微信扫码登录,扫码后会重定向到回调地址中,这时改变了electron访问地址,这个项目就会刷新,然后重置所有状态,本人已经确认过当前是跳转后的地址,但是后续操作全部被reload掉了。(tip: 不知道是代码问题还是将微信嵌入项目中的这种方式有问题,正常访问微信官网扫码不会出现这种情况)

贴上当时的代码:

const {app, BrowserWindow} = require('electron');
const electronHotKey = require('electron-localshortcut'); // 这里是注册的全局按键,是第三方插件,与问题无关
const path = require('path');
let mainWindow;

function createWindow () {
  mainWindow = new BrowserWindow({
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      // webviewTag: true,
    },
    show: false,
  });

  mainWindow.setMenu(null);
  mainWindow.maximize();

  // mainWindow.loadFile('./dist/index.html');
  mainWindow.loadURL('http://www.****.com/');
  new_win(mainWindow);
  
  // Open the DevTools.
  // mainWindow.webContents.openDevTools();

  // hot key register
  electronHotKey.register(mainWindow, 'CmdOrCtrl+Shift+I', () => {
    mainWindow.webContents.openDevTools();
  });
  electronHotKey.register(mainWindow, 'CmdOrCtrl+R', () => {
    mainWindow.webContents.reload();
  });

  mainWindow.on('closed', function () {
    mainWindow = null
  });
}

function new_win(win) {
  win.webContents.on('new-window', (event, url) => {
    let childWindow;
    childWindow = new BrowserWindow({
      width: 800,
      height: 600,
      webPreferences: {nodeIntegration: false}
    });
    new_win(childWindow);
    childWindow.setMenu(null);
    childWindow.loadURL(url);
    event.preventDefault();
  });
}

app.on('ready', createWindow);

app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
});

app.on('activate', function () {
  if (mainWindow === null) createWindow()
});

期间还试过用loadFile加载webview的方式,在script里边处理;使用最新的监听时间session结合webContent去拦截重定向;最终结果都失败了。

网上查阅了大量的资料(最好访问官网的文档,国内的文档都是以前的,没有更新过了,少了很多新版本的api),最好在github上翻阅electron源码和issue时,了解到我所使用的就是类iframe的形式,果然在最新版的文档里找到了该属性sanbox沙盒(tip:该属性为实验性属性,可能有未知的错误)。

解决代码:

webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      sandbox: true,
      // webviewTag: true,
    },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值