ما هي المهارات اللازمة لإنشاء تطبيق iOS؟ تقرير ياندكس

يحتاج مطور الجوال إلى مجموعة واضحة من المهارات. تحتاج إلى التحدث عنها في سياق المهام المحددة التي تنشأ أثناء إنشاء التطبيق ونشره. يعمل آرثر أنتونوف كمطور لنظام iOS في قسم الترجمة الآلية في Yandex. أوضح آرثر في تقريره للطلاب والمبتدئين ما يجب على المطور القيام به لإنشاء برنامج محمول حديث.


- يوجد قسمان لتطبيقات الهاتف المحمول في قسمنا: Yandex.Translate و Yandex.Keyboard. لدينا في Translator الكثير من التقنيات المتطورة ، مثل الإدخال الصوتي والتعرف على النص بالصور وترجمة النص باستخدام الشبكات العصبية. هناك تحدٍ منفصل يتمثل في الحفاظ على هذه الوظيفة في وضع عدم الاتصال. أي أن هذه الوظيفة ستعمل لك حتى بدون الإنترنت.



لوحة المفاتيح هي فئة منفصلة من التطبيقات ؛ هناك متطلبات منفصلة لسرعتها وجودة التطبيق نفسه. يعمل التصحيح التلقائي باللغة الروسية بالنسبة لنا: فهو يساعد المستخدم ، ولكنه لا يزعجه. الإدخال الصوتي ، إدخال التمرير.





ميزة باردة منفصلة هي الشبكة الديناميكية: فهي تحاول التنبؤ بالحرف التالي ، واعتمادًا على ذلك ، تغير علامة التبويب. أي أنه من الأسهل الدخول في رسالة أكثر ترجيحًا.



في المدرسة كنت منخرطًا في البرمجة الرياضية. ولكن عندما دخلت الجامعة ، بدا لي أنها كانت مملة بعض الشيء ، كنت أرغب في تطوير برامج للناس العاديين ، ومن المستحسن أن تكون متاحة دائمًا وفي كل مكان. لذلك قررت اختيار تطوير الهاتف المحمول. لكن تطبيقات الهاتف المحمول متعددة الأوجه ، وأكبر سؤال طرأ على نفسي هو من أين أبدأ.

الإنترنت مليء الآن بالدورات عبر الإنترنت والبرامج التعليمية والكتب حول مواضيع مختلفة ، وينفجر الرأس. ليس من الواضح من أين تبدأ. لذلك ، في تقريري ، أود أن أساعدك في بناء مسار التعلم الخاص بك لتصبح مطورًا للجوال. ما يستحق الدراسة في البداية ، دراسة ما يمكن تأجيله.



بعد تحليل عملي على مدى عدة سنوات ، حددت العديد من المهارات الأساسية اللازمة لحل معظم المشاكل. هذه هي المهارات الأساسية وما يسمى مهارات الأدوات. ليست مطلوبة عند تطوير تطبيقات الهاتف المحمول ، ولكن إذا كنت تمتلكها ، فستصبح حياتك أسهل ، وستكون جودة تطبيقاتك أفضل بكثير.

نظرًا لأن نظرية بدون ممارسة ميتة ، فسوف ندرس المهارات باستخدام مثال نسخة مبسطة من Yandex.Translator. عند الانتهاء من المشروع ، كل ما تراه هو شاشة بيضاء.

دعنا نعيد إحياء تطبيقنا باستخدام واجهة المستخدم.





هناك طريقتان كلاسيكيتان لإنشاء واجهة - محرر رسومي وكود. هذا أحد مواضيع هوليوود في تطوير الهواتف المحمولة. هناك أتباع للتنمية في محرر الرسوم البيانية ، ولا يتعرف شخص ما على أي شيء باستثناء الكود. ولكن أنصحك بتجربة كلتا الطريقتين. بالتأكيد سوف تصادفهم ، بالإضافة إلى ذلك ، لا أحد يمنعك من الجمع بين المناهج ، على سبيل المثال ، أشياء بسيطة يمكنك القيام بها في محرر رسومية ، ومعقدة بالفعل في التعليمات البرمجية.



ومؤخرًا ، يمتلك مطورو iOS إطار عمل SwiftUI جديد يحاول الجمع بين هذين النهجين. أي عند التغيير في محرر الرسوم البيانية ، يتغير رمزك والعكس صحيح. ربما عندما ينتشر هذا الإطار على نطاق واسع ، ستدخل جميع النزاعات في طي النسيان.

لسوء الحظ ، لا يتوفر SwiftUI إلا بدءًا من iOS 13 ، لذلك لا يمكن استخدامه في المشاريع الكبيرة حتى الآن.



يحتوي محرر الرسوم البيانية على واجهة بسيطة للغاية. نحن نأخذ مكونات جاهزة ، نسحبها على شاشة افتراضية ونرى على الفور ما نحصل عليه. لهذا السبب ، من السهل جدًا إنشاء مكونات واجهة مستخدم بسيطة. يمكننا أيضًا تغيير حجم الشاشة الافتراضية للأجهزة المختلفة واختبار واجهتنا دون تشغيل التطبيق.





من ناحية أخرى ، لدينا تصميم واجهة في الكود. عند تطوير واجهة في التعليمات البرمجية الخاصة بك ، ستكون مكتبة UIKit مفيدة ، وسوف تستخدم كتل بناء صغيرة منها تسمى UIView. تتوافق كائنات UIView تقريبًا مع المكونات التي عرضتها على الشاشة. ومثلما هو الحال في محرر الرسوم البيانية ، لديك فئات فرعية جاهزة للمكونات شائعة الاستخدام ، مثل الأزرار والنص.

عند تطوير الشفرة ، من المهم جدًا أن نفهم أن UIViews الأخرى يمكنها إنشاء UIView داخلها ، أي يمكنك بناء واجهات بأي تعقيد. ونتيجة لذلك ، تحصل على ما يسمى الشجرة. من الأسهل التعديل من التعليمات البرمجية. أي أنه إذا كان لديك واجهة مستخدم ديناميكية للغاية ، فقد يكون من الجدير كتابتها في التعليمات البرمجية وسيكون من الأسهل عليك تعديلها لاحقًا.



دعونا نرى الرمز الذي يمكن كتابته لمترجمنا.

أولاً قمنا بتعيين لون الخلفية إلى الأصفر. ثم نضيف حقل إدخال حيث يدخل المستخدم النص باللغة الإنجليزية. بعد ذلك ، نضيف فاصلًا للجمال ، وأخيرًا ، أضف حقل إخراج ، مع منع المستخدم من تحريره.

لدينا واجهة مستخدم جاهزة ، ولكن التطبيق لا يزال عديم الفائدة إلى حد ما. لا يحل المهمة الرئيسية للمستخدم - ترجمة النص.

دعنا نضيف هذه الوظيفة. سوف تساعدنا قدرات منصة SDK.



إن حزم SDK للنظام الأساسي عبارة عن مجموعة من الأدوات والمكتبات لإنشاء تطبيقات الجوال التي تقدمها إلينا شركة Apple ، وبالتالي Google.

في الوقت الحالي ، يحتوي SDK على الكثير من المكتبات منخفضة المستوى للتفاعل مع نظام التشغيل ، ويمكنك تنفيذ أي فكرة تقريبًا عن تطبيق الهاتف المحمول دون بذل الكثير من الجهد.

تعتمد المكتبات التي ستستخدمها على تفاصيل تطبيقك. على سبيل المثال ، إذا أردنا إنشاء كاميرا ، فعلى الأرجح ستحتاج إلى مكتبتين: AVFoundation للعمل مع الكاميرا و CoreImage لمعالجة الصور.

لذلك ، في هذه المرحلة ليس من الضروري حفظ جميع المكتبات ، فمن المستحيل بكل بساطة. الأهم هو القدرة على إيجاد الأدوات المناسبة. ولسوء الحظ ، فإن الوثائق الرسمية لا توثق دائمًا الميزات بالكامل. في بعض الأحيان تجد بعض الأشياء المثيرة للاهتمام ، على سبيل المثال ، على مدونة أو على تويتر لمطور آخر. يجدر اتباع حقل المعلومات.

لذا ، ماذا نحتاج من SDK لمترجمنا؟



مترجمنا هو تطبيق كلاسيكي لخادم العميل: نقوم بتقديم طلب إلى الخادم ونحصل على رد. ثم نقوم بطريقة ما بتحويله وإظهاره للمستخدم. سيساعدنا إطار المؤسسة في هذه المهمة. يحتوي على تجريدات مناسبة لحل المهام اليومية.

سنأخذ فئة URLSession منه ، هذه هي فئة العمل مع الخادم باستخدام بروتوكول http ، و JSONSerialization ، هذه هي الفئة التي تساعدنا على تحويل الكائنات من تنسيق JSON.



لذا ، دعنا نرى الرمز الذي نحتاج إلى كتابته لهذه الوظيفة. على اليسار طريقة يتم تنفيذها في كل مرة يتم فيها تغيير إدخال المستخدم. نقوم أولاً بإنشاء عنوان URL بعنوان خادم المترجم وتقديم طلب. علاوة على ذلك ، بعد تلقينا الإجابة ، نقوم بتحليلها من تنسيق JSON ، ونحصل على النص المطلوب منه ، أي نص الترجمة. والخطوة الأخيرة - نقول أنه في حقل الإدخال تحتاج إلى تعيين الإجابة المستلمة.

دعونا نرى ما حصلنا عليه. يدخل المستخدم مرحبًا وتظهر كلمة "مرحبًا":



لكن "مرحبًا" ظهر بطريقة ما لفترة طويلة ، لم يكن يبدو وكأنه تأخيرات في الشبكة. للموثوقية ، دعنا نقارن مع الأخ الأكبر:

افتح ملف GIF

في كلا التطبيقين ، ندخل النص مرحبًا ونرى أن الترجمة قد ظهرت بالفعل عدة مرات على المترجم الحقيقي. على مترجمنا ، تظهر الترجمة مع تعليق كبير.

لإصلاح هذه المشكلة ، نحتاج إلى التعرف على نموذج سلاسل المحادثات المتعددة في تطبيقات الهاتف المحمول.



تمامًا مثل سطح المكتب ، تعمل تطبيقات الجوال في بيئة متعددة الخيوط. ولكن هناك قيود مهمة. يحتوي تطبيق الهاتف المحمول على مؤشر ترابط رئيسي أو ما يسمى مؤشر ترابط واجهة المستخدم. وأي عملية مع واجهة المستخدم ، يجب أن يحدث أي تغيير في واجهة المستخدم في هذا الموضوع الرئيسي. إذا كنت ترغب في تغيير لون الزر أو تحريكه - يجب أن يكون كل شيء في دفق واجهة المستخدم.

من ناحية أخرى ، تأتي جميع تفاعلات المستخدم إلينا في الموضوع الرئيسي. أي نقر المستخدم على زر - تلقينا رسالة في الموضوع الرئيسي. تغيير النص ، كما هو الحال في حالتنا - حصلنا عليه أيضًا في الموضوع الرئيسي. نظرًا لوجود دفق واحد فقط ويتم تنفيذ جميع الإجراءات مع واجهة المستخدم فيه ، فمن المهم جدًا الاهتمام به وإجراء أقل قدر ممكن من الحساب عليه ، وإلا فإنك تخاطر بأن تكون في موقف حيث تقوم بمعالجة إجراء مستخدم لفترة طويلة ولديك قائمة انتظار من إجراءات المستخدم الأخرى. ثم يبدأ كل شيء بالتجمد.

لهذا السبب ، تعمل العديد من مكتبات النظام بشكل افتراضي على دفق في الخلفية. على سبيل المثال ، تستغرق الرحلة إلى الشبكة في المتوسط ​​من 100 إلى 500 مللي ثانية. هذه عملية مكلفة للغاية للتيار الرئيسي ، لذلك يتم كل تفاعل مع الشبكة في تيار الخلفية.

ومرة أخرى ، هذا يخلق مشاكل بالنسبة لنا ، لأنه إذا استخدمنا عن غير قصد النتيجة التي تم الحصول عليها من الخادم على الفور لتغيير واجهة المستخدم ، فقد يؤدي ذلك إلى حدوث عطل أو تعطل.

أذكر السطر الأخير:

self.textOutputView.text = translation

في ذلك ، أخذنا نتيجة الخادم ووضعناها في حقل الإخراج. وهكذا ، انتهكنا القاعدة الأولى - قمنا بتغيير واجهة المستخدم وليس من الخيط الرئيسي. ستساعد المكتبة القياسية Grand Central Dispatch في إصلاح ذلك. يساعدنا ذلك بسهولة كبيرة في التبديل إلى سلسلة المحادثات الرئيسية وتنفيذ هذا الإجراء على سلسلة المحادثات الرئيسية.

DispatchQueue.main.async {
  self.textOutputView.text = translation
}

دعونا نرى ما حصلنا عليه مع التطبيق في النهاية.



يدخل المستخدم النص ، ونرى أن الترجمة تحدث على الفور تقريبًا. مرحى! لقد هزمنا هذه المشكلة. ولكن ، قبل إصدار التطبيق ، لنتحدث عن موضوع آخر مهم - الهندسة المعمارية.

لسوء الحظ ، في المشروع الحالي ، لن أتمكن من إثبات أهمية الهندسة المعمارية بالنسبة لك ، فهي لا تزال صغيرة جدًا.



ولكن ، أؤكد لكم ، أن العمارة لم تنشأ من حياة أفضل ، وليس من حقيقة أن المطورين ليس لديهم ما يفعلونه ويكتبون الملخصات حتى لا يتم طردهم. الهندسة المعمارية هي الإجابة على تحديات تطوير المحمول.

أهم هذه المشاكل هو قابلية التوسع. عندما يصبح تطبيقك كبيرًا جدًا وله وظائف مختلفة ، من المهم أن يكون من السهل فهمه وتوسيعه وتصحيحه. خلاف ذلك ، فإن أي إضافة للميزات ستغير جميع الميزات القديمة. ويزيد خطر تعرضنا للأخطاء.

لا تنتظر حتى ينمو التطبيق الخاص بك. بالفعل في المرحلة الأولية ، يمكنك معرفة الممارسات الأساسية لبناء برامج تعمل أيضًا لتطبيقات الهاتف المحمول ، مثل SOLID ، وأنماط العصابات المكونة من أربعة.

تحتوي بنية تطبيقات الهاتف المحمول على تفاصيلها الخاصة: يتم بناء مكوناتها العالمية أو الكبيرة وفقًا للأنماط المعمارية التي تنص على مستوى عالٍ على الأشياء التي يجب أن تنتمي إلى أي طبقة. الأكثر شعبية هي MVC و MVP و MVVM.

ودعونا لا ننسى أن العمارة في الواقع ليست رصاصة فضية. من الضروري مراعاة تفاصيل المشروع. إذا كنت تسحب نوعًا من الهندسة المعمارية إلى مشروعك مع وجود دموع في عينيك ، فربما حدث خطأ ما.

عندما تدرس النظرية ، سوف تبدو معقدة للغاية بالنسبة لك. ولكن في الواقع ، عندما تعمل في مشروع ذي بنية جيدة ، فسوف تكون سعيدًا لأنه أصبح من الأسهل عليك كتابة التعليمات البرمجية. أنت تعرف ما وأين تريد إضافته بحيث يكون لديك ميزة. لذلك ، في هذه المرحلة ، من أجل التعرف على الهندسة بشكل جيد ، أنصحك بالعمل أو التدريب في مشروع كبير. إذا لم يكن لديك مثل هذه الفرصة ، فإن العديد من الشركات الآن تضع مشاريعها في مصدر مفتوح: Wikipedia ، Firefox. ولا أحد يمنعك من الذهاب إلى جيثب ورؤية هناك.

لذا ، طلبنا جاهز. لنضعه في المجال العام حتى يتمكن المستخدمون من تنزيله.



في معظم الحالات ، يحصل المستخدمون على تطبيقات من Google Play و App Store. ولكن قبل إضافة التطبيق إلى المتجر ، يجب أن نوقعه. ويرجع ذلك إلى حقيقة أن أنظمة التشغيل تقوم بتشغيل التطبيقات فقط من المطورين الموثوق بهم. وبالتالي ، على الأنظمة الأساسية للجوّال ، لدينا تطبيقات وفيروسات أقل ضررًا ، لأن المطورين الموثوق بهم فقط هم الذين يمكنهم الوصول للعمل على الأجهزة المحمولة.

