RemoteMonster Documents
HomepageBlogCommunityAbout Us
v2.x
v2.x
  • RemoteMonster
  • Overview
    • Flow
    • Structure
    • Examples
    • Features
    • Spec
  • Web
    • Web - Overview
    • Web - Getting Started
    • Web - Media
    • Web - Debug Inside
    • Web - Github
    • Web - SDK Reference
  • Android
    • Android - Overview
    • Android - Getting Started
    • Android - Media
    • Android - ProGuard
    • Android - Github
    • Android - SDK Reference
  • iOS
    • iOS - Overview
    • iOS - Getting Started
    • iOS - Media
    • iOS - Github
    • iOS - SDK Reference
  • api
    • Webhook API - Livecast - beta
    • Managing Channels
  • Common
    • Service Key
    • Config/RemonConfig
    • Livecast
    • Communication
    • Callbacks
    • Channel
    • Channel ID ๊ทœ์น™
    • Network Environment
    • Studio Environment
    • Media
    • Simulcast
    • Record - beta
    • Error
    • About WebRTC
    • FAQ
  • ๊ทธ๋ฃนํ†ตํ™”
    • ๊ทธ๋ฃนํ†ตํ™” ๋งŒ๋“ค๊ธฐ(Android)
    • ๊ทธ๋ฃนํ†ตํ™” ๋งŒ๋“ค๊ธฐ(iOS)
    • ๊ทธ๋ฃนํ†ตํ™” ๋งŒ๋“ค๊ธฐ(Web)
  • ํŠœํ† ๋ฆฌ์–ผ - ํ†ตํ™”
    • ํ†ตํ™” 5 ๋ถ„ ์•ˆ์— ์‹œ์ž‘ํ•˜๊ธฐ
    • ํ†ตํ™” ํ‚ค ๋ฐœ๊ธ‰
    • ์ƒˆ ํ†ตํ™” ํ”„๋กœ์ ํŠธ ์„ค์ • - Web
    • ๋‹จ์ˆœ ํ†ตํ™” ์•ฑ ๋งŒ๋“ค๊ธฐ - Web
  • ํŠœํ† ๋ฆฌ์–ผ - ๋ฐฉ์†ก
    • ๋ฐฉ์†ก 5 ๋ถ„ ์•ˆ์— ์‹œ์ž‘ํ•˜๊ธฐ
    • ๋ฐฉ์†ก ํ‚ค ๋ฐœ๊ธ‰
    • ์ƒˆ ๋ฐฉ์†ก ํ”„๋กœ์ ํŠธ ์„ค์ • - Web
    • ๋‹จ์ˆœ ์‹œ์ฒญ ์•ฑ ๋งŒ๋“ค๊ธฐ - Web
Powered by GitBook
On this page
  • ๊ธฐ๋ณธ ์„ค์ •
  • ๊ฐœ๋ฐœ
  • View ๋“ฑ๋ก
  • ๋ฐฉ์†ก์ƒ์„ฑ
  • ๋ฐฉ์†ก์‹œ์ฒญ
  • Callbacks
  • Channel ๋ชฉ๋ก ์กฐํšŒ
  • ์ข…๋ฃŒ
  • ๊ธฐํƒ€
  1. Common

Livecast

PreviousConfig/RemonConfigNextCommunication

Last updated 5 years ago

๊ธฐ๋ณธ ์„ค์ •

๋ฐฉ์†ก์„ ํ•˜๊ธฐ ์ „์— ๊ฐ ํ”Œ๋ ›ํผ ๋ณ„ ํ”„๋กœ์ ํŠธ ์„ค์ •์„ ์ง„ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ

RemonCast ํด๋ž˜์Šค๋Š” ๋ฐฉ์†ก ์ƒ์„ฑ ๋ฐ ์‹œ์ฒญ์„ ์œ„ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. RemonCast ํด๋ž˜์Šค์˜ create() ํ•จ์ˆ˜์™€ join() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฉ์†ก ๊ธฐ๋Šฅ์„ ์ด์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด์ ์ธ ๊ตฌ์„ฑ๊ณผ ํ๋ฆ„์€ ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

View ๋“ฑ๋ก

