1. 程式人生 > >Electron中使用flash 外掛及flash與JS通訊

Electron中使用flash 外掛及flash與JS通訊

題記

Electron可以輕鬆的使用 Html5 / CSS3 / ES6 / Node.js 等等時興技術開發。近期用Electron做一個需要通過手寫實現毛筆簽名,手頭有一個AS3的版本。網上提供的JS演算法基本都只能圓珠筆的線條效果,無法實現類似毛筆的筆鋒效果。
研究預期:swf檔案實現簽名功能,完成後交給JS處理。

Electron 中使用flash外掛

ppapi-flash外掛

PPAPI是Google開發的瀏覽器外掛介面,以沙箱模式執行外掛。

在 Electron 中可以使用ppapi-flash外掛載入swf程式

獲取ppapi-flash外掛

flash 外掛安裝好後,Windows系統可以在以下路徑找到相應的dll檔案。
C:\Windows\System32\Macromed\Flash\pepflashplayer64_23_0_0_207.dl
C:\Windows\SysWOW64\Macromed\Flash\pepflashplayer32_23_0_0_207.dll
上面依次對應 64位 及 32位的外掛,必須與Electron 的對應
其他系統可以通過chrome開啟 chrome://plugins/

檢視外掛位置
建議將外掛複製到專案的目錄或子目錄下

使用ppapi-flash外掛

index.js 入口檔案中引入外掛

//index.js 入口檔案
const electron = require('electron');
const {app,BrowserWindow} = electron;
//此處僅相容了Windows 的 32位 與 64位
const pepflashplayer = (process.arch == 'x64')? `${__dirname}/flash/pepflashplayer64_23_0_0_207.dll`:`${__dirname}/flash/pepflashplayer32_23_0_0_207.dll`;
//設定外掛
app.commandLine.appendSwitch('ppapi-flash-path', pepflashplayer); //設定外掛版本(不知道是否真有用,不匹配貌似也能執行) app.commandLine.appendSwitch('ppapi-flash-version', '23.0.0.207'); let win; function createWindow() { //... }

ppapi-flash-path 設定的時候 千萬不要 加 file://
使用 <webview> 標籤啟用外掛 並在 <webview> 標籤裡新增 plugins 屬性

<webview id="webview" src="jsCall.swf" plugins></webview>

Flash與JS通訊

困難

通過前面的步驟,可以將swf檔案插入到Electron中使用。
JS與Flash通訊已經是老生常談了,AS端使用ExternalInterface就能輕鬆實現。
但是 在Electron中似乎並不那麼容易實現,問題的關鍵點在於

<webview id="webview" src="jsCall.swf" plugins></webview>

上面的程式碼在Electron 中執行後變成了

<webview id="webview" src="file:///D:/Electron/swf/jsCall.swf" plugins="" tabindex="-1"></webview>

swf是以本地的方式載入執行。

AS 中只要使用了 ExternalInterface 執行時就會報 #2060 錯誤
本人相當不善AS,只瞭解個大概。
查閱了網上全部解決方案,因不是針對Electron,沒有一個能實現的。

突破

百般嘗試後找到了一個辦法

<webview id="webview" src="http://localhost/jsCall.swf" plugins></webview>

搭建一個簡單的http服務 讓flash的執行環境變為 remote 雖然麻煩至少實現了。
看到了由 flash alert 出來的 123

alert 123

踩坑

實際使用時發現,按照前面分析的全部資訊。發現完全無法實現想要的功能。
JS直接通過 webview 呼叫flash的函式會報錯。

<webview id="webview" src="http://localhost/jsCall.swf" plugins></webview>
<h4 id="h4"></h4>
<script>
    var webview = document.getElementById("webview");
    var h4 = document.getElementById("h4");
    var i = 1;
    //設定一個計數器 
    setInterval(()=>{h4.innerHTML = ++i},1000);
    //頁面載入完後通過 console 執行 webview.callFlash(123);
</script>

flash直接 ExternalInterface.call("alert",123); 彈窗時上面的計數不會停止。
webview.callFlash(123); 報錯 is not a function 。
而且 webview 中也找不到子元素。

可能是 webview 機制問題,查閱了一下官方文件。

Unlike an iframe, the webview runs in a separate process than your app. It doesn’t have the same permissions as your web page and all interactions between your app and embedded content will be asynchronous. This keeps your app safe from the embedded content.

