消息传递从firefox扩展到mac app

时间:2015-02-25 15:17:19

标签: objective-c macos firefox-addon jsctypes

我有一个mac app,它接收广播分发的通知消息 代码

            NSDistributedNotificationCenter.defaultCenter().addObserver(sender, selector: "testaction:", name: "myNoti", object: nil)

我还使用Addon SDK开发了firefox扩展

我知道他们是javascript - Objc bridge

我们可以导入系统框架并在firefox扩展javascript代码中编写目标c代码。

但我尝试添加

 Components.utils.import("/path/to/macosx.js");

然后

  include("macosx.js")

等但是没有对我有用的是代码链接:: https://drive.google.com/file/d/0B9ioid0ZPVpaaHBqRzdEV2tGUjg/view?usp=sharing

有谁知道如何使用任何东西

将消息从firefox扩展传递到mac app

DistributedNotification似乎很好,使用macosx.js对我来说没问题,但它对我不起作用

由于

1 个答案:

答案 0 :(得分:2)

添加了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做这个,因为它有抽象的TON。你不会理解运行它所需的基本原理。所以从没有抽象开始,然后你可以根据需要进入抽象,否则故障排除将是一个令人头疼的问题。

这是您使用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