Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //
- // ViewController.swift
- // peersChallenge
- //
- // Created by Andrey Minin on 13/03/2019.
- // Copyright © 2019 Andrey Minin. All rights reserved.
- //
- import UIKit
- import MultipeerConnectivity
- class ViewController: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate, MCNearbyServiceBrowserDelegate {
- func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
- }
- let dict = ["eventType" : "TextMessage", "text" : "...", "messageId" : "?"]
- var newnew : MCAdvertiserAssistant!
- lazy var peerID = MCPeerID(displayName: UIDevice.current.name)
- lazy var session = MCSession(peer: peerID)
- lazy var advertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: ["userName": "sex"], serviceType: "tinkoff-chat")
- lazy var browser = MCNearbyServiceBrowser(peer: peerID, serviceType: "tinkoff-chat")
- func printLogs() {
- //print(#function)
- }
- func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
- printLogs()
- browserViewController.dismiss(animated: true, completion: nil)
- }
- func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
- printLogs()
- browserViewController.dismiss(animated: true, completion: nil)
- }
- func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
- switch state {
- case MCSessionState.connected:
- print("Connecting: \(peerID.displayName)")
- case MCSessionState.connecting:
- print("Connecting: \(peerID.displayName)")
- case MCSessionState.notConnected:
- print("Not Connected: \(peerID.displayName)")
- }
- }
- func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
- let nsdata = try! JSONSerialization.jsonObject(with: data, options: .allowFragments)
- print(nsdata)
- //print(data["eventType"])
- printLogs()
- }
- func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
- printLogs()
- }
- func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
- printLogs()
- }
- func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
- printLogs()
- }
- override func viewDidLoad() {
- super.viewDidLoad()
- session.delegate = self
- advertiser.delegate = self as? MCNearbyServiceAdvertiserDelegate
- advertiser.startAdvertisingPeer()
- hosting = false
- }
- func generateMessageId() -> String {
- return "\(arc4random_uniform(UINT32_MAX))+\(Date.timeIntervalSinceReferenceDate)".data(using: .utf8)!.base64EncodedString()
- }
- func browser(_ browser: MCNearbyServiceBrowser, foundPeer foundpeerID: MCPeerID, withDiscoveryInfo info: [String: String]?) {
- /*if info?["userName"] == "Илья" {
- print("slknfdl")
- browser.invitePeer(peerID, to: session, withContext: nil, timeout: 10000)
- }*/
- browser.invitePeer(foundpeerID, to: session, withContext: nil, timeout: 10000)
- //print(foundpeerID)
- }
- @IBAction func joinSessBut(_ sender: Any) {
- let newvc = MCBrowserViewController(browser: browser, session: session)
- newvc.delegate = self
- present(newvc, animated: true, completion: nil)
- }
- @IBAction func hostBut(_ sender: Any) {
- if session.connectedPeers.count == 0 && !hosting {
- let connectionActionSheet = UIAlertController(title: "Our chat", message: "Do you want to host or join chat?", preferredStyle: .actionSheet)
- connectionActionSheet.addAction(UIAlertAction(title: "Host chat", style: .default, handler: { (action: UIAlertAction) in
- self.newnew = MCAdvertiserAssistant(serviceType: "Tinkoff-Chat", discoveryInfo: nil, session: self.session)
- self.newnew.start()
- self.hosting = true
- }))
- connectionActionSheet.addAction(UIAlertAction(title: "Join chat", style: .default, handler: { (action: UIAlertAction) in
- let browser = MCBrowserViewController(serviceType: "Tinkoff-chat", session: self.session)
- browser.delegate = self
- self.present(browser,animated: true,completion: nil)
- }))
- connectionActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
- self.present(connectionActionSheet,animated: true,completion: nil)
- }
- else if session.connectedPeers.count == 0 && hosting{
- let waitActionSheet = UIAlertController(title: "Waiting...", message: "Whating for other to join the chat", preferredStyle: .actionSheet)
- waitActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
- self.present(waitActionSheet,animated: true,completion: nil)
- } else {
- let dissconectActionSheet = UIAlertController(title: "Are you sure you want to disconnect", message: nil, preferredStyle: .actionSheet)
- dissconectActionSheet.addAction(UIAlertAction(title: "Dissconect", style: .destructive, handler: { (action: UIAlertAction) in
- self.session.disconnect()
- }))
- dissconectActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
- self.present(dissconectActionSheet,animated: true,completion: nil)
- }
- }
- var recMsg: String!
- var sendMsg: String!
- var hosting: Bool!
- func advertiser(_ advertiser: MCNearbyServiceAdvertiser,
- didReceiveInvitationFromPeer peerID: MCPeerID,
- withContext context: Data?,
- invitationHandler: @escaping (Bool, MCSession?) -> Void) {
- if session.connectedPeers.contains(peerID) {
- invitationHandler(true, session)
- } else {
- invitationHandler(false, nil)
- }
- }
- }
- protocol CommunicatorDelegate : class {
- //discovering
- func didFoundUser( userID : String, userName : String?)
- func didLostUser( userID : String)
- //errors
- func failedToStartBrowsingForUsers(error : Error)
- func failedToStartAdvertising(error : Error)
- //messages
- func didReceiveMessage(text : String, fromUser : String, toUser: String)
- }
- class CommunicatorManager: CommunicatorDelegate {
- func didFoundUser(userID: String, userName: String?) {
- }
- func didLostUser(userID: String) {
- }
- func failedToStartBrowsingForUsers(error: Error) {
- }
- func failedToStartAdvertising(error: Error) {
- }
- func didReceiveMessage(text: String, fromUser: String, toUser: String) {
- }
- }
- protocol Communicator {
- func sendMessage(string: String, to UserID: String, completionHandler: (( _ success : Bool, _ error : Error?) -> ())?)
- var delegate : CommunicatorDelegate? {get set}
- var online : Bool {get set}
- }
- class MultipeerCommunicator: NSObject, Communicator {
- var peer: MCPeerID!
- //var displayName = UserDefaults.standard.string(forKey: "profileName") ?? "Default name"
- var displayName = UIDevice.current.name
- var serviceBrowser: MCNearbyServiceBrowser!
- var advertiser: MCNearbyServiceAdvertiser!
- weak var delegate: CommunicatorDelegate?
- var activeSessions: [String: MCSession] = [:]
- var online: Bool = false
- override init() {
- // Setting up my peer ID:
- peer = MCPeerID(displayName: displayName)
- // Setting up advertiser:
- advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: ["userName": displayName], serviceType: "tinkoff-chat")
- // Setting up browser:
- serviceBrowser = MCNearbyServiceBrowser(peer: peer, serviceType: "tinkoff-chat")
- super.init()
- // Settin up delegates:
- serviceBrowser.delegate = self
- advertiser.delegate = self
- // Let the magic begin:
- advertiser.startAdvertisingPeer()
- serviceBrowser.startBrowsingForPeers()
- print("Прошла инициализация соединения...")
- }
- func manageSession(with peerID: MCPeerID) -> MCSession {
- // Проверяем, есть ли этот юзер в словаре сессий, если нет - добавляем:
- guard activeSessions[peerID.displayName] == nil else { return activeSessions[peerID.displayName]! }
- let session = MCSession(peer: peer, securityIdentity: nil, encryptionPreference: .none)
- session.delegate = self
- // Закидываем сессию на юзера:
- activeSessions[peerID.displayName] = session
- return activeSessions[peerID.displayName]!
- }
- func sendMessage(string: String, to UserID: String, completionHandler: ((Bool, Error?) -> ())?) {
- // Забираем сессию юзера из массива
- guard let session = activeSessions[UserID] else {return}
- // Готовим сообщение:
- let preparedMessageToSend = ["eventType" : "TextMessage", "messageId" : generateMessageId(), "text" : string]
- // Формируем JSON сообщения:
- guard let data = try? JSONSerialization.data(withJSONObject: preparedMessageToSend, options: .prettyPrinted) else { return }
- // Пытаемся отправить или забираем ошибку:
- do {
- try session.send(data, toPeers: session.connectedPeers, with: .reliable)
- // Обрабатываем свое сообщение:
- delegate?.didReceiveMessage(text: string, fromUser: peer.displayName, toUser: UserID)
- if let completion = completionHandler {
- completion(true, nil)
- }
- } catch let error {
- if let completion = completionHandler {
- completion(false, error)
- }
- }
- }
- }
- extension MultipeerCommunicator {
- func generateMessageId() -> String {
- let string = "\(arc4random_uniform(UINT32_MAX))+\(Date.timeIntervalSinceReferenceDate)+\(arc4random_uniform(UINT32_MAX))".data(using: .utf8)?.base64EncodedString()
- return string!
- }
- }
- extension MultipeerCommunicator: MCNearbyServiceBrowserDelegate, MCNearbyServiceAdvertiserDelegate, MCSessionDelegate {
- func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
- browser.invitePeer(peerID, to: activeSessions[peerID.displayName]!, withContext: nil, timeout: 10000)
- }
- func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
- }
- func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
- if activeSessions[peerID.displayName]!.connectedPeers.contains(peerID) {
- invitationHandler(true, activeSessions[peerID.displayName]!)
- } else {
- invitationHandler(false, nil)
- }
- }
- func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
- switch state {
- case MCSessionState.connected:
- print("Connecting: \(peerID.displayName)")
- case MCSessionState.connecting:
- print("Connecting: \(peerID.displayName)")
- case MCSessionState.notConnected:
- print("Not Connected: \(peerID.displayName)")
- }
- }
- func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
- let nsdata = try! JSONSerialization.jsonObject(with: data, options: .allowFragments)
- print(nsdata)
- }
- func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
- }
- func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
- }
- func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement