Mainstream messaging
iMessage
وضعیت: یکپارچهسازی بومی با CLI خارجی. Gateway، imsg rpc را اجرا میکند و از طریق stdio با JSON-RPC ارتباط میگیرد — بدون daemon یا درگاه جداگانه. برای داشتن یک کانال کامل iMessage، حالت API خصوصی قویاً توصیه میشود؛ پاسخها، tapbackها، جلوهها، نظرسنجیها، پاسخ به پیوستها و عملیات گروهی به imsg launch و کاوش موفق API خصوصی نیاز دارند.
برای راهاندازی محلی رایج، راهانداز OpenClaw میتواند نصب یا بهروزرسانی imsg با Homebrew را، پس از تأیید کاربر، روی Mac واردشده به Messages پیشنهاد دهد. راهاندازی دستی و توپولوژیهای پوشش SSH همچنان تحت مدیریت اپراتور هستند: imsg را در همان زمینه کاربری نصب یا بهروزرسانی کنید که Gateway یا پوشش را اجرا خواهد کرد.
پاسخها، tapbackها، جلوهها، نظرسنجیها، پیوستها و مدیریت گروه.
پیامهای خصوصی iMessage بهطور پیشفرض از حالت جفتسازی استفاده میکنند.
وقتی Gateway روی Mac مربوط به Messages اجرا نمیشود، از یک پوشش SSH استفاده کنید.
مرجع کامل فیلدهای iMessage.
راهاندازی سریع
Mac محلی (مسیر سریع)
نصب و تأیید imsg
brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg rpc --helpimsg launchopenclaw channels status --probeوقتی راهنمای راهاندازی محلی نبود فرمان پیشفرض imsg را تشخیص دهد، میتواند نصب steipete/tap/imsg از طریق Homebrew را پیشنهاد کند. اگر imsg مدیریتشده با Homebrew را تشخیص دهد، میتواند نصب مجدد یا بهروزرسانی آن را پیشنهاد کند. پوششهای سفارشی cliPath تغییر داده نمیشوند.
پیکربندی OpenClaw
{channels: {imessage: {enabled: true,cliPath: "/usr/local/bin/imsg",dbPath: "/Users/user/Library/Messages/chat.db",},},}راهاندازی Gateway
openclaw gatewayتأیید نخستین جفتسازی پیام خصوصی (dmPolicy پیشفرض)
openclaw pairing list imessageopenclaw pairing approve imessage <CODE>درخواستهای جفتسازی پس از 1 ساعت منقضی میشوند.
Mac راهدور از طریق SSH
بیشتر راهاندازیها به SSH نیاز ندارند. فقط زمانی از این توپولوژی استفاده کنید که Gateway نتواند روی Mac واردشده به Messages اجرا شود. OpenClaw فقط به یک cliPath سازگار با stdio نیاز دارد؛ بنابراین میتوانید cliPath را به اسکریپت پوششی هدایت کنید که با SSH به Mac راهدور متصل میشود و imsg را اجرا میکند.
imsg را روی همان Mac راهدور نصب و بهروزرسانی کنید، نه روی میزبان Gateway:
ssh messages-mac 'brew install steipete/tap/imsg && brew update && brew upgrade imsg'#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"پیکربندی توصیهشده هنگام فعالبودن پیوستها:
{channels: {imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "user@gateway-host", // برای دریافت پیوستها با SCP استفاده میشود includeAttachments: true, // اختیاری: ریشههای مجاز اضافی برای پیوستها (با مقدار پیشفرض // /Users/*/Library/Messages/Attachments ادغام میشوند). attachmentRoots: ["/Users/*/Library/Messages/Attachments"], remoteAttachmentRoots: ["/Users/*/Library/Messages/Attachments"],},},}اگر remoteHost تنظیم نشده باشد، OpenClaw تلاش میکند آن را با تجزیه اسکریپت پوشش SSH بهطور خودکار تشخیص دهد.
remoteHost باید host یا user@host باشد (بدون فاصله یا گزینههای SSH)؛ مقادیر ناامن نادیده گرفته میشوند.
OpenClaw برای SCP از بررسی سختگیرانه کلید میزبان استفاده میکند؛ بنابراین کلید میزبان رله باید از قبل در ~/.ssh/known_hosts وجود داشته باشد.
مسیرهای پیوست با ریشههای مجاز (attachmentRoots / remoteAttachmentRoots) اعتبارسنجی میشوند.
الزامات و مجوزها (macOS)
- Messages باید روی Mac اجراکننده
imsgوارد حساب شده باشد. - دسترسی کامل به دیسک برای زمینه فرایندی که OpenClaw/
imsgرا اجرا میکند الزامی است (برای دسترسی به پایگاه داده Messages). - مجوز Automation برای ارسال پیام از طریق Messages.app الزامی است.
- برای عملیات پیشرفته (واکنش / ویرایش / لغو ارسال / پاسخ رشتهای / جلوهها / نظرسنجیها / عملیات گروهی)، System Integrity Protection باید غیرفعال باشد — فعالسازی API خصوصی imsg را ببینید. ارسال و دریافت پایه متن و رسانه بدون آن کار میکند.
ارسال از طریق پوشش SSH با AppleEvents -1743 ناموفق است
یک راهاندازی SSH راهدور ممکن است بتواند گفتوگوها را بخواند، channels status --probe را با موفقیت اجرا کند و پیامهای ورودی را پردازش کند، اما ارسالهای خروجی همچنان با خطای مجوز AppleEvents شکست بخورند:
مجوز ارسال رویدادهای Apple به Messages وجود ندارد. (-1743)پایگاه داده TCC کاربر واردشده به Mac یا System Settings > Privacy & Security > Automation را بررسی کنید. اگر ورودی Automation بهجای فرایند imsg یا پوسته محلی برای /usr/libexec/sshd-keygen-wrapper ثبت شده باشد، ممکن است macOS یک کلید قابلاستفاده Messages برای آن کلاینت سمت سرور SSH ارائه نکند:
kTCCServiceAppleEvents | /usr/libexec/sshd-keygen-wrapper | auth_value=0 | com.apple.MobileSMSدر این وضعیت، تکرار tccutil reset AppleEvents یا اجرای مجدد imsg send از طریق همان پوشش SSH ممکن است همچنان شکست بخورد، زیرا زمینه فرایندی که به Automation برای Messages نیاز دارد پوشش SSH است، نه برنامهای که رابط کاربری بتواند به آن مجوز دهد.
بهجای آن، از یکی از زمینههای فرایندی پشتیبانیشده imsg استفاده کنید:
- Gateway، یا دستکم پل
imsg، را در نشست محلی کاربر واردشده به Messages اجرا کنید. - پس از اعطای دسترسی کامل به دیسک و Automation از همان نشست، Gateway را با یک LaunchAgent برای آن کاربر راهاندازی کنید.
- اگر توپولوژی SSH دوکاربره را حفظ میکنید، پیش از فعالسازی کانال بررسی کنید که ارسال واقعی خروجی با
imsg sendاز طریق همان پوشش دقیقاً موفق میشود. اگر امکان اعطای Automation به آن وجود ندارد، بهجای اتکا به پوشش SSH برای ارسالها، راهاندازی تککاربرهimsgرا پیکربندی کنید.
فعالسازی API خصوصی imsg
imsg با دو حالت عملیاتی عرضه میشود. برای OpenClaw، حالت API خصوصی راهاندازی توصیهشده است، زیرا عملیات بومی iMessage مورد انتظار کاربران را در اختیار کانال قرار میدهد. حالت پایه همچنان برای نصبهای کمخطر، تأیید اولیه یا میزبانهایی که SIP در آنها قابل غیرفعالسازی نیست مفید است.
- حالت پایه (پیشفرض، بدون نیاز به تغییر SIP): متن و رسانه خروجی از طریق
send، پایش/تاریخچه ورودی و فهرست گفتوگوها. این همان چیزی است که با یکbrew install steipete/tap/imsgتازه و مجوزهای استاندارد macOS در بالا بهصورت آماده دریافت میکنید. - حالت API خصوصی:
imsgیک dylib کمکی را بهMessages.appتزریق میکند تا توابع داخلیIMCoreرا فراخوانی کند. این کارreact،edit،unsend،reply(رشتهای)،sendWithEffect،pollوpoll-vote(نظرسنجیهای بومی Messages)،renameGroup،setGroupIcon،addParticipant،removeParticipant،leaveGroup، بههمراه نشانگرهای در حال تایپ و رسیدهای خواندن را فعال میکند.
سطح عملیات توصیهشده در این صفحه به حالت API خصوصی نیاز دارد. README مربوط به imsg این الزام را صریحاً بیان میکند:
قابلیتهای پیشرفتهای مانند
read،typing،launch، ارسال غنی با پشتیبانی پل، تغییر پیام و مدیریت گفتوگو اختیاری هستند. آنها به غیرفعالبودن SIP و تزریق یک dylib کمکی بهMessages.appنیاز دارند.imsg launchهنگام فعالبودن SIP از تزریق خودداری میکند.
روش تزریق ابزار کمکی از dylib خود imsg برای دسترسی به APIهای خصوصی Messages استفاده میکند. در مسیر iMessage مربوط به OpenClaw هیچ سرور شخص ثالث یا زماناجرای BlueBubbles وجود ندارد.
راهاندازی
-
imsgرا نصب (یا ارتقا) کنید روی Macی که Messages.app را اجرا میکند:bash brew install steipete/tap/imsgbrew update && brew upgrade imsgimsg --versionimsg status --jsonخروجی
imsg status --json،bridge_version،rpc_methodsوselectorsبهازای هر متد را گزارش میکند تا پیش از شروع ببینید ساخت فعلی از چه قابلیتهایی پشتیبانی میکند. -
محافظت از یکپارچگی سیستم و (در نسخههای جدید macOS) اعتبارسنجی کتابخانه را غیرفعال کنید. تزریق یک dylib کمکی غیر Apple به
Messages.appامضاشده توسط Apple مستلزم خاموشبودن SIP و تسهیل اعتبارسنجی کتابخانه است. مرحله SIP در حالت Recovery به نسخه macOS بستگی دارد:- macOS 10.13-10.15 (Sierra-Catalina): اعتبارسنجی کتابخانه را از طریق Terminal غیرفعال کنید، سیستم را در Recovery Mode راهاندازی مجدد کنید،
csrutil disableرا اجرا کنید و دوباره راهاندازی کنید. - macOS 11+ (Big Sur و نسخههای بعدی)، Intel: وارد Recovery Mode (یا Internet Recovery) شوید،
csrutil disableرا اجرا کنید و دوباره راهاندازی کنید. - macOS 11+، Apple Silicon: برای ورود به Recovery از توالی راهاندازی با دکمه روشن/خاموش استفاده کنید؛ در نسخههای اخیر macOS، هنگام کلیک روی Continue کلید Left Shift را نگه دارید، سپس
csrutil disableرا اجرا کنید. راهاندازیهای ماشین مجازی جریان جداگانهای دارند، بنابراین ابتدا از VM یک snapshot بگیرید.
در macOS 11 و نسخههای بعدی، معمولاً
csrutil disableبهتنهایی کافی نیست. Apple همچنان اعتبارسنجی کتابخانه را برایMessages.appبهعنوان یک باینری پلتفرم اعمال میکند، بنابراین حتی با خاموشبودن SIP نیز یک ابزار کمکی با امضای adhoc رد میشود (Library Validation failed: ... platform binary, but mapped file is not). پس از غیرفعالکردن SIP، اعتبارسنجی کتابخانه را نیز غیرفعال و سیستم را دوباره راهاندازی کنید:bash sudo defaults write /Library/Preferences/com.apple.security.libraryvalidation.plist DisableLibraryValidation -bool truemacOS 26 (Tahoe)، تأییدشده روی 26.5.1: خاموشبودن SIP بههمراه فرمان
DisableLibraryValidationبالا برای تزریق ابزار کمکی در نسخههای 26.0 تا 26.5.x کافی است. هیچ boot-argsای لازم نیست. فایل plist عامل تعیینکننده و رایجترین مرحله فراموششده هنگام شکست تزریق در Tahoe است:- با plist:
imsg launchتزریق میشود وimsg statusمقدارadvanced_features: trueرا گزارش میکند. - بدون plist (حتی با SIP خاموش):
imsg launchباFailed to launch: Timeout waiting for Messages.app to initializeشکست میخورد. AMFI ابزار کمکی adhoc را هنگام بارگذاری رد میکند، بنابراین bridge هرگز آماده نمیشود و راهاندازی به مهلت زمانی میرسد. این مهلت زمانی همان نشانهای است که بیشتر افراد در Tahoe با آن مواجه میشوند؛ راهحل، plist بالا است، نه اقدام شدیدتری.
اگر پس از ارتقای macOS، تزریق
imsg launchیاselectorsمشخصی شروع به بازگرداندن false کردند، معمولاً علت همین گیت است. پیش از آنکه فرض کنید خود مرحله SIP شکست خورده است، وضعیت SIP و اعتبارسنجی کتابخانه را بررسی کنید. اگر این تنظیمات درستاند و bridge همچنان نمیتواند تزریق شود،imsg status --jsonرا بههمراه خروجیimsg launchجمعآوری کنید و بهجای تضعیف کنترلهای امنیتی بیشتر در سراسر سیستم، آن را به پروژهimsgگزارش دهید. - macOS 10.13-10.15 (Sierra-Catalina): اعتبارسنجی کتابخانه را از طریق Terminal غیرفعال کنید، سیستم را در Recovery Mode راهاندازی مجدد کنید،
-
ابزار کمکی را تزریق کنید. با SIP غیرفعال و ورود انجامشده در Messages.app:
bash imsg launchوقتی SIP همچنان فعال باشد،
imsg launchاز تزریق خودداری میکند؛ بنابراین این کار تأییدی نیز بر انجام مرحله 2 است. -
bridge را از OpenClaw تأیید کنید:
bash openclaw channels status --probeورودی iMessage باید
worksرا گزارش کند وimsg status --json | jq '{rpc_methods, selectors}'باید قابلیتهای ارائهشده توسط build نسخه macOS شما را نشان دهد. ایجاد نظرسنجی بهselectors.pollPayloadMessageنیاز دارد؛ رأیدادن هم بهselectors.pollVoteMessageو هم به متد RPC مربوط بهpoll.voteنیاز دارد. Plugin مربوط به OpenClaw فقط کنشهایی را اعلام میکند که probe ذخیرهشده در cache پشتیبانی میکند، درحالیکه cache خالی خوشبینانه باقی میماند و هنگام نخستین dispatch عمل probe را انجام میدهد.
اگر openclaw channels status --probe کانال را بهصورت works گزارش میکند، اما کنشهای مشخص هنگام dispatch خطای «iMessage <action> به bridge مربوط به API خصوصی imsg نیاز دارد» میدهند، دوباره imsg launch را اجرا کنید — ابزار کمکی ممکن است از دسترس خارج شود (راهاندازی مجدد Messages.app، بهروزرسانی سیستمعامل و غیره) و وضعیت cacheشده available: true تا زمانی که probe بعدی آن را تازه کند، همچنان کنشها را اعلام خواهد کرد.
وقتی SIP فعال باقی میماند
اگر غیرفعالکردن SIP برای مدل تهدید شما پذیرفتنی نیست:
imsgبه حالت پایه بازمیگردد — فقط متن + رسانه + دریافت.- Plugin مربوط به OpenClaw همچنان ارسال متن/رسانه و پایش ورودی را اعلام میکند؛ اما
react،edit،unsend،reply،sendWithEffectو عملیات گروه را از سطح کنش پنهان میکند (بر اساس گیت قابلیت هر متد). - میتوانید یک Mac جداگانه غیر Apple-Silicon (یا یک Mac اختصاصی برای ربات) را با SIP خاموش برای بار کاری iMessage اجرا کنید و همزمان SIP را در دستگاههای اصلی خود فعال نگه دارید. بخش کاربر اختصاصی ربات در macOS (هویت جداگانه iMessage) را در ادامه ببینید.
کنترل دسترسی و مسیریابی
سیاست پیام مستقیم
channels.imessage.dmPolicy پیامهای مستقیم را کنترل میکند:
pairing(پیشفرض)allowlist(حداقل به یک ورودیallowFromنیاز دارد)open(لازم استallowFromشامل"*"باشد)disabled
فیلد فهرست مجاز: channels.imessage.allowFrom.
ورودیهای فهرست مجاز باید فرستندگان را مشخص کنند: handleها یا گروههای ثابت دسترسی فرستنده (accessGroup:<name>). برای مقصدهای گفتوگو مانند chat_id:*، chat_guid:* یا chat_identifier:* از channels.imessage.groupAllowFrom استفاده کنید؛ برای کلیدهای عددی رجیستری chat_id از channels.imessage.groups استفاده کنید.
سیاست گروه + اشارهها
channels.imessage.groupPolicy مدیریت گروه را کنترل میکند:
allowlist(پیشفرض)opendisabled
فهرست مجاز فرستندگان گروه: channels.imessage.groupAllowFrom.
ورودیهای groupAllowFrom میتوانند به گروههای ثابت دسترسی فرستنده (accessGroup:<name>) نیز ارجاع دهند.
بازگشت Runtime: اگر groupAllowFrom تنظیم نشده باشد، بررسی فرستندگان گروه iMessage از allowFrom استفاده میکند؛ وقتی پذیرش پیام مستقیم و گروه باید متفاوت باشد، groupAllowFrom را تنظیم کنید. مقدار صراحتاً خالی groupAllowFrom: [] بازگشت انجام نمیدهد — همه فرستندگان گروه را تحت allowlist مسدود میکند.
نکته Runtime: اگر channels.imessage کاملاً وجود نداشته باشد، Runtime به groupPolicy="allowlist" بازمیگردد و یک هشدار ثبت میکند (حتی اگر channels.defaults.groupPolicy تنظیم شده باشد).
گیت اشاره برای گروهها:
- iMessage هیچ فراداده بومی برای اشاره ندارد
- تشخیص اشاره از الگوهای regex استفاده میکند (
agents.entries.*.groupChat.mentionPatterns، با بازگشت بهmessages.groupChat.mentionPatterns) - بدون الگوهای پیکربندیشده، گیت اشاره قابل اعمال نیست
- فرمانهای کنترلی از فرستندگان مجاز، گیت اشاره را دور میزنند
systemPrompt برای هر گروه:
هر ورودی زیر channels.imessage.groups.* یک رشته اختیاری systemPrompt میپذیرد که در هر نوبتی که پیامی از آن گروه را مدیریت میکند، به اعلان سیستمی عامل تزریق میشود. تفکیک آن مشابه channels.whatsapp.groups است:
- اعلان سیستمی مخصوص گروه (
groups["<chat_id>"].systemPrompt): وقتی ورودی گروه مشخص در map وجود داشته باشد و کلیدsystemPromptآن تعریف شده باشد، استفاده میشود. اگرsystemPromptرشتهای خالی ("") باشد، wildcard سرکوب میشود و هیچ اعلان سیستمی برای آن گروه اعمال نمیشود. - اعلان سیستمی wildcard گروه (
groups["*"].systemPrompt): وقتی ورودی گروه مشخص کاملاً در map وجود نداشته باشد، یا وجود داشته باشد اما هیچ کلیدsystemPromptتعریف نکند، استفاده میشود.
{ channels: { imessage: { groupPolicy: "allowlist", groupAllowFrom: ["+15555550123"], groups: { "*": { systemPrompt: "از املای بریتانیایی استفاده کنید." }, "8421": { requireMention: true, systemPrompt: "این گفتوگوی نوبت آمادهباش است. پاسخها را به کمتر از 3 جمله محدود کنید.", }, "9907": { // سرکوب صریح: wildcard «از املای بریتانیایی استفاده کنید.» اینجا اعمال نمیشود systemPrompt: "", }, }, }, },}اعلانهای هر گروه فقط برای پیامهای گروه اعمال میشوند — پیامهای مستقیم تحتتأثیر نیستند.
نشستها و پاسخهای قطعی
- پیامهای مستقیم از مسیریابی مستقیم و گروهها از مسیریابی گروه استفاده میکنند.
- با مقدار پیشفرض
session.dmScope=main، پیامهای مستقیم iMessage در نشست اصلی عامل ادغام میشوند. - نشستهای گروه ایزوله هستند (
agent:<agentId>:imessage:group:<chat_id>). - پاسخها با استفاده از فراداده کانال/مقصد مبدأ، دوباره به iMessage مسیریابی میشوند.
رفتار رشتههای شبیه گروه:
برخی رشتههای iMessage با چند مشارکتکننده ممکن است با is_group=false دریافت شوند.
اگر آن chat_id صراحتاً زیر channels.imessage.groups پیکربندی شده باشد، OpenClaw آن را ترافیک گروه در نظر میگیرد (گیت گروه + ایزولهسازی نشست گروه).
اتصال گفتوگوهای ACP
گفتوگوهای iMessage را میتوان به نشستهای ACP متصل کرد.
جریان سریع اپراتور:
/acp spawn codex --bind hereرا داخل پیام مستقیم یا گفتوگوی گروه مجاز اجرا کنید.- پیامهای آینده در همان گفتوگوی iMessage به نشست ACP ایجادشده مسیریابی میشوند.
/newو/resetهمان نشست ACP متصل را درجا بازنشانی میکنند./acp closeنشست ACP را میبندد و اتصال را حذف میکند.
اتصالهای دائمی پیکربندیشده از ورودیهای سطحبالای bindings[] با type: "acp" و match.channel: "imessage" استفاده میکنند.
match.peer.id میتواند از موارد زیر استفاده کند:
- handle نرمالشده پیام مستقیم مانند
+15555550123یاuser@example.com chat_id:<id>(برای اتصالهای پایدار گروه توصیه میشود)chat_guid:<guid>chat_identifier:<identifier>
مثال:
{ agents: { list: [ { id: "codex", runtime: { type: "acp", acp: { agent: "codex", backend: "acpx", mode: "persistent" }, }, }, ], }, bindings: [ { type: "acp", agentId: "codex", match: { channel: "imessage", accountId: "default", peer: { kind: "group", id: "chat_id:123" }, }, acp: { label: "codex-group" }, }, ],}برای رفتار مشترک اتصال ACP، بخش عاملهای ACP را ببینید.
الگوهای استقرار
کاربر اختصاصی ربات در macOS (هویت جداگانه iMessage)
از یک Apple ID و کاربر macOS اختصاصی استفاده کنید تا ترافیک ربات از نمایه شخصی Messages شما جدا باشد.
جریان معمول:
- یک کاربر اختصاصی macOS ایجاد کنید/وارد آن شوید.
- در آن کاربر، با Apple ID ربات وارد Messages شوید.
imsgرا در آن کاربر نصب کنید.- یک پوشش SSH ایجاد کنید تا OpenClaw بتواند
imsgرا در زمینهٔ آن کاربر اجرا کند. channels.imessage.accounts.<id>.cliPathو.dbPathرا به پروفایل آن کاربر ارجاع دهید.
نخستین اجرا ممکن است در نشست کاربر ربات به تأییدهای رابط گرافیکی (Automation + Full Disk Access) نیاز داشته باشد.
Mac راهدور از طریق Tailscale (نمونه)
توپولوژی متداول:
- gateway روی Linux/VM اجرا میشود
- iMessage و
imsgروی یک Mac در tailnet شما اجرا میشوند - پوشش
cliPathبرای اجرایimsgاز SSH استفاده میکند remoteHostدریافت پیوستها با SCP را فعال میکند
نمونه:
{ channels: { imessage: { enabled: true, cliPath: "~/.openclaw/scripts/imsg-ssh", remoteHost: "bot@mac-mini.tailnet-1234.ts.net", includeAttachments: true, dbPath: "/Users/bot/Library/Messages/chat.db", }, },}#!/usr/bin/env bashexec ssh -T bot@mac-mini.tailnet-1234.ts.net imsg "$@"از کلیدهای SSH استفاده کنید تا SSH و SCP هر دو غیرتعاملی باشند.
ابتدا مطمئن شوید کلید میزبان مورد اعتماد است (برای مثال ssh bot@mac-mini.tailnet-1234.ts.net) تا known_hosts پر شود.
الگوی چندحسابی
iMessage از پیکربندی جداگانهٔ هر حساب در channels.imessage.accounts پشتیبانی میکند.
هر حساب میتواند فیلدهایی مانند cliPath، dbPath، allowFrom، groupPolicy، mediaMaxMb، تنظیمات تاریخچه و فهرستهای مجاز ریشهٔ پیوستها را بازنویسی کند.
تاریخچهٔ پیام مستقیم
برای مقداردهی اولیهٔ نشستهای جدید پیام مستقیم با تاریخچهٔ رمزگشاییشدهٔ اخیر imsg مربوط به آن مکالمه، channels.imessage.dmHistoryLimit را تنظیم کنید. برای بازنویسیهای مختص هر فرستنده، از channels.imessage.dms["<sender>"].historyLimit استفاده کنید؛ از جمله 0 برای غیرفعالکردن تاریخچهٔ یک فرستنده.
تاریخچهٔ پیام مستقیم iMessage هنگام نیاز از imsg واکشی میشود. تنظیمنکردن dmHistoryLimit مقداردهی اولیهٔ سراسری تاریخچهٔ پیام مستقیم را غیرفعال میکند، اما مقدار مثبت channels.imessage.dms["<sender>"].historyLimit برای هر فرستنده همچنان مقداردهی اولیه را برای همان فرستنده فعال میکند.
رسانه، قطعهبندی و مقصدهای تحویل
پیوستها و رسانه
- دریافت پیوست ورودی بهطور پیشفرض غیرفعال است — برای ارسال عکسها، یادداشتهای صوتی، ویدئو و دیگر پیوستها به عامل،
channels.imessage.includeAttachments: trueرا تنظیم کنید. در صورت غیرفعالبودن آن، iMessageهایی که فقط پیوست دارند پیش از رسیدن به عامل حذف میشوند و ممکن است اصلاً هیچ خط گزارشInbound messageتولید نکنند. - وقتی
remoteHostتنظیم شده باشد، مسیرهای پیوست راهدور را میتوان از طریق SCP واکشی کرد - مسیرهای پیوست باید با ریشههای مجاز مطابقت داشته باشند:
channels.imessage.attachmentRoots(محلی)channels.imessage.remoteAttachmentRoots(حالت SCP راهدور)- ریشههای پیکربندیشده الگوی ریشهٔ پیشفرض
/Users/*/Library/Messages/Attachmentsرا گسترش میدهند (ادغام میشوند، جایگزین نمیشوند)
- SCP از بررسی سختگیرانهٔ کلید میزبان استفاده میکند (
StrictHostKeyChecking=yes) - اندازهٔ رسانهٔ خروجی از
channels.imessage.mediaMaxMbاستفاده میکند (پیشفرض 16 MB)
متن خروجی و قطعهبندی
- محدودیت قطعهٔ متن:
channels.imessage.textChunkLimit(پیشفرض 4000) - حالت قطعهبندی:
channels.imessage.streaming.chunkModelength(پیشفرض)newline(تقسیم ابتدا بر اساس بندها)
- قالببندی ضخیم/مورب/زیرخطدار/خطخوردهٔ Markdown خروجی به متن قالببندیشدهٔ بومی تبدیل میشود (گیرندگان macOS 15+ قالببندی را نمایش میدهند؛ گیرندگان قدیمیتر متن ساده را بدون نشانهها میبینند)؛ جدولهای Markdown مطابق حالت جدول Markdown کانال تبدیل میشوند
channels.imessage.sendTransport(autoپیشفرض،bridge،applescript) چگونگی تحویل ارسالها توسطimsgرا تعیین میکند
قالبهای نشانیدهی
مقصدهای صریح ترجیحی:
chat_id:123(برای مسیریابی پایدار توصیه میشود)chat_guid:...chat_identifier:...
مقصدهای مبتنی بر شناسه نیز پشتیبانی میشوند:
imessage:+1555...sms:+1555...user@example.com
imsg chats --limit 20کنشهای API خصوصی
وقتی imsg launch در حال اجرا است و openclaw channels status --probe مقدار privateApi.available: true را گزارش میکند، ابزار پیام میتواند علاوه بر ارسال عادی متن، از کنشهای بومی iMessage استفاده کند.
همهٔ کنشها بهطور پیشفرض فعالاند؛ برای غیرفعالکردن هر کنش، از channels.imessage.actions استفاده کنید:
{ channels: { imessage: { actions: { reactions: true, edit: true, unsend: true, reply: true, sendWithEffect: true, sendAttachment: true, renameGroup: true, setGroupIcon: true, addParticipant: true, removeParticipant: true, leaveGroup: true, polls: true, }, }, },}کنشهای موجود
- react: افزودن/حذف tapbackهای iMessage (
messageId،emoji،remove). tapbackهای پشتیبانیشده به عشق، پسندیدن، نپسندیدن، خنده، تأکید و پرسش نگاشت میشوند. حذف بدون ایموجی، هر tapback تنظیمشدهای را پاک میکند. - reply: ارسال پاسخ رشتهای به یک پیام موجود (
messageId،textیاmessage، بهعلاوهٔchatGuid،chatId،chatIdentifierیاto). پاسخ همراه پیوست علاوه بر این به ساختی ازimsgنیاز دارد کهsend-richآن از--fileپشتیبانی کند. - sendWithEffect: ارسال متن با یک جلوهٔ iMessage (
textیاmessage،effectیاeffectId). نامهای کوتاه: slam، loud، gentle، invisibleink، confetti، lasers، fireworks، balloon، heart، echo، happybirthday، shootingstar، sparkles، spotlight. - edit: ویرایش پیام ارسالشده در نسخههای پشتیبانیشدهٔ macOS/API خصوصی (
messageId،textیاnewText). فقط پیامهایی که خود Gateway ارسال کرده است قابل ویرایشاند. - unsend: پسگرفتن پیام ارسالشده در نسخههای پشتیبانیشدهٔ macOS/API خصوصی (
messageId). فقط پیامهایی که خود Gateway ارسال کرده است قابل پسگرفتناند. - upload-file: ارسال رسانه/فایلها (
bufferبهصورت base64 یا یکmedia/path/filePathآمادهشده،filename، وasVoiceاختیاری). نام مستعار قدیمی:sendAttachment. - renameGroup، setGroupIcon، addParticipant، removeParticipant، leaveGroup: مدیریت گفتوگوهای گروهی هنگامی که مقصد فعلی یک مکالمهٔ گروهی است. این کنشها هویت Messages میزبان را تغییر میدهند، بنابراین به یک فرستندهٔ مالک یا یک کلاینت Gateway با
operator.adminنیاز دارند. - poll: ایجاد یک نظرسنجی بومی Apple Messages (
pollQuestion، تکرارpollOptionاز 2 تا 12 بار، بهعلاوهٔchatGuid،chatId،chatIdentifierیاto). گیرندگان دارای iOS/iPadOS/macOS 26+ آن را بهصورت بومی میبینند و رأی میدهند؛ نسخههای قدیمیتر سیستمعامل متن جایگزین "یک نظرسنجی ارسال شد" را دریافت میکنند. بهselectors.pollPayloadMessageنیاز دارد. - poll-vote: رأیدادن در یک نظرسنجی موجود (
pollIdیاmessageId، بهعلاوهٔ دقیقاً یکی ازpollOptionIndex،pollOptionIdیاpollOptionText). بهselectors.pollVoteMessageو متد RPC به نامpoll.voteنیاز دارد.
نظرسنجیهای ورودی پذیرفتهشده برای عامل همراه با پرسش، برچسبهای شمارهدار گزینهها، تعداد رأیها و شناسهٔ پیام نظرسنجی موردنیاز poll-vote نمایش داده میشوند.
شناسههای پیام
زمینهٔ iMessage ورودی، در صورت وجود، هم مقادیر کوتاه MessageSid و هم GUIDهای کامل پیام (MessageSidFull) را شامل میشود. شناسههای کوتاه به حافظهٔ نهان پاسخ اخیرِ مبتنی بر SQLite محدودند و پیش از استفاده در برابر گفتوگوی فعلی بررسی میشوند. اگر یک شناسهٔ کوتاه منقضی شد، هنگام هدفگیری مکالمهای که آن را ارائه کرده است، با MessageSidFull آن دوباره تلاش کنید. شناسههای کامل مقیدبودن به مکالمه یا حساب را دور نمیزنند؛ بنابراین شناسهای از گفتوگویی دیگر را با شناسهای از مقصد فعلی جایگزین کنید. فراخوانیهای واگذارشدهٔ راهدور ممکن است شناسههای کامل قدیمی را هنگامی که شواهد مکالمهٔ فعلی در دسترس نیست رد کنند.
تشخیص قابلیت
OpenClaw کنشهای API خصوصی را فقط زمانی پنهان میکند که وضعیت کاوش ذخیرهشده در حافظهٔ نهان نشان دهد پل در دسترس نیست. اگر وضعیت ناشناخته باشد، کنشها قابلمشاهده میمانند و هنگام ارسال، کاوشها را بهصورت تنبل اجرا میکنند تا نخستین کنش بتواند پس از imsg launch بدون تازهسازی دستی جداگانهٔ وضعیت موفق شود.
رسید خواندن و نشانگر تایپ
وقتی پل API خصوصی فعال است، گفتوگوهای ورودی پذیرفتهشده بهعنوان خواندهشده علامتگذاری میشوند و گفتوگوهای مستقیم بهمحض پذیرش نوبت، درحالیکه عامل زمینه را آماده و پاسخ را تولید میکند، حباب تایپ را نشان میدهند. علامتگذاری خواندهشدن را با این تنظیم غیرفعال کنید:
{ channels: { imessage: { sendReadReceipts: false, }, },}ساختهای قدیمیتر imsg که پیش از فهرست قابلیتهای هر متد ساخته شدهاند، تایپ/خواندن را بیسروصدا غیرفعال میکنند؛ OpenClaw در هر راهاندازی مجدد یک هشدار یکباره ثبت میکند تا علت نبود رسید مشخص باشد.
tapbackهای ورودی
OpenClaw در tapbackهای iMessage مشترک میشود و واکنشهای پذیرفتهشده را بهجای متن عادی پیام بهصورت رویدادهای سیستمی مسیریابی میکند؛ بنابراین tapback کاربر یک حلقهٔ پاسخ عادی را فعال نمیکند.
حالت اعلان با channels.imessage.reactionNotifications کنترل میشود:
"own"(پیشفرض): فقط وقتی کاربران به پیامهای نوشتهشده توسط ربات واکنش نشان میدهند اعلان کنید."all": برای همهٔ tapbackهای ورودی از فرستندگان مجاز اعلان کنید."off": tapbackهای ورودی را نادیده بگیرید.
بازنویسیهای مختص هر حساب از channels.imessage.accounts.<id>.reactionNotifications استفاده میکنند.
واکنشهای تأیید (👍 / 👎)
وقتی approvals.exec.enabled یا approvals.plugin.enabled مقدار true دارد و درخواست به iMessage مسیریابی میشود، Gateway یک درخواست تأیید را بهصورت بومی تحویل میدهد و برای تعیین تکلیف آن یک tapback را میپذیرد:
👍(tapback پسندیدن) →allow-once👎(tapback نپسندیدن) →denyallow-alwaysبهعنوان راهحل جایگزین دستی باقی میماند:/approve <id> allow-alwaysرا بهصورت یک پاسخ عادی ارسال کنید.
پردازش واکنش مستلزم آن است که شناسهٔ کاربر واکنشدهنده صراحتاً در میان تأییدکنندگان باشد. فهرست تأییدکنندگان از channels.imessage.allowFrom (یا channels.imessage.accounts.<id>.allowFrom) خوانده میشود؛ شمارهٔ تلفن کاربر را با قالب E.164 یا ایمیل Apple ID او اضافه کنید (مقصدهای گفتوگو مانند chat_id:* ورودی معتبر تأییدکننده نیستند). ورودی عام "*" پذیرفته میشود، اما به هر فرستندهای اجازهٔ تأیید میدهد؛ فهرست خالی تأییدکنندگان میانبر واکنش را کاملاً غیرفعال میکند. میانبر واکنش عمداً reactionNotifications، dmPolicy و groupAllowFrom را دور میزند، زیرا فهرست مجاز صریح تأییدکنندگان تنها محدودیتی است که برای تعیین تکلیف تأیید اهمیت دارد.
مجوزدهی فرمان متنی /approve از همان فهرست پیروی میکند: وقتی channels.imessage.allowFrom خالی نیست، /approve <id> <decision> در برابر همان فهرست تأییدکنندگان مجاز میشود (نه فهرست مجاز گستردهتر پیام مستقیم) و فرستندگانی که در فهرست مجاز پیام مستقیم اجازه دارند اما در allowFrom نیستند، یک رد صریح دریافت میکنند. وقتی allowFrom خالی است، راهحل جایگزین همان گفتوگو برقرار میماند و /approve هر کسی را که فهرست مجاز پیام مستقیم اجازه میدهد مجاز میکند. هر اپراتوری را که باید تأیید کند — از طریق /approve یا واکنشها — به allowFrom اضافه کنید.
یادداشتهای اپراتور:
- اتصال واکنش هم در حافظه و هم در ذخیرهساز کلیددار پایدار Gateway نگهداری میشود (TTL با زمان انقضای تأیید مطابقت دارد) و Gateway همچنین درخواستهای در انتظار را برای tapbackها بررسی میکند؛ بنابراین tapbackی که اندکی پس از راهاندازی مجدد Gateway برسد، همچنان تأیید را نهایی میکند.
- tapback متعلق به خود اپراتور در
is_from_me=true(برای مثال از یک دستگاه Apple جفتشده) زمانی تأیید را نهایی میکند که آن شناسه بهصراحت تأییدکننده باشد. - درخواستهای تأیید فقط زمانی به گفتوگوی گروهی هدایت میشوند که تأییدکنندگان صریح پیکربندی شده باشند؛ در غیر این صورت، هر عضو گروه میتواند تأیید کند.
- tapbackهای متنی قدیمی (
Liked "…"متن ساده از کلاینتهای بسیار قدیمی Apple) نمیتوانند تأییدها را نهایی کنند، زیرا GUID پیام ندارند؛ نهاییسازی واکنش به فرادادهٔ ساختاریافتهٔ tapback نیاز دارد که کلاینتهای فعلی macOS / iOS تولید میکنند.
واکنشهای پرسش (1️⃣ / 2️⃣ / 3️⃣ / 4️⃣)
برای یک درخواست ask_user با یک پرسش غیرمحرمانه و تکانتخابی و یک تا چهار گزینه، OpenClaw گزینههای ایموجی شمارهدار اضافه میکند. برای پاسخدادن، با شمارهٔ متناظر به درخواست تحویلشده واکنش نشان دهید. واکنش باید GUID پایدار پیام نوشتهشده توسط ربات را داشته باشد؛ سپس OpenClaw از طریق Gateway شماره را به گزینهٔ متعارف نگاشت میکند. لمسهای منقضی یا تکراری نادیده گرفته میشوند.
درخواستهای چندپرسشی، چندانتخابی و متن آزاد همچنان فقط با پاسخ متنی کار میکنند. واکنشهای پرسش از قواعد معمول پذیرش پیام خصوصی/گروهی iMessage پیروی میکنند. این واکنشها حتی زمانی که reactionNotifications عمومی روی "off" تنظیم شده باشد شناسایی میشوند، بدون آنکه واکنشهای نامرتبط به رویدادهای عامل تبدیل شوند.
نوشتن پیکربندی
iMessage بهطور پیشفرض اجازه میدهد کانال تغییرات پیکربندی را آغاز کند (برای /config set|unset هنگامی که commands.config: true).
غیرفعالسازی:
{ channels: { imessage: { configWrites: false, }, },}ادغام پیامهای خصوصی چندبخشی (دستور + URL در یک ترکیب)
Apple میتواند یک دستور و پیشنمایش URL آن را بهصورت ردیفهای فیزیکی جداگانهٔ chat.db ذخیره کند. نسخهٔ imsg 0.13.1 و جدیدتر، پیش از آنکه پایش، تاریخچه یا جستوجو پیام را برگرداند، این ردیفها را ادغام میکند؛ بنابراین OpenClaw بدون افزودن تأخیر مخصوص کانال به پیام خصوصی، یک پیام ورودی منطقی دریافت میکند.
هیچ تنظیمی برای ادغام iMessage لازم نیست. کلید بازنشستهٔ channels.imessage.coalesceSameSenderDms توسط openclaw doctor --fix حذف میشود. debounce عمومی messages.inbound زمانی همچنان در دسترس است که عمداً بخواهید پیامهای متنی سریع را در سراسر یک کانال دستهبندی کنید.
اگر ارسالهای شامل دستور و URL بهصورت نوبتهای جداگانهٔ عامل میرسند، imsg را در Mac مربوط به Messages بهروزرسانی کنید:
brew update && brew upgrade imsgبازیابی ورودی پس از راهاندازی مجدد پل یا Gateway
iMessage پیامهایی را که هنگام ازکارافتادگی Gateway از دست رفتهاند بازیابی میکند و همزمان «انباشت انفجاری» قدیمی را که Apple ممکن است پس از بازیابی Push تخلیه کند، سرکوب میکند. رفتار پیشفرض همیشه فعال است و بر ورودی پایدار همراه با محدودیت سنی متکی است.
- محافظت پایدار در برابر بازپخش. پیش از جلو بردن مکاننمای بازیابی، OpenClaw هر ردیف خام را با GUID مربوط به Apple بهعنوان شناسهٔ رویداد، در صف ورودی SQLite مشترک ثبت میکند. یک ردیف تکمیلشده حدود 4 ساعت، با سقف 10,000 ورودی، یک نشان حذف باقی میگذارد؛ بنابراین بازپخشی با همان GUID حتی پس از راهاندازی مجدد کنار گذاشته میشود. یک ردیف در انتظار تا زمانی که فرایند ارسال آن را بپذیرد، قابل بازیابی باقی میماند.
- بازیابی زمان ازکارافتادگی. هنگام راهاندازی، پایشگر آخرین rowid ردیف
chat.dbپذیرفتهشده بهصورت پایدار را به خاطر میسپارد (یک مکاننمای پایدار برای هر حساب) و آن را بهصورتsince_rowidبهimsg watch.subscribeمیدهد تا imsg ردیفهایی را که هنوز ثبت نشدهاند بازپخش کند و سپس رویدادهای زنده را دنبال کند. ردیفهای ثبتشده پیش از خرابی از SQLite ادامه مییابند. بازپخش به جدیدترین 500 ردیف و پیامهایی با حداکثر سن حدود 2 ساعت محدود است و نشانهای حذف GUID هر مورد از قبل پردازششده را کنار میگذارند. - محدودیت سنی انباشت قدیمی. ردیفهای بالاتر از مرز راهاندازی واقعاً زندهاند؛ ردیفی که تاریخ ارسالش بیش از حدود 15 دقیقه از زمان رسیدنش قدیمیتر باشد، انباشت حاصل از تخلیهٔ Push است و سرکوب میشود. ردیفهای بازپخششده (در مرز یا پایینتر از آن) بهجای آن از بازهٔ بازیابی گستردهتر استفاده میکنند؛ بنابراین پیام تازه ازدسترفته تحویل میشود، اما تاریخچهٔ بسیار قدیمی خیر.
بازیابی هم در راهاندازیهای محلی و هم راهدور cliPath کار میکند، زیرا بازپخش since_rowid از همان اتصال RPC مربوط به imsg عبور میکند. تفاوت در بازه است: هنگامی که Gateway بتواند chat.db را بخواند (محلی)، مرز rowid راهاندازی را تثبیت میکند، گسترهٔ بازپخش را محدود میکند و پیامهای ازدسترفته با قدمت حداکثر چند ساعت را تحویل میدهد. از طریق یک cliPath راهدور مبتنی بر SSH نمیتواند پایگاه داده را بخواند؛ بنابراین بازپخش بدون سقف است و هر ردیف از محدودیت سنی زنده استفاده میکند — همچنان پیامهای تازه ازدسترفته را بازیابی و انباشت قدیمی را سرکوب میکند، اما با بازهٔ زندهٔ محدودتر. برای استفاده از بازهٔ بازیابی گستردهتر، Gateway را روی Mac مربوط به Messages اجرا کنید.
نشانهٔ قابلمشاهده برای اپراتور
انباشت سرکوبشده در سطح پیشفرض ثبت میشود و هرگز بیسروصدا کنار گذاشته نمیشود (پرچم recovery نشان میدهد کدام بازه اعمال شده است):
imessage: انباشت ورودی قدیمی سرکوب شد account=<id> sent=<iso> recovery=<bool> (<N> مورد از زمان شروع سرکوب شده است)مهاجرت
channels.imessage.catchup.* منسوخ شده است — بازیابی زمان ازکارافتادگی خودکار است و برای راهاندازیهای جدید به هیچ پیکربندیای نیاز ندارد. پیکربندیهای موجود دارای catchup.enabled: true همچنان بهعنوان نمایهٔ سازگاری برای بازهٔ بازپخش بازیابی رعایت میشوند. بلوکهای catchup غیرفعال (enabled: false یا بدون enabled: true) بازنشسته شدهاند؛ openclaw doctor --fix آنها را حذف میکند.
عیبیابی
imsg یافت نشد یا RPC پشتیبانی نمیشود
فایل اجرایی و پشتیبانی RPC را اعتبارسنجی کنید:
imsg rpc --helpimsg status --jsonopenclaw channels status --probeاگر بررسی پشتیبانینشدن RPC را گزارش کرد، imsg را بهروزرسانی کنید. اگر کنشهای API خصوصی در دسترس نیستند، imsg launch را در نشست کاربر واردشدهٔ macOS اجرا کنید و دوباره بررسی کنید. اگر Gateway روی macOS اجرا نمیشود، بهجای مسیر محلی پیشفرض imsg از راهاندازی Remote Mac از طریق SSH در بالا استفاده کنید.
پیامها ارسال میشوند، اما iMessageهای ورودی نمیرسند
ابتدا مشخص کنید آیا پیام به Mac محلی رسیده است. اگر chat.db تغییر نکند، حتی زمانی که imsg status --json سلامت پل را گزارش میکند، OpenClaw نمیتواند پیام را دریافت کند.
imsg chats --limit 10 --jsonimsg watch --chat-id <chat-id> --jsonsqlite3 ~/Library/Messages/chat.db \"select datetime(max(date)/1000000000 + 978307200, 'unixepoch', 'localtime'), max(ROWID) from message;"اگر پیامهای ارسالشده از تلفن هیچ ردیف جدیدی ایجاد نمیکنند، پیش از تغییر پیکربندی OpenClaw، لایههای Messages در macOS و Apple Push را تعمیر کنید. یک تازهسازی یکبارهٔ سرویس اغلب کافی است:
launchctl kickstart -k system/com.apple.apsdlaunchctl kickstart -k gui/$(id -u)/com.apple.CommCenterlaunchctl kickstart -k gui/$(id -u)/com.apple.identityservicesdlaunchctl kickstart -k gui/$(id -u)/com.apple.imagentimsg launchopenclaw gateway restartیک iMessage جدید از تلفن ارسال کنید و پیش از عیبیابی نشستهای OpenClaw، ایجاد یک ردیف جدید chat.db یا رویداد imsg watch را تأیید کنید. این کار را بهصورت حلقهٔ دورهای راهاندازی مجدد پل اجرا نکنید؛ اجرای مکرر imsg launch همراه با راهاندازی مجدد Gateway هنگام کار فعال میتواند تحویلها را مختل و اجراهای در حال انجام کانال را معلق کند.
Gateway روی macOS اجرا نمیشود
cliPath: "imsg" پیشفرض باید روی Mac واردشده به Messages اجرا شود. در Linux یا Windows، channels.imessage.cliPath را روی یک اسکریپت پوششی تنظیم کنید که از طریق SSH به آن Mac متصل شود و imsg "$@" را اجرا کند.
#!/usr/bin/env bashexec ssh -T messages-mac imsg "$@"سپس اجرا کنید:
openclaw channels status --probe --channel imessageپیامهای خصوصی نادیده گرفته میشوند
بررسی کنید:
channels.imessage.dmPolicychannels.imessage.allowFrom- تأییدهای جفتسازی (
openclaw pairing list imessage)
پیامهای گروهی نادیده گرفته میشوند
بررسی کنید:
channels.imessage.groupPolicychannels.imessage.groupAllowFrom- رفتار فهرست مجاز
channels.imessage.groups - پیکربندی الگوی اشاره (
agents.entries.*.groupChat.mentionPatterns)
پیوستهای راهدور ناموفقاند
بررسی کنید:
channels.imessage.remoteHostchannels.imessage.remoteAttachmentRoots- احراز هویت کلیدی SSH/SCP از میزبان Gateway
- وجود کلید میزبان در
~/.ssh/known_hostsروی میزبان Gateway - خوانا بودن مسیر راهدور روی Mac اجراکنندهٔ Messages
درخواستهای مجوز macOS از دست رفتهاند
در یک ترمینال گرافیکی تعاملی، در همان بافت کاربر/نشست، دوباره اجرا و درخواستها را تأیید کنید:
imsg chats --limit 1imsg send <handle> "test"تأیید کنید که Full Disk Access + Automation برای بافت فرایندی که OpenClaw/imsg را اجرا میکند اعطا شدهاند.
ارجاعات مرجع پیکربندی
مطالب مرتبط
- نمای کلی کانالها — همهٔ کانالهای پشتیبانیشده
- حذف BlueBubbles و مسیر imsg برای iMessage — اطلاعیه و خلاصهٔ مهاجرت
- مهاجرت از BlueBubbles — جدول تبدیل پیکربندی و انتقال گامبهگام
- جفتسازی — احراز هویت پیام خصوصی و جریان جفتسازی
- گروهها — رفتار گفتوگوی گروهی و محدودسازی بر اساس اشاره
- مسیریابی کانال — مسیریابی نشست برای پیامها
- امنیت — مدل دسترسی و مقاومسازی