Socket.iO comunication between iOS app and nodeJS
- Develop/Swift
- 2020. 11. 29. 09:00
-
Xcode를 이용하여 iOS App Project 생성
-
terminal 실행 후, 생성된 폴더로 이동 후 아래의 명령어를 수행
-
참고 포스팅 : macOS Finder에서 터미널 바로 열기 를 확인 Good!
pod init
use_frameworks!
target 'YourApp' do
pod 'Socket.IO-Client-Swift', '~> 15.2.0'
end
pod install
//
// SockMgr.swift
// SocketIOChatExR01
//
// Created by vbflash on 2020/09/23.
// Copyright © 2020 vbflash. All rights reserved.
//
import Foundation
import SocketIO
let manager = SocketManager(socketURL: URL(string: "http://localhost:3014")!, config: [.log(false), .compress, .forceWebsockets(true)])
class SockMgr {
// ... 생략
}
//
// SockMgr.swift
// SocketIOChatExR01
//
// Created by vbflash on 2020/09/23.
// Copyright © 2020 vbflash. All rights reserved.
//
import Foundation
import SocketIO
let manager = SocketManager(socketURL: URL(string: "http://localhost:3014")!, config: [.log(false), .compress, .forceWebsockets(true)])
class SockMgr {
// singleton
static let mInstance = SockMgr()
private init() {}
// 생략 ...
}
// 생략 ...
func establishConnection() {
socket.connect()
let message: [String: Any] = [
"sender": "from iOS",
"recepient": "ALL",
"command": "chat",
"type":"text",
"data": "한글테스트"
]
socket.on(clientEvent: .connect) {data, ack in
print("socket connected: http://localhost:3014")
self.socket.emit("message", message)
print("emited on TestSock()")
}
print("log: establishConnection")
}
func closeConnection() {
socket.disconnect()
}
// 생략 ...
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
SockMgr.mInstance.establishConnection()
return true
}
log: establishConnection
socket connected: http://localhost:3014
emited on TestSock()
connection info : { address: '::1', family: 'IPv6', port: 59896 }
message 이벤트를 받았습니다.
{
command: 'chat',
type: 'text',
sender: 'from iOS',
recepient: 'ALL',
data: '한글테스트'
}
'나를 포함한 모든 클라이언트에게 message 이벤트를 전송합니다.'
-
문제점
-
App Transport Security policy requires the use of a secure connection ~ 와 같은 오류가 발생할 경우, 아래와 같이 해결함
-
Info.plist 내부에 아래의 항목을 추가 함
-
Allow Arbitrary Loads : YES
-
-
App Transport Security Settings
-
Reference
-
2015.12.17 iOS9 App transport Security 설정법
-
2017.03.30 iOS HTTP 허용하기
-
error
-
tried emitting when not connected swift
-
solved
socket.on("connect") { _, _ in
print("socket connected")
socket.emit("your_event", jsonObject)
}
'Develop > Swift' 카테고리의 다른 글
한글 완성형<->조합형 변환코드 및 인코딩(EUC-KR, UTF-8, CP949) (0) | 2020.12.20 |
---|---|
Socket.iO comunication between Visual Studio based C++ and nodeJS (활용편) (0) | 2020.12.17 |
Swift와 Windows(C/C++)의 TCP소켓통신의 한글인코딩 문제 (0) | 2020.12.10 |
Socket.iO comunication between iOS app and nodeJS (7) | 2020.11.29 |
SwiftUI (기존/예정) 포스팅 리스트 정리 편 (0) | 2020.11.26 |
SwiftUI @State @Binding 초기화 파라미터 전달 방법 및 navigationBar 및 TabView 사용시 문제점 해결방법 (0) | 2020.11.24 |
Swift 개발을 위한 라이브러리 추천 (0) | 2020.11.23 |
SwiftUI 채팅앱 만들기 마무리편 (0) | 2020.11.21 |
SwiftUI로 채팅UI 화면 만들기 (0) | 2020.11.20 |
SwiftUI로 채팅 리스트 화면 만들기 (0) | 2020.11.19 |
SwiftUI로 친구목록 화면 만들기 (0) | 2020.11.18 |
이 글을 공유하기
-
눈팅이2020.12.17 00:21
안녕하세요. Socket.io로 Swift와 Node.js간의 소켓통신 잘 보았습니다.
제가 사실 지난 이틀간 이것을 구현시키느라 시간을 아주 많이 소비했습니다.
Swift에서 세팅 후 아래와 같이
self.socket.on(clientEvent: .connect) {data, ack in
print("SOCKET CONNECTED"
}
self.socket.connect()
를 하고나면, 분명 로그에는 "SOCKET CONNECTED" 메세지가 뜹니다.
그런데, 서버쪽 코드대로라면
io.on('connection', function(clientSocket) {
console.log('a user connected ... ');
})
위와 같이 Swift 코드를 실행시키면, 서버쪽 콘솔에서도 'a user connected ... ' 라고 떠야되는데, 아무것도 뜨질 않습니다. 물론, 다른 event들도 전혀 발동되지 않구요.. Xcode에서도 "SOCKET CONNECTED"라는 메세지 하나만 뜨고, message 전송을 해도 아무런 반응도 나오질 않아요. 이것때문에 골머리를 앓고 있습니다...
그러던 중 이 블로그를 찾았는데, 저와 똑같이 하셨는데, 잘되시는거보니 분명 뭔가 잘못된거 같아요.. 혹시 혜안이 있으신지요..?
현재 Big Sur이고, Socket.IO-Client-Swift 15.2.0, XCode는 12.3 쓰고 있습니다.
-
2020.12.17 04:35 신고
권한 설정 하셨나요?
권한 설정을 안해도, 상위 코드와 같이 connected 라고 로그가 출력되더라구요.
포스팅 본문에도 추가하는 방법 있으니 꼭 한번 더 확인 해보세요.
그리고 다른 문제는 방화벽 문제인데, node.js 서버의 ip/port 외 서버환경에서의 방화벽 해제, 공유기의 방화벽해제, 포트포워딩 까지 다해주셔야 접속 됩니다.
더 궁금하시면 댓글 남겨주세요 ㅎ
-
-
눈팅이2020.12.17 10:12
info.plist에서 [Allow Arbitrary Loads:YES] 되있고, 방화벽도 해제를 해놨습니다.
socket.io는 하도 먹통이길래, NodeJS WebSocket이라는 패키지로 바꾸고, Swift 코드도 그에 맞게 바꾸고 실험해봤는데, 이건 또 잘되더군요.. 그런데, 사정상 socket.io를 써야하는데, 대체 왜 이것만 안되는지 답답하네요.
혹시나해서 제 NodeJS 코드 남겨볼께요.
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res) {
res.send('<h1>hi</h1>');
});
http.listen(8080, function() {
console.log('Listening on *8080');
})
io.on('connection', function(clientSocket) {
console.log('a user connected ... ');
})
-
2020.12.17 13:04 신고
macOS 로컬에서 연결 테스트 하신건가요? 아이폰도 기기라서 localhost 하면 아이폰 자기자신일껍니다. 그래서 macOS 아이피 찾아서 연결 테스트 해보세요.
방화벽 문제 없음
권한 문제 없음
IP, PORT 문제가 크죠..
-
-
눈팅이2020.12.17 18:33
아직 실제 아이폰 기기에 연결해서 테스트해보진 않았고, 로컬에서 시뮬레이터만 쓰고 있어요.
혹시 포트포워딩이라면, 구체적으로 어떻게 해야하는지 말씀해주실수 있나요?
일단은 시뮬레이터에서라도 잘돌아가면 되거든요. 왜 내 컴퓨터에서만 안되는지 참... ㅋㅋ 답답하네요 ㅠㅠ-
2020.12.17 21:37 신고
엥?
Client - Mac/xcode 시뮬레이터?
Server - macOS(nodeJS)
아닌가요? 로컬에서도 접속이 안된다는 거는 해당 iOS App 개발이 잘못되었다는 것입니다.
1. ip/port 확인
1.1 macOS ip 확인 필요(127.0.0.1 안됨)
2. 권한 확인
3. macOS방화벽 확인(보통 내부 통신은 다른 설정 필요없음)
4. 포트포워딩은 windows 혹은 linux 등에 설치된 nodeJS일때 필요 합니다. 하지만, 1~3단계에서 접속이 안되시는 것 같아 설정 부분을 다시 확인 해보시는게 좋지 않을까 하네요...
아니면 코드 공개 가능하면 git에 올리고 댓글 올려주세요. 맥을 오랫만에 켰더니 업뎃한다고......마지막 작업 확인을 못했네요.
-