أحدث عمل على Roam
التحديثات القادمة لـRoam
- تمت إضافة واجهات التحكم: القوائم التي تعرض الملعب, كتم الصوت, تغيير مستوى الصوت, والتحديد من وسط التحكم!
الخارطة الطرقية
-
تحديث معالجة لوحة المفاتيح لدعم ecp-textedit على
KeyboardEntry
- عرض لوحة المفاتيح عند فتح textedit
- إخفاء لوحة المفاتيح عند إغلاق textedit
- التأكد من أن اللصق + التحديد / الحذف في حقل textedit يعمل كما هو متوقع
- استخدم حقل النص المعدّل الحالي إذا لم يتم دعم ecp-textedit، استخدم حقل النص الرئيسي إذا تم دعمه
- في macOS، ادعم اللصق باستخدام cmdP, والنسخ / القطع باستخدام cmdX + cmdC
- إذا لم يكن ecp-textedit مدعومًا، فالعودة إلى السلوك الحالي لإرسال المفاتيح
- في macOS أظهر حقل نص في الأسفل عند تمكين textedit
- في macOS ، السماح ب cmd+v و cmd+c و cmd+x للنسخ لصق من / إلى الحافة
-
أضف +30 ثانية مع العد التنازلي لوقت الصمت
- احتفظ بالكتم لكتم الصوت لمدة +30 ثانية
- انقر مرة أخرى لإلغاء الكتم والغاؤه
- إظهار مؤشر أسفل الخط الخاص بزر الكتم
- شريط التقدم يحتوي على مؤشر تقدم خطي
- شريط التقدم به زرين: +30 ثانية ، إلغاء
- إظهاره تحت لوحة الزر الرئيسي بحيث يكون قريبًا من كتم الصوت
- جعل +30 قابلا للتهيئة إلى 30 ، 15 ، 60 ثانية من خيارات الكتم
-
تقديم عرض اختياري مصغر على iOS يقلد عرض Siri Remote بشكل كثيف
- https://support.apple.com/guide/tv/use-ios-or-ipados-control-center-atvb701cadc1/tvos
- ادعم التعليمات المرئية لـ visionos أيضًا...
أفكار عامة للمستقبل
-
كتابة مقال في مدونة حول robot discord والإشارة إلى MessageView
-
كتابة مقال في مدونة عن الترجمة التلقائية والمنطق المحيط بها
-
قم بتخصيص أيقونة شريط القائمة
-
كيفية تحويل النص إلى كلام أو الأوامر الصوتية العامة؟
- يتعين عليك فك الترميز العكسي لبروتوكول روكو الصوتي عبر udp
- أو يجب إضافة نص مخصص للكلام مع المحرك الزر؟
-
تشغيل تلقائي لالتقاط لقطات الشاشة
- استخدم UITests للحصول على لقطات شاشة فعلية
- استخدم AppScreens https://appscreens.com/user/project/DRxTFSSIQtuU0y9Eew4w للحصول على لقطات الشاشة في الإطارات
- أو شيء آخر
- https://www.figma.com/community/file/886620275115089774
- https://www.figma.com/community/file/1071476530354359587/app-store-screenshots?searchSessionId=lxw3ep02-oubp844ov8
- https://www.figma.com/community/file/1256854154932829222/free-app-store-screenshot-templates?searchSessionId=lxw3ep02-oubp844ov8
- https://www.canva.com/templates/s/iphone/
-
اختبار المزيد م ن الأدوات الخاصة بلوحة المفاتيح
- GCKeyboard لواحد
- FocusEnvironment لاثنين
- التأكد من أن أي حل يتم استخدامه لـ iOS لا يعطل إدخال النص في الرسائل / إدخال لوحة المفاتيح
-
أضف بعض التتبع الحدثي لما يفعله المستخدمون فعليا على أجهزتهم (الاتصال بـ Firebase Analytics ربما؟)
- تعقب من يستخدم العرض المصغر، ما هي الأفعال التي يقومون بها، الخ...
إصلاح الأخطاء
- معرفة ما إذا كانت الدورة من الدعوات إلى
nextPacket
تكون منطقية.- بدلاً من الالتفاف كل 10 مللي ثانية والأمل في أن تكون التوقيتات صحيحة، هل يجب أن يتم بدلاً من ذلك الدوران على الحزم المستلمة ومحاولة جدولتها في وقت الاستضافة
10ms * globalSequenceNumber + startHostTime
و sampleTime إلىsequenceNumber * Int64(lastSampleTime.sampleRate) / packetsPerSec + startSampleTime
- ثم يمكنني التبديل من
for await
loop على الساعة إلىwhile !Task.isCancelled
loop مزود بـTask.sleep
فيه. - حسنًا ، لذا نحن بحاجة إلى الدوران كل 10 مللي ثانية ومحاولة سحب الحزمة الأخيرة ومن ثم جدولتها في ذلك الوقت
- كلما قمت بمزامنة الصوت
- يجب أن يكون لدين ا lastRenderTime + a sync packet
- تقدير عدد الحزم التي يجب أن نرسلها + وقت المزامنة
- وقت العرض + إضافي
- بدلاً من الالتفاف كل 10 مللي ثانية والأمل في أن تكون التوقيتات صحيحة، هل يجب أن يتم بدلاً من ذلك الدوران على الحزم المستلمة ومحاولة جدولتها في وقت الاستضافة
تحسين الاختبارات
- اختبارات UI
- اختبار عندما يتم إضافة الجهاز أنه يظهر في مُنتقِي الأجهزة ويتم اختياره بواسطة roam
- اختبار أن المستخدم يمكنه التنقل إلى الإعدادات -> الأجهزة
- اختبار أن المستخدم يمكنه التنقل إلى الإعدادات -> الرسائل
- اختبار أن المستخدم يمكنه التنقل إلى الإعدادات -> حول
- اختبار أن المستخدم قادر على تحرير / حذف الأجهزة
- اختبار أن المستخدم يمكنه النقر على الأزرار بمجرد إضافة الأجهزة
- اختبار أن المستخدم يرى الشريط الإعلاني لعدم وجود أجهزة عند عرضه
- اختبار أن المستخدم يرى الروابط التطبيقية
- الإشارة إلى swiftdat testingmodelcontainer للحاويات الموديل
- الإشارة إلى هنا https://medium.com/appledeveloperacademy-ufpe/how-to-implement-ui-tests-with-swiftui-a-few-examples-636708ee26ad لكيفية إعداد الاختبارات
App Clip
- AppClip
- أضف زر "الحصول على رابط قابل للمشاركة إلى هذا الجهاز" في الإعدادات -> الجهاز
- قم بتوليد كل أكواد App Clip البالغ عددها 1.1 مليون مسبقًا وترميز مواقع الحلقات (0.5GB)
- قم بإنشاء زر لـ "الحصول على رابط قابل للمشاركة إلى الجهاز!" مع معاينة صورة لكود App Clip (لون الجوال)
- قم بتنزيل الكود + الرابط وتحويله إلى PNG على الجهاز عند تغيير موقع الجهاز
- اجعل الكود يفتح الجهاز كرابط مشترك إلى صورة (مع استعراض!)
- اجعل الرابط الفعلي للجهاز قابلاً للمشاركة
- أضف زر "الحصول على رابط قابل للمشاركة إلى هذا الجهاز" في الإعدادات -> الجهاز
تحسين الرسائل الموجهة إلى المستخدمين حول إدارة المعلومات / الحالة
- تحديث إدارة المعلومات / الحالة للتعامل بشكل أفضل مع الحالة المتقلبة
- عند الانقطاع، التحديد، النقر على الزر، الانتقال إلى الواجهة الأمامية، فتح التطبيق -> إعادة بدء الحلقة إعادة الاتصال إذا تم قطع الاتصال
- حلقة إعادة الاتصال للتراجع بشكل متصاعد اعادة المحاولة الاتصالات الفاشلة (0.5 ث، مضاعفة، 10 ث التراجع)
- عند الاتصال بالجهاز، قم دائمًا بتعطيل تحذيرات الشبكة
- عند محاولة الاتصال بالجهاز، أو محاولة تشغيل الجهاز، اظهر رمزا معلومات دوار بدلا من النقطة الرمادية.
- عند تشغيل الجهاز وتحقيق النجاح، اظهر رسمًا متحركًا عند الانتقال من الرمادي -> الدوران -> الأخضر
- عند تشغيل جهاز بـ WOL وعدم الاتصال بعد 5 ثوانٍ، أو عند تشغيل الجهاز والفشل فورًا، قم بإظهار رسالة تحذير تحت واحدة الشبكة اللاسلكية
- “لم نتمكن من إيقاظ جهاز Roku الخاص بك” (تعرف على المزيد) (لا تظهر مرة أخرى لهذا الجهاز), (X)
- تعرف على المزيد يظهر بعض الأسباب المحتملة لذلك
- أنت غير متصل بنفس الشبكة (اظهر اسم الشبكة الأخير للجهاز. اسأل ما إذا كان المستخدم متصلا بهذه الشبكة)
- جهازك في وضع النوم العميق (لم يتم إيقاف تشغيله مؤخرا) ولا يمكن إيقاظه
- جهازك لا يدعم WWOL وهو متصل بالشبكة اللاسلكية
- جهازك لا يدعم WWOL أو WOL
- شبكتك غير معدة بطريقة تسمح لنا بإرسال أوامر الإيقاظ إلى الجهاز
- حلقة إعادة الاتصال = محاولة تراجعية متصاعدة لإعادة الاتصال بإعادة الاتصال ECP
- إنق توصيل ECP أولاً
- الاستماع إلى الإخطار ثانيًا
- التعامل مع +power-mode-changed,+textedit-opened,+textedit-changed,+textedit-closed,+device-name-changed
- تأكد من أننا نستطيع التعامل مع كل واحد من هذه الطلبات وتنسيقها ...
- تحديث حالة الجهاز ثالثًا
- تحديث حالة query-textedit-state رابعاً
- تحديث حالة textedit
- تحديث أيقونات الجهاز خامسًا
- على جميع التغييرات بعد إعادة الاتصال (من خلال الإخطار أو أي شيء)
- تحديث الجهاز (مخزن) وحالة الجهاز (متقلبة)
- بعد الاتصال / الانقطاع ، تحديث حالة الاتصال في عرض الجهاز
تحسين الرسائل المستخدمة حول قدرات الجهاز
- تحديث رسائل المستخدم عند حدوث الأخطاء
- عند النقر على زر معطل ، افتح القائمة المنبثقة لإظهار السبب وراء تعطيله
- أظهر مؤشر الرموز في الزر للدلالة على أن المعلومات يمكن تلقيها عند النقر عليه؟
- تم تعطيل البعد الصوتي للسماعات -> لأن الجهاز لا يدعم وضع السماعات لهذا التطبيق
- تم تعطيل التحكم بالصوت -> لأن الصوت يتم إخراجه عبر HDMI ، والذي لا يدعم اختيارات صوت؟
- عند الفحص المباشر للأجهزة وعدم العثور على جدد ، تظهر رسالة تحذير تحت قائمة الجهاز
- “لم نتمكن من إيقاظ Roku الخاص بك” (اكتشف السبب), (X)
- اعثري على المزيد من العروض من الإعدادات التي تظهر في نافذة منبثقة
- تأكد من تشغيل الجهاز والاتصال بنفس شبكة wifi كتطبيق. إذا لم ينجح هذا، حاول إضافة الجهاز يدوياً.
- رابط https://roam.msd3.io/manually-add-tv.md و https://support.roku.com/article/115001480188 للإستفسارات المتعلقة بالتنقيب أو الدردشة
- عند النقر على زر معطل ، افتح القائمة المنبثقة لإظهار السبب وراء تعطيله
- أضف شارة لدعم WakeOnWLAN و supportMute.
ملاحظات ECP textedit
أوامر جلسة Keyboard ECP (ملاحظات)
- {"request":"request-events","request-id":"4","param-events":"+language-changed,+language-changing,+media-player-state-changed,+plugin-ui-run,+plugin-ui-run-script,+plugin-ui-exit,+screensaver-run,+screensaver-exit,+plugins-changed,+sync-completed,+power-mode-changed,+volume-changed,+tvinput-ui-run,+tvinput-ui-exit,+tv-channel-changed,+textedit-opened,+textedit-changed,+textedit-closed,+textedit-closed,+ecs-microphone-start,+ecs-microphone-stop,+device-name-changed,+device-location-changed,+audio-setting-changed,+audio-settings-invalidated"}
- {"notify":"textedit-opened","param-masked":"false","param-max-length":"75","param-selection-end":"0","param-selection-start":"0","param-text":"","param-textedit-id":"12","param-textedit-type":"full","timestamp":"608939.003"}
- {"request":"query-textedit-state","request-id":"10"}
- {"content-data":"eyJ0ZXh0ZWRpdC1zdGF0ZSI6eyJ0ZXh0ZWRpdC1pZCI6Im5vbmUifX0=","content-type":"application/json; charset=\"utf-8\"","response":"query-textedit-state","response-id":"10","status":"200","status-msg":"OK"}
- {"param-text":"h","param-textedit-id":"12","request":"set-textedit-text","request-id":"20"}
- {"response":"set-textedit-text","response-id":"29","status":"200","status-msg":"OK"}
للتحديث عند ترك الدعم لـ iOS 17/macOS 14 (فبراير 2026)
- اذهب حول وأزل @available(iOS 18) تأشيرات
- استخدم ميزات معاينة لإدخال بيانات العينة في المعاينات
- كيفية القيام بذلك مع iOS 17 لا زال هو العامل؟
- كيفية استخدام @Previewable في المعاينات مع iOS 17 لا زالهو العامل؟؟
- SwiftData
- اضافة استخدام #Index الجديد الماكرو للنماذج
- استخدام #Unique macro الجديد للنماذج
- استخدام حذف الدفعة
- TipKit
- استخدم CloudkitContainer https://developer.apple.com/videos/play/wwdc2024/10070/?time=698