Kakao i Connect Live 커뮤니티

[ios] RemonCall, p2p connect 를 2번째 호출시 RemonError error 8.이 발생합니다

안녕하세요
iOS로 p2p 연결, voice chat을 개발하고 있는데요,

1번째 연결을 let remonCall = RemonCall()
remonCall.closeRemon()
로 종료후 다시
remonCall.connect(channelId, config) 를 호출 할 경우, 다음과 같이 에러발생후
바로 close가 됩니다.
다시 연결할 수 있는 방법 문의드립니다.

[에러 로그]
init RemonController
load RemonSettrings
RTCDispatcher - typeAudioSession :
********** ac.ioBufferDuration 0.02
********** ac.sampleRate 48000.0

** Error RTCAudioSessionConfiguration The operation couldn’t be completed. (OSStatus error -50.)
2019-04-02 14:24:41.293355+0900 mindpro_new[1754:133740] [NetworkInfo] Signal strength query returned error: Error Domain=NSPOSIXErrorDomain Code=13 “Permission denied”, descriptor: <CTServiceDescriptor 0x283720980, domain=1, instance=1>
supportedCodec <RTCVideoCodecInfo: 0x283720660>
encoderFactory.preferredCodec H264 true
2019-04-02 14:24:41.303450+0900 mindpro_new[1754:133740] [NetworkInfo] Signal strength query returned error: Error Domain=NSPOSIXErrorDomain Code=13 “Permission denied”, descriptor: <CTServiceDescriptor 0x2837200a0, domain=1, instance=1>
url https://signal.remotemonster.com/rest/init

supportedCodec <RTCVideoCodecInfo: 0x283727a20>
encoderFactory.preferredCodec H264 true

url https://signal.remotemonster.com/rest/init

WS Setup is completed

WebSocket(url!) wss://signal.remotemonster.com/ws
WS Setup is completed
*********** WS Socket is Opened
Remon Manager 0

[]onStateChange 0
connect Channel
[onInit]
*********** WS Socket is Opened
Remon Manager 0

[]onStateChange 0
connect Channel
[onInit]
200!
WS Socket State is onConnect

onConnect
DEBUG ice RTCConfiguration: {
(
“RTCIceServer:\n(\n “stun:stun.l.google.com:19302”\n)\n(null)\n(null)\nRTCTlsCertPolicySecure\n(null)\n(\n)\n(\n)”,
“RTCIceServer:\n(\n “turn:demo.remotemonster.com:3478”\n)\nremon\n0987654321\nRTCTlsCertPolicySecure\n(null)\n(\n)\n(\n)”
)
ALL
MAX_BUNDLE
NEGOTIATE
TCP_ENABLED
CANDIDATE_ALL_NETWORKS
GATHER_CONTINUALLY
PLAN_B
50
0
-1
-1
0
0
0
(null)
(null)
0
0
0
5
0
(null)
}

[]didReceiveLocalAudioTrack RTCMediaStreamTrack:
audio
ARDAMSa0
enabled
Live
----------------------- peerConnectionShouldNegotiate --------------------
create offer is completed
Remon Manager 2

[]onStateChange 2
********* new sdp : v=0

o=- 7681254078619162242 2 IN IP4 127.0.0.1

s=-

t=0 0

a=group:BUNDLE audio

a=msid-semantic: WMS ARDAMS

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126

c=IN IP4 0.0.0.0

a=rtcp:9 IN IP4 0.0.0.0

a=ice-ufrag:iK/C

a=ice-pwd:LTvk53ZswkxiAs8oT0Zs5/sE

a=ice-options:trickle renomination

a=fingerprint:sha-256 16:7B:CE:1A:ED:11:BD:F4:68:9E:0D:F4:7D:13:E6:83:3D:87:3F:4C:C0:8C:0B:56:FB:8B:F3:38:79:7F:67:2A

a=setup:actpass

a=mid:audio

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a=sendrecv

a=rtcp-mux

a=rtpmap:111 opus/48000/2

a=rtcp-fb:111 transport-cc

a=fmtp:111 minptime=10;useinbandfec=1

a=rtpmap:103 ISAC/16000

