Comment on page
Callback과 Observer
RemonCast
, RemonCall
의 간단한 코드 만으로 통신 및 방송이 가능 합니다. 사용자의 필요에 따라 UI처리 및 추가 작업이 필요한 경우가 발생 합니다. 아래의 다양한 Callback을 통해 보다 세부적인 개발이 가능합니다.안드로이드 2.4.13, iOS 2.6.9 버전부터 콜백은 모두 UI Thread 에서 호출됩니다. 이전 버전의 경우 UI 요소의 변경 시 UI Thread 와 관련한 처리를 추가해야 합니다.
방송과 통신은 각각에 적합한 이벤트와 흐름을 가지고 있습니다. 이를 알아두면 Callback를 활용하는데 도움이 됩니다. 이에 대한 내용은 아래를 참고하세요.
onInit
은 SDK가 인터넷을 통해 RemoteMonster 서버에 정상적으로 접속하여 RemoteMonster의 방송, 통신 인프라를 사용할 준비가 완료된 상태를 의미합니다. 이때 인증 정보인 token
을 돌려 받습니다. 대다수의 경우 사용할 일이 없으며 디버깅에 활용하게 됩니다.
(Android 의 경우 token 을 전달하지 않습니다.)Web
Android - Java
Android - Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onInit(token) {
// Do something
}
}
remonCast.onInit(() -> {
// Do something
});
remonCast.onInit {
}
remonCast.onInit { (token) in
// Do something
}
[remonCast onInitWithBlock:^{
// Do something
}];
방송에서 송출자만 사용합니다. 송출자가
create()
을 통해 방송을 정상적으로 생성하여 송출이 될때입니다.onCreate
는 인자로 channelId
를 넘겨줍니다. 이것은 이 방의 고유한 구분자로 시청자들이 이 channelId
를 통해 접속하여 방송을 보게 됩니다.Web
Android - Java
Android - Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onCreate(channelId) {
// Do something
}
}
const cast = new Remon({ listener })
cast.createCast() // Server generate chid
remonCast.onCreate((channelId) -> {
// Do something
});
remonCast.create("ChannelName"); // Server generate channelId
remonCast.onCreate {(channelId)->
}
remonCast.create("ChannelName")
remonCast.onCreate { (channelId) in
// Do something
}
remonCast.create() // Server generate chid
[remonCast onCreateWithBlock:^(NSString * _Nullable chId) {
// Do something
}];
방송에서 시청자만 사용됩니다. 시청자가
join()
을 통해 연결이 완료 된후 미디어 시청이 가능해 졌을 때 호출 됩니다.Web
Android - Java
Android -Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onJoin(channelId) {
// Do something
}
}
const cast = new Remon({ listener })
cast.joinCast('MY_CHANNEL_ID') // 'chid' is mandatory
remonCast.onJoin(() ->
// Do something
});
remonCast.join('MY_CHANNEL_ID'); // channelId is mandatory
remonCast.onJoin {
// Do something
}
remonCast.join('MY_CHANNEL_ID');
remonCast.onJoin {
// Do something
}
remonCast.join('MY_CHANNEL_ID') // 'chid' is mandatory
const listener = {
onJoin(channelId) {
// Do something
}
}
const cast = new Remon({ listener })
cast.joinCast('MY_CHANNEL_ID') // 'channelId' is mandatory
통신에서만 사용됩니다. 실질적으로 채널을 만들어 통화를 요청하는 Caller이거나 만들어진 채널에 접속하여 요청에 응답하는 Callee일때의 동작을 달리 하는 경우가 많으며 위해서 개발자가 Caller, Callee여부에 대한 상태를 관리해야 합니다.
Caller는
connect()
을 통해 채널을 새로 만들고 상대방이 입장하기를 기다립니다.Callee는
connect()
을 통해 이미 만들어진 채널에 접속하게 됩니다. 이때 만들어진 채널의 channelId
를 필수로 필요하게 됩니다. 정상적으로 완료되면 onConnect
가 생기나, Callee라면 곧바로 발생하는 onComplete
를 사용하는것을 권장합니다.Web
Android - Java
Android - Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onConnect(channelId) {
if (isCaller) {
// Do something
}
}
}
const call = new Remon({ listener })
call.connectCall()
// Or
call.connectCall('MY_CHANNEL_ID')
// 콜백
remonCall.onConnect((channelId) -> {
// Do something
});
// 연결
remonCall.connect("MY_CHANNEL_ID");
// 콜백
remonCall.onConnect{ channelId ->
// Do something
}
// 연결
remonCall.connect("MY_CHANNEL_ID");
remonCall.onConnect { (channelId) in
// Do something
}
remonCast.connect("MY_CHANNEL_ID")
[remonCall onConnectWithBlock:^(NSString * _Nullable chId) {
// Do something
}];
[remonCall connect:@"MY_CHANNEL_ID" :nil];
통신에만 사용됩니다. 상호간 연결이 완료 된후 미디어 전송이 가능해 졌을 때 호출 됩니다.
Web
Android - Java
Android - Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onComplete() {
// Do something
}
}
remonCall.onComplete(() -> {
// Do something
});
remonCall.onComplete {
// Do something
}
remonCall.onComplte {
// Do something
}
[remonCall onCompleteWithBlock:^{
// Do something
사용자가 명시적으로
close()
함수를 호출 하거나 상대방이 close()
함수를 호출 했을때 또는 네트워크 이상 등으로 더이상 연결을 유지 하기 어려울 때 등 연결이 종료 되면 호출 되며, Remon
에서 사용했던 자원들 해제가 완료된 상태입니다.Web
Android - Java
Android - Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onClose() {
// Do something
}
}
remonCast.onClose((closeType) -> {
// CloseType.MINE : 자신이 close() 를 호출해 연결을 끊은 경우
// CloseType.OTHER : 상대방이 close() 를 호출해 연결을 끊은 경우
// CloseType.OTHER_UNEXPECTED : 상대방이 끊어져서 연결이 종료된 경우
// CloseType.UNKNOWN : 이유를 알 수 없이 연결이 종료된 경우
});
remonCast.onClose { closeType:CloseType ->
// CloseType.MINE : 자신이 close() 를 호출해 연결을 끊은 경우
// CloseType.OTHER : 상대방이 close() 를 호출해 연결을 끊은 경우
// CloseType.OTHER_UNEXPECTED : 상대방이 끊어져서 연결이 종료된 경우
// CloseType.UNKNOWN : 이유를 알 수 없이 연결이 종료된 경우
}
remonCast.onClose {
// Do something
}
remonCast.close()
[remonCast onCloseWithBlock:^{
// Do something
}];
Remon
이 동작 중에 에러가 발생 할때 호출 됩니다.Web
Android - Java
Android -Kotlin
iOS - Swift
iOS - ObjC
const listener = {
onError(error) {
// Do something
}
}
remonCast.onError((error) -> {
// Do something
});
remonCall.onError { error: RemonException ->
when( error.code ) {
RemonErrorCode.unknown->
RemonErrorCode.initError->
RemonErrorCode.wsError->
RemonErrorCode.connectError->
RemonErrorCode.iceError->
RemonErrorCode.mediaError->
RemonErrorCode.invalidParameterError->
RemonErrorCode.networkChange->
}
}
remonCast.onError { (error) in
// RemonError
switch error {
case .ConnectChannelFailed(_)
break;
}
}
N/A
Error 코드에 대해 자세히 알고 싶으시면 아래 내용을 참고하시기 바랍니다.
Remon
이 동작 중에 네트워크 환경의 변경이 감지되면 재연결을 시도 합니다. 이 때 재연결 상태를 알려주는 onRetry()
함수가 호출 되며 재연결이 시도가 시작 될 때는 completed
값을 false
로 호출 되고, 재연결이 완료 되면 completed
값을 true
로 호출 됩니다. 만약 재연결 시도중 재연결이 실패 하거나 에러가 발생 한다면 onRetry()
가 아닌 onError()
또는 onClose()
가 호출 될 수도 있습니다.Web
Android
iOS - Swift
iOS - ObjC
N/A
N/A
self.remonCast.onRetry { (completed) in
if completed {
// 재연결이 완료 되었습니다.
// 재연결 시도 중 실패가 발생 한다면 호출 되지 않을 수 있습니다.
} else {
// 재연결을 시도 합니다. 재연결이 시도가 시작 되면 항상 호출 됩니다.
}
}
[self.remonCall onRetryWithBlock:^(BOOL completed) {
if (completed) {
// 재연결이 완료 되었습니다.
// 재연결 시도 중 실패가 발생 한다면 호출 되지 않을 수 있습니다.
} else {
// 재연결을 시도 합니다. 재연결이 시도가 시작 되면 항상 호출 됩니다.
}
}];
영상의 사이즈는 네트워크 상태에 따라 시시각각 변화 하며, 영상의 비율은 영상장치에 따라 다릅니다. 영상 송출자가 고정된 사이즈와 비율 보장해 주지 않는 환경이라면
onRemoteVideoSizeChanged
와 onLocalVideoSizeChanged
함수를 구현 하여 변화 하는 영상크기에 반응 하도록 구현합니다.Untitled
N/A
N/A
let remonCall = RemonCall()
remonCall.onRemoteVideoSizeChanged {(view, size) in
let raito = size.height / size.width
let oldSize = view.frame.size
let newFrame =
CGRect(x: 0.0, y: 0.0, width: oldSize.width, height: oldSize.width * raito)
view.frame = newFrame
}
아래의 링크를 통해 구체적인 응용 예시를 확인할 수 있습니다.
[self.remonCall onLocalVideoSizeChangedWithBlock:^(UIView * _Nullable view, CGSize size) {
CGFloat raito = size.height / size.width;
CGRect oldFrame = view.frame;
CGSize oldSize = oldFrame.size;
CGRect newFrame = CGRectMake(0, 0, oldSize.width, oldSize.width * raito);
view.frame = newFrame;
}];
아래의 링크를 통해 구체적인 응용 예시를 확인할 수 있습니다.
통신 / 방송 상태를 알수있는
report
를 받습니다. report
는 사용자가 remon
생성시 설정한 statInterval
간격 마다 들어오게 됩니다. 네트워크 상황등에 따른 미디어 품질을 나타냄으로 사용자에게 로딩 UI 처리등 안내를 하는데 유용합니다.이때, 들어오는 값은 영상 및 음성 통화 중에 현재 통화의 품질이 어떠한지를 통합하여 1에서 5까지의 단계로 확인할 수 있습니다.
사용자는 간혹 자신 혹은 상대방의 네트워크 문제로 인하여 통화 품질이 안좋거나 끊어진 상황에서도 서비스의 문제라고 생각하고 불만을 제기할 수 있습니다. 때문에 사용자의 문제가 네트워크의 문제임을 사전에 알려주거나 다양한 UI 처리가 가능합니다.
현재 이 통화 품질 정보는 5초에 한번씩 받을 수 있습니다.
단계 | 품질 | 비고 |
1 | 매우 좋음 | |
2 | 좋음 | |
3 | 나쁨 | |
4 | 매우 나쁨 | |
5 | 방송, 통화 불능 | |
iOS - Swift
iOS - ObjC
let remonCall = RemonCall()
remoCall.onRemonStatReport{ (stat) in
let rating:RatingValue = stat.getRttRating()
let level = rating.levle
}
self.showRemoteVideoStat = true //stat 정보가 영상 위에 오버레이 됩니다.
[self.remonCast onRemonStatReportWithBlock:^(RemonStatReport * _Nonnull stat) {
RatingValue *rating = [stat getRttRating];
// Do something
}];
보다 더 자세한 내용은 아래를 확인하세요.
Last modified 4yr ago