2016-10-16 4 views
0

Also im Grunde möchte ich Sinch Video in iOS-Anwendung aktivieren.Sinch Video will nicht mit iOS arbeiten (Swift)

Denn ich zu Testzwecken erstellt haben SinchManaevger, die ich instatiate es in AppDelegate Singletons ist:

class SinchManager: NSObject, SINClientDelegate, SINCallClientDelegate { 

    static let sharedInstance = SinchManager() 

    var client: SINClient? 

    func initSinchClientWithUserId(id: String) { 
     if client == nil { 
      if case .Authenticated(let currentUser, _) = SessionManager.sharedInstance.state.value { 

       self.client = Sinch.clientWithApplicationKey("xyz", applicationSecret: "xyz", environmentHost: "sandbox.sinch.com", userId: currentUser.username) 
       print("sinchClient") 
       print(client!) 
       self.client!.delegate = self 
       self.client!.setSupportCalling(true) 
       self.client!.enableManagedPushNotifications() 
       self.client!.start() 
       self.client!.startListeningOnActiveConnection() 

      } 
     } 
    } 

    func clientDidStart(client: SINClient!) { 
     print("clientDidStart") 
     self.client!.callClient().delegate = self 
    } 

    func clientDidStop(client: SINClient!) { 
     print("clientDidStop") 
    } 

    func clientDidFail(client: SINClient!, error: NSError!) { 
     print("clientDidFail") 
    } 

    func client(client: SINCallClient!, didReceiveIncomingCall call: SINCall!) { 
     print("didReceiveIncomingCall") 
     let sinchVC = SinchVC(username: currentUser.username) 
     let sinchNC = DNMMainNC(rootViewController: sinchVC) 

     sinchVC.call = call 
    } 
} 

Und ich habe Sinch Viewcontroller erstellt, die mit dem Benutzernamen initialisiert wird, die aufgerufen wird:

class SinchVC: UIViewController, SINCallDelegate { 

    private let videoController = SinchManager.sharedInstance.client!.videoController() 
    private let audioController = SinchManager.sharedInstance.client!.audioController() 
    private let callClient: SINCallClient 
    private var call: SINCall! 

    let username: String 

    private var mainView: SinchView { return view as! SinchView } 

    override func loadView() { 
     view = SinchView() 
    } 

    init(username: String) { 
     self.username = username 
     self.callClient = SinchManager.sharedInstance.client!.callClient() 

     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     call.delegate = self 

     self.mainView.videoView.addSubview(self.videoController.localView()) 
     self.videoController.localView().contentMode = .ScaleToFill 

     if self.call.direction == SINCallDirection.Incoming { 
      self.audioController.startPlayingSoundFile(self.pathForSound("incoming.wav") as String, loop: true) 
     } 

     if self.call.details.videoOffered { 
      print("video offered") 
      self.mainView.videoView.addSubview(self.videoController.localView()) 
      self.videoController.localView().contentMode = .ScaleToFill 
     } 

     mainView.videoView.addSubview(self.videoController.localView()) 
     mainView.answerButton.addTarget(self, action: #selector(answer), forControlEvents: .TouchUpInside) 
     mainView.declineButton.addTarget(self, action: #selector(decline), forControlEvents: .TouchUpInside) 
    } 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 
     self.audioController.enableSpeaker() 
    } 

    func pathForSound(string: String) -> NSString { 
     let nsSt = NSBundle.mainBundle().resourcePath! as NSString 

     return nsSt.stringByAppendingPathComponent(string) 
    } 

    func answer() { 
     call.answer() 
    } 

    func decline() { 
     call.hangup() 
    } 

    func callDidEstablish(call: SINCall!) { 
     print("callDidEstablish") 
    } 

    func callDidEnd(call: SINCall!) { 
     print("callDidEnd") 
    } 

    func callDidProgress(call: SINCall!) { 
     print("callDidProgress") 
     self.audioController.startPlayingSoundFile(self.pathForSound("ringback.wav") as String, loop: true) 
    } 

    func callDidAddVideoTrack(call: SINCall!) { 
     print("callDidAddVideoTrack") 
     mainView.videoView.addSubview(self.videoController.remoteView()) 
    } 


} 

Problem ist, wenn ich versuche, mit meiner app nichts von meiner App zu anderem Telefon anrufen passiert (didReceiveIncomingCall Delegatmethode nicht aufgerufen bekommt)

Wenn ich versuche, von meiner App aus die SinchVideo-Beispielanwendung aufzurufen, wird der Videoanruf normal gestartet. Aber wenn ich von der SinchVideo App zu meiner App rufe, passiert nichts in meiner App. Wahrscheinlich habe ich vergessen, Benachrichtigungen hinzuzufügen, um meiner App mitzuteilen, wann der Anruf eingeht. Wenn Sie mir helfen könnten, wäre ich Ihnen sehr dankbar. Danke

EDIT: Ich habe es geschafft, didReceiveIncomingCall arbeiten, aber jetzt call.answer funktioniert nicht. (Nichts passiert, wenn call.answer genannt wird, und ich sehe, dass mein Telefon klingelt)

+1

tou muss Aufruf Eigenschaft aus Delegate-Methode speziell verweisen oder es funktioniert nicht - behoben –

+0

Können Sie den Code bearbeiten für Vollständigkeit mit der Arbeitslösung? Wenn es zu viel Arbeit ist, kann ich es tun und Post als eine Antwort, die Sie akzeptieren. – cjensen

+1

@cjensen Ich habe Post bearbeitet. –

Antwort

0

Ich bin nicht sicher, was DNMMainNC tut in Ihrem tat recieve eingehenden Anruf,

let sinchNC = DNMMainNC(rootViewController: sinchVC) What does DNMMainNC do? 
sinchVC.call = call // private var? 

Aber seine Blicke irgendwie komisch zu Legen Sie einen privaten var-Aufruf aus Ihrem Code, sollte das nicht öffentlich sein oder einen Konstruktor wie Ihre init, aber mit einem Anruf haben

+0

Das Lesen dieser http://stackoverflow.com/questions/26087447/private-var-is-accesible-from-outside-the-class macht mich ein wenig verärgert, warum würdest du Beschränke privat eher auf den physischen Ort als auf Klassen. – cjensen

Verwandte Themen