> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stmlink.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> 对外开放的服务端接口有两组前缀，都用同一套鉴权：`/server/v1/...`（SRTC 与 SMeeting 的主接口）和 `/stm/srvapi/v1/...`（SMeeting 的用户体系，服务端极简对接会用到）。鉴权是 app_id + nonce + timestamp + signature 四个请求头，用 app_key 做 HMAC-SHA256 签名，只能从业务方自己的后端调用。除这两组前缀外的接口均为内部接口，不要建议客户调用。 Public server APIs use two path prefixes with the same authentication: `/server/v1/...` (the main APIs of both SRTC and SMeeting) and `/stm/srvapi/v1/...` (the SMeeting user system, used by server-side low-code integration). Authenticate with four request headers, app_id + nonce + timestamp + signature, where signature is HMAC-SHA256 keyed with app_key; call these APIs only from the customer's own backend. Any other path is internal: never suggest calling it.
> app_key 是服务端密钥，绝不能出现在客户端代码、前端配置或移动 App 里。客户端加入频道用的 token 必须由业务方后端签发后下发（SRTC 走 `/server/v1/channel/grant`，SMeeting 走 `/stm/srvapi/v1/member/grant`）。 app_key is a server-side secret and must never appear in client code, frontend config, or a mobile app. The token a client uses to join must be issued by the customer's backend and passed down to the client (SRTC: `/server/v1/channel/grant`; SMeeting: `/stm/srvapi/v1/member/grant`).
> SRTC 与 SMeeting 是上下两层不同的产品，术语不通用：SRTC 是音视频底座，说「频道 channel」「加入 / 退出」；SMeeting 建在 SRTC 之上，说「房间 room」「会议 meeting」「进入 / 退出」。回答时按用户所在的层用对应术语，不要把「房间」「会议」安到 SRTC 的接口上，也不要用「频道」「加入 / 离开」描述 SMeeting 的概念（接口标识符原样保留）。 SRTC and SMeeting are two separate layers with different terminology. SRTC is the audio/video foundation: it has channels, and users join and leave a channel. SMeeting is built on top of SRTC: it has rooms and meetings, and members enter and exit a meeting. Answer in the terms of the layer the user is working with: never apply "room" or "meeting" to SRTC APIs, and never describe SMeeting concepts in prose with "channel", "join", or "leave" (API identifiers such as `force_join` keep their literal names).
> 同一能力在各端 SDK 里的包名、类名、方法名并不相同。写示例代码时请使用文档中该端自己的 API，不要把一个端的写法套到另一个端上。苹果平台每个产品都有两套 SDK（Swift 原生与 Objective-C），两套 API 不能混用。 Package, class, and method names differ between platform SDKs for the same capability. In sample code, use the API documented for that platform; never carry one platform's code over to another. On Apple platforms each product ships two SDKs (native Swift and Objective-C) whose APIs must not be mixed.

# Integration

> Requirements (iOS 16 / macOS 14, Xcode 15, Swift 5.9), adding the SMeeting Swift SDK with Swift Package Manager, the extra SRTCBroadcastKit dependency for iOS full-screen sharing, which types need import SRTC, and Info.plist permissions. Read this before writing any meeting code on iOS or macOS.

The SMeeting Swift SDK is a conferencing SDK delivered as a `Swift Package`, with the public module name `SMeeting`. It currently supports:

* iOS 16.0 and later
* macOS 14.0 and later
* Xcode 15 and later
* Swift 5.9 and later

<Warning>
  **Starting with `1.3.0`, the minimum OS versions were raised from iOS 13 / macOS 10.15 to iOS 16 / macOS 14.** Projects below these minimums can't resolve 1.3.0 or later (you get a dependency resolution failure, not a compile error); projects that still need to support older systems should stay on `1.2.1`.

  The minimums come from the virtual background inference runtime in the audio and video layer—SwiftPM's `platforms:` is package-wide, and a dependent package can only be equal to or higher than its dependency. For details, see [Virtual background](/zh/meeting/swift/advanced/virtual-background) (Chinese).
</Warning>

SMeeting is built on top of SRTC's audio and video capabilities: the meeting layer handles business semantics such as rooms, meetings, members, and host controls, while the underlying audio and video capture, encoding and decoding, and rendering are still provided by SRTC. When you add `SMeeting`, SRTC is resolved along with it as a dependency, so you don't need to add it separately.

<Note>
  **There are two SMeeting SDKs for Apple platforms—first confirm which one you need.** This section covers the native Swift SDK (`import SMeeting`, delivered as a Swift Package, supporting both iOS and macOS); there is also an Objective-C `MeetingKit` (distributed via CocoaPods, iOS only), see [iOS SDK](/zh/meeting/ios/quickstart) (Chinese).

  **For new projects, we recommend the Swift SDK in this section.** The two APIs can't be mixed, and you shouldn't add both to the same project.
</Note>

***

### Integrate with Swift Package Manager

The SDK is distributed as a precompiled XCFramework containing three platform slices: iOS device, iOS simulator, and macOS.

The meeting layer is built on top of the audio and video layer, but you only need to declare one dependency—SPM resolves the underlying SRTC and WebRTC automatically.

#### Declare it in Package.swift

```swift theme={null}
// Package.swift
dependencies: [
    .package(url: "https://github.com/seastart/smeeting-swift-sdk.git", from: "1.3.8"),
],
targets: [
    .target(
        name: "YourApp",
        dependencies: [
            .product(name: "SMeeting", package: "smeeting-swift-sdk"),
        ]
    ),
]
```

#### Add it in an Xcode project

If you use an Xcode project rather than a pure SPM project:

* Open `File > Add Package Dependencies...`
* Enter `https://github.com/seastart/smeeting-swift-sdk.git`
* Check `SMeeting` for your target

#### Exception: iOS full-screen sharing needs one more dependency

You need this step only for **iOS full-screen screen sharing** (sharing the entire system screen, not just your app's content). The extension must link `SRTCBroadcastKit`—the second product of the audio and video layer's `srtc-swift-sdk` (it doesn't include WebRTC)—and because SwiftPM doesn't allow using products of transitive dependencies, you must declare it explicitly:

```swift theme={null}
dependencies: [
    .package(url: "https://github.com/seastart/smeeting-swift-sdk.git", from: "1.3.8"),
    // The version must match the SRTC version pinned inside SMeeting
    .package(url: "https://github.com/seastart/srtc-swift-sdk.git", exact: "1.4.7"),
],
```

<Warning>
  **Add `SRTCBroadcastKit` only to the Broadcast Upload Extension target**, not to the app target as well—`SRTC` on the app side already statically contains the same code, and linking it twice puts two copies of the same types into one process. The reverse doesn't work either: linking `SMeeting` / `SRTC` into the extension pulls WebRTC into an extension process that has a 50 MB memory limit.

  For the full integration steps, see [Screen sharing](/zh/meeting/swift/advanced/screen-sharing) (Chinese).
</Warning>

Each SMeeting version pins a fixed SRTC version (pinned with `exact:` to guarantee a combination we have tested); you can find the mapping in the [Changelog](/zh/meeting/swift/changelog) (Chinese).

***

### Import the SDK

```swift theme={null}
import SMeeting
```

Meeting-related types (`SMeetingEngine`, `MeetingCreateReq`, `MeetingUserInfo`, `SMeetingDelegate`, etc.) are all in the `SMeeting` module.

The following types come from the underlying SRTC module and require an extra import when you use them:

```swift theme={null}
import SRTC
```

| Scenario | Types |
| - | - |
| Render video | `SRTCVideoView`, `SRTCVideoRenderer` |
| Specify capture parameters | `CameraPreset`, `MicPreset`, `ScreenPreset` |
| Set the log level | `LogLevel` |
| Enumerate devices | `DeviceInfo` |
| Choose a sharing source on macOS | `ScreenCaptureSources`, `DisplaySource`, `WindowSource` |
| Full-screen sharing on iOS | `SRTCBroadcastPicker` (brings up the system broadcast picker) |
| Audio routing on iOS | `AudioRoute`, `AudioRouteTarget`, `AudioRouteInfo`, `AudioCallState` |
| Virtual background | `SRTCNativeImage` (the background image, an alias of `UIImage` / `NSImage`), `SRTCVirtualBackgroundEffect` |
| Call quality events | `QualityReport`, `ConnectionQualityChange`, `ActiveSpeakersSnapshot`, `LayerSwitchedInfo` |
| Disconnect reason | `DisconnectReason` |

***

### Permissions

#### iOS

Add the following to `Info.plist`:

```xml theme={null}
<key>NSCameraUsageDescription</key>
<string>Camera access is required for video meetings</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for voice meetings</string>
```

We recommend also declaring the background audio capability, so the system doesn't suspend audio when the app goes to the background:

```xml theme={null}
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>
```

<Note>
  On iOS, **the SDK requests microphone permission when you enter the meeting**, even if the member only intends to listen; the orange microphone indicator also shows in the status bar while in the meeting. This is a prerequisite for controllable audio routing and matches apps such as Zoom and Tencent Meeting; for the reason, see [Audio routing](/zh/meeting/swift/advanced/audio-routing) (Chinese). So `NSMicrophoneUsageDescription` is required—the app crashes without it.
</Note>

#### macOS

Add the following to `Info.plist`:

```xml theme={null}
<key>NSCameraUsageDescription</key>
<string>Camera access is required for video meetings</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is required for voice meetings</string>
<key>NSScreenCaptureUsageDescription</key>
<string>Screen recording is required for screen sharing</string>
```

If you use screen sharing, also note:

* On macOS, sharing a display or an app window requires the user to grant permission in a system prompt
* The APIs that specify a sharing source require macOS 12.3 or later; for details, see [Screen sharing](/zh/meeting/swift/advanced/screen-sharing) (Chinese)

***

### Minimum integration checklist

* `SMeeting` has been added to your target's dependencies
* Usage descriptions for camera / microphone (and screen recording) permissions are configured
* Your backend can issue the meeting token needed to log in to the SDK
* Your UI has areas ready for local video and remote video

Once you've completed these steps, continue with the [Quickstart](/en/meeting/swift/quickstart).
