Swift Markdown Kit · DOCS

API 参考

API 参考

视图与控制器

类型用途
MarkdownRenderViewSwiftUI,单文档。
MarkdownRenderViewControllerUIKit,单文档。
MarkdownChatRenderViewSwiftUI,整段会话。
MarkdownChatRenderViewControllerUIKit,整段会话。
MarkdownChatRenderProxy命令式控制 SwiftUI 的会话视图。
MarkdownRenderKitversion、bridgeVersion、licenseDiagnostics()。

单文档方法

render(_:) · renderStream(_:) · startStreaming() · appendChunk(_:isFinal:) · finishStreaming() · clear() · reload() · contentHeight · licenseStatus

会话方法

setMessages(_:) · appendMessage(_:) · updateMessage(_:) · appendChunk(_:to:isFinal:) · appendReasoningChunk(_:to:isFinal:) · finishReasoning(for:) · setReasoningExpanded(_:for:) · finishMessage(_:) · removeMessage(_:) · clear() · scrollToBottom(animated:) · contentHeight · licenseStatus

MarkdownRenderOptions

选项默认值含义
colorScheme.auto.auto、.light、.dark。
theme.system.system 或 .github,可叠加 token 覆盖。
extensions[]自定义行内语法。
interaction.automatic链接与图片点击归谁处理。
isScrollEnabledtrue嵌进自己的滚动视图时关掉。
backgroundColor.clear渲染器背景。
contentPadding四周 16pt内容与边缘的间距。
bottomGap0最后一块下方的额外空间,给覆盖的输入框预留。
markdown见下解析能力开关。
streamingMode.incremental.fullRerender 每次刷新都全量重渲染。
longBlockStreaming.throttled.deferred 会等长块完成后一次画出。
longBlockThreshold512超过多少字符启用上面的策略。
baseFontSize16Dynamic Type 缩放前的基准字号。
respectsDynamicTypetrue跟随系统字号。
minFontScale / maxFontScale0.85 / 1.6Dynamic Type 倍率的上下限。
heightChangeDebounceInterval0.08流式期间高度上报的防抖间隔。
copyText / copiedText / copyFailedText"Copy" …代码块复制按钮的文案。

MarkdownRenderLocalization

SDK 自身文案的语言开关与文案本身。详见多语言。

成员含义
language.automatic(默认,跟随设备)、.english、.simplifiedChinese、.custom(_:)。
availableLanguages本次构建提供的语言代码,例如 ["en", "zh-Hans"]。
codeCopy / codeCopied / codeCopyFailed解析后的代码块复制按钮文案。
messageCopy / messageCopied / messageRetry / messageEdit解析后的消息操作辅助功能标签。
reasoningThinking / reasoningCompleted / reasoningDuration解析后的推理折叠区标题。

MarkdownRenderOptions.MarkdownConfig

选项默认值
allowRawHTMLfalse
linkifytrue
typographertrue
breaksfalse
taskListstrue
emojitrue
mathtrue
reasoning已启用

MarkdownChatRenderOptions

选项默认值含义
renderOptions——上面那套单文档选项,作用于每一条消息。
interaction.automaticrenderOptions.interaction 的快捷入口。
reasoning已启用推理折叠。
messageActions仅复制每条消息的操作条。
streamingPresentation.smooth.immediate 来一个 chunk 显示一个。
autoScrollBehavior.nearBottom还有 .always、.never。
preservesUserScrolltrue读者往上翻后停止跟随。
bottomThreshold96距底部多少点仍算「在底部」。
messageSpacing14消息之间的间距(点)。
maxMessageWidth.full阅读栏宽度。
userMessageMaxWidth.fraction(0.82)用户自己气泡的宽度。
chunkCoalescingInterval1/30 秒送进 WebView 前的 token 聚合时长,0 表示不聚合。

事件

单文档是 MarkdownRenderEvent,会话是 MarkdownChatRenderEvent。会话版多了 viewportChanged 和 messageAction,并且会给每个 action 附上它来自哪条消息。

事件触发时机
.ready渲染器加载完成,排队的命令开始执行。
.rendered(height:)每个内容周期恰好两次:首帧上屏,以及最终 flush。
.heightChanged(_)期间的高度变化 —— 流式、图片加载、Dynamic Type。流式中会防抖。
.viewportChanged(_)滚动位置与是否接近底部。
.messageAction(_)消息上的复制、重试或编辑被点击。
.action(_)下面全部。
.error(_)结构化失败,带稳定的 code。

Actions

请求 —— 你不处理就没有任何反应:

Action含义
.linkTapped(URL)链接被点击,且 interaction.links 为 .handledByHost。
.imageTapped(URL?)图片被点击,且 interaction.images 为 .handledByHost。
.extensionTapped(name:action:value:)自定义行内扩展被点击。
.custom(name:payload:)无法识别的 bridge 消息。

通知 —— SDK 已经做完了:

Action含义
.didOpenLink(URL)已在应用内浏览器打开;mailto/tel 交给系统。
.didPresentImage(URL)已弹出内置预览器。
.linkBlocked(url:scheme:)scheme 不在 allowedLinkSchemes 内,没有打开任何东西。
.codeCopied(text:language:)已复制到剪贴板。
.codeCopyFailed(text:language:error:)复制失败。
.reasoningToggled(isExpanded:)读者展开或收起了推理折叠。
.taskToggled(isChecked:text:)任务列表的勾选状态变化。

错误码

MarkdownRenderError 带有 reason、可读的 message,以及适合打点的稳定 code。

code含义
licenseMissingCopy Bundle Resources 里没有 .smklicense。
licenseInvalid信封格式不对、签名错误,或 payload 非法。
licenseUnknownSigningKey由本 SDK 不信任的密钥签发 —— 最常见的是测试环境签发的授权配了生产 SDK。
licenseWrongIssuerEnvironment由 sandbox 签发方签发,生产 SDK 只接受 production。
licenseUnauthorizedTeamIdApp 的签名团队与授权不一致。
licenseTeamIdentifierUnavailable读不到 Team ID —— 在模拟器上属于预期。
licenseUnauthorizedBundleId当前 bundle identifier 不在授权覆盖范围内。
expiredTrialLicense试用授权已超过 validUntil。
sdkReleaseNotCovered这个 SDK 构建的发布时间晚于授权的 updatesUntil,需要续期才能使用。
releaseMetadataMissingFramework 缺少发布时间元数据 —— 构建本身有问题。
resourceMissing / resourceInvalid / resourceKeyInvalid / resourceDecryptionFailed内置渲染核心加载失败。
webViewLoadFailedWebView 加载渲染器失败。
webContentProcessTerminatedWebKit 回收了内容进程;SDK 会自动重载并回放。
renderFailed / serializationFailed / copyFailed某次运行时操作失败。

所有 license* 都是诊断,不是故障。渲染继续进行,只是构建被打上角标。见 授权。

版本

MarkdownRenderKit.version        // SDK 版本,例如 "0.0.10"
MarkdownRenderKit.bridgeVersion  // 原生 ↔ Web 的消息契约版本

Framework 开启了 library evolution。同一大版本内,公开声明只增不改 —— 用旧构建 编译的 App,链接新构建时不需要重新编译。