上面的內容大意是 <webview> 標籤有一個獨立的程序,只是被嵌入到了當前頁面中。

峰迴路轉

仔細翻閱了 <webview> 篇的完整文件,終於找到了解決方案 —— 文件還是比網上的複製貼上更有用。

寫有 <webview> 的頁面稱為 host<webview> 載入的頁面 稱為 guest

多添加了一個 guest 頁面 jsCall.html 用來巢狀 jsCall.swf

<!--jsCall.html-->
<embed width="100%" height="100%" name="plugin" id="plugin" src="jsCall.swf" type="application/x-shockwave-flash">  
<script>
var {ipcRenderer} = require('electron');
var plugin = document.getElementById("plugin");
//接收來自 host 頁面ipc 傳送過來的 sendToWebView  事件
//index.html 的 webview 必須有 nodeintegration 屬性
ipcRenderer.on('sendToWebView', function(event, arg) {
    //將接收來的值直接傳給flash
    plugin.callFlash(arg);
});
//讓flash呼叫的JS函式
function flashCall(string){
console.log(string)
}
function toIndex(args){
    //sendToHost 可以將訊息送給 host 頁面
    ipcRenderer.sendToHost("toIndex",args)
}
</script>   

host 頁面 index.html

<!--index.html-->
<!--nodeintegration 屬性表示載入的頁面可以使用electron的資源-->
<webview id="webview" src="http://localhost/jsCall.html" plugins nodeintegration></webview>  
<script>
var webview = document.getElementById("webview");
//下面的程式碼 可以監聽來自guest 頁面的ipc 訊息
webview.addEventListener('ipc-message', (event) =>{
  console.log(event);
});
//下面是第一種方法 通過 ipcRenderer 
webview.send('sendToWebView', 123);
//第二種方法 webview.executeJavaScript(code, userGesture, callback)
webview.executeJavaScript('window["plugin"].callFlash(123)', (event)=>{
    console.log(event);
})
</script>

尾記

打完收工,感覺好累。除了更深入的瞭解了一些東西,意義實在不大。
不管如何,功能可以實現了。

相關推薦

Electron使用flash 外掛flashJS通訊

題記 Electron可以輕鬆的使用 Html5 / CSS3 / ES6 / Node.js 等等時興技術開發。近期用Electron做一個需要通過手寫實現毛筆簽名,手頭有一個AS3的版本。網上提供的JS演算法基本都只能圓珠筆的線條效果,無法實現類似毛筆的筆

每天學一點flash 12 as3 0asp通訊 2

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

在IDEA.ignore外掛的安裝使用

.ignore簡介   .ignore是IDEA的一款專用忽略檔案的外掛。其支援的忽略檔案型別有:.gitignore (Git), .hgignore (Mercurial), .npmignore (NPM), .dockerignore (Docker), .chefignor

Firebreath生成的Windows外掛視窗物件JS互動物件

對於Windows平臺框架,Firebreath生成兩個主要物件: 1.FB::PluginCore派生物件,主要與瀏覽器互動 2.FB::JSAPIAuto派生物件,主要與JS互動 對於FB::PluginCore派生物件,可以通過下面方法得到外掛視窗控制代碼:

安卓開發之Eclipsesvn外掛的安裝使用

 SVN,全稱Subversion,分為伺服器版本和客戶端版本,我們使用的Eclipse SVN外掛就是SVN客戶端的一種。 Eclipse的SVN外掛主要有兩種,一種叫做Subclipse(主要支援Eclipse 3.2+ 和 SVN 1.5 ~ 1.8), 另一

IOS 使用JavaScriptCore 實現OCJS的互動

轉: http://www.jianshu.com/p/cdaf9bc3d65d 一、說明 這篇文章記錄自己在研究OC與JS互動中的所得,以及遇到的問題與解決 由於蘋果的稽核時間太漫長,一次稽核不過,那又將進入另一個漫長的稽核期。為了能在開發中方便更新,公司要求在專案

