Chrome 拡張機能と対話するネイティブ アプリケーションは永遠に存続しますか? たとえば、ポストバックが発生する前に存在する必要がありますか?マニフェスト ファイルに追加する構成が見つかりませんでした。
私はページを持っています。ページにはいくつかのオブジェクトがあります。オブジェクトをクリックし、ネイティブ アプリで 1 つのメッセージを送受信すると、残りのオブジェクトでは機能しなくなります。
私の正確な質問: ネイティブ アプリ インスタンス オブジェクトの有効期間はどのくらいですか? そのオブジェクトは、たとえば永遠に応答する必要がありますか? または、これが継続的な通信である場合、stdin からメッセージを読み取るなどのループが必要ですか?
これが私のバックグラウンドスクリプトです:
var host_name = "files.mffta.java.nativeapp";
var port = null;
initPort();
function initPort() {
console.log( 'Connecting to native host: ' + host_name );
port = chrome.runtime.connectNative( host_name );
port.onMessage.addListener( onNativeMessage );
port.onDisconnect.addListener( onDisconnected );
}
// Listen for messages that come from the content script.
chrome.runtime.onMessage.addListener(
function( messageData, sender, sendResponse ) {
if( messageData ) {
sendNativeMessage(messageData);
sendResponse( { res: 'done!' } );
}
} );
// Sending a message to the port.
function sendNativeMessage(messageData) {
if( port == null )
initPort();
console.log( 'Sending message to native app: ' + JSON.stringify( messageData ) );
port.postMessage( messageData );
console.log( 'Sent message to native app.' );
}
// Receiving a message back from the Native Client API.
function onNativeMessage( message ) {
console.log( 'recieved message from native app: ' + JSON.stringify( message ) );
alert( "messaged received from Native: " + JSON.stringify( message ) );
//sending a message to Content Script to call a function
if( message.methodName && message.methodName != "" ) {
chrome.tabs.query( { active: true, currentWindow: true }, function( tabs ) {
chrome.tabs.sendMessage( tabs[0].id, message, function( response ) {
// Call native again to return JavaScript callback function results
alert ("calc res received by extension : " + response);
sendNativeMessage({ type: "JSCallbackRes", callbackRes: response });
} );
} );
}
}
// Disconnecting the port.
function onDisconnected() {
console.log( "ERROR: " + JSON.stringify( chrome.runtime.lastError ) );
console.log( 'disconnected from native app.' );
port = null;
}
私の拡張マニフェスト:
{
"name": "Files.ChromeExt.Operarations",
"version": "1.0",
"manifest_version": 2,
"description": "This extension calls a Native API which that API calls some x-Files related operations.",
"icons": {
"128": "x-files_icon.png"
},
"permissions": [
"nativeMessaging", "activeTab"
],
"background": {
"persistent": true,
"scripts": ["main.js"]
},
"content_scripts" : [{"matches": ["http://localhost/*","https://localhost/*"],
"js": ["contentscripts/page.js"]}]
}
Javaプログラム: [コメントで尋ねられたように]
import java.io.IOException;
import javax.swing.JOptionPane;
public class Applet {
public Applet(){}
public static void main(String[] args) {
try {
readMessage();
sendMessage("{\"msg\" : \"hello\"}");
} catch (Exception ex) {
JOptionPane.showMessageDialog(null, ex.getMessage());
}
}
public static String readMessage() {
String msg = "";
try {
int c, t = 0;
for (int i = 0; i <= 3; i++) {
t += Math.pow(256.0f, i) * System.in.read();
}
for (int i = 0; i < t; i++) {
c = System.in.read();
msg += (char) c;
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "error in reading message from JS");
}
return msg;
}
public static void sendMessage(String msgdata) {
try {
int dataLength = msgdata.length();
System.out.write((byte) (dataLength & 0xFF));
System.out.write((byte) ((dataLength >> 8) & 0xFF));
System.out.write((byte) ((dataLength >> 16) & 0xFF));
System.out.write((byte) ((dataLength >> 24) & 0xFF));
// Writing the message itself
System.out.write(msgdata.getBytes());
System.out.flush();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "error in sending message to JS");
}
}
}
Chrome ログを調べると、次のメッセージが表示されます。
- ネイティブ メッセージング ホストは、長さが 1936028240 バイトのメッセージを送信しようとしました。
- {"メッセージ":"ネイティブ メッセージング ホストとの通信中にエラーが発生しました。"}"、ソース: chrome-extension://XXX
これらを Win 8.0 マシン 64 ビットでテストしています。
更新: connectNative が呼び出され、ポートがエラーによって停止されていない場合、ホストは永遠に生きていると確信しています。したがって、上記のエラー メッセージの根本的な原因は、ポートの有効期間以外にあるはずです。つまり、通信エラーによりポートが強制的に停止されているということです。
コメントをいただければ幸いです。