2015-08-12 4 views
0

Я использую xcode 6 и быстро создаю приложение с видеочатом - используя OpenTok. У меня есть 2 сцены «Меню» и «Видео». Из меню i используйте:ViewController.swift может не загружаться правильно

self.performSegueWithIdentifier("StreamScene", sender: self) 

внутри кнопки, чтобы перейти в «видео» viewcontroller. В первый раз, когда я загружаю свой APP, все работает отлично, но когда я перехожу от «Видео» в «Меню», а затем снова перемещаюсь из «Меню» в «Видео», он не работает, я не вижу подписчика на мой сеанс, но когда я закрываю свой APP, но все же разрешаю сеансу видео и снова запускаю свое приложение и перехожу к диспетчеру просмотра «Видео», это работает. Это потому, что мой ViewControler может загружаться неправильно ?. Я также использую perfomrSegueWithIdentifier для перехода назад.

код из видео ViewController

import UIKit 

//Api key 
private let ApiKey = "45309032" 
//Session ID 
private let SessionID = HttpPost.SessionId 
//Token 
private let Token = HttpPost.Token 

let SubscribeToSelf = false 
class ViewController: UIViewController, OTSessionDelegate,  OTSubscriberKitDelegate, OTPublisherDelegate { 


@IBOutlet weak var DoctorDeclienBtn: UIButton! 

var Session : OTSession? 
var Publisher : OTPublisher? 
var Subscriber : OTSubscriber? 

var http = HttpPost() 


override func viewDidLoad() { 
    super.viewDidLoad() 

} 


override func viewWillAppear(animated: Bool) { 

    // Step 2: As the view comes into the foreground, begin the connection process. 
    //ConnectToSession() 
    println("Session ID " + SessionID) 
    println("Token " + Token) 



    // Do any additional setup after loading the view, typically from a nib. 

    // Step 1: As the view is loaded initialize a new instance of OTSession 

    if(HttpPost.Role == "0") 
    { 
     DoctorDeclienBtn.hidden = true 
    } 


    ConnectToSession() 


} 


@IBAction func GoBackBtn(sender: AnyObject) { 
    self.performSegueWithIdentifier("a", sender: self) 
    DisconnectSession() 
} 



@IBAction func DoctorDeclineBtn(sender: AnyObject) { 

    http.HttpPostVideoEnded("access_token=" + HttpPost.AccessToken, URL: "http://95.85.53.176/nhi/api/app/consultation/end/", completionHandler: {(EndSuccess: Int32) ->() in 

     if(EndSuccess == 1) 
     { 
      if let session = self.Session 
      { 
       var Error : OTError? 
       session.disconnect(&Error) 


       if let error = Error 
       { 

       } 

      } 

     } 


    }) 
} 


// MARK: - OpenTok Methods 

/** 
* Asynchronously begins the session connect process. Some time later, we will 
* expect a delegate method to call us back with the results of this action. 
*/ 
func ConnectToSession() 
{ 

    Session = OTSession(apiKey: ApiKey, sessionId: SessionID, delegate: self) 

    if let session = self.Session 
    { 
     var Error : OTError? 
     session.connectWithToken(Token, error: &Error) 


     if let error = Error 
     { 

     } 

    } 
} 

/** 
* Sets up an instance of OTPublisher to use with this session. OTPubilsher 
* binds to the device camera and microphone, and will provide A/V streams 
* to the OpenTok session. 
*/ 

func PublishToSession() 
{ 

    Publisher = OTPublisher(delegate: self) 

    var Error : OTError? 

    Session?.publish(Publisher, error: &Error) 

    if let error = Error 
    { 
     //Some message 
    } 


    //The resolutuon of current device 
    var sizeRect = UIScreen.mainScreen().applicationFrame 
    var width = sizeRect.size.width 
    var height = sizeRect.size.height 

    Publisher!.view.frame = CGRect(x: width-(width/4), y: height * (4/5), width: width/4, height: height/3) 
    view.addSubview(Publisher!.view) 


} 


//Unpublish to session 
func UnPublishToSession() 
{ 
    Publisher = OTPublisher(delegate: self) 

    var Error : OTError? 

    Session?.unpublish(Publisher, error: &Error) 

    if let error = Error 
    { 
     //Some message 
    } 

    Publisher!.view.removeFromSuperview() 
    self.Publisher = nil 

} 


/** 
* Instantiates a subscriber for the given stream and asynchronously begins the 
* process to begin receiving A/V content for this stream. Unlike doPublish, 
* this method does not add the subscriber to the view hierarchy. Instead, we 
* add the subscriber only after it has connected and begins receiving data. 
*/ 
func SubscribeToStream(stream : OTStream) { 
    if let session = self.Session { 
     Subscriber = OTSubscriber(stream: stream, delegate: self) 

     var Error : OTError? 
     session.subscribe(Subscriber, error: &Error) 
     if let error = Error { 

     } 
    } 
} 

func DisconnectSession() 
{ 
    if let session = self.Session 
    { 
     var Error : OTError? 
     session.disconnect(&Error) 


     if let error = Error 
     { 
      NSLog("Disconnect failed") 
     } 

    } 
} 

/** 
* Cleans the subscriber from the view hierarchy, if any. 
*/ 
func UnsubscribeStream() { 
    if let subscriber = self.Subscriber { 
     var Error : OTError? 
     Session?.unsubscribe(Subscriber, error: &Error) 
     if let error = Error { 

     } 

     subscriber.view.removeFromSuperview() 
     self.Subscriber = nil 
    } 
} 

// MARK: - OTSession delegate callbacks 

func sessionDidConnect(session : OTSession) { 
    NSLog("sessionDidConnect (\(session.sessionId))") 

    // Step 2: We have successfully connected, now instantiate a publisher and 
    // begin pushing A/V streams into OpenTok. 
    PublishToSession() 
} 

func sessionDidDisconnect(session : OTSession) { 
    NSLog("Session disconnected (\(session.sessionId))") 
    UnPublishToSession() 
    self.performSegueWithIdentifier("a", sender: self) 
} 

func session(session: OTSession, streamCreated stream: OTStream) { 
    NSLog("session streamCreated (\(stream.streamId))") 

    // Step 3a: (if NO == subscribeToSelf): Begin subscribing to a stream we 
    // have seen on the OpenTok session. 
    if Subscriber == nil && !SubscribeToSelf{ 
     SubscribeToStream(stream) 
    } 


} 

func session(session: OTSession, streamDestroyed stream: OTStream) { 
    NSLog("session streamDestroyed (\(stream.streamId))") 

    if Subscriber?.stream.streamId == stream.streamId { 
     UnsubscribeStream() 
    } 
    DisconnectSession() 
} 

func session(session: OTSession, connectionCreated connection : OTConnection) { 
    NSLog("session connectionCreated (\(connection.connectionId))") 
} 

func session(session: OTSession, connectionDestroyed connection : OTConnection) { 
    NSLog("session connectionDestroyed (\(connection.connectionId))") 

} 

func session(session: OTSession, didFailWithError error: OTError) { 
    NSLog("session didFailWithError (%@)", error) 

} 

// MARK: - OTSubscriber delegate callbacks 

func subscriberDidConnectToStream(subscriberKit: OTSubscriberKit) { 
    NSLog("subscriberDidConnectToStream (\(subscriberKit))") 


    var sizeRect = UIScreen.mainScreen().applicationFrame 
    var width = sizeRect.size.width 
    var height = sizeRect.size.height 

    if let view = Subscriber?.view { 
     view.frame = CGRect(x: 0, y: 0, width: width, height: height + 20) 
     self.view.addSubview(view) 
     self.view.sendSubviewToBack(view) 

    } 
} 

func subscriber(subscriber: OTSubscriberKit, didFailWithError error : OTError) { 
    NSLog("subscriber %@ didFailWithError %@", subscriber.stream.streamId, error) 

} 

// MARK: - OTPublisher delegate callbacks 

func publisher(publisher: OTPublisherKit, streamCreated stream: OTStream) { 

    NSLog("publisher streamCreated %@", stream) 


    // Step 3b: (if YES == subscribeToSelf): Our own publisher is now visible to 
    // all participants in the OpenTok session. We will attempt to subscribe to 
    // our own stream. Expect to see a slight delay in the subscriber video and 
    // an echo of the audio coming from the device microphone. 

    if Subscriber == nil && !SubscribeToSelf{ 
     SubscribeToStream(stream) 
    } 


} 

func publisher(publisher: OTPublisherKit, streamDestroyed stream: OTStream) { 
    NSLog("publisher streamDestroyed %@", stream) 

    if Subscriber?.stream.streamId == stream.streamId { 
     UnsubscribeStream() 
    } 
} 

func publisher(publisher: OTPublisherKit, didFailWithError error: OTError) { 
    NSLog("publisher didFailWithError %@", error) 
} 

func showAlert(message: String) { 
    // show alertview on main UI 
    dispatch_async(dispatch_get_main_queue()) { 
     let al = UIAlertView(title: "OTError", message: message, delegate: nil, cancelButtonTitle: "OK") 
    } 
} 

} 
+0