๋ฐฉ์†ก ์†ก์ถœ์ž๊ฐ€ ์Šค์Šค๋กœ์˜ ๋ชจ์Šต์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ์‹œ์ฒญ์ž๊ฐ€ ๋ฐฉ์†ก์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ ์‹ค์ œ ๋น„๋””์˜ค๊ฐ€ ๊ทธ๋ ค์ง€๋Š” View๋ฅผ ์ •ํ•˜๊ณ  ์—ฐ๊ฒฐํ•ด์•ผ ๋ฉ๋‹ˆ๋‹ค. ๋ฐฉ์†ก ์†ก์ถœ์ž์—๊ฒŒ๋Š” ์Šค์Šค๋กœ๊ฐ€ ๋ณด์ด๋„๋ก Local View๋ฅผ ๋“ฑ๋ก ํ•˜๊ณ , ์‹œ์ฒญ์ž์—๊ฒŒ๋Š” ์†ก์ถœ์ž๊ฐ€ ๋ณด์ด๋„๋ก Remote View๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

<!-- Caster : local view -->
<video id="localVideo" autoplay muted></video>
<!-- Viewer : remote view -->
<video id="remoteVideo" autoplay></video>
<!-- Caster : local view -->
<com.remotemonster.sdk.PercentFrameLayout
    android:id="@+id/perFrameLocal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/surfRendererLocal"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</com.remotemonster.sdk.PercentFrameLayout>
<!-- Viewer : remote view -->
<com.remotemonster.sdk.PercentFrameLayout
    android:id="@+id/perFrameRemote"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <org.webrtc.SurfaceViewRenderer
        android:id="@+id/surfRendererRemote"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</com.remotemonster.sdk.PercentFrameLayout>

ConstraintLayout ๊ณผ ๊ฐ™์ด ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/constraintLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- Remote -->
    <RelativeLayout
        android:id="@+id/layoutRemote"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_margin="10dp"
        app:layout_constraintDimensionRatio="H,1:1.33"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        >
        <org.webrtc.SurfaceViewRenderer
            android:id="@+id/surfRendererRemote"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </RelativeLayout>
    
    <!-- Local -->
    <RelativeLayout
        android:id="@+id/layoutLocal"
        android:layout_width="80dp"
        android:layout_height="0dp"
        android:layout_margin="18dp"
        app:layout_constraintDimensionRatio="H,1:1.33"
        app:layout_constraintVertical_bias="0.1"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        >

        <org.webrtc.SurfaceViewRenderer
            android:id="@+id/surfRendererLocal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/remon_identity"
            android:scaleType="fitCenter"
            android:visibility="visible"
            />
    </RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

Interface Builder๋ฅผ ํ†ตํ•ด ์ง€์ • ํ•˜๊ฒŒ ๋˜๋ฉฐ iOS - Getting Start์— ๋”ฐ๋ผ ํ™˜๊ฒฝ์„ค์ •์„ ํ–ˆ๋‹ค๋ฉด ์ด๋ฏธ View๋“ฑ๋ก์ด ์™„๋ฃŒ๋œ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค. ํ˜น, ์•„์ง ์™„๋ฃŒ๊ฐ€ ์•ˆ๋œ ์ƒํƒœ๋ผ๋ฉด ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Interface Builder๋ฅผ ํ†ตํ•ด ์ง€์ • ํ•˜๊ฒŒ ๋˜๋ฉฐ iOS - Getting Start์— ๋”ฐ๋ผ ํ™˜๊ฒฝ์„ค์ •์„ ํ–ˆ๋‹ค๋ฉด ์ด๋ฏธ View๋“ฑ๋ก์ด ์™„๋ฃŒ๋œ ์ƒํƒœ ์ž…๋‹ˆ๋‹ค. ํ˜น, ์•„์ง ์™„๋ฃŒ๊ฐ€ ์•ˆ๋œ ์ƒํƒœ๋ผ๋ฉด ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ณด๋‹ค ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๋ฐฉ์†ก์ƒ์„ฑ

RemonCast์˜ create() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฉ์†ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. create() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋˜๋ฉด Remon์˜ ๋ฏธ๋””์–ด ์„œ๋ฒ„์—๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค์ด ์ ‘์† ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์†ก์ด ์ฑ„๋„๋กœ์จ ๋งŒ๋“ค์–ด ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ฑ„๋„์ด ๋งŒ๋“ค์–ด ์ง€๋ฉด์„œ channelId๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์‹œ์ฒญ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// <video id="localVideo" autoplay muted></video>
let myChannelId

const config = {
  credential: {
    serviceId: 'MY_SERVICE_ID',
    key: 'MY_SERVICE_KEY'
  },
  view: {
    local: '#localVideo'
  },
  media: {
    sendonly: true
  }
}

const listener = {
  onCreate(channelId) {
    myChannelId = channelId
  }
}
โ€‹
const caster = new Remon({ listener, config })
caster.createCast()
caster = RemonCast.builder()
    .serviceId("MY_SERVICE_ID")
    .key("MY_SERVICE_KEY")
    .context(CastActivity.this)
    .localView(surfRendererlocal)        // local Video Renderer
    .build();

caster.onCreate((channelId) -> {
    myChannelId = channelId;
});

caster.create();
caster = RemonCast.builder()
    .serviceId("MY_SERVICE_ID")
    .key("MY_SERVICE_KEY")
    .context(CastActivity.this)
    .localView(surfRendererlocal)        // local Video Renderer
    .build()

caster.onCreate { channelId -> 
    myChannelId = channelId;
}

caster.create()
remonCast.create("MY_CHANNEL_ID")

ํ˜น์€ ์•„๋ž˜์™€ ๊ฐ™์ด Interface Builder ์—†์ด ์ž‘์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

let caster = RemonCast()
caster.serviceId = "MY_SERVICE_ID"
caster.serviceKey = "MY_SERVICE_KEY"
caster.localView = localView

remonCast.onCreate { (channelId) in
    let myChannelId = caster.channelId
}

caster.create("MY_CHANNEL_ID")
[remonCast create:@"MY_CHANNEL_ID"];

Or you can create it without Interface Builder as follows.

RemonCast *caster = [[RemonCast alloc]init];
caster.serviceId = @"MY_SERVICE_ID";
caster.serviceKey = @"MY_SERVICE_KEY";
caster.localView = localView;

[self.remonCast onCreateWithBlock:^(NSString * _Nullable chId) {
    [self.channelIdLabel setText:chId];
}];

[caster create:@"MY_CHANNEL_ID"];

๋ฐฉ์†ก์‹œ์ฒญ

RemonCast์˜ joinRoom(channelId) ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ฐฉ์†ก์— ์ฐธ์—ฌ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์›ํ•˜๋Š” channelId๋ฅผ ์•Œ๋ ค์ค˜์•ผ ํ•˜๋Š”๋ฐ ๋ณดํ†ต ์•„๋ž˜์˜ Channel์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ „์ฒด ๋ชฉ๋ก์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•˜๋Š” ๋ฐฉ์‹์ด ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

// <video id="remoteVideo" autoplay></video>
let myChannelId

const config = {
  credential: {
    serviceId: 'MY_SERVICE_ID',
    key: 'MY_SERVICE_KEY'
  },
  view: {
    local: '#remoteVideo'
  },
  media: {
    recvonly: true
  }
}

const listener = {
  onJoin() {
    // Do something
  }
}
โ€‹
const viewer = new Remon({ listener, config })
viewer.joinCast('MY_CHANNEL_ID')                  // myChnnelId from caster
viewer = RemonCast.builder()
    .serviceId("MY_SERVICE_ID")
    .key("MY_SERVICE_KEY")
    .context(ViewerActivity.this)
    .remoteView(surfRendererRemote)        // remote video renderer
    .build();
โ€‹
viewer.onJoin(() -> {});

viewer.join("MY_CHANNEL_ID");                     // myChid from caster
viewer = RemonCast.builder()
    .serviceId("MY_SERVICE_ID")
    .key("MY_SERVICE_KEY")
    .context(ViewerActivity.this)
    .remoteView(surfRendererRemote)        // remote video renderer
    .build()
โ€‹
viewer.onJoin{
}

viewer.join("MY_CHANNEL_ID")                     // myChid from caster
remonCast.join("MY_CHANNEL_ID")

ํ˜น์€ ์•„๋ž˜์™€ ๊ฐ™์ด Interface Builder ์—†์ด ์ž‘์„ฑ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

let viewer = RemonCast()
viewer.serviceId = "MY_SERVICE_ID"
viewer.key = "MY_SERVICE_KEY"
viewer.remoteView = remoteView

viewer.onJoin {
    // Do something
}

viewer.join("MY_CHANNEL_ID")
[remonCast join:@"MY_CHANNEL_ID"]

Or you can create it without Interface Builder as follows.

RemonCast *caster = [[RemonCast alloc]init];
caster.serviceId = @"MY_SERVICE_ID";
caster.serviceKey = @"MY_SERVICE_KEY";
caster.localView = localView;

[self.remonCast onJoinWithBlock:^() {

}];

[caster join:@"MY_CHANNEL_ID"];

Callbacks

๊ฐœ๋ฐœ์ค‘ ๋‹ค์–‘ํ•œ ์ƒํƒœ ์ถ”์ ์„ ๋•๊ธฐ ์œ„ํ•œ Callback์„ ์ œ๊ณต ํ•ฉ๋‹ˆ๋‹ค.

  • ์•ˆ๋“œ๋กœ์ด๋“œ 2.4.13, iOS 2.6.9 ๋ฒ„์ „๋ถ€ํ„ฐ ์ฝœ๋ฐฑ์€ ๋ชจ๋‘ UI Thread ์—์„œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

const listener = {
  onInit(token) {
    // UI ์ฒ˜๋ฆฌ๋“ฑ remon์ด ์ดˆ๊ธฐํ™” ๋˜์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜์—ฌ์•ผ ํ•  ์ž‘์—…
  },
โ€‹  
  onConnect(channelId) {
    // ํ†ตํ™” ์ƒ์„ฑ ํ›„ ๋Œ€๊ธฐ ํ˜น์€ ์‘๋‹ต
  },
โ€‹
  onComplete() {
    // Caller, Callee๊ฐ„ ํ†ตํ™” ์‹œ์ž‘
  },
โ€‹  
  onClose() {
    // ์ข…๋ฃŒ
  }
}
remonCast = RemonCast.builder().build();

// UI ์ฒ˜๋ฆฌ๋“ฑ remon์ด ์ดˆ๊ธฐํ™” ๋˜์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜์—ฌ์•ผ ํ•  ์ž‘์—…
remonCast.onInit(() -> {
});
โ€‹
// ๋ฐฉ์†ก ์ƒ์„ฑ
remonCast.onCreate((channelId) -> {
});
โ€‹
// ๋ฐฉ์†ก ์ฐธ
remonCast.onJoin ( () -> {
});

// Caller, Callee๊ฐ„ ํ†ตํ™” ์‹œ์ž‘
remonCast.onComplete(() -> {
});
โ€‹
// ์ข…๋ฃŒ
remonCast.onClose(() -> {
});
remonCast = RemonCast.builder().build()

// UI ์ฒ˜๋ฆฌ๋“ฑ remon์ด ์ดˆ๊ธฐํ™” ๋˜์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜์—ฌ์•ผ ํ•  ์ž‘์—…
remonCast.onInit {
}
โ€‹
// ๋ฐฉ์†ก ์ƒ์„ฑ
remonCast.onCreate { channelId -> {
}
โ€‹
// ๋ฐฉ์†ก ์ฐธ
remonCast.onJoin {
}

// Caller, Callee๊ฐ„ ํ†ตํ™” ์‹œ์ž‘
remonCast.onComplete {
}
โ€‹
// ์ข…๋ฃŒ
remonCast.onClose {
}
let remonCast = RemonCast()

remonCast.onInit { [weak self] in
    // UI ์ฒ˜๋ฆฌ๋“ฑ remon์ด ์ดˆ๊ธฐํ™” ๋˜์—ˆ์„ ๋•Œ ์ฒ˜๋ฆฌํ•˜์—ฌ์•ผ ํ•  ์ž‘์—…
}
โ€‹
remonCast.onCreate { [weak self](channelId) in
    // ํ•ด๋‹น 'chid'๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ ์ฑ„๋„์ด ์—†๋‹ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น 'chid'๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ ํ• ๋•Œ ๊นŒ์ง€ ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 
}
โ€‹
remonCast.onJoin { [weak self] in
}

remonCast.onComplete { [weak self] in
    // Caller, Callee๊ฐ„ ํ†ตํ™” ์‹œ์ž‘
}
โ€‹
remonCast.onClose { [weak self](closeType) in
    // ์ข…๋ฃŒ
}
RemonCast *remonCast = [[RemonCast alloc] init];

[remonCast onInitWithBlock:^{
    // Things to do when remon is initialized, such as UI processing, etc.
}];

[remonCast onConnectWithBlock:^(NSString * _Nullable chId) {
    // Make a call then wait the callee
}];

[remonCast onJoinWithBlock:^{
}];

[remonCast onCompleteWithBlock:^{
    // Start between Caller and Callee
}];

[remonCast onCloseWithBlock:^{
    // End calling
}];

๋” ๋งŽ์€ ๋‚ด์šฉ์€ ์•„๋ž˜๋ฅผ ์ฐธ์กฐ ํ•˜์„ธ์š”.โ€‹

Channel ๋ชฉ๋ก ์กฐํšŒ

๋ฐฉ์†ก์„ ๋งŒ๋“ค๋ฉด ์ฑ„๋„์ด ์ƒ์„ฑ๋˜๊ณ  ๊ณ ์œ ํ•œ channelId๊ฐ€ ์ƒ์„ฑ ๋ฉ๋‹ˆ๋‹ค. ์ด channelId๋ฅผ ํ†ตํ•ด ์‹œ์ฒญ์ž๊ฐ€ ์ƒ์„ฑ๋œ ๋ฐฉ์†ก์— ์ ‘๊ทผ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐฉ์†ก์ค‘์ธ ์ „์ฒด ์ฑ„๋„ ๋ชฉ๋ก์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์กฐํšŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

const remonCast = new Remon()
const casts = await remonCast.fetchCasts()
remonCast = RemonCast.builder().build();

remonCast.onFetch((casts) -> {
    // Do something
});

remonCast.featchCasts();
remonCast = RemonCast.builder().build()

remonCast.onFetch { casts ->
    // Do something
}

remonCast.featchCasts()
let remonCast = RemonCast()

remonCast.fetchCasts { (error, results) in
    // Do something
}
RemonCast *remonCast = [[RemonCast alloc]init];
 [remonCast fetchCastsWithIsTest:YES
                   complete:^(NSArray<RemonSearchResult *> * _Nullable chs) {
                        // Do something
                    }];

๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ข…๋ฃŒ

๋ฐฉ์†ก์˜ ์†ก์ถœ, ์‹œ์ฒญ์ด ๋๋‚ฌ์„ ๊ฒฝ์šฐ ๊ผญ RemonCast๊ฐ์ฒด๋ฅผ close()ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. close๋ฅผ ํ†ตํ•ด์„œ ๋ชจ๋“  ๋ฐฉ์†ก ์ž์›๊ณผ ๋ฏธ๋””์–ด ์ŠคํŠธ๋ฆผ ์ž์›์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

const remonCast = new Remon()
remonCast.close()
remonCast = RemonCast.builder().build();
remonCast.close();
remonCast = RemonCast.builder().build()
remonCast.close()
let remonCast = RemonCast()
remonCast.closeRemon()
RemonCast *remonCast = [[RemonCast alloc]init];
[remonCast closeRemon];

๊ธฐํƒ€

์•„๋ž˜๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ์ž์„ธํ•œ ์„ค์ •, ์‹ค ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ํ”„๋ ‰ํ‹ฐ์Šค๋“ฑ ๋‹ค์–‘ํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•ด ๋ณด์„ธ์š”.

iOS - Getting Started
iOS - Getting Started
Flow
Structure
Web - Media
Android - Media
iOS - Media
Callbacks
Channel
Config/RemonConfig
Network Environment