日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

注意!Electron 無法獲取設備ID了!

來源: 責編: 時間:2024-03-18 09:42:19 171觀看
導讀大家好,我是楊成功。在桌面應用開發(fā)中,常常需要獲取設備唯一 ID 來表示當前客戶端的唯一性。一般的設備 ID 需要滿足兩個條件:基于硬件和系統(tǒng)配置生成,確保設備的唯一性。只要不重裝系統(tǒng),設備 ID 多次獲取都是唯一的。node

SS628資訊網(wǎng)——每日最新資訊28at.com

大家好,我是楊成功。SS628資訊網(wǎng)——每日最新資訊28at.com

在桌面應用開發(fā)中,常常需要獲取設備唯一 ID 來表示當前客戶端的唯一性。一般的設備 ID 需要滿足兩個條件:SS628資訊網(wǎng)——每日最新資訊28at.com

  • 基于硬件和系統(tǒng)配置生成,確保設備的唯一性。
  • 只要不重裝系統(tǒng),設備 ID 多次獲取都是唯一的。

node-machine-id 是一個常用的 Node.js 模塊,它能夠在 Electron 中獲取機器的唯一標識。SS628資訊網(wǎng)——每日最新資訊28at.com

我們的產(chǎn)品就是使用該模塊,用法也很簡單:SS628資訊網(wǎng)——每日最新資訊28at.com

import { machineIdSync } from 'node-machine-id';let id = machineIdSync();

但是昨天出現(xiàn)了問題,排查結(jié)果是多臺設備獲取的 ID 竟然是一樣的,造成了一些設備的數(shù)據(jù)被篡改,我從 issues 中找到了一些端倪。SS628資訊網(wǎng)——每日最新資訊28at.com

圖片SS628資訊網(wǎng)——每日最新資訊28at.com

也就是在 Window Ghost 系統(tǒng)中會出現(xiàn)問題(啥是 Window Ghost ?)。SS628資訊網(wǎng)——每日最新資訊28at.com

Window 中還經(jīng)常遇到權(quán)限問題,而且這個 ID 總歸不可控,所以還是用自定義的方式實現(xiàn)吧。SS628資訊網(wǎng)——每日最新資訊28at.com

自定義設置設備 ID

自定義的設備 ID 首先需要唯一,其次在安裝和卸載應用時設備 ID 不變。SS628資訊網(wǎng)——每日最新資訊28at.com

滿足這兩個要求,最佳的方案就是將自己生成的設備 ID 存儲在用戶目錄下。SS628資訊網(wǎng)——每日最新資訊28at.com

假設當前用戶叫張三,他的用戶目錄:SS628資訊網(wǎng)——每日最新資訊28at.com

  • Window:C:/Users/張三/
  • MacOS:/Users/張三/

很多應用程序都把配置寫到用戶目錄下,且該目錄一般不會遇到權(quán)限問題。SS628資訊網(wǎng)——每日最新資訊28at.com

使用 uuid 生成設備 ID:SS628資訊網(wǎng)——每日最新資訊28at.com

import { v4 as uuidv4 } from 'uuid';const device_id = uuidv4();

在主進程中獲取到用戶目錄,非常簡單:SS628資訊網(wǎng)——每日最新資訊28at.com

import { app } from 'electron';const user_path = app.getPath('home'); // 自動獲取 Win 或 Mac 的用戶目錄

在用戶目錄下創(chuàng)建 .elappid 文件,存放生成的設備 ID:SS628資訊網(wǎng)——每日最新資訊28at.com

import { join } from 'node:path';import fs from 'node:fs';// 獲取配置文件地址let appid_path = join(user_path, '.elappid');// 判斷文件是否存在,不存在就先創(chuàng)建,并寫入設備IDif (!fs.existsSync(appid_path)) {  fs.writeFileSync(appid_path, device_id, 'utf8');}

讀取設備 ID,并發(fā)送給渲染進程:SS628資訊網(wǎng)——每日最新資訊28at.com

let appid = fs.readFileSync(appid_path, 'utf8');win.webContents.send('susr-config', { appid });

寫一個進程間交互的方法,就能拿到設備 ID 了。SS628資訊網(wǎng)——每日最新資訊28at.com

什么時候獲取設備 ID

正常情況下,我們希望用戶打開應用的時候,主動獲取設備 ID 并發(fā)給渲染進程。SS628資訊網(wǎng)——每日最新資訊28at.com

然而經(jīng)過測試,在創(chuàng)建瀏覽器窗口的同時立即獲取設備 ID 并通知渲染進程,在正式環(huán)境中,渲染進程往往接受不到消息。SS628資訊網(wǎng)——每日最新資訊28at.com

這是因為創(chuàng)建窗口時,頁面還沒有初始化完成,自然接收不到消息。SS628資訊網(wǎng)——每日最新資訊28at.com

保險的方法就是在頁面加載完成后再獲取設備 ID,方法如下:SS628資訊網(wǎng)——每日最新資訊28at.com

win = new BrowserWindow({...})// 頁面加載完成后觸發(fā):win.webContents.on("did-finish-load", () => {  console.log('在這里獲取設備ID吧')})

大功告成,你也試試吧!SS628資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-76538-0.html注意!Electron 無法獲取設備ID了!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 談談JS二進制:File、Blob、FileReader、ArrayBuffer、Base64

下一篇: 贈你13張圖,助你20分鐘打敗了「V8垃圾回收機制」!!!

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 邵阳县| 赫章县| 南通市| 阜宁县| 慈溪市| 拜城县| 新安县| 拉萨市| 日照市| 玉屏| 信宜市| 玉门市| 赣州市| 璧山县| 辛集市| 邳州市| 项城市| 洪湖市| 大渡口区| 丁青县| 和林格尔县| 乐安县| 明光市| 胶南市| 东阿县| 阿鲁科尔沁旗| 故城县| 称多县| 和静县| 洪湖市| 唐山市| 涿鹿县| 松潘县| 乐昌市| 大兴区| 东平县| 察隅县| 武邑县| 新昌县| 台前县| 同德县|