Swift에서 네트워크 통신을 어떻게 하는지 검색을 정말 많이 했다.
대표적으로
SwiftIO, SwiftSocket, Alamofire, Moya 등등 많이 검색을 해 보았지만 계속 연결을 실패 했다고 알림이 떠서...
하아.. 왜 도대체 안되는거지 하고 생각을 했는데
결국엔 원인을 찾아 냈다.
그 이유는 프로그램이 샌드박스 형식이여서 권한을 주지 않으면 무조건 실패 했다..
Info.plist 권한을 추가해보기도 하고 다 안되었는데 결국에 된 방식은
Project -> Signing & Capabilities -> App SandBox -> Network에 권한을 In, Outgoing을 추가해주면 되었다..!
UDP 통신으로 통신을 성공적으로 하는 모습이다.
개발하면서 느꼇던 부분이지만
전에 맥의 바탕화면의 파일 쓰기, 읽기가 실패했던 이유도 권한 부족이였는데. 앞으론 권한에 대해서 많이 공부를 해야할것 같다.
권한이 제일 중요하다..
import SwiftUI
import Network
struct ContentView: View {
var connection:NWConnection?
var hostUDP: NWEndpoint.Host = "127.0.0.1"
let portUDP: NWEndpoint.Port = 5555
let client:network = network()
public func connectToUDP(_ hostUDP: NWEndpoint.Host, _ portUDP: NWEndpoint.Port) {
self.connection = NWConnection(host: hostUDP, port: portUDP, using: .udp)
self.connection?.stateUpdateHandler = { (newState) in
print("This is stateUpdateHandler:")
switch (newState) {
case .ready:
print("State: Ready\n")
case .setup:
print("State: Setup\n")
case .cancelled:
print("State: Cancelled\n")
case .preparing:
print("State: Preparing\n")
default:
print("ERROR! State not defined!\n")
}
}
self.connection?.start(queue: .global())
}
public func sendUDP(_ content: String) {
let contentToSendUDP = content.data(using: String.Encoding.utf8)
self.connection?.send(content: contentToSendUDP, completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in
if (NWError == nil) {
print("Data was sent to UDP")
} else {
print("ERROR! Error when data (Type: Data) sending. NWError: \n \(NWError!)")
}
})))
}
var body: some View {
VStack {
Text("Receive : \(receive)")
Text("Send : \(send)")
Button(action: {
self.sendUDP("test")
}) {
Text("Send")
}
}.frame(width: 300, height: 400)
.onAppear{
self.connectToUDP(self.hostUDP, self.portUDP)
}
}
}
Swift 코드는 위와 같다. 이제 다시 보기엔 정말 코드가 C#처럼 깔끔하고 좋은데 여러 라이브러리를 사용하다 보니까 역시...
해당 코드는 Client 의 경우이고, 데이터를 수신하지 않는다. 오직 보내기만 하는 Outgoing 데이터이다.
Server도 구현을 해야하는데 Server의 경우에는 Swift, Objective-C로 작성을 한 것이 아닌. C#으로, 완전히 다른 언어로 작성을 하였다.
만약 통신이 성공적으로 된다면 Tcp,Udp가 제대로 된것이고, 만약 이상한 데이터도 같이 넘어온다면 Network 라이브러리가 잘못 구현이 되어있다는것을 알 수 있을것이다.
class Program
{
static void Main(string[] args)
{
IPEndPoint ip = new IPEndPoint(IPAddress.Loopback, 5555);
UdpClient cl = new UdpClient(ip);
while (true)
{
var data = cl.Receive(ref ip);
var str = Encoding.ASCII.GetString(data);
Console.WriteLine(str);
}
}
}
다행이 다음의 코드가 정상적으로 동작을 한다.
그렇다면 UDP 구현하기는 완성을 하였다.
UDP 통신을 이용하여 양방향 통신을 할려고 하였으나. 1포트 1바인딩 때문인지 바로 오류가 난다.
그래서 포트를 2개를 잡아줘야하는데 그 부분은 역시 귀찮으므로 구현을 하지 않았다. 한가지의 방법, 즉 주는것을 성공했으면 받는것 또한
쉽기 때문에. 네트워크 연결에 성공했다는 부분에 의의를 두었다.
'차장님의 이야기' 카테고리의 다른 글
C#의 UdpClient 생성자 및 동작 (0) | 2020.06.18 |
---|---|
유니티의 CBD(Component-Based Development) 구현 해보기 (0) | 2020.06.15 |
IOS에서 Itunes에 파일 목록에 나오게 하기. (0) | 2020.06.03 |
SwiftUI에서 MapKit 사용하기 (0) | 2020.06.02 |
IOS 13.5 업그레이드 시 테스팅이 불가능한 이유. (0) | 2020.06.01 |