zoom-plugin-sdk-macos
Zoom Plugin SDK for native macOS companion applications using Swift or Objective-C to control an installed Zoom Workplace client over IPC. Use for Xcode integration, OAuth initialization, start/join f
SKILL.mdskills/plugin-sdk/macos/SKILL.md
GitHubZoom Plugin SDK for macOS
Use Swift or Objective-C to control Zoom Workplace from a separate native macOS application.
Start Here
- Read Lifecycle and Integration.
- Use Package and API Map to locate the authoritative header and sample for a feature.
- Use Capabilities to check whether the official client can do the requested operation.
- Implement the smallest auth and IPC connection baseline.
- Add start/join and meeting-state handling.
- Add one feature toolkit at a time.
- Use Common Issues when callbacks, linking, permissions, or client compatibility fail.
Baseline Requirements
- A Zoom Marketplace General app with Plugin SDK enabled.
- A user OAuth access token containing
plugin_sdk:read:connection_meta. - Zoom Workplace
7.0.2or later according to the public setup documentation. - Xcode
16.1or later. - The complete signed dependency set from the package's
PSDKLibs/folder.
Package review baseline: zoom-plugin-sdk-macos-universal-7.1.0.595.
Minimal Lifecycle
Retain the listener for the full initialized lifetime:
import Cocoa
import ZoomToolSuite
final class PluginListener: NSObject, ZoomToolSuiteEventListenerProtocol {
func onAuthResult(_ result: ZoomToolSuiteAuthResult) {
// Continue only after .success.
}
func onIPCConnectStatusChanged(
_ status: ZoomToolSuiteIPCConnectStatus,
errorMessage: String?
) {
// Enable controls only after .connected.
}
func onMeetingStatusChanged(_ status: ZoomToolSuiteMeetingStatus) {
// Enable meeting toolkits only after .inMeeting.
}
}
final class PluginController {
private let listener = PluginListener()
func initialize(accessToken: String) {
let context = ZoomToolSuiteAuthContext()
context.accessToken = accessToken
context.domain = "https://zoom.us"
ZoomToolSuiteAPI.initSDK(context, listener: listener)
}
func shutdown() {
ZoomToolSuiteAPI.uninitSDK()
}
}
Start or Join
let join = ZoomToolSuiteJoinMeetingParam()
join.displayName = "Display Name"
join.meetingNumber = 1234567890
join.password = ""
let submitted = ZoomToolSuiteAPI.PreMeeting.Launch.joinMeeting(param: join) { result in
guard result.error_code == .success else {
return
}
}
submitted means the SDK accepted the call for processing. The completion result and subsequent meeting-status callbacks determine the actual outcome.
Implementation Guardrails
- Wait for auth success and
.connectedIPC status before calling pre-meeting APIs. - Wait for
.inMeetingbefore calling meeting feature APIs. - Use the relevant
ZoomToolSuiteMeetingInstancefor default meeting, green room, or breakout-room contexts. - Check host/co-host role and feature capability before privileged operations.
- Keep UI updates on the AppKit main thread if callbacks arrive on another thread.
- Do not embed client secrets in a distributed macOS app. Use PKCE/public-client behavior or a backend token exchange appropriate to the Marketplace app configuration.
- Re-sign packaged frameworks and libraries with the application's signing identity.
Feature Routing
| Task | API family |
|---|---|
| Start/join, settings window, URL navigation | ZoomToolSuiteAPI.PreMeeting.Launch |
| Status, properties, leave/end, statistics | ZoomToolSuiteAPI.Meeting.MeetingAPI |
| Roster, roles, permissions, host controls | ZoomToolSuiteAPI.Meeting.Participants |
| Mute, unmute, mute on entry | ZoomToolSuiteAPI.Meeting.Audio |
| Camera, pin, spotlight, avatar | ZoomToolSuiteAPI.Meeting.Video |
| Share application, monitor, camera, file, audio, frame, whiteboard | ZoomToolSuiteAPI.Meeting.Share |
| Recording, waiting room, chat/UI, captions, Q&A, webinar | Matching ZoomToolSuiteAPI.Meeting.* namespace |
| Device selection and audio/video processing settings | ZoomToolSuiteAPI.Setting.Audio and .Video |