React Native Android 原始碼框架淺析(主流程 Java JS 雙邊通訊

1 背景 有了前面《React Native Android 從學車到補胎和成功發車經歷》和《React Native Android Gradle 編譯流程淺析》兩篇文章的學習我們 React Native 已經能夠基本接入處理一些事情了,那接下來的

wkwebviewjs通訊學習總結(一)

EvaluateJavaScript方法為非同步- UIWebview: 中是同步執行的,直接呼叫 - (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;方法返回執行結果- WKWebView改為了```block``

kotlin學習筆記——kotlinJs通訊

和原來一樣,通過物件互相傳值。 webview傳遞物件給js呼叫,webview則通過mWebview.loadUrl("javaScript:方法名(引數)")來呼叫js中的方法,需要注意的是呼叫js方法必須在主執行緒。1.懶載入:使用時才初始化, 型別宣告為valpriv

linux下spi-nor Flash的操作----備份還原norflash的uboot

一、環境: Ubuntu 16.02 nor flash型號: spi nor flash S25FL256S ,Sector Size = 64 kbytes,  total size = 256M BIT = 32M Bytes 一、備份: dd if=/dev/mtd

js判斷當前電腦是否安裝flash外掛

if (!testingFlash()) { dialog("您的瀏覽器還沒有安裝flash外掛或未允許本站執行,導致上傳按鈕無法載入,請檢查flash外掛後重試!"); } /** * 返回true表

因新版本Chrome無法關閉自帶Flash外掛,導致“此Flash Player您的地區不相容,請重新安裝Flash”問題的解決方案

問題分析: Chrome新版本,早就移除了Flash Player外掛,但在安裝新版的Chrome,在訪問有Flash的頁面時,會提示“正在下載Flash Player”,或“Flash Player不是最新版本”,過段時間,還是會自動升級並更新到最新版本Flash Pla

關於NAND flash的MTD分割槽uboot分割槽的理解

         今天做核心移植,準備新增NAND flash的驅動,做到MTD分割槽時,想起在一本書上看到的一句話,說的是分割槽時每個區之間沒有間隙,前一個區的結束地址是後一個區的起始地址。可是當我看我的開發板的教程時,分割槽如下: static struct mtd_p

在LinuxMint對firefox進行手動安裝flash外掛

然後解壓此壓縮包,然後按照常規先看Readme.txt檔案,可以看到是要將解壓的外掛的庫複製到瀏覽器外掛目錄下,還要將usr下的檔案複製到系統的/usr目錄下,原文件中如下: o Copy libflashplayer.so to the appropriate browser plugins direct

ubuntu下瀏覽器flash外掛

   下載tar格式的install_flash_player_11_linux_x86_64.tar.gz 2.解壓下載的壓縮包檔案:tar -zxvf install_flash_player_11_linux.x86_64.tar.gz 3.拷貝libflashpl

關於Ubuntu在Firefox安裝Flash外掛的問題

   外掛可在Firefox中根據提示進入Adobe官網下載,    將下載的檔案提取,可得到libflashplayer.so,將其放入/usr/lib/adobe-flashplugin下。     但注意Firefox使用的外掛目錄是/usr/lib/firefox

DSP TMS320FF28335程式從FLASH拷貝到RAM的兩種方法FLASH燒寫方法

程式從FLASH中拷貝到RAM中執行的方法 DSP的程式下載執行方式有兩種:一種是下載到RAM中線上執行,一種是下載到FLASH中執行。在RAM中執行時,具有執行速度快,可以無限次下載的特點,但是RAM的特點是掉電丟失資料。FLASH具有掉電不丟失資料的特點,但是同時存在執

JS的事件監聽事件流

pan 交互 ack 其他 獲得 發生 listen 監聽器 pre 事件監聽:   使用監聽器(eventListener)來預定事件,在傳統軟件工程中稱成為觀察者模式   執行某種操作時(特定的交互瞬間),會產生對象,對象會沿事件流的方向傳播。 事件流:   事件流有

Spring MVC Flash Attribute 的講解使用示例

取數據 這樣的 src artifact tag osc web.xml startup 刷新 Spring MVC 3.1版本加了一個很有用的特性,Flash屬性,它能解決一個長久以來缺少解決的問題,一個POST/Redirect/GET模式問題。 正常的MVC W

Spring core resourc層結構體系JDKSpring對classpath資源的獲取方式結果對比

資源 相關 add blog height back 獲取 img com 1. Spring core resourc層結構體系 1.1. Resource相關結構體系 1.2. ResourceLoader相關體系 2. JDK與Spring對cla