Alljoyn初始化总线附件抛出EXC_BAD_ACCESS

时间:2016-03-01 03:50:35

标签: ios swift alljoyn

我正在尝试使用alljoyn库创建iOS应用。但是,当我尝试通过调用busAttachment = AJNBusAttachment.init(applicationName: "BusName", allowRemoteMessages: true); 在swift中创建总线附件时,我在运行时遇到EXC_BAD_ACCESS错误。

这是我用来创建和使用总线附件的类

class HostController: UIViewController {

var hostApi: HostApi!

var busAttachment: AJNBusAttachment!

var sessionOpts: AJNSessionOptions!

var CONTACT_PORT: AJNSessionPort = 12345

var serviceName: String = "org.company.appname.HelloWorld"


override func viewDidLoad() {
    super.viewDidLoad();
    NSLog("HostController viewDidLoad");


    var status: QStatus!

    busAttachment = AJNBusAttachment(applicationName: "BusName", allowRemoteMessages: true);

    busAttachment.registerBusListener(BusListener());


    hostApi = HostApi.init(busAttachment: busAttachment, onPath: "/HostService");

    status = busAttachment.start();

    if (status != ER_OK) {
        NSLog("busAttachment.start, Status: %s", QCC_StatusText(status));
    }

    status = busAttachment.registerBusObject(hostApi);

    if (status != ER_OK) {
        NSLog("busAttachment.registerBusObject, Status: %s", QCC_StatusText(status));
    }


    status = busAttachment.connectWithArguments(nil);

    if (status != ER_OK) {
        NSLog("busAttachment.connectWithArguments, Status: %s", QCC_StatusText(status));
    }


    status = busAttachment.requestWellKnownName(serviceName, withFlags: kAJNBusNameFlagReplaceExisting | kAJNBusNameFlagDoNotQueue)

    if (status != ER_OK) {
        NSLog("busAttachment.requestWellKnownName, Status: %s", QCC_StatusText(status));
    }


    sessionOpts = AJNSessionOptions.init(trafficType: kAJNTrafficMessages, supportsMultipoint: true, proximity: kAJNProximityAny, transportMask: kAJNTransportMaskTCP);



    status = busAttachment.bindSessionOnPort(CONTACT_PORT, withOptions: sessionOpts, withDelegate: nil);

    if (status != ER_OK) {
        NSLog("busAttachment.bindSessionOnPort, Status: %s", QCC_StatusText(status));
    }


    status = busAttachment.advertiseName(serviceName, withTransportMask: sessionOpts.transports);

    if (status != ER_OK) {
        NSLog("busAttachment.advertiseName, Status: %s", QCC_StatusText(status));
    }


    NSLog("Done");
}



override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning();
    // Dispose of any resources that can be recreated.
}


class BusListener: NSObject, AJNBusListener {}

class SessionPortListener: NSObject, AJNSessionPortListener {

    func shouldAcceptSessionJoinerNamed(joiner: String!, onSessionPort sessionPort: AJNSessionPort, withSessionOptions options: AJNSessionOptions!) -> Bool {
        if (sessionPort == 12345) {
            NSLog("New peer joining session: %s", joiner);
            return true;
        } else {
            return false;
        }
    }

}

}

我可能会遗漏一件事,在java上我们必须在使用总线附件之前调用org.alljoyn.bus.alljoyn.DaemonInit.PrepareDaemon(context);,但是在为iOS提供的示例中似乎没有等效的调用。也许我只是错过了它,它被放在其他地方,或者可能在iOS上没有等价物。

1 个答案:

答案 0 :(得分:1)

与Java一样,您需要在使用之前初始化AllJoyn。 为了解决这个问题,我将#import "AJNInit.h"添加到我的桥接标题中,并将其添加到我的swift中以初始化AllJoyn。

AJNInit.alljoynInit();
AJNInit.alljoynRouterInit();

您还应该调用这些方法来释放AllJoyn使用的资源。

AJNInit.alljoynShutdown();
AJNInit.alljoynRouterShutdown();