Last active
October 9, 2018 11:25
-
-
Save saroar/0642f9fa96cf46a022a9043b4e4a68fe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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