Skip to main content
Version: 7.0

Release notes

This page provides the release notes of PlanetKit 7.0 for iOS/macOS.

PlanetKit 7.0

Release date: 2026-04-24

Unify logging path and level configuration

The logging and path configuration APIs in PlanetKitInitialSettingBuilder have been simplified.

  • The separate withEnableKitLogKey, withSetKitBasePathKey, and withSetKitLogFilePathKey methods are replaced with withEnableLog(logOption:) and withSetPlanetKitSystemDirectory(path:).
  • A new PlanetKitLogOption class provides two factory methods for log configuration: size-limited logging with rotation, and unlimited logging with an optional custom file name.

API

Changed
  • PlanetKitInitialSettingBuilder class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    func withEnableKitLogKey(level: PlanetKitLogLevel, enable: Bool, logSize: PlanetKitLogSizeLimit) -> PlanetKitInitialSettingBuilderfunc withEnableLog(logOption: PlanetKitLogOption) -> PlanetKitInitialSettingBuilder
    func withSetKitBasePathKey(path: String) throws -> PlanetKitInitialSettingBuilderfunc withSetPlanetKitSystemDirectory(path: String) throws -> PlanetKitInitialSettingBuilder
Added
  • PlanetKitLogOption class 1-to-1 callGroup call
    • let logDirectory: String
    • let logLevel: PlanetKitLogLevel
    • let logFileName: String?
    • static func withSizeLimitUnlimited(logDirectory: String, logFileName: String?, logLevel: PlanetKitLogLevel = .simple) -> PlanetKitLogOption?
    • static func withSizeLimit(logDirectory: String, logLevel: PlanetKitLogLevel = .simple, logSizeLimit: PlanetKitLogSizeLimit = .large) -> PlanetKitLogOption?
Removed
  • PlanetKitInitialSettingBuilder class 1-to-1 callGroup call

    • func withSetKitLogFilePathKey(filePath: String) -> PlanetKitInitialSettingBuilder
  • PlanetKitLogLevel enum 1-to-1 callGroup call

    • case silent
  • PlanetKitLogSizeLimit enum 1-to-1 callGroup call

    • case unlimited

Example code

Configure logging with size limit (rotation enabled)
let logDirectory = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!
.appendingPathComponent("PlanetKitLogs")
try! FileManager.default.createDirectory(at: logDirectory, withIntermediateDirectories: true)

let logOption = PlanetKitLogOption.withSizeLimit(
logDirectory: logDirectory.path,
logLevel: .simple,
logSizeLimit: .small
)

let settings = PlanetKitInitialSettingBuilder()
.withEnableLog(logOption: logOption!)
.build()
Configure logging without size limit
let logOption = PlanetKitLogOption.withSizeLimitUnlimited(
logDirectory: logDirectory.path,
logFileName: "myapp.log",
logLevel: .vital
)

let settings = PlanetKitInitialSettingBuilder()
.withEnableLog(logOption: logOption!)
.build()

Remove deprecated API key authentication and peer video/screen share request methods

Removed deprecated API key-based authentication, legacy peer video request methods, and legacy peer screen share request methods. Use access token-based authentication and methods of PlanetKitPeerControl instead.

API

Removed
  • PlanetKitCallParam class 1-to-1 call

    • var APIKey: String?
    • init(myUserId: PlanetKitUserId, peerUserId: PlanetKitUserId, delegate: PlanetKitCallDelegate, APIKey: String)
  • PlanetKitCall class 1-to-1 call

    • let APIKey: String?
  • PlanetKitConferenceParam class Group call

    • var APIKey: String?
    • init(myUserId: PlanetKitUserId, roomId: String, roomServiceId: String, displayName: String?, delegate: PlanetKitConferenceDelegate, APIKey: String)
  • PlanetKitConference class Group call

    • let APIKey: String?
    • func requestPeerVideo(id: PlanetKitUserId, maxResolution: PlanetKitVideoResolution, delegate: PlanetKitVideoOutputDelegate, subgroupName: String?, completion: @escaping (Bool)->Void)
    • func requestPeerVideo(id: PlanetKitUserId, maxResolution: PlanetKitVideoResolution, delegate: PlanetKitVideoOutputDelegate, subgroupName: String?, resolution: @escaping (Bool, PlanetKitVideoResolution, PlanetKitVideoResolution, String)->Void)
    • func stopPeerVideo(id: PlanetKitUserId, subgroupName: String?, completion: @escaping (Bool)->Void)
    • func requestPeerScreenShare(peerId: PlanetKitUserId, subgroupName: String?, completion: @escaping (Bool)->Void)
    • func stopPeerScreenShare(peerId: PlanetKitUserId, subgroupName: String?, completion: @escaping (Bool)->Void)
  • PlanetKitStartFailReason enum 1-to-1 callGroup call

    • case invalidAPIKey

Add detailed failure reasons for sending short data

The completion callback of sendShortData now returns a PlanetKitSendShortDataFailReason instead of Bool, providing detailed failure information such as invalid parameters, data size limits, rate limiting, and timeout.

API

Changed
  • PlanetKitCall class 1-to-1 call

    PreviousPlanetKit 7.0
    func sendShortData(type: String, data: Data, completion: @escaping (Bool)->Void)func sendShortData(type: String, data: Data, completion: @escaping (PlanetKitSendShortDataFailReason)->Void)
  • PlanetKitConference class Group call

    PreviousPlanetKit 7.0
    func sendShortData(peerId: PlanetKitUserId, type: String, data: Data, completion: @escaping (Bool)->Void)func sendShortData(peerId: PlanetKitUserId, type: String, data: Data, completion: @escaping (PlanetKitSendShortDataFailReason)->Void)
    func sendShortData(type: String, data: Data, completion: @escaping (Bool)->Void)func sendShortData(type: String, data: Data, completion: @escaping (PlanetKitSendShortDataFailReason)->Void)
Added
  • PlanetKitSendShortDataFailReason enum 1-to-1 callGroup call
    • case none - No failure
    • case invalidParameter - Invalid input parameters (e.g., empty data)
    • case tooLongDataType - Data type exceeds 100 bytes
    • case tooLongData - Data payload exceeds 800 bytes
    • case tooFrequent - Rate limit exceeded (max once per second)
    • case timeout - Sending operation timed out
    • case internalError - Internal error

Deliver a screen share disabled reason

When a peer stops screen share, the disabledReason is now delivered to the other participants.

  • In group calls, PlanetKitPeerControlDelegate.didUpdateScreenShare and PlanetKitConferenceScreenShareUpdateParam now include disabledReason.
  • In 1-to-1 calls, the reason parameter type of PlanetKitCallDelegate.peerDidStopScreenShare has been changed from Int32 to NSNumber?.
  • Valid range for disabledReason: 0–39.

API

Changed
  • PlanetKitPeerControlDelegate protocol Group call

    PreviousPlanetKit 7.0
    func didUpdateScreenShare(_ peerControl: PlanetKitPeerControl, subgroup: PlanetKitSubgroup, status: PlanetKitScreenShareStatus)func didUpdateScreenShare(_ peerControl: PlanetKitPeerControl, subgroup: PlanetKitSubgroup, status: PlanetKitScreenShareStatus, disabledReason: NSNumber?)
  • PlanetKitCallDelegate protocol 1-to-1 call

    PreviousPlanetKit 7.0
    func peerDidStopScreenShare(_ call: PlanetKitCall, reason: Int32)func peerDidStopScreenShare(_ call: PlanetKitCall, reason: NSNumber?)
Added
  • PlanetKitConferenceScreenShareUpdateParam class Group call
    • let disabledReason: NSNumber?

Restrict PlanetKitVideoBuffer member modification in the video modifier

All properties of PlanetKitVideoBuffer except sampleBuffer are now read-only to prevent unintended modifications in the video modifier.

  • When modifying sampleBuffer, the following constraints are enforced. If violated, the frame is dropped and an error is reported via didEncounterError(_:):
    • Upscaling beyond the original resolution is not allowed.
    • Changing the pixel format is not allowed.

API

Changed
  • PlanetKitVideoBuffer class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    var timestamp: CMTimelet timestamp: CMTime
    var rotation: PlanetKitVideoRotationlet rotation: PlanetKitVideoRotation
    var position: PlanetKitCameraPositionlet position: PlanetKitCameraPosition
    var sender: PlanetKitUserId?let sender: PlanetKitUserId?
    var source: PlanetKitVideoSourcelet source: PlanetKitVideoSource
Added
  • PlanetKitVideoModifierDelegate protocol 1-to-1 callGroup call

    • func didEncounterError(_ error: PlanetKitVideoModifierError)
  • PlanetKitVideoModifierError enum 1-to-1 callGroup call

    • case videoFrameRejectedByUpscaling
    • case videoFrameRejectedByFormatChange

Example code

Handling video modifier errors
class MyVideoModifier: PlanetKitVideoModifierDelegate {
func videoOutput(_ videoBuffer: PlanetKitVideoBuffer) {
guard let sampleBuffer = videoBuffer.sampleBuffer else { return }
// Apply filter with resolution <= original and same pixel format
videoBuffer.sampleBuffer = applyFilter(to: sampleBuffer)
}

func didEncounterError(_ error: PlanetKitVideoModifierError) {
switch error {
case .videoFrameRejectedByUpscaling:
print("Upscaling is not allowed.")
case .videoFrameRejectedByFormatChange:
print("Changing pixel format is not allowed.")
}
}
}

Improve video and screen share modifier APIs

Removed duplicated video modifier and receiver properties from PlanetKitCall and PlanetKitConference. Use PlanetKitCameraManager.modifier instead.

  • PlanetKitCameraManager.previewModifier has been renamed to modifier to reflect that it affects the outgoing video stream, not just preview.
  • PlanetKitVideoStream.modifier has been removed to avoid duplication with PlanetKitCameraManager.modifier.
  • For screen share modification, use the newly added myScreenShareModifier property.

API

Changed
  • PlanetKitCameraManager class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    var previewModifier: PlanetKitVideoModifierDelegate?var modifier: PlanetKitVideoModifierDelegate?
Added
  • PlanetKitCall class 1-to-1 call

    • weak var myScreenShareModifier: PlanetKitVideoModifierDelegate?
  • PlanetKitConference class Group call

    • weak var myScreenShareModifier: PlanetKitVideoModifierDelegate?
Removed
  • PlanetKitCall class 1-to-1 call

    • weak var myVideoModifier: PlanetKitVideoModifierDelegate?
  • PlanetKitConference class Group call

    • weak var myVideoModifier: PlanetKitVideoModifierDelegate?
    • weak var myVideoReceiver: PlanetKitVideoOutputDelegate?
  • PlanetKitVideoStream class 1-to-1 callGroup call

    • weak var modifier: PlanetKitVideoModifierDelegate?

Migration guide

Set video modifier
  • Previous version:
// Option A: via Call/Conference session
call.myVideoModifier = myModifier

// Option B: via VideoStream
call.myVideoStream.modifier = myModifier

// Option C: via CameraManager (preview only)
PlanetKitCameraManager.shared.previewModifier = myModifier
  • New version:
// Use CameraManager.modifier for all video modification
PlanetKitCameraManager.shared.modifier = myModifier
Set screen share modifier
  • Previous version:
call.myScreenShareStream.modifier = myModifier
  • New version:
call.myScreenShareModifier = myModifier

Rename custom audio device reset APIs

Renamed resetCustomMicToDefaultMic() and resetCustomSpeakerToDefaultSpeaker() to clearCustomMic() and clearCustomSpeaker().

API

Changed
  • PlanetKitAudioManager class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    func resetCustomMicToDefaultMic()func clearCustomMic()
    func resetCustomSpeakerToDefaultSpeaker()func clearCustomSpeaker()

Replace preferred sample rate with presets

The type of sample rate properties in PlanetKitAudioManager has been changed from Float64 to the PlanetKitAudioSampleRate enum.

  • The PlanetKitAudioSampleRate enum provides a predefined set of supported sample rates.
  • The configured sample rate is a preferred value. PlanetKit will make a best effort to open the audio session at the configured rate, but may fall back to the nearest supported rate.

API

Changed
  • PlanetKitAudioManager class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    var defaultMicSampleRate: Float64 { get set }var defaultMicSampleRate: PlanetKitAudioSampleRate { get set }
    var defaultSpeakerSampleRate: Float64 { get set }var defaultSpeakerSampleRate: PlanetKitAudioSampleRate { get set }
Added
  • PlanetKitAudioSampleRate enum 1-to-1 callGroup call
    • case sampleRate16k - 16,000 Hz
    • case sampleRate32k - 32,000 Hz
    • case sampleRate48k - 48,000 Hz
    • var floatValue: Float64

Correct typos in API names

Fixed typos in API names for correctness and naming consistency.

API

Changed
  • PlanetKitAudioManager class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    func startMicPreview(_ preview: PlanetKitAudioMicPreviewDelegate, volumeInternal: TimeInterval) -> Boolfunc startMicPreview(_ preview: PlanetKitAudioMicPreviewDelegate, volumeInterval: TimeInterval) -> Bool
  • PlanetKitStatistics.Video class 1-to-1 callGroup call

    PreviousPlanetKit 7.0
    let witdh: UInt16let width: UInt16
  • PlanetKitStatistics.PeerVideo class Group call

    PreviousPlanetKit 7.0
    let subGroupName: String?let subgroupName: String?
  • PlanetKitStatistics.PeerScreenShare class Group call

    PreviousPlanetKit 7.0
    let subGroupName: String?let subgroupName: String?

(iOS) Remove hardware in PlanetKitAutoGainControlMode

On iOS, the hardware case of PlanetKitAutoGainControlMode has been removed.

API

Removed
  • (iOS only) PlanetKitAutoGainControlMode enum 1-to-1 callGroup call
    • case hardware

(macOS) Add hardwareEchoTolerance in PlanetKitAutoGainControlMode

Added hardwareEchoTolerance case to PlanetKitAutoGainControlMode on macOS. It adjusts the input gain based on the speaker's voice level, even when echo is present in the environment.

API

Added
  • (macOS only) PlanetKitAutoGainControlMode enum 1-to-1 callGroup call
    • case hardwareEchoTolerance