import AppIntents #if canImport(UIKit) import UIKit #elseif canImport(AppKit) import AppKit #endif // 「上传剪贴板」动作:读本机剪贴板文本,经控件专用会话推到云剪贴板。控制中心控件与主屏小组件按钮 // 共用此 intent。App 外触发时经 WidgetFeedback 弹本地通知反馈成功 / 失败(#6)。 struct UploadClipboardIntent: AppIntent { static var title: LocalizedStringResource = "上传剪贴板" static var description = IntentDescription("把本机剪贴板内容上传到 Commilitia Drop 云剪贴板") func perform() async throws -> some IntentResult { #if os(macOS) let text = await MainActor.run { NSPasteboard.general.string(forType: .string) ?? "" } #else let text = await MainActor.run { UIPasteboard.general.string ?? "" } #endif guard !text.isEmpty else { await WidgetFeedback.post(t("ios.clipboard.empty")) return .result() } do { try await ClipboardClient.upload(text) await WidgetFeedback.post(t("ios.clipboard.uploaded")) } catch ClipboardClient.ClientError.noSession { await WidgetFeedback.post(t("ios.widget.needApp")) } catch { await WidgetFeedback.post(t("ios.clipboard.failed")) } return .result() } } // 「拉取剪贴板」动作:拉云剪贴板内容写入本机剪贴板。同上,App 外触发弹本地通知反馈。 struct PullClipboardIntent: AppIntent { static var title: LocalizedStringResource = "拉取剪贴板" static var description = IntentDescription("把 Commilitia Drop 云剪贴板内容写入本机剪贴板") func perform() async throws -> some IntentResult { do { let text = try await ClipboardClient.pull() if text.isEmpty { await WidgetFeedback.post(t("ios.clipboard.empty")) } else { #if os(macOS) await MainActor.run { NSPasteboard.general.clearContents() NSPasteboard.general.setString(text, forType: .string) } #else await MainActor.run { UIPasteboard.general.string = text } #endif await WidgetFeedback.post(t("ios.clipboard.pulled")) } } catch ClipboardClient.ClientError.noSession { await WidgetFeedback.post(t("ios.widget.needApp")) } catch { await WidgetFeedback.post(t("ios.clipboard.failed")) } return .result() } }