从 firefox 扩展到 mac 应用的消息传递
Message Passing From firefox extension to mac app
我有一个 mac 应用程序可以接收广播分发的通知消息
代码
NSDistributedNotificationCenter.defaultCenter().addObserver(sender, selector: "testaction:", name: "myNoti", object: nil)
我也使用 Addon SDK 开发了 firefox 扩展
我知道他们是 javascript - Objc bridge
我们可以在其中导入系统框架并在 firefox 扩展 javascript 代码中编写 objective c 代码。
但我尝试添加
Components.utils.import("/path/to/macosx.js");
然后
include("macosx.js")
等等,但对我来说没有任何用处是代码 link : : https://drive.google.com/file/d/0B9ioid0ZPVpaaHBqRzdEV2tGUjg/view?usp=sharing
谁能知道我如何使用任何东西将消息从 firefox 扩展程序传递到 mac 应用
DistributedNotification 对我来说似乎不错 macosx.js 但它对我不起作用
谢谢
添加了 js-ctypes 标签。加入 moz irc js-ctypes 以获得更多帮助,我真的很想和你聊聊,加入这里:https://client00.chat.mibbit.com/?url=irc%3A%2F%2Firc.mozilla.org%2F%23jsctypes 或这里 irc://moznet/jsctypes 。你在这里做的很棒。
我不会用 ObjC Bridge 来做这件事,因为它有大量的抽象。您不会理解 运行 所需的基础知识。所以从没有抽象开始,然后如果你愿意,你可以进入抽象,否则故障排除将是一件令人头疼的事情。
这就是你 post 一条消息 postNotification:object
的方式,试试这段代码,我测试过,它 运行 没有错误,但我没有设置观察者所以没有测试它是否真的有效。它只是不会崩溃 :P
Cu.import('resource://gre/modules/ctypes.jsm');
var objc = ctypes.open(ctypes.libraryName('objc'));
// BASIC TYPES
var BOOL = ctypes.signed_char;
var CHAR = ctypes.char;
var ID = ctypes.voidptr_t;
var SEL = ctypes.voidptr_t;
var VOID = ctypes.void_t;
// CONSTANTS
var NIL_ID = ctypes.cast(ctypes.uint64_t(0), ID);
var YES = BOOL(1);
var NO = BOOL(0);
// COMMON FUNCTIONS
var objc_getClass = objc.declare('objc_getClass', ctypes.default_abi, ID, CHAR.ptr);
var objc_msgSend = objc.declare('objc_msgSend', ctypes.default_abi, ID, ID, SEL, '...');
var sel_registerName = objc.declare('sel_registerName', ctypes.default_abi, SEL, CHAR.ptr);
// COMMON SELECTORS
var alloc = sel_registerName('alloc');
var init = sel_registerName('init');
var release = sel_registerName('release');
var shutdown = function() {
if (NSString_myNoti) {
console.log('releasing NSString_myNoti');
objc_msgSend(NSString_myNoti, release);
}
objc.close();
console.log('succesfully shutdown');
}
// my globals:
var NSString_myNoti;
function main() {
// default_center = [NSDistributedNotificationCenter defaultCenter];
var NSDistributedNotificationCenter = objc_getClass('NSDistributedNotificationCenter');
var defaultCenter = sel_registerName('defaultCenter');
var default_center = objc_msgSend(NSDistributedNotificationCenter, defaultCenter);
console.info('default_center:', default_center, default_center.toString(), uneval(default_center), default_center.isNull());
var NSString = objc_getClass('NSString');
var initWithUTF8String = sel_registerName('initWithUTF8String:');
NSString_myNoti = objc_msgSend(objc_msgSend(NSString, alloc), initWithUTF8String, CHAR.array()('myNoti'));
console.info('NSString_myNoti:', NSString_myNoti, NSString_myNoti.toString(), uneval(NSString_myNoti));
// postNotificationName:object:userInfo:deliverImmediately:
var postNotificationNameObject = sel_registerName('postNotificationName:object:');
var rez_postNotificationName = objc_msgSend(default_center, postNotificationNameObject, NSString_myNoti, NIL_ID); // returns void
//docs say rez_postNotificationName is VOID
console.log(postNotificationNameObject.toString(), postNotificationNameObject.toString() == YES.toString()); //its always returning 0x0 which iS NO, but its sending, 0x0 is VOID proabably i dont know, but i guess this matches the documentation
}
try {
main();
} catch (ex) {
console.error('Error Occured:', ex);
} finally {
shutdown();
}
编辑
验证了上面的代码是否有效,我通过为 myNotif
添加观察者也使用 jsctypes 进行了测试,addObserver:selector:name:object
代码是从 README 链接的。而且在这个例子中我使用了 postNotification:notificationName:object:userInfo:deliverImmediatey
所以这表明作为额外的奖励:GitHubGIST :: Noitidart / _ff-addon-snippet-ObjC-postNotificationNameObjectUserInfoDeliverImmediately
我有一个 mac 应用程序可以接收广播分发的通知消息 代码
NSDistributedNotificationCenter.defaultCenter().addObserver(sender, selector: "testaction:", name: "myNoti", object: nil)
我也使用 Addon SDK 开发了 firefox 扩展
我知道他们是 javascript - Objc bridge
我们可以在其中导入系统框架并在 firefox 扩展 javascript 代码中编写 objective c 代码。
但我尝试添加
Components.utils.import("/path/to/macosx.js");
然后
include("macosx.js")
等等,但对我来说没有任何用处是代码 link : : https://drive.google.com/file/d/0B9ioid0ZPVpaaHBqRzdEV2tGUjg/view?usp=sharing
谁能知道我如何使用任何东西将消息从 firefox 扩展程序传递到 mac 应用
DistributedNotification 对我来说似乎不错 macosx.js 但它对我不起作用
谢谢
添加了 js-ctypes 标签。加入 moz irc js-ctypes 以获得更多帮助,我真的很想和你聊聊,加入这里:https://client00.chat.mibbit.com/?url=irc%3A%2F%2Firc.mozilla.org%2F%23jsctypes 或这里 irc://moznet/jsctypes 。你在这里做的很棒。
我不会用 ObjC Bridge 来做这件事,因为它有大量的抽象。您不会理解 运行 所需的基础知识。所以从没有抽象开始,然后如果你愿意,你可以进入抽象,否则故障排除将是一件令人头疼的事情。
这就是你 post 一条消息 postNotification:object
的方式,试试这段代码,我测试过,它 运行 没有错误,但我没有设置观察者所以没有测试它是否真的有效。它只是不会崩溃 :P
Cu.import('resource://gre/modules/ctypes.jsm');
var objc = ctypes.open(ctypes.libraryName('objc'));
// BASIC TYPES
var BOOL = ctypes.signed_char;
var CHAR = ctypes.char;
var ID = ctypes.voidptr_t;
var SEL = ctypes.voidptr_t;
var VOID = ctypes.void_t;
// CONSTANTS
var NIL_ID = ctypes.cast(ctypes.uint64_t(0), ID);
var YES = BOOL(1);
var NO = BOOL(0);
// COMMON FUNCTIONS
var objc_getClass = objc.declare('objc_getClass', ctypes.default_abi, ID, CHAR.ptr);
var objc_msgSend = objc.declare('objc_msgSend', ctypes.default_abi, ID, ID, SEL, '...');
var sel_registerName = objc.declare('sel_registerName', ctypes.default_abi, SEL, CHAR.ptr);
// COMMON SELECTORS
var alloc = sel_registerName('alloc');
var init = sel_registerName('init');
var release = sel_registerName('release');
var shutdown = function() {
if (NSString_myNoti) {
console.log('releasing NSString_myNoti');
objc_msgSend(NSString_myNoti, release);
}
objc.close();
console.log('succesfully shutdown');
}
// my globals:
var NSString_myNoti;
function main() {
// default_center = [NSDistributedNotificationCenter defaultCenter];
var NSDistributedNotificationCenter = objc_getClass('NSDistributedNotificationCenter');
var defaultCenter = sel_registerName('defaultCenter');
var default_center = objc_msgSend(NSDistributedNotificationCenter, defaultCenter);
console.info('default_center:', default_center, default_center.toString(), uneval(default_center), default_center.isNull());
var NSString = objc_getClass('NSString');
var initWithUTF8String = sel_registerName('initWithUTF8String:');
NSString_myNoti = objc_msgSend(objc_msgSend(NSString, alloc), initWithUTF8String, CHAR.array()('myNoti'));
console.info('NSString_myNoti:', NSString_myNoti, NSString_myNoti.toString(), uneval(NSString_myNoti));
// postNotificationName:object:userInfo:deliverImmediately:
var postNotificationNameObject = sel_registerName('postNotificationName:object:');
var rez_postNotificationName = objc_msgSend(default_center, postNotificationNameObject, NSString_myNoti, NIL_ID); // returns void
//docs say rez_postNotificationName is VOID
console.log(postNotificationNameObject.toString(), postNotificationNameObject.toString() == YES.toString()); //its always returning 0x0 which iS NO, but its sending, 0x0 is VOID proabably i dont know, but i guess this matches the documentation
}
try {
main();
} catch (ex) {
console.error('Error Occured:', ex);
} finally {
shutdown();
}
编辑
验证了上面的代码是否有效,我通过为 myNotif
添加观察者也使用 jsctypes 进行了测试,addObserver:selector:name:object
代码是从 README 链接的。而且在这个例子中我使用了 postNotification:notificationName:object:userInfo:deliverImmediatey
所以这表明作为额外的奖励:GitHubGIST :: Noitidart / _ff-addon-snippet-ObjC-postNotificationNameObjectUserInfoDeliverImmediately