можете ли вы опубликовать некоторый код из бита viewDidLoad вашего видео viewController, также бит viewWillAppear? В принципе, если он не работает, как вы описали проблему, будет где-то где-то – dyatesupnorth

+0

Я добавил свое полное «видео» viewcontroller @ fr0s1yjack. Спасибо за ваш ответ –

+0

Что произойдет, если вы установите ConnectToSession() внутри viewDidLoad вместо viewWillAppear? – dyatesupnorth

ответ

0

Вы должны тщательно рассмотреть логику вокруг переходов.

В коде, который вы указали, вы в основном говорите: «Когда поток абонента уничтожается, отменяется публикация и отмена подписки из потока и переход в меню».

Во-первых, вы должны обратить внимание на то, где вы хотите очистить какие виды состояния. Как и вы, вы предполагаете, что другой участник уйдет, а затем очистит и перейдет все в пределах метода session:streamDestroyed:. Вместо этого используйте этот метод для очистки только абонента. Аналогичным образом очистите издателя внутри метода sessionDidDisconnect:. При очистке я в основном подразумеваю использование методов UnsubscribeToStream() и UnPublishToSession() соответственно.

Далее, вопрос о том, что требуется для запуска завершения вызова, - это то, что вы должны рассмотреть. Предполагая, что другой участник уйдет первым, все в порядке для простых случаев, но его лучший дизайн, чтобы сделать метод для этого дискретного действия, чтобы вы могли его назвать из более чем одного места. С точки зрения того, что метод должен делать, его на самом деле так же просто, как позвонить session.disconnect(). Это вызовет оба вышеупомянутых метода, которые очистят издателя и подписчика. Прямо сейчас, вы полностью пропустите отсоединение, и это причина, по которой вы не начинаете подписку, когда возвращаетесь в представление «Видео» (весь код для настройки вызова вызывается только внутри метода sessionDidConnect:).

И, наконец, необходимо активировать segue. По-моему, вы должны сделать это в конце метода sessionDidDisconnect: после того, как вы очистили издателя.

+0

Здравствуйте @Ankur. Спасибо за ваш ответ. Извините, что я не смог дать вам отзыв раньше. Я снова начал этот проект. Я попробовал ваше решение, но оно все еще не работает. Я отредактировал свой ответ на свое новейшее решение. Как вы можете видеть, я отключусь, когда вернусь к меню. И из режима «Меню» перейдите к «Вид видео» и снова подключитесь к подключению. Мой подписчик не загружается, и я получаю сообщение об ошибке: {NSLocalizedDescription = Выполняется тайм-аут при попытке подписаться на поток.} –

+0

@LocDaiLe ли эта ошибка происходит последовательно или просто с перерывами? эта конкретная ошибка связана с сетевым подключением. попробуйте OpenTok Connectvity Doctor [https://itunes.apple.com/us/app/opentok-connectivity-doctor/id902048239?mt=8] на устройстве, чтобы узнать, правильно ли настроена сеть. – Ankur

Смежные вопросы