للقيام بذلك ، تحتاج إلى إصدار شهادة مطور. هذه في الواقع بيروقراطية صغيرة ، ولحسن الحظ ، فهي مؤتمتة في أحدث إصدارات Xcode.

كما تحتاج إلى التقاط لقطات شاشة للتطبيق والوصف. لا يجب إهمال الخطوتين الأخيرتين ، لأن صفحة تطبيقك هي إعلانها. إذا لم يكن ساطعًا ، فمن المرجح أن كل تطويرنا قد ذهب سدى ، لأنه لن يقوم أحد بتنزيل التطبيق.

تم تحميل التطبيق ، لنتحدث الآن عن بعض المهارات الإضافية التي يمكنها تبسيط حياتك وتحسين جودة التطبيقات.

المهارة التي ستستخدمها غالبًا هي تصحيح الأخطاء.



طريقة تصحيح الأخطاء الرئيسية هي وحدة التحكم القديمة الجيدة. لديها الكثير من الأسماء ، ولكن المعنى هو نفسه. عندما يحدث خطأ ما ، نضيف متغيرات التسجيل والطباعة. ولكن للأسف ، فإن هذه الطريقة لها أيضًا عيوب خطيرة.

أول العيوب هو تغيير شفرة المصدر. هناك أخطاء تختفي عند إضافة printf. وقمت بإزالة printf - تنشأ مرة أخرى. حتى أن هذه الأخطاء لها اسم منفصل - Heisenbug.

النتيجة الثانية هي أنك تحتاج إلى إعادة ترجمة التطبيق الخاص بك وتشغيله مرة أخرى. في المشاريع الكبيرة ، يمكن أن يستغرق ذلك دقائق ، وإذا كنت بحاجة إلى الانتظار لمدة دقيقة عند إضافة كل سجل جديد ، فسوف تقضي الكثير من الوقت في المجموع.

والأخير هو العيب الأكثر أهمية للطباعة - لسوء الحظ ، فإنه لا يساعد على جميع الأخطاء.

مثال من الممارسة الشخصية. عند تطوير لوحة المفاتيح ، حدث ما يلي:



في لوحة مفاتيح النظام أدناه ، بدلاً من أيقونات النظام والميكروفون ، ظهرت بعض المعرّفات. تصحيح هذا الخطأ ، شعرت بهذا:



كيف يمكن للتطبيق كسر لوحة مفاتيح النظام؟! اتضح أنه يمكن.



عند التحقيق في الخطأ ، ساعدتني معرفة المصحح كثيرًا. على وجه الخصوص ، تعيين نقطة توقف لاستدعاء وظائف معينة. عرض المصحح ، حيث يمكننا إلقاء نظرة على واجهة المستخدم الخاصة بنا ومعرفة من لديه أي فئة وحالة.

عندما استفدت من هاتين النقطتين الأوليين ، اتضح أن المشكلة كانت في مكتبة UIKit. مطورو iOS على دراية بها ويعرفون أنه ليس لديه رمز مفتوح المصدر. ولكن عندما تعرف المجمع ، تصبح أي مكتبة مفتوحة المصدر لك ، لذا قد تكون الأساسيات الصغيرة للمجمع مفيدة.

هناك أيضًا ما يسمى بمهارة الهندسة العكسية. في بعض الأحيان يمكن أن تكون مملة للغاية ، وأحيانًا تكون مثيرة للاهتمام - قصة بوليسية حيث تتحقق من كيفية ارتباط أحد المكونات بعنصر آخر ، وكيف يتم كل ذلك داخل المكتبة. ونتيجة لذلك ، اتضح أن المشكلة كانت في وقت تشغيل لغة Objective-C.

المهارة المهمة التالية هي تحسين تطبيقاتنا.



تمتلك الأجهزة المحمولة موارد محدودة ، لذلك غالبًا ما تكون هناك مشكلة في الأداء. عند التطوير ، نحتاج إلى التفكير في أشياء مثل استهلاك وحدة المعالجة المركزية. في معظم الأحيان ، هذا هو تعقيد التعليمات البرمجية التي تكتبها. سرعة العرض والذاكرة وحركة مرور الشبكة ، لأن معظم المستخدمين من المرجح أن يستخدموا تطبيقك على حركة مرور الهاتف المحمول دعونا نحترم المستخدمين وربما يكون متبادلاً.

النقطة الخامسة هي البطارية ، وهي تتبع من الأربعة الأولى.

أهم شيء عند تحسين التطبيقات هو تحديد مجالات المشكلة. إذا كنت تعتمد فقط على افتراضاتك ، فمن المحتمل أنك ستخسر الكثير من الوقت ، ولن تحصل على الكثير من الربح. هذا سوف يساعد أدوات المنصة. وهي تتضمن ملفًا شخصيًا - برنامج يوضح لك المكان الذي يقضي فيه البرنامج معظم الوقت في شفرتك. أي أنك سترى الطريقة التي يتم فيها تعليق برنامجك في أغلب الأحيان ، وعلى الأرجح ستجد سبب التجميد.

ستساعدك معرفة الخوارزميات وهياكل البيانات على إيجاد حل أكثر كفاءة. أيضا ، يمكن أن تساعد المعرفة متعددة المقالات هنا. هناك معالجات متعددة النواة على الأجهزة المحمولة الآن ، ومن خلال موازاة المشكلة عبر عدة سلاسل ، ستحصل على زيادة طفيفة في الأداء.

يحدث في بعض الأحيان أن النقطتين الأوليين ، للأسف ، لا تساعد. بعد ذلك ، ستتم مساعدتك بفهم كيفية عمل نظام التشغيل ، ومعرفة مكالمات النظام ، مثل خريطة الذاكرة (mmap). في حالتنا ، فإن لوحات مفاتيح iOS التابعة لجهات خارجية لديها قيود على استهلاك ذاكرة الوصول العشوائي - 52 ميغابايت. أي أننا نريد إضافة ميزات ، وإنشاء واجهة مستخدم جميلة ، ولكن تقتصر على 52 ميغابايت. ما يجب القيام به مع هذا ليس واضحا.

عند إضافة ميزة أخرى ، حدث هذا. غالبًا ما بدأنا في تجاوز هذا الحد ولم نعرف ماذا نفعل به. ونتيجة لذلك ، جاءت مكالمة نظام خريطة الذاكرة للإنقاذ. أخذنا ملفًا مع قاموس ، حيث نحصل على جميع التلميحات ، وبدأنا في استدعاء خريطة الذاكرة. وبالتالي ، نعمل مع جزء من الملف دون تحميله بالكامل في ذاكرة الوصول العشوائي.

آخر مشكلة تمت مواجهتها بشكل متكرر هي وقت البدء. هنا يمكنني أن أنصحك بقراءة ما يحدث قبل أن يبدأ الكود الخاص بك في العمل. على وجه الخصوص ، حول الربط الثابت والديناميكي.



آخر مهارة مفيدة هي التكامل المستمر أو أتمتة المهام المملة.

لا أحد يحب القيام بمهام مملة ، لذلك نقوم فقط بأتمتتها. في أغلب الأحيان ، يكون أبسط شيء هو إنشاء التطبيق لكل التزام تقوم به ، وكلما قمت بإنشاء التطبيق ، زادت سرعة العثور على المشكلة. إذا كانت لديك اختبارات ، فقم بتشغيلها أيضًا.

كما قلت ، يرتبط المنشور ببيروقراطية صغيرة ، لذا فهو أيضًا مؤتمت للغاية ، ويمكنك إطلاق التجميع في متجر بيتا لكل طلب تجمع حتى يتمكن المختبرون من اختباره. يمكنك أيضًا أتمتة إنشاء لقطات الشاشة لمتجر التطبيقات ، حتى لا تفعلها يدويًا.

لجميع المهارات المذكورة ، جمعت مواد مفيدة.التي ستساعد في دراستهم. كما يحتوي على شفرة المصدر لنسخة مبسطة من المترجم. شكرا لاهتمامكم ، آمل أن يكون لديك أوضح قليلا ما يجب أن تدرسه لبدء رحلتك.

Source: https://habr.com/ru/post/undefined/


All Articles