- RevueSDK
- FriendManager
- sendMessage(friendId:message:timeout:)
Instance Method
sendMessage(friendId:message:timeout:)
發送文字訊息給好友並等待送達確認。
@discardableResult func sendMessage(friendId: String, message: String, timeout: TimeInterval = 10) async throws -> UInt32Parameters
- friendId
好友 Base58 ID
- message
訊息內容(UTF-8)
- timeout
等待 delivery receipt 的最長秒數。範圍 5~30 秒,預設 10 秒; 超出範圍不報錯、自動限制:大於 30 用 30,小於 5(含 0、負數)用 5; NaN 沒有大小可比,用預設的 10 秒
Return Value
對方裝置已收到時回傳 toxcore 分配的 messageId
Discussion
此方法會 await 直到兩種情況之一發生:
對方裝置的 toxcore 收到封包並回 ACK → return messageId
超過
timeout秒數沒收到 ACK → throw.timeout(messageId:)
v0.17.0 起送出前不以 paths 預判可達性(契約 @invariant 3:bitmap 歸零期間 C 層 仍在重連):送出前不檢查 isOnline,一律直接交給 C 層、由回傳碼決定成敗。 送出之後 paths 歸零則提前以 .timeout 收尾(見 handleFriendPathsChange)。
並行呼叫支援:多筆 sendMessage 可以並行呼叫,每筆獨立 await,互不影響。
接收端不去重:如果發送端 timeout 後重送,對方 toxcore 可能實際上已經收到第一筆, 導致對方 App 收到兩筆相同內容。去重邏輯由應用層在 message payload 中自行處理。
Throws
FriendMessageError.invalidArgument— 好友不存在、ID 格式錯誤或訊息為空(C -1/-2)
FriendMessageError.notInitialized— SDK 尚未初始化(C -4)
FriendMessageError.friendNotReachable— 對方無可用 path(C -20,可重試)
FriendMessageError.messageTooLong— 訊息過長(C -30)
FriendMessageError.sendQueueFull— 發送佇列已滿(C -34,可重試)
FriendMessageError.failed(code:)— C 層回傳未對映的錯誤碼
FriendMessageError.timeout(messageId:)— 等待超過 timeout 秒數
CancellationError—Revue.shared.destroy()觸發 cancelAllPending好友存在性不再由本方法預先檢查,一律交給 C 層判定(回
-2→.invalidArgument):原前置檢查isFriendExists需解析整份好友清單, 是 async 暫停點、多則併發時造成 msgId 亂序配發。