a=rtpmap:104 ISAC/32000

a=rtpmap:9 G722/8000

a=rtpmap:102 ILBC/8000

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:106 CN/32000

a=rtpmap:105 CN/16000

a=rtpmap:13 CN/8000

a=rtpmap:110 telephone-event/48000

a=rtpmap:112 telephone-event/32000

a=rtpmap:113 telephone-event/16000

a=rtpmap:126 telephone-event/8000

a=ssrc:3663089097 cname:C2issu3o/0/P7ARH

a=ssrc:3663089097 msid:ARDAMS ARDAMSa0

a=ssrc:3663089097 mslabel:ARDAMS

a=ssrc:3663089097 label:ARDAMSa0

----------------------- sigStateChanged to 1
SDP: Description is created
v=0

o=- 7681254078619162242 2 IN IP4 127.0.0.1

s=-

t=0 0

a=group:BUNDLE audio

a=msid-semantic: WMS ARDAMS

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126

c=IN IP4 0.0.0.0

a=rtcp:9 IN IP4 0.0.0.0

a=ice-ufrag:iK/C

a=ice-pwd:LTvk53ZswkxiAs8oT0Zs5/sE

a=ice-options:trickle renomination

a=fingerprint:sha-256 16:7B:CE:1A:ED:11:BD:F4:68:9E:0D:F4:7D:13:E6:83:3D:87:3F:4C:C0:8C:0B:56:FB:8B:F3:38:79:7F:67:2A

a=setup:actpass

a=mid:audio

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a=sendrecv

a=rtcp-mux

a=rtpmap:111 opus/48000/2

a=rtcp-fb:111 transport-cc

a=fmtp:111 minptime=10;useinbandfec=1

a=rtpmap:103 ISAC/16000

a=rtpmap:104 ISAC/32000

a=rtpmap:9 G722/8000

a=rtpmap:102 ILBC/8000

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:106 CN/32000

a=rtpmap:105 CN/16000

a=rtpmap:13 CN/8000

a=rtpmap:110 telephone-event/48000

a=rtpmap:112 telephone-event/32000

a=rtpmap:113 telephone-event/16000

a=rtpmap:126 telephone-event/8000

a=ssrc:3663089097 cname:C2issu3o/0/P7ARH

a=ssrc:3663089097 msid:ARDAMS ARDAMSa0

a=ssrc:3663089097 mslabel:ARDAMS

a=ssrc:3663089097 label:ARDAMSa0

200!
WS Socket State is onConnect

onConnect
DEBUG ice RTCConfiguration: {
(
“RTCIceServer:\n(\n “stun:stun.l.google.com:19302”\n)\n(null)\n(null)\nRTCTlsCertPolicySecure\n(null)\n(\n)\n(\n)”,
“RTCIceServer:\n(\n “turn:demo.remotemonster.com:3478”\n)\nremon\n0987654321\nRTCTlsCertPolicySecure\n(null)\n(\n)\n(\n)”
)
ALL
MAX_BUNDLE
NEGOTIATE
TCP_ENABLED
CANDIDATE_ALL_NETWORKS
GATHER_CONTINUALLY
PLAN_B
50
0
-1
-1
0
0
0
(null)
(null)
0
0
0
5
0
(null)
}

didCreateSessionDescription is called
SDP was set and remonstate= Optional(RemoteMonster.RemonState)
iceGatheringStateChanged to 1

[]didReceiveLocalAudioTrack RTCMediaStreamTrack:
audio
ARDAMSa0
enabled
Live
----------------------- peerConnectionShouldNegotiate --------------------
create offer is completed
Remon Manager 2

[]onStateChange 2
********* new sdp : v=0

o=- 4831907116934513753 2 IN IP4 127.0.0.1

s=-

t=0 0

a=group:BUNDLE audio

a=msid-semantic: WMS ARDAMS

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126

c=IN IP4 0.0.0.0

a=rtcp:9 IN IP4 0.0.0.0

a=ice-ufrag:LB/k

a=ice-pwd:CZjFInnIuhU0+TLe2S5dtb4T

a=ice-options:trickle renomination

a=fingerprint:sha-256 B7:25:8C:A5:14:61:A7:60:6C:58:80:BB:CA:EF:78:36:ED:15:8B:70:A2:20:48:1A:1A:7A:14:02:EA:1A:11:13

a=setup:actpass

a=mid:audio

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a=sendrecv

a=rtcp-mux

a=rtpmap:111 opus/48000/2

a=rtcp-fb:111 transport-cc

a=fmtp:111 minptime=10;useinbandfec=1

a=rtpmap:103 ISAC/16000

a=rtpmap:104 ISAC/32000

a=rtpmap:9 G722/8000

a=rtpmap:102 ILBC/8000

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:106 CN/32000

a=rtpmap:105 CN/16000

a=rtpmap:13 CN/8000

a=rtpmap:110 telephone-event/48000

a=rtpmap:112 telephone-event/32000

a=rtpmap:113 telephone-event/16000

a=rtpmap:126 telephone-event/8000

a=ssrc:1102201899 cname:ABgJs+hlGfpGdMbp

a=ssrc:1102201899 msid:ARDAMS ARDAMSa0

a=ssrc:1102201899 mslabel:ARDAMS

a=ssrc:1102201899 label:ARDAMSa0

200!
WS Socket State is onStateChange

onStateChange: CONNECT
Remon Manager 2

[]onStateChange 2
----------------------- sigStateChanged to 1
SDP: Description is created
v=0

o=- 4831907116934513753 2 IN IP4 127.0.0.1

s=-

t=0 0

a=group:BUNDLE audio

a=msid-semantic: WMS ARDAMS

m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126

c=IN IP4 0.0.0.0

a=rtcp:9 IN IP4 0.0.0.0

a=ice-ufrag:LB/k

a=ice-pwd:CZjFInnIuhU0+TLe2S5dtb4T

a=ice-options:trickle renomination

a=fingerprint:sha-256 B7:25:8C:A5:14:61:A7:60:6C:58:80:BB:CA:EF:78:36:ED:15:8B:70:A2:20:48:1A:1A:7A:14:02:EA:1A:11:13

a=setup:actpass

a=mid:audio

a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level

a=sendrecv

a=rtcp-mux

a=rtpmap:111 opus/48000/2

a=rtcp-fb:111 transport-cc

a=fmtp:111 minptime=10;useinbandfec=1

a=rtpmap:103 ISAC/16000

a=rtpmap:104 ISAC/32000

a=rtpmap:9 G722/8000

a=rtpmap:102 ILBC/8000

a=rtpmap:0 PCMU/8000

a=rtpmap:8 PCMA/8000

a=rtpmap:106 CN/32000

a=rtpmap:105 CN/16000

a=rtpmap:13 CN/8000

a=rtpmap:110 telephone-event/48000

a=rtpmap:112 telephone-event/32000

a=rtpmap:113 telephone-event/16000

a=rtpmap:126 telephone-event/8000

a=ssrc:1102201899 cname:ABgJs+hlGfpGdMbp

a=ssrc:1102201899 msid:ARDAMS ARDAMSa0

a=ssrc:1102201899 mslabel:ARDAMS

a=ssrc:1102201899 label:ARDAMSa0

200!
WS Socket State is onSdp

onSdp
onSdp body : 1280 bytes
onSdp body string: {
“type” : “offer”,
“sdp” : “v=0\r\no=- 7681254078619162242 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio\r\na=msid-semantic: WMS ARDAMS\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 102 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:iK/C\r\na=ice-pwd:LTvk53ZswkxiAs8oT0Zs5/sE\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 16:7B:CE:1A:ED:11:BD:F4:68:9E:0D:F4:7D:13:E6:83:3D:87:3F:4C:C0:8C:0B:56:FB:8B:F3:38:79:7F:67:2A\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:102 ILBC/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3663089097 cname:C2issu3o/0/P7ARH\r\na=ssrc:3663089097 msid:ARDAMS ARDAMSa0\r\na=ssrc:3663089097 mslabel:ARDAMS\r\na=ssrc:3663089097 label:ARDAMSa0\r\n”
}

-ufrag:LB\/k\r\na=ice-pwd:CZjFInnIuhU0+TLe2S5dtb4T\r\na=ice-options:trickle renomination\r\na=fingerprint:sha-256 B7:25:8C:A5:14:61:A7:60:6C:58:80:BB:CA:EF:78:36:ED:15:8B:70:A2:20:48:1A:1A:7A:14:02:EA:1A:11:13\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus\/48000\/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC\/16000\r\na=rtpmap:104 ISAC\/32000\r\na=rtpmap:9 G722\/8000\r\na=rtpmap:102 ILBC\/8000\r\na=rtpmap:0 PCMU\/8000\r\na=rtpmap:8 PCMA\/8000\r\na=rtpmap:106 CN\/32000\r\na=rtpmap:105 CN\/16000\r\na=rtpmap:13 CN\/8000\r\na=rtpmap:110 telephone-event\/48000\r\na=rtpmap:112 telephone-event\/32000\r\na=rtpmap:113 telephone-event\/16000\r\na=rtpmap:126 telephone-event\/8000\r\na=ssrc:1102201899 cname:ABgJs+hlGfpGdMbp\r\na=ssrc:1102201899 msid:ARDAMS ARDAMSa0\r\na=ssrc:1102201899 mslabel:ARDAMS\r\na=ssrc:1102201899 label:ARDAMSa0\r\n"\n}"}
didCreateSessionDescription is called
SDP was set and remonstate= Optional(RemoteMonster.RemonState)
iceGatheringStateChanged to 1

WS Socket State is onIce

onIce : {
“candidate” : “candidate:2595196448 1 udp 2122260223 10.10.12.210 64332 typ host generation 0 ufrag iK/C network-id 1 network-cost 10”,
“sdpMid” : “audio”,
“sdpMLineIndex” : 0
}

SDP was set and remonstate= Optional(RemoteMonster.RemonState)

[]onError The operation couldn’t be completed. (RemoteMonster.RemonError error 8.)
[onError] IceFailed(“Failed to set remote answer sdp: Failed to apply the description for audio: Answerer must use either active or passive value for setup attribute.”)
[onClose] start
[onClose] end
Error is occured! Failed to set remote answer sdp: Failed to apply the description for audio: Answerer must use either active or passive value for setup attribute.
200!
WS Socket State is onIce

onIce : {
“candidate” : “candidate:24033082 1 udp 2122194687 169.254.224.97 52386 typ host generation 0 ufrag iK/C network-id 2 network-cost 10”,
“sdpMid” : “audio”,
“sdpMLineIndex” : 0
}
200!
WS Socket State is onIce

onIce : {
“candidate” : “candidate:2595196448 2 udp 2122260222 10.10.12.210 52447 typ host generation 0 ufrag iK/C network-id 1 network-cost 10”,
“sdpMid” : “audio”,
“sdpMLineIndex” : 0
}
200!
WS Socket State is onIce

onIce : {
“candidate” : “candidate:24033082 2 udp 2122194686 169.254.224.97 63820 typ host generation 0 ufrag iK/C network-id 2 network-cost 10”,
“sdpMid” : “audio”,
“sdpMLineIndex” : 0
}
200!

안녕하세요. 리모트몬스터 입니다.
현재 2.4.492 버전을 사용하시는 것으로 확인 되었습니다.

만약 개발 환경을 swift5 (xcode10.2)으로 변경 가능 하시다면 오디오 관련 이슈가 처리된 최신 버전인 2.5.0 버전을 이용해 보시기 바랍니다.

swift 4.x 환경을 계속 유지 하셔야 한다면 RemonCall 생성 후 오디오세션 active 시켜주세요.

    do {
                if #available(iOS 10.0, *) {
                    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategorySoloAmbient, mode: AVAudioSessionModeDefault)
//                    try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.soloAmbient, mode: AVAudioSession.Mode.default) //ios 12
                }
                else {
                    AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSessionCategorySoloAmbient)
//                    AVAudioSession.sharedInstance().perform(NSSelectorFromString("setCategory:error:"), with: AVAudioSession.Category.soloAmbient) //ios 12
                }
                
                try AVAudioSession.sharedInstance().setActive(true, with: [])
            } catch {
                print(error)
            }