Skip to content

Instantly share code, notes, and snippets.

@saroar
Last active October 9, 2018 11:25
Show Gist options
  • Save saroar/0642f9fa96cf46a022a9043b4e4a68fe to your computer and use it in GitHub Desktop.
Save saroar/0642f9fa96cf46a022a9043b4e4a68fe to your computer and use it in GitHub Desktop.
//
// VideoStremingVC.swift
// AddaIOS
//
// Created by Alif on 14/9/18.
// Copyright © 2018 Alif. All rights reserved.
//
import Foundation
import UIKit
class VideoStremingVC: UIViewController, WebSocketEventsListener {
private let webRTC = WebRTC.sharedInstance
private let controlButton = UIButton()
let username = PerfectLocalAuth.defaults.value(forKey: "username") as? String ?? ""
let avatar = PerfectLocalAuth.defaults.value(forKey: "profileImage") as? String ?? ""
@IBOutlet var btnStartLiveVideo: RoundButton!
// private let flipCameraButton = UIButton()
@IBOutlet weak var flipCameraButton: UIButton!
private var typeOffer: Bool = false
@IBOutlet weak var remoteView: UIView!
@IBOutlet weak var localView: UIView!
let socket = WebSocketTracker.shared
var testDP: NSDictionary!
var joinID: String?
@IBOutlet var startView: UIView!
@IBOutlet var topView: UIView!
@IBOutlet var bottomView: UIView!
override func viewDidLoad() {
super.viewDidLoad(); printTypeOf(self)
// Do any additional setup after loading the view, typically from a nib.
webRTC.setup()
localView.addSubview(webRTC.localView())
remoteView.addSubview(webRTC.remoteView())
self.tabBarController?.tabBar.isHidden = true
// view.addSubview(flipCameraButton)
socket.addListener(self)
socket.connect()
}
override func viewDidAppear(_ animated: Bool) {
if #available(iOS 11.0, *) {
//To change iOS 11 navigationBar largeTitle color
self.navigationController?.navigationBar.isHidden = true
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor.white]
} else {
// for default navigation bar title color
self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue): UIColor.white]
}
var newframe: CGRect = webRTC.localView().frame
newframe.size.width = localView.frame.size.width
newframe.size.height = localView.frame.size.height
newframe.origin.x = 0
newframe.origin.y = 0
webRTC.localView().frame = newframe
newframe = webRTC.remoteView().frame
newframe.size.width = remoteView.frame.size.width
newframe.size.height = remoteView.frame.size.height
newframe.origin.x = 0
newframe.origin.y = 0
webRTC.remoteView().frame = newframe
super.viewDidAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
socket.removeListener(self)
}
override var prefersStatusBarHidden: Bool {
return true
}
deinit {
socket.disconnect()
self.webRTC.diconnect(userID: PerfectLocalAuth.userid, iceServerUrlList: ["stun:stun.l.google.com:19302"], onCreatedLocalSdp: { (localSdp) in
let jsonString = HostRequest(type: "leave", hostID: PerfectLocalAuth.userid)
self.socket.socket.write(string: jsonString.jsonString ?? "")
print("inside self.webRTC.diconnect")
}, didReceiveRemoteStream: { () in })
let jsonString = HostRequest(type: "leave", hostID: PerfectLocalAuth.userid)
self.socket.socket.write(string: jsonString.jsonString ?? "")
print("deinit VideoStremingVC")
}
func dictToString(dict:NSDictionary) -> String? {
let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [])
let jsonString = String(data: jsonData!, encoding: .utf8)
return jsonString
}
func stringToDict(str:String) -> [String: Any]? {
let jsonData = str.data(using: .utf8)
let dictionary = try? JSONSerialization.jsonObject(with: jsonData!, options: .mutableLeaves)
print(dictionary!)
return dictionary as? [String : Any]
}
func dictToData(dict:NSDictionary) -> Data? {
let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [])
return jsonData
}
func dataToDict(data:Data) -> [String: Any]? {
let dictionary = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
return dictionary as? [String : Any]
}
private func connect() {
webRTC.connect(userID: PerfectLocalAuth.userid, iceServerUrlList: ["stun:stun.l.google.com:19302"], onCreatedLocalSdp: { (localSdp) in
print("connected webrtc")
// {
// hostID:"123",
// joinuserID:"567",
// type:"offer", // offer duplicate so we can remove stream and change it to type
// sdp:"asdfasfgafgdfgfgasuysdfb78832jhbasd"
// }
guard let sdp = localSdp["sdp"] as? String else { return }
let jsonStringOffer = Stream(
id: "",
type: "offer",
username: "",
hostID: PerfectLocalAuth.userid,
joinUID: self.joinID,
avatarImageURL: "",
sdp: sdp
)
self.socket.socket.write(string: jsonStringOffer.jsonString ?? "")
}, didReceiveRemoteStream: { () in
})
if typeOffer {
// webRTC.createOffer()
let jsonString = HostRequest(type: "host", hostID: PerfectLocalAuth.userid)
self.socket.socket.write(string: jsonString.jsonString ?? "")
APIClient.createVideoStreams(
id: nil,
hostID: PerfectLocalAuth.userid,
username: self.username,
avatarImageURL: self.avatar,
sdp: "",
type: "",
active: true
).execute(onSuccess: { videoStreamCreateResponse in
print("videoStreamCreateResponse", videoStreamCreateResponse)
}, onFailure: { videoStreamErrorResponse in
print("videoStreamErrorResponse", videoStreamErrorResponse)
})
} else {
// self.webRTC.receiveOffer(remoteSdp: self.testDP)
}
}
func connectFromHeventsVC(dict: NSDictionary) {
guard let hostID = dict["host_id"] as? String else {
print("dict missing"); printLine()
return
}
print("1 connectFromHeventsVC")
// print("connectFromHeventsVC dict offer from 183 line type", type)
webRTC.connect(userID: PerfectLocalAuth.userid, iceServerUrlList: ["stun:stun.l.google.com:19302"], onCreatedLocalSdp: { (localSdp) in
guard let sdp = localSdp["sdp"] as? String else { return }
print("connectFromHeventsVC localSdp", localSdp)
let jsonStringOffer = Stream(
id: "",
type: "answer",
username: "",
hostID: hostID,
joinUID: PerfectLocalAuth.userid,
avatarImageURL: "",
sdp: sdp
)
print("2 answer")
self.socket.socket.write(string: jsonStringOffer.jsonString ?? "")
}, didReceiveRemoteStream: { () in
})
// {
// type:"approveme",
// hostID:"123",
// joinuserID:"567"
// }
let jsonStringOffer = Stream(
id: "",
type: "approveme",
username: "",
hostID: hostID,
joinUID: PerfectLocalAuth.userid,
avatarImageURL: "",
sdp: ""
)
print("3 approveme")
self.socket.socket.write(string: jsonStringOffer.jsonString ?? "")
}
// MARK: UIEventswe
@IBAction func flipCameraButton(_ sender: Any) {
self.webRTC.flipCamera()
}
// MARK: states
@IBAction func dissmissVC(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
@IBAction func btnStartLiveClicked(_ sender: Any) {
self.startView.isHidden = true
self.remoteView.isHidden = true
typeOffer = true
connect()
}
@IBAction func btnJoinLiveClicked(_ sender: Any) {
// self.localView.isHidden = true
// self.startView.isHidden = true
// typeOffer = false
// connect()
}
// MARK: Websocket Delegate Methods.
func webSocketEventsListenerDidConnect(_ webSocketTrackerService: WebSocketTracker) {
print("websocket is connected")
let jsonString = HostRequest(type: "connect", hostID: PerfectLocalAuth.userid)
self.socket.socket.write(string: jsonString.jsonString ?? "")
}
func webSocketEventsListenerDidDisconnect(_ webSocketTrackerService: WebSocketTracker, didDisconnectError: Error?) {
print("didDisconnect Error", didDisconnectError?.localizedDescription as Any)
}
func webSocketEventsListenerDidRecieveError(_ webSocketTrackerService: WebSocketTracker, didRecieveError: Error) {
print("didRecieveError", didRecieveError.localizedDescription)
}
func webSocketEventsListenerDidReceiveMessage(_ webSocketTrackerService: WebSocketTracker, didRecieveMessage text: String) {
print("Received text: \(text)")
print("onReceiveOffer")
guard let stream = Stream.from(json: text) else {
print("videoStreamingResponse json text error")
return
}
let hostID = stream.hostID ?? ""
let joinUID = stream.joinUID ?? ""
let sdp = stream.sdp ?? ""
let type = stream.type ?? ""
switch stream.type {
case "connect":
print("connect")
case "host":
print("steam type host")
case "approveme":
print("approveme hostID", hostID)
// create
webRTC.createOffer(hostID: hostID)
self.joinID = joinUID
case "offer":
print("steam type offer")
let offer: [String: String] = [
"type": type,
"sdp": sdp
]
webRTC.receiveOffer(joinUID: joinUID, remoteSdp: offer as NSDictionary)
case "answer":
print("answer")
guard let answer = ["sdp": sdp, "type": type] as? NSDictionary else { return }
webRTC.receiveAnswer(hostID: hostID, remoteSdp: answer)
case "leave":
print("leave")
case "end":
print("end")
default:
print("stream type default")
}
}
func webSocketEventsListenerDidReceiveData(_ webSocketTrackerService: WebSocketTracker, didRecieveMessage data: Data) {
// print("Received data count: \(data.count)")
// print("Received data: \(data)")
// print("onReceiveOffer")
// let dict = self.dataToDict(data: data)! as NSDictionary
//
// if dict["type"] as? String == "answer" {
//
// if !self.typeOffer { return }
// print("onReceiveAnswer")
// self.webRTC.receiveAnswer(remoteSdp: dict)
//
// } else {
//
// if self.typeOffer { return }
// self.testDP = dict
//// self.webRTC.receiveOffer(remoteSdp: dict)
// }
}
func sendMessage(_ message: String) {
print("message", message)
}
func register(_ response: String) {
print("respose", response)
}
// MARK: Write Text Action
@IBAction func writeText(_ sender: UIBarButtonItem) {
// socket.write(string: "hello there!") need to rewrite
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment