Я использую 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")
}
}
}
можете ли вы опубликовать некоторый код из бита viewDidLoad вашего видео viewController, также бит viewWillAppear? В принципе, если он не работает, как вы описали проблему, будет где-то где-то – dyatesupnorth
Я добавил свое полное «видео» viewcontroller @ fr0s1yjack. Спасибо за ваш ответ –
Что произойдет, если вы установите ConnectToSession() внутри viewDidLoad вместо viewWillAppear? – dyatesupnorth