Advertisement
andreyminin

все что было

Mar 19th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 13.09 KB | None | 0 0
  1. //
  2. //  ViewController.swift
  3. //  peersChallenge
  4. //
  5. //  Created by Andrey Minin on 13/03/2019.
  6. //  Copyright © 2019 Andrey Minin. All rights reserved.
  7. //
  8.  
  9. import UIKit
  10. import MultipeerConnectivity
  11.  
  12. class ViewController: UIViewController, MCSessionDelegate, MCBrowserViewControllerDelegate, MCNearbyServiceBrowserDelegate {
  13.     func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
  14.     }
  15.    
  16.     let dict = ["eventType" : "TextMessage", "text" : "...", "messageId" : "?"]
  17.    
  18.     var newnew : MCAdvertiserAssistant!
  19.    
  20.     lazy var peerID = MCPeerID(displayName: UIDevice.current.name)
  21.    
  22.     lazy var session = MCSession(peer: peerID)
  23.    
  24.     lazy var advertiser = MCNearbyServiceAdvertiser(peer: peerID, discoveryInfo: ["userName": "sex"], serviceType: "tinkoff-chat")
  25.    
  26.     lazy var browser = MCNearbyServiceBrowser(peer: peerID, serviceType: "tinkoff-chat")
  27.    
  28.     func printLogs() {
  29.         //print(#function)
  30.     }
  31.  
  32.    
  33.     func browserViewControllerDidFinish(_ browserViewController: MCBrowserViewController) {
  34.         printLogs()
  35.         browserViewController.dismiss(animated: true, completion: nil)
  36.     }
  37.    
  38.     func browserViewControllerWasCancelled(_ browserViewController: MCBrowserViewController) {
  39.         printLogs()
  40.         browserViewController.dismiss(animated: true, completion: nil)
  41.     }
  42.    
  43.     func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
  44.         switch state {
  45.         case MCSessionState.connected:
  46.             print("Connecting: \(peerID.displayName)")
  47.            
  48.         case MCSessionState.connecting:
  49.             print("Connecting: \(peerID.displayName)")
  50.            
  51.         case MCSessionState.notConnected:
  52.             print("Not Connected: \(peerID.displayName)")
  53.         }
  54.        
  55.     }
  56.    
  57.     func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
  58.         let nsdata = try! JSONSerialization.jsonObject(with: data, options: .allowFragments)
  59.         print(nsdata)
  60.         //print(data["eventType"])
  61.  
  62.         printLogs()
  63.     }
  64.    
  65.     func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
  66.         printLogs()
  67.     }
  68.    
  69.     func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
  70.         printLogs()
  71.     }
  72.    
  73.     func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
  74.         printLogs()
  75.     }
  76.    
  77.     override func viewDidLoad() {
  78.         super.viewDidLoad()
  79.        
  80.         session.delegate = self
  81.        
  82.         advertiser.delegate = self as? MCNearbyServiceAdvertiserDelegate
  83.        
  84.         advertiser.startAdvertisingPeer()
  85.  
  86.         hosting = false
  87.     }
  88.    
  89.     func generateMessageId() -> String {
  90.         return "\(arc4random_uniform(UINT32_MAX))+\(Date.timeIntervalSinceReferenceDate)".data(using: .utf8)!.base64EncodedString()
  91.     }
  92.    
  93.     func browser(_ browser: MCNearbyServiceBrowser, foundPeer foundpeerID: MCPeerID, withDiscoveryInfo info: [String: String]?) {
  94.         /*if info?["userName"] == "Илья" {
  95.             print("slknfdl")
  96.             browser.invitePeer(peerID, to: session, withContext: nil, timeout: 10000)
  97.         }*/
  98.        
  99.         browser.invitePeer(foundpeerID, to: session, withContext: nil, timeout: 10000)
  100.         //print(foundpeerID)
  101.     }
  102.    
  103.     @IBAction func joinSessBut(_ sender: Any) {
  104.        
  105.        
  106.         let newvc = MCBrowserViewController(browser: browser, session: session)
  107.         newvc.delegate = self
  108.         present(newvc, animated: true, completion: nil)
  109.  
  110.     }
  111.    
  112.     @IBAction func hostBut(_ sender: Any) {
  113.  
  114.         if session.connectedPeers.count == 0 && !hosting {
  115.             let connectionActionSheet = UIAlertController(title: "Our chat", message: "Do you want to host or join chat?", preferredStyle: .actionSheet)
  116.            
  117.             connectionActionSheet.addAction(UIAlertAction(title: "Host chat", style: .default, handler: { (action: UIAlertAction) in
  118.                 self.newnew = MCAdvertiserAssistant(serviceType: "Tinkoff-Chat", discoveryInfo: nil, session: self.session)
  119.                 self.newnew.start()
  120.                 self.hosting = true
  121.             }))
  122.            
  123.             connectionActionSheet.addAction(UIAlertAction(title: "Join chat", style: .default, handler: { (action: UIAlertAction) in
  124.                 let browser = MCBrowserViewController(serviceType: "Tinkoff-chat", session: self.session)
  125.                 browser.delegate = self
  126.                 self.present(browser,animated: true,completion: nil)
  127.             }))
  128.            
  129.             connectionActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
  130.            
  131.             self.present(connectionActionSheet,animated: true,completion: nil)
  132.            
  133.         }
  134.         else if session.connectedPeers.count == 0 && hosting{
  135.            
  136.             let waitActionSheet = UIAlertController(title: "Waiting...", message: "Whating for other to join the chat", preferredStyle: .actionSheet)
  137.            
  138.             waitActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
  139.            
  140.             self.present(waitActionSheet,animated: true,completion: nil)
  141.         } else {
  142.             let dissconectActionSheet = UIAlertController(title: "Are you sure you want to disconnect", message: nil, preferredStyle: .actionSheet)
  143.            
  144.             dissconectActionSheet.addAction(UIAlertAction(title: "Dissconect", style: .destructive, handler: { (action: UIAlertAction) in
  145.                 self.session.disconnect()
  146.             }))
  147.            
  148.             dissconectActionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
  149.            
  150.             self.present(dissconectActionSheet,animated: true,completion: nil)
  151.         }
  152.     }
  153.     var recMsg: String!
  154.     var sendMsg: String!
  155.     var hosting: Bool!
  156.    
  157.     func advertiser(_ advertiser: MCNearbyServiceAdvertiser,
  158.                     didReceiveInvitationFromPeer peerID: MCPeerID,
  159.                     withContext context: Data?,
  160.                     invitationHandler: @escaping (Bool, MCSession?) -> Void) {
  161.         if session.connectedPeers.contains(peerID) {
  162.             invitationHandler(true, session)
  163.         } else {
  164.             invitationHandler(false, nil)
  165.         }
  166.     }
  167.    
  168. }
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191. protocol CommunicatorDelegate : class {
  192.     //discovering
  193.     func didFoundUser( userID : String, userName : String?)
  194.     func didLostUser( userID : String)
  195.    
  196.     //errors
  197.     func failedToStartBrowsingForUsers(error : Error)
  198.     func failedToStartAdvertising(error : Error)
  199.    
  200.     //messages
  201.     func didReceiveMessage(text : String, fromUser : String, toUser: String)
  202. }
  203.  
  204.  
  205.  
  206. class CommunicatorManager: CommunicatorDelegate {
  207.     func didFoundUser(userID: String, userName: String?) {
  208.        
  209.     }
  210.    
  211.     func didLostUser(userID: String) {
  212.        
  213.     }
  214.    
  215.     func failedToStartBrowsingForUsers(error: Error) {
  216.        
  217.     }
  218.    
  219.     func failedToStartAdvertising(error: Error) {
  220.        
  221.     }
  222.    
  223.     func didReceiveMessage(text: String, fromUser: String, toUser: String) {
  224.        
  225.     }
  226.    
  227.  
  228. }
  229.  
  230.  
  231. protocol Communicator {
  232.     func sendMessage(string: String, to UserID: String, completionHandler: (( _ success : Bool, _ error : Error?) -> ())?)
  233.     var delegate : CommunicatorDelegate? {get set}
  234.     var online : Bool {get set}
  235. }
  236.  
  237.  
  238.  
  239.  
  240.  
  241. class MultipeerCommunicator: NSObject, Communicator {
  242.    
  243.     var peer: MCPeerID!
  244.    
  245.     //var displayName = UserDefaults.standard.string(forKey: "profileName") ?? "Default name"
  246.    
  247.     var displayName = UIDevice.current.name
  248.    
  249.     var serviceBrowser: MCNearbyServiceBrowser!
  250.    
  251.     var advertiser: MCNearbyServiceAdvertiser!
  252.    
  253.     weak var delegate: CommunicatorDelegate?
  254.    
  255.     var activeSessions: [String: MCSession] = [:]
  256.    
  257.     var online: Bool = false
  258.    
  259.     override init() {
  260.         // Setting up my peer ID:
  261.         peer = MCPeerID(displayName: displayName)
  262.         // Setting up advertiser:
  263.         advertiser = MCNearbyServiceAdvertiser(peer: peer, discoveryInfo: ["userName": displayName], serviceType: "tinkoff-chat")
  264.         // Setting up browser:
  265.         serviceBrowser = MCNearbyServiceBrowser(peer: peer, serviceType: "tinkoff-chat")
  266.         super.init()
  267.         // Settin up delegates:
  268.         serviceBrowser.delegate = self
  269.         advertiser.delegate = self
  270.         // Let the magic begin:
  271.         advertiser.startAdvertisingPeer()
  272.         serviceBrowser.startBrowsingForPeers()
  273.        
  274.         print("Прошла инициализация соединения...")
  275.     }
  276.    
  277.    
  278.     func manageSession(with peerID: MCPeerID) -> MCSession {
  279.         // Проверяем, есть ли этот юзер в словаре сессий, если нет - добавляем:
  280.         guard activeSessions[peerID.displayName] == nil else { return activeSessions[peerID.displayName]! }
  281.         let session = MCSession(peer: peer, securityIdentity: nil, encryptionPreference: .none)
  282.        
  283.         session.delegate = self
  284.        
  285.         // Закидываем сессию на юзера:
  286.         activeSessions[peerID.displayName] = session
  287.         return activeSessions[peerID.displayName]!
  288.     }
  289.    
  290.    
  291.     func sendMessage(string: String, to UserID: String, completionHandler: ((Bool, Error?) -> ())?) {
  292.         // Забираем сессию юзера из массива
  293.         guard let session = activeSessions[UserID] else {return}
  294.        
  295.         // Готовим сообщение:
  296.         let preparedMessageToSend = ["eventType" : "TextMessage", "messageId" : generateMessageId(), "text" : string]
  297.        
  298.         // Формируем JSON сообщения:
  299.         guard let data = try? JSONSerialization.data(withJSONObject: preparedMessageToSend, options: .prettyPrinted) else { return }
  300.        
  301.         // Пытаемся отправить или забираем ошибку:
  302.         do {
  303.             try session.send(data, toPeers: session.connectedPeers, with: .reliable)
  304.            
  305.             // Обрабатываем свое сообщение:
  306.             delegate?.didReceiveMessage(text: string, fromUser: peer.displayName, toUser: UserID)
  307.             if let completion = completionHandler {
  308.                 completion(true, nil)
  309.             }
  310.         } catch let error {
  311.             if let completion = completionHandler {
  312.                 completion(false, error)
  313.             }
  314.         }
  315.     }
  316. }
  317.  
  318. extension MultipeerCommunicator {
  319.     func generateMessageId() -> String {
  320.         let string = "\(arc4random_uniform(UINT32_MAX))+\(Date.timeIntervalSinceReferenceDate)+\(arc4random_uniform(UINT32_MAX))".data(using: .utf8)?.base64EncodedString()
  321.         return string!
  322.     }
  323. }
  324.  
  325.  
  326.  
  327.  
  328. extension MultipeerCommunicator: MCNearbyServiceBrowserDelegate, MCNearbyServiceAdvertiserDelegate, MCSessionDelegate {
  329.     func browser(_ browser: MCNearbyServiceBrowser, foundPeer peerID: MCPeerID, withDiscoveryInfo info: [String : String]?) {
  330.         browser.invitePeer(peerID, to: activeSessions[peerID.displayName]!, withContext: nil, timeout: 10000)
  331.     }
  332.    
  333.     func browser(_ browser: MCNearbyServiceBrowser, lostPeer peerID: MCPeerID) {
  334.        
  335.     }
  336.    
  337.     func advertiser(_ advertiser: MCNearbyServiceAdvertiser, didReceiveInvitationFromPeer peerID: MCPeerID, withContext context: Data?, invitationHandler: @escaping (Bool, MCSession?) -> Void) {
  338.         if activeSessions[peerID.displayName]!.connectedPeers.contains(peerID) {
  339.             invitationHandler(true, activeSessions[peerID.displayName]!)
  340.         } else {
  341.             invitationHandler(false, nil)
  342.         }
  343.     }
  344.    
  345.     func session(_ session: MCSession, peer peerID: MCPeerID, didChange state: MCSessionState) {
  346.         switch state {
  347.         case MCSessionState.connected:
  348.             print("Connecting: \(peerID.displayName)")
  349.            
  350.         case MCSessionState.connecting:
  351.             print("Connecting: \(peerID.displayName)")
  352.            
  353.         case MCSessionState.notConnected:
  354.             print("Not Connected: \(peerID.displayName)")
  355.         }
  356.     }
  357.    
  358.     func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
  359.         let nsdata = try! JSONSerialization.jsonObject(with: data, options: .allowFragments)
  360.         print(nsdata)
  361.     }
  362.    
  363.     func session(_ session: MCSession, didReceive stream: InputStream, withName streamName: String, fromPeer peerID: MCPeerID) {
  364.     }
  365.    
  366.     func session(_ session: MCSession, didStartReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, with progress: Progress) {
  367.     }
  368.    
  369.     func session(_ session: MCSession, didFinishReceivingResourceWithName resourceName: String, fromPeer peerID: MCPeerID, at localURL: URL?, withError error: Error?) {
  370.     }
  371. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement