Companion App — برنامه همراه برای دستگاههای پوشیدنی Apple Watch و Wear OS که در کنار برنامه اصلی روی گوشی هوشمند کار میکند. Companion App دادهها را از طریق WatchConnectivity (iOS) یا Wearable Data Layer (Android) همگامسازی میکند، اعلانها را روی ساعت نمایش میدهد و میتواند به صورت مستقل عمل کند. توسعه به زبان Swift برای watchOS و Kotlin برای Wear OS انجام میشود. بیشتر در WatchConnectivity Docs.
نکات اصلی
Companion App — برنامهای برای دستگاههای پوشیدنی Apple Watch یا Wear OS که همراه با برنامه اصلی iOS یا Android عرضه میشود. هدف اصلی گسترش عملکرد روی مچ است: مشاهده سریع اطلاعات، پاسخ به پیامها، کنترل موسیقی، ردیابی تمرینات. Companion App به طور خودکار روی ساعت نصب میشود هنگام نصب برنامه اصلی روی گوشی، اگر توسعهدهنده آن را در بیلد گنجانده باشد.
معماری برنامه companion شامل دو مؤلفه است: برنامه iOS/Android (اصلی) و برنامه watchOS/Wear OS (همراه). ارتباط بین آنها از طریق APIهای سیستمی انجام میشود: WatchConnectivity برای Apple و Wearable Data Layer برای Google. دادهها در پسزمینه از طریق Bluetooth یا Wi-Fi منتقل میشوند — کاربر فرآیند همگامسازی را نمیبیند. برنامه روی ساعت میتواند UI خاص خود را داشته باشد، متفاوت از موبایل، متناسب با صفحه نمایش کوچک.
انواع برنامههای companion از نظر میزان وابستگی به گوشی متفاوت هستند. برنامههای Mirroring کپی دادههای گوشی را نمایش میدهند و بدون اتصال کار نمیکنند. برنامههای Decoupled منطق خاص خود را دارند، دادهها را کش میکنند و بخشی از عملکرد را هنگام قطع اتصال از گوشی حفظ میکنند. برنامههای Independent (watchOS 6+ و Wear OS 3+) میتوانند بدون گوشی نصب شوند و با دسترسی شبکه مستقل خود کاملاً خودکار کار کنند.
WatchConnectivity — فریمورک Apple برای ارتباط دوطرفه بین iPhone و Apple Watch. چهار مکانیزم انتقال داده ارائه میدهد: Application Context (آخرین وضعیت شناخته شده)، File Transfer (فایلهای هر اندازه)، User Info (دیکشنریهای با تحویل تضمینی) و Interactive Messaging (ارتباط دوطرفه در زمان واقعی). سیستم به طور خودکار Bluetooth یا Wi-Fi را بسته به فاصله و کیفیت سیگنال انتخاب میکند.
import WatchConnectivity
class PhoneSessionManager: NSObject, WCSessionDelegate {
func activateSession() {
WCSession.default.delegate = self
WCSession.default.activate()
}
func sendWorkoutData(_ data: WorkoutData) {
let dict = ["heartRate": data.heartRate,
"calories": data.calories] as [String: Any]
WCSession.default.transferUserInfo(dict)
}
func session(_: WCSession,
didReceiveUserInfo: [String: Any]) {
DispatchQueue.main.async {
NotificationCenter.default.post(
name: .workoutDataReceived,
object: didReceiveUserInfo)
}
}
}
Interactive Messaging — تنها مکانیزم WatchConnectivity با تحویل تضمینی در زمان واقعی. پیام در ۲۰۰–۵۰۰ میلیثانیه با اتصال فعال ارسال و پاسخ دریافت میکند. برای اقداماتی که نیاز به پاسخ فوری دارند استفاده میشود: شروع تمرین، تأیید پرداخت، باز کردن درب خانه هوشمند. نشست باید روی هر دو دستگاه فعال باشد — اگر ساعت قفل است یا برنامه در پسزمینه است، تحویل تضمینی نیست.
File Transfer API برای حجمهای زیاد داده طراحی شده است — تصاویر، فایلهای صوتی، تمرینات صادر شده. فایلها حتی با برنامه بسته در پسزمینه منتقل میشوند. محدودیت — حداکثر ۱۰ انتقال همزمان در صف. Application Context — بهصرفهترین مکانیزم: فقط آخرین وضعیت را منتقل میکند و زمینههای ارسال نشده قبلی را لغو میکند. ایدهآل برای همگامسازی تنظیمات و وضعیت فعلی.
Wearable Data Layer — API از Google Play Services برای همگامسازی داده بین دستگاه Android و ساعت Wear OS. سه پروتکل ارائه میدهد: DataItem (همگامسازی جفتهای کلید-مقدار), MessageClient (پیامهای یکجهته) و ChannelClient (انتقال جریانی داده). DataItems به طور خودکار از طریق Google Cloud همگامسازی میشوند — اگر گوشی در دسترس نباشد، دادهها پس از بازیابی اتصال تحویل داده میشوند.
class WearableSyncService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
dataEvents.forEach { event ->
when (event.type) {
DataEvent.TYPE_CHANGED -> {
val uri = event.dataItem.uri
val path = uri.path // /ورزش/ضربان_قلب
val data = DataMapItem
.fromDataItem(event.dataItem)
.dataMap
val bpm = data.getInt("bpm")
updateUI(bpm)
}
}
}
}
}
MessageClient — پیامهای یکجهته با مسیر و آرایه بایتی ارسال میکند. برای دستورات استفاده میشود: «شروع تمرین»، «توقف موقت موسیقی». پیام در صورت اتصال دستگاه به طور تضمینی تحویل داده میشود. برای دریافت پیام در Wear OS، WearableListenerService را پیادهسازی کرده و در مانیفست ثبت کنید. MessageClient از کش خودکار پشتیبانی نمیکند — اگر ساعت قطع باشد، پیام از دست میرود.
ChannelClient — پروتکل برای دادههای جریانی: صدا، ویدئو، جریان پیوسته سنسورها. یک کانال دوطرفه باز میکند که آرایههای بایتی از آن منتقل میشوند. فقط در Wear OS 2.0+ پشتیبانی میشود. ChannelClient برای انتقال صدا از گوشی به ساعت برای تماسهای Bluetooth و برای رله دادههای سنسورهای Bluetooth خارجی (ضربانسنج، کامپیوتر دوچرخه) از طریق گوشی به ساعت مفید است.
کار مستقل — توانایی برنامه companion برای انجام وظایف بدون اتصال به گوشی. در watchOS با ماژول Cellular برنامه درخواستهای شبکه را مستقیماً از طریق eSIM ارسال میکند. در Wear OS با LTE عملکرد مشابهی در دسترس است. حتی بدون ماژول سلولار، ساعت آخرین دادههای گوشی را کش میکند و هنگام قطع اتصال نمایش میدهد — کاربر اطلاعات بهروز در زمان آخرین همگامسازی را میبیند.
| حالت | داده | دسترسی | مثال |
|---|---|---|---|
| Online | زنده از سرور/گوشی | کامل | مسیر ناوبری |
| Cached | آخرین از گوشی | محدود | لیست مخاطبین |
| Offline | محلی روی ساعت | حداقل | تایمر، کرونومتر |
کش کردن دادهها — عنصر کلیدی کار مستقل. برنامه باید آخرین وضعیت دریافتی را در حافظه محلی ساعت ذخیره کند. در watchOS از UserDefaults یا CoreData استفاده میشود، در Wear OS — Room Database یا DataStore. پس از بازیابی اتصال، کش با همگامسازی پسزمینه بهروزرسانی میشود. اگر دادهها بیش از ۲۴ ساعت قدیمی باشند، برنامه پیام «اتصال به گوشی را بهروز کنید» نشان میدهد.
Wearable UI برای صفحه نمایش محدود ساعت صفحه ۱.۵–۲ اینچی دارد — رابط برنامه companion باید حداکثر مختصر باشد. Apple NavigationView تک ستونی را در watchOS توصیه میکند، Google — لیست کارتها در Wear OS با تکان دادن برای ناوبری. دکمهها باید حداقل ۴۴pt اندازه داشته باشند برای لمس راحت. از فیلدهای ورود متن خودداری کنید — از پاسخهای آماده، دیکته یا چرخ Digital Crown استفاده کنید.
طراحی کممصرف — برنامه companion نباید ساعت را در چند ساعت تخلیه کند. از بهروزرسانیهای پسزمینه با حداقل فاصله استفاده کنید. در watchOS WatchConnectivity انتقال را با شارژ کم باتری متوقف میکند و پس از شارژ از سر میگیرد. در Wear OS Wearable Data Layer به طور خودکار انتقالهای کوچک را برای صرفهجویی در انرژی گروهبندی میکند. Wrist raise — UI را فقط هنگام بلند کردن مچ توسط کاربر بهروز کنید.
معماری برنامه companion باید با در نظر گرفتن قطع احتمالی اتصال طراحی شود. از الگوی Repository استفاده کنید: یک منبع داده واحد روی گوشی با مخزن محلی روی ساعت همگامسازی میشود. ViewModel روی ساعت مشترک مخزن محلی میشود و دادهها را مستقل از وضعیت اتصال نمایش میدهد. پس از بازیابی اتصال، Repository روی ساعت دادهها را از طریق WatchConnectivity یا Wearable Data Layer درخواست میکند و حافظه محلی را بهروز میکند.
class WorkoutRepository constructor(
private val localStorage: WorkoutDao,
private val wearableClient: WearableClient
) {
val workoutFlow: Flow<Workout?> = merge(
localStorage.observeWorkout(),
wearableClient.observeWorkout()
.onEach { localStorage.save(it) }
)
}
تست برنامه companion نیاز به بررسی روی ساعت واقعی یا شبیهساز دارد. Xcode از شبیهساز Apple Watch در کنار شبیهساز iPhone پشتیبانی میکند — میتوان WatchConnectivity را بدون دستگاه فیزیکی تست کرد. Android Studio شامل شبیهساز Wear OS با پشتیبانی Wearable Data Layer است. موارد آزمایشی بحرانی: قطع اتصال در حین انتقال، شارژ کم باتری، کار همزمان دو برنامه companion و نصب بدون گوشی روی ساعت standalone.
انتشار برنامه companion در watchOS نیاز به آپلود جداگانه در App Store ندارد — برنامه در باینری iOS قرار میگیرد و به طور خودکار برای نصب روی ساعت پیشنهاد میشود. در Wear OS برنامه companion به طور جداگانه در Google Play منتشر میشود، اما از طریق همان بسته به برنامه اصلی متصل میشود. App Group در iOS و sharedUserId در Android به برنامه اصلی و companion اجازه استفاده از حافظه مشترک میدهد.
سوالات متداول
Companion App برای عملکرد کامل نیاز به برنامه اصلی نصب شده روی iPhone یا Android دارد. برنامه standalone معمولی روی ساعت (مانند قطبنما یا کرونومتر) بدون گوشی به طور مستقل کار میکند. Companion App دادهها را با گوشی همگامسازی میکند، اعلانها را نمایش میدهد و امکان اقدامات سریع را فراهم میکند، اما بدون گوشی بخشی از عملکرد را از دست میدهد.
WatchConnectivity از چهار حالت پشتیبانی میکند: Application Context برای انتقال وضعیت جاری با لغو وضعیت قبلی، File Transfer برای فایلهای هر اندازه، User Info برای دیکشنریهای داده با تحویل تضمینی و Interactive Messaging برای ارتباط دوطرفه در زمان واقعی. دادهها از طریق Bluetooth یا Wi-Fi منتقل میشوند — سیستم به طور خودکار کانال بهینه را انتخاب میکند.
بله، برنامه companion به طور مستقل کار میکند — watchOS و Wear OS دادههای دریافتی از گوشی را کش میکنند. در ساعت با ماژول سلولار، برنامه درخواستها را مستقیماً از طریق eSIM یا LTE ارسال میکند. دادههای کش شده حتی در صورت عدم اتصال نمایش داده میشوند. پس از بازیابی اتصال، کش با همگامسازی پسزمینه بهروزرسانی میشود.
محبوبترین دستهها: ردیابهای تناسب اندام با همگامسازی تمرینات، پیامرسانها برای پاسخ به پیامها از ساعت، مسیریابها با راهنمایی پیچها روی مچ، پخشکنندههای موسیقی برای کنترل پخش، سیستمهای پرداخت، خانه هوشمند برای کنترل دستگاهها و مانیتورهای پزشکی برای ضربان قلب و فشار.
Apple Watch با برنامه companion فعال در استفاده استاندارد تا ۱۸ ساعت کار میکند. Wear OS — تا ۲۴ ساعت. WatchConnectivity برای مصرف کم انرژی بهینه شده است: انتقال داده با شارژ کم باتری متوقف میشود و همگامسازی انبوه در حین شارژ ساعت انجام میشود.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.