ALBPeerConnection
主要使用 Swift 编写的点对点网络类(套接字是 Objective-C 类 GCDAsyncSocket)
请查看 Shopping 项目以了解如何使用此类在应用程序的实例之间进行同步的示例。
此类使用 Swift 5
** 待办事项
- 添加单元测试
- 添加安全连接
用于通过 Wi-Fi 或蓝牙在附近设备之间通信的点对点类。
入门指南
对客户端和服务器进行初始化,每个客户端和服务器都有一个名称和唯一标识符。服务器在 Bonjour 上发布自己,以便客户端可以看到它。
当客户端请求与服务器建立连接时,将调用代理方法,并传递客户端的名称和唯一标识符,以评估是否应通过代码或用户交互允许连接。
一旦建立连接,所有通信都是通过 ALBPeerCommunication 类进行的。
服务器
初始化服务器实例。
let netNode = ALBPeer(name: "Server device", peerID: "uniquedeviceid")
let netServer = ALBPeerServer(serviceType:"_albsync._tcp.", serverNode:netNode, serverDelegate:nil)
netServer.delegate = self
启动服务器,允许它被看见并连接。
if !netServer.startPublishing() {
// handle error
}
停止服务器,将其从网络视图中移除,并防止新的连接。
netServer.stopPublishing()
必需的代理调用。
func serverPublishingError(errorDict: [NSObject : AnyObject]) {
println("publishing error: \(errorDict)")
}
func allowConnectionRequest(remoteNode:ALBPeer, requestResponse:(allow:Bool)->()) {
// do work to determine if this device should be allowed to connect
// this can involve user interface calls etc.
// requestResponse can be saved and called elsewhere
requestResponse(allow: true)
}
func clientDidConnect(connection:ALBPeerConnection) {
// connection delegate must be assigned immediately
connection.delegate = self
// strong reference must be kept of the connection
_netConnections.append(connection)
}
客户端
初始化客户端实例。
let netNode = ALBPeer(name: "Client device", peerID: "uniquedeviceid")
let netClient = ALBPeerClient(serviceType:"_albsync._tcp.", clientNode:netNode, clientDelegate:nil)
netClient.delegate = self
查找服务器。找到或丢失的服务器将触发代理调用。
netClient.startBrowsing()
停止查找。
netClient.stopBrowsing()
请求连接到服务器。
netClient.connectToServer(peerDevice)
必需的代理调用。
func clientBrowsingError(errorDict:[NSObject: AnyObject]) {
println("browsing error: \(errorDict)")
}
func serverFound(server:ALBPeer) {
// a server has been found
}
func serverLost(server:ALBPeer) {
// a server is no longer seen
}
func unableToConnect(server:ALBPeer) {
// was unable to connect
}
func connectionDenied(server:ALBPeer) {
// connection was denied
}
func connected(connection:ALBPeerConnection) {
// connection delegate must be assigned immediately
connection.delegate = self
// strong reference must be kept of the connection
_netConnection = connection
}
连接
关闭连接。
connection.disconnect()
向远程连接发送文本、数据和本地资源
connection.sendText("sample text string")
connection.sendData(dataObject)
let progressTracker = connection.sendResourceAtURL(localURL, name:"fileName", resourceID:"unique identifier", onCompletion: { (sent) -> () in
// do some cleanup, etc.
})
必需的代理调用。
func disconnected(connection:ALBPeerConnection, byRequest:Bool) {
// connection closed
}
func textReceived(connection: ALBPeerConnection, text: String) {
// text received
}
func dataReceived(connection:ALBPeerConnection, data:NSData) {
// data received
}
func startedReceivingResource(connection:ALBPeerConnection, atURL:NSURL, name:String, resourceID:String, progress:NSProgress) {
// resource transfer started
}
func resourceReceived(connection:ALBPeerConnection, atURL:NSURL, name:String, resourceID:String) {
// resource transfer complete
}