2016-03-01 48 views
0

我想創建一個使用alljoyn庫的iOS應用程序。但是,當我嘗試通過調用busAttachment = AJNBusAttachment.init(applicationName: "BusName", allowRemoteMessages: true); 快速創建總線附件時,運行時會出現EXC_BAD_ACCESS錯誤。Alljoyn初始化總線附件拋出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

與Java一樣,您需要先啓動AllJoyn才能使用它。 爲了解決這個問題,我將#import "AJNInit.h"添加到了我的橋接頭文件中,並將其添加到我的swift中以初始化AllJoyn。

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

您還應該調用這些方法釋放AllJoyn使用的資源。

AJNInit.alljoynShutdown(); 
AJNInit.alljoynRouterShutdown(); 
相關問題