أوليغ إيفانوف ، رئيس مركز اختصاص قنوات الخدمة عن بعد ، قسم تطوير تكنولوجيا المعلومات ، إدارة تكنولوجيا المعلومات ، بنك موسكو الائتماني (ICD)بالنسبة لنا ، بدأ تطوير تطبيق الهاتف المحمول من نقطة الصفر ، وبالتالي ، سنبدأ في هذه المقالة من البداية: من خلال تحديد ما هو عليه وما هي الوظائف التي يجب أن تكون فيه. وبعد ذلك سنذهب - من شراء أدوات جديدة لاختبار التطبيق إلى تشغيله. سنحكي قصة تطوير تطبيقنا مع المسافات البادئة التكنولوجية. لنصف المشكلات التي واجهناها. لسوء الحظ ، لن نتمكن من تغطية جميع النهج والمبادئ والحلول التكنولوجية التي استخدمت في التطوير في مقالة المراجعة هذه ، لكننا سنناقش أكثر النقاط إثارة للاهتمام.
علاوة على ذلك ، سيكون هناك تركيز على تطوير نظام التشغيل iOS. قبل أن تبدأ ، دعونا نقرر ما هو موبايل بنك.
بنك المحمول هو إدارة الحسابات المصرفية التي تستخدم التطبيق المصرفي على هاتف ذكي (iPhone ، إلخ) ، كمبيوتر لوحي (iPad ، Samsung Galaxy Tab ، وما إلى ذلك). بالنسبة للعمليات المصرفية ، يلزم تأكيد من خطوتين باستخدام رموز لمرة واحدة عبر رسائل SMS.
العمليات المصرفية الرئيسية لبنك المحمول:
- استخدام المنتجات المصرفية (الحسابات ، البطاقات ، الودائع ، القروض ، حزم الخدمات ، إلخ.)
- عرض رصيد الحساب
- مقتطف
- دفع الفواتير لخدمات المحمول
- دفع خدمات الإسكان
- تحويل الأموال من بطاقة إلى بطاقة
- المدفوعات العادية
- سداد القروض
- تحويل الأموال إلى الودائع
- قفل بطاقة الدفع
- وغيرها.
التطبيقات المصرفية للأجهزة المحمولة هي تطبيقات مصرفية عبر الإنترنت تم تكييفها لشاشات صغيرة من الهواتف الذكية وأنظمة التشغيل (Apple iOS ، Google Android) المثبتة على الأجهزة المحمولة. تجدر الإشارة إلى أن مجموعة طرازات الأجهزة التي تعمل بنظام التشغيل Android واسعة للغاية: Samsung و LG و Xiaomi و Huawei وغيرها ، مما يعقد تطوير ودعم تطبيق Android.
المصدر - MKBMobile 1.0
تم نقل مشروع تطبيق Mobile Bank إلى فريقنا من شركة خارجية ، وتم كتابته في الهدف C.
هكذا نظر المشروع من خلال عيون المستخدم:


أصبح هذا المشروع بدء التشغيل واختبارًا لقدراتنا. لم يكن لدى فريقنا سوى القليل من تجارب التطوير الخاصة بمنصة iOS للجوال ، لكننا نجحنا في تنفيذ المشروع.
من أين تبدأ؟ عندما نفكر في تطوير نظام iOS ، فإن أول شيء نحتاجه:
1. تحتاج إيماك
تشتهر شركة آبل بارتفاع أسعار منتجاتها. لكن الادخار لا يستحق كل هذا العناء - هذه هي سرعة تطورك!
تكوين تقريبي أمثل يناسبنا:
- معالج Intel Core i5 من الجيل السابع بسرعة 3.8 جيجا هرتز على مدار الساعة (Turbo Boost حتى 4.2 جيجا هرتز)
- 32 جيجابايت DDR4 2400 ميغاهيرتز
- 2 تيرابايت فيوجن درايف
- راديون برو 580 GPU مع 8GB من VRAM
التكلفة التقريبية لهذه الآلة هي 190،000 روبل.
هناك رأي - للمبرمجين بحاجة إلى iMac Pro. هذا صحيح :) لكن السعر بالنسبة للعض ، وإذا كانت شركتك مستعدة لشرائها ، فسيؤدي ذلك إلى زيادة سرعة تطويرك ، وبالطبع زيادة المستوى الجمالي لمكتبك.
2. تحتاج إلى أجهزة iOS
"كم ومن؟" - السؤال الأول الذي يطرح نفسه. كل هذا يتوقف على طلبك.
إذا كان التطبيق الخاص بك لا يدعم سوى iPhone ، فهناك حجمان مختلفان على الأقل (مثل iPhone SE) وكبير (على سبيل المثال iPhone 8 Plus).
إذا كان تطبيقك يدعم iPad أيضًا ، فأنت بحاجة إلى iPad واحد.
التالي يأتي نظام التشغيل - إصداره. إذا كان التطبيق الخاص بك يدعم الحد الأدنى من الإصدار ، على سبيل المثال ، بدءًا من نظام التشغيل iOS 8.0 ، فأنت بحاجة إلى تخزين الجهاز مع كل رقم تسلسلي لنظام التشغيل iOS وتذكر أن "تحتفظ" (لا تقم بالتحديث) هذا الإصدار على الجهاز ومراقبة ظهور الإصدارات الجديدة من نظام التشغيل iOS ، دون أن تنسى تحديد مجموعة له الأجهزة.
بطبيعة الحال ، لأول مرة يمكنك الحصول عليها باستخدام محاكيات Xcode ، ولكن الأجهزة المادية تفرض تصادماتها الخاصة التي لا تظهر على أجهزة المحاكاة.
إذا كنت لا ترغب في امتلاك مزرعة للأجهزة الخاصة بك ، فيمكنك التطلع إلى أطراف الشركات التي تقدم هذه الخدمة: AWS Device Farm ، Xamarin Test Cloud ، إلخ.
كما ذكرنا سابقًا ، يتم دعم تطبيقنا لكل من iPhone و iPad. في وقت كتابة هذا التقرير ، تضم مزرعة (!) الخاصة بنا حوالي 30 جهازًا من أنواع مختلفة من إصدارات نظام التشغيل.
3. تحتاج إلى اتخاذ قرار بشأن نهج التطوير لنظام التشغيل iOS (أصلي أو بديل).
جربنا خيارات التطوير البديلة التالية لنظام iOS:
Phonegap / Cordovaتم إنشاء PhoneGap في الأصل بواسطة Nitobi. في عام 2011 ، استحوذت Adobe على Nitobi وعلامة PhoneGap. تقوم Adobe بعد ذلك بنقل إصدار واحد من PhoneGap ، يطلق عليه Cordova ، إلى Apache Foundation ، تاركًا العلامة التجارية PhoneGap والمنتج نفسه. ونتيجة لذلك ، يمكن اعتبار Cordova كمحرك أسفل غطاء PhoneGap (وكذلك بعض الأُطُر الهجينة الأخرى). PhoneGap ، بدوره ، يضيف ميزاته الإضافية إلى قدرات Cordova.
PhoneGap يشبه إلى حد كبير أيوني. كما أنه يمنح المطورين القدرة على إنشاء تطبيقات مشتركة عبر منصات باستخدام تقنيات الويب ، كما أنه مصمم أيضًا على أساس Apache Codova. ومع ذلك ، فإن PhoneGap غير مرتبط بأي إطار عمل جافاسكريبت معين ، بحيث يكون لدى المطورين المزيد من الخيارات بشأن ماذا وكيف سيقومون بإنشاء تطبيقاتهم.
للأسف ، يستخدم PhoneGap WebView (الذي يكون بطيئًا جدًا على نظام التشغيل iOS) ، لذلك لا تكون الأشياء رائعة دائمًا مع سرعة التطبيقات المبنية على أساس هذا الإطار.
Xamarinتأسست شركة Xamarin ، وهي عائلة منتجات Xamarin ، التي تأسست عام 2011 من قبل Microsoft بعد خمس سنوات من وجودها. تقدم منتجات Xamarin حاليًا أسلوبًا مثيرًا للاهتمام لتطوير تطبيقات الأجهزة المحمولة متعددة المنصات في السوق: يتم كتابة التطبيقات في C # ، ثم تقوم Xamarin بتجميعها في تطبيق أصلي لـ iOS أو Android ، بينما تستخدم Xamarin تقنية Mono كتقنية أساسية ، بدلاً من الأنظمة الأساسية المشتركة وتقدم. يقول مطورو Xamarin أن التطبيقات الناتجة تستخدم واجهة برمجة التطبيقات للنظام الأساسي الأصلي الذي يتم تجميع التطبيق من أجله ، وبالتالي فإن سلوك التطبيق الناتج لا يختلف عن سلوك أي تطبيق آخر على نفس النظام الأساسي. بالمناسبة ، يمكن إجراء التطوير باستخدام Visual Studio (وهو أمر غير مفاجئ).
على الرغم من حقيقة أن معظم رمز المشروع يمكن استخدامه دون إجراء تغييرات على كل من المنصات المحمولة المدعومة ، إلا أن بعض الأجزاء يجب كتابتها خصيصًا لإصدار التطبيق لنظامي التشغيل iOS و Android.
ولكن هذه الأساليب تعطي ما يسمى التطبيق "المختلط".
مزايا الخيارات البديلة:- عبر النظام الأساسي (بعد إجراء تطبيق واحد ، يمكن تصديره لأي نظام تشغيل) ؛
- وقت التنمية أقل من الأم.
سلبيات البدائل:- يعمل أبطأ من التطبيقات الأصلية ؛
- ليس لديه حق الوصول الكامل إلى القدرات التقنية للجهاز ؛
- غالبًا ما يتم إهمال المكونات الإضافية الحالية ، لذلك عليك أحيانًا كتابة ما لديك ؛
- يتم تصور واجهة المستخدم باستخدام المتصفح المدمج ، وهذا يخلق صعوبات في الحصول على ردود الفعل مقارنة بالتطبيق الأصلي ؛
- لا يتم تنفيذ جميع الضوابط.
وقررنا مواصلة التطوير "الأصلي" لمشروعنا.
طريقة أبل الأصلية4. بادئ ذي بدء ، نحن بحاجة إلى أداة لتطوير وكتابة التعليمات البرمجية - نحن بحاجة إلى IDE Xcode
Xcode هي بيئة تطوير برامج متكاملة (IDE) لأنظمة تشغيل macOS و iOS و watchOS و tvOS التي طورتها شركة Apple. تم إطلاق الإصدار الأول في عام 2001. يتم توزيع الإصدارات المستقرة مجانًا من خلال متجر تطبيقات Mac. يمكن للمطورين المسجلين أيضًا الوصول إلى تصميمات بيتا من خلال موقع Apple Developer.
هذه هي الطريقة التي يبدو بها إنشاء تطبيق بسيط مثل تطبيق Single View في Xcode والعمل به:

بعض النقاط المثيرة للاهتمام حول Xcode:يوفر Xcode مجموعة أدوات ملائمة للغاية لإنشاء واجهة مستخدم (واجهة المستخدم) - لوحة العمل.


لكن معظم المشاريع (التطبيقات) لنظام التشغيل iOS لا يخدمها مطور واحد ، ولكن يخدمها العديد من (فريق التطوير) ، وعند استخدام لوحة عمل واحدة لجميع شاشات التطبيقات عند استخدام أنظمة التحكم في الإصدار الموزع (SVN ، Mercurial ، GIT ، إلخ) ، يتحول دمج التطورات إلى الجحيم الحقيقي.
وافق فريقنا على نهج:
القصة المصورة واحدة - ViewController واحد .
باستخدام هذا النهج ، تختفي المشكلة الموضحة أعلاه ، حيث يقوم مطور واحد عادة بتنفيذ ميزة واحدة ، أي جميع شاشات هذه الميزة.
لتقليل التحميل في لوحة العمل عند استخدام Segue ، يمكنك استخدام وظيفة
"Refactor to storyboard" . تقوم عملية إعادة تشكيل لوحة العمل هذه بإنشاء رابط في لوحة العمل الأصلية ، مما يؤدي إلى لوحة عمل جديدة منفصلة ، حيث يتم تطبيق ViewController المطلوب.
كما تجدر الإشارة إلى أداة تصحيح الأخطاء من Xcode -
Breakpoint .
Breakpoint هي أداة تصحيح تسمح لك بإيقاف تنفيذ البرنامج مؤقتًا حتى نقطة معينة. سيتيح لنا ذلك فحص رمز البرنامج (معرفة قيم المتغيرات في هذه اللحظة ، وإجراء بعض العمليات الحسابية ، وما إلى ذلك) لمعرفة مكان حدوث الأخطاء.

هذه الأداة ذكية: لدينا أزرار التحكم في الوصول (Step Over و Step Into) ، والتي نتعامل معها والتي نتصفحها من خلال كودنا. لدينا أيضًا إمكانية الوصول إلى تحليل قيم المتغيرات والعمل مع السجلات في إخراج وحدة التحكم.
عند النقر مع الضغط على Control على نقطة توقف المؤشر تعرض قائمة من الأوامر. يمكنك هنا تعيين شروط إضافية لتشغيل نقطة توقف ، وإضافة إجراءات ، إلخ.
على سبيل المثال ، قمنا بتعيين شرط تشغيل لنقطة التوقف: ستأخذ الخطوة المتغيرة القيمة 4. وبعد بدء تشغيل التطبيق ، سيتوقف البرنامج عن تنفيذه عند نقطة التوقف هذه فقط عندما يأخذ متغير الخطوة القيمة 4 وليس قبل ذلك.

يمكننا إضافة تعبير إضافي (الخصائص وحتى الحسابات!).
5. تحتاج إلى تحديد لغة البرمجة Objective-C أو Swift الجديد
تم كتابة المشروع الذي حصلنا عليه في Objective-C ، ولكن لغة برمجة Swift الجديدة كانت بالفعل في الأفق.
ما هي لغات البرمجة هذه؟
Objective-C هي لغة برمجة مترجمة وموجهة للعناصر تستخدمها شركة Apple ، وهي مبنية على أساس لغة C ونموذج Smalltalk. على وجه الخصوص ، تم تصميم نموذج الكائن في نمط Smalltalk - أي ، يتم إرسال الرسائل إلى الكائنات.
لغة الهدف - C موجودة منذ عام 1989 ، وآخر مرة تم تحديثها في عام 2006 ، وأكثر من ذلك
منذ 10 سنوات. تتزايد شعبية نظام التشغيل iOS ، مما يتطلب تحسين جودة التطبيق. للعمل مع الهدف- C ، مطلوب مطور ماهر.
كل هذا أصبح من الشروط الأساسية لإنشاء لغة برمجة سويفت.
بدأت شركة آبل تطوير Swift في عام 2010. في 2 يونيو 2014 ، تم الكشف عن هذه اللغة رسميًا في مؤتمر مطوري Apple Worldwide (WWDC). دليل مجاني مكون من 500 صفحة لاستخدامه كان متاحًا على iBook Store.
تم إصدار Swift 1.0 في 9 سبتمبر 2014 مع إصدار Gold Master من Xcode 6.0 لنظام التشغيل iOS.
في 8 يونيو 2015 ، أصدرت Apple إصدارًا جديدًا من Swift 2.0 مع تحسين الأداء وواجهة برمجة تطبيقات جديدة لمعالجة الأخطاء. تم تحسين بناء اللغة ، وظهرت وظيفة للتحقق من توفر وظائف Swift لأنظمة التشغيل المستهدفة.
في 3 كانون الأول (ديسمبر) 2015 ، تم إصدار نسخة تجريبية من Swift 3.0 مع دعم لنظام التشغيل X و iOS و Linux ، المرخص لها بموجب ترخيص Apache 2.0 مفتوح المصدر.
في 19 سبتمبر 2017 ، تم إصدار Swift 4.0.
في سبتمبر 2018 ، بالإضافة إلى الإصدار الجديد من iOS 12 ، تم إصدار إصدار مستقر جديد من لغة Swift 4.2 ، وظهرت نسخة تجريبية من Swift 5.0. أعلن الإصدار 5.0 أخيرًا عن التشغيل المستقر لـ ABI من خلال المكتبات القياسية (Swift Dynamic Library) ، ودعم التعبيرات العادية والحل من الدرجة الأولى لمعالجة البيانات الموازية مع وضع المعالجة المتزامن / انتظار.
بناءً على ما تقدم ، قررنا استخدام Swift فقط في أشكال جديدة لدعم النماذج القديمة وإعادة كتابتها تدريجيًا.6. بعد ذلك ، تحتاج إلى فهم بنية المشروع - قررنا ترك بنية MVC من Apple
يقوم Model-View-Controller (MVC) بتعيين واحد من ثلاثة أدوار لكائنات في التطبيق: نموذج أو عرض أو وحدة تحكم. لا تحدد الهندسة المعمارية الأدوار التي تلعبها الكائنات في التطبيق فحسب ، بل تحدد أيضًا الطريقة التي تتفاعل بها الكائنات مع بعضها البعض. يتم فصل كل نوع من الأنواع الثلاثة للكائنات عن غيرها بواسطة حدود مجردة ويتفاعل مع كائنات من الأنواع الأخرى من خلال هذه الحدود (https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html).

ولكن ، بتطبيق هذا النهج ، واجهنا المشكلات التالية ، التي تمكنا من حلها فقط من خلال التبديل إلى الهيكل الجديد في MKBMobile 3.0:
- لا يوفر MVC إرشادات واضحة حول الكيانات والفئات التي تحتاج إلى إنشائها وأيها لا. تظل بنية النموذج وبنيته ، بالإضافة إلى تفاعله مع وحدة التحكم ، بالكامل على ضمير وخيال المطور (المطورين).
- سوء فهم مجال المجال. أي عندما يضيف المطور وظائف جديدة ، بدلاً من إنشاء كيانات جديدة وإعادة هيكلة البنية الحالية ، تتم إضافة وظائف جديدة إلى ViewController. الأمر الذي أدى إلى المشكلة التالية: Massive View Controller - الكثير من التعليمات البرمجية داخل ViewController.
7. وأروع ما في الأمر هو iOS SDK (https://developer.apple.com/documentation/)
يوفر iK SDK عددًا كبيرًا من الإطارات.
استخدمنا قائمة الأطر التالية بحماس خاص في أحد التطبيقات المصرفية:
- PushKit و UserNotifications للعمل مع إشعارات الدفع ؛
- PassKit للعمل مع Apple Pay ؛
- CallKit (بالاشتراك مع WebRTC) للعمل مع خدمات VoIP ؛
- AVFoundation للعمل مع الموارد السمعية ؛
- جهات الاتصال للوصول إلى جهات اتصال المستخدم ؛
- CommonCrypto للعمل مع وظائف التشفير.
لذلك ، قررنا ما هو ضروري ، نحن مكلفون وجاهزون للإنجازات ...لبعض الوقت ، تم دمج الميزات الجديدة (الوظيفة - التحويلات الجديدة ، المدفوعات ، المنتجات المصرفية (البطاقات ، القروض ، إلخ) في التطبيق.
ولكن بعد ذلك أصبح التطبيق
مرهقًا وغير مريح .
لذلك ظهر مشروع MKBMobile 2.0 مع فكرة واجهة جريئة - Trello Pages.في الواقع ، فإن طريقة Trello Pages هي لوحات متصلة بأعلى الشاشة ، في نسختنا ، إلى شريط التنقل العلوي. يسمح لك هذا النهج بإجراء التنقل السريع بين اللوحات (الصفحات).

مزايا هذا النهج:
- قابلية التوسع ، مساحة لانهائية يسار / يمين وأسفل ؛
- إمكانية الفصل ، تم وضع كل نوع من الوظائف على صفحة منفصلة ؛
- مثالي لكل من iPad و iPhone.
ولكن كانت هناك بعض عيوب هذه الفكرة:
- أعلى عناصر قائمة التنقل كانت صعبة الوصول ؛
- خلقت دفع الإخطارات الواردة وإشعارات الرسائل القصيرة صعوبات إضافية في العمل مع قائمة التنقل العلوي ؛
- لم يتوافق هذا النهج مع إرشادات واجهة الإنسان لـ Apple.
لذا وُلد الإصدار الحالي لبنك ICD للهواتف المحمولة ، MKBMobile 3.0.في هذا الإصدار ، اعتمدنا نموذج التنقل الكلاسيكي من TabBar Apple HIG (إرشادات الواجهة البشرية).


بالانتقال إلى هذا الإصدار ، اكتسبنا خبرة سلبية كثيرة باستخدام بنية MVC الكلاسيكية من Apple.
نما فريقنا ، ونحن بحاجة إلى عتبة منخفضة للموظفين الجدد لدخول المشروع.
بالإضافة إلى ذلك ، هناك نقطة أخرى لم تزعجنا: اختبار الوحدة لسلوك العناصر الرسومية ، والذي تم استخدامه للاختبار عبر اختبار واجهة المستخدم الخاصة بـ Xcode ، والذي كان عملية طويلة من بدء تشغيل تطبيق على محاكي (جهاز) مع محاكاة إجراءات المستخدم.
كل هذه المتطلبات أدت إلى استخدام نهج معماري جديد - VIPER.
نموذج VIPER الكلاسيكي:

ولكن ، بعد النظر في العديد من الأساليب في تطبيق VIPER لنظام iOS ، استقرنا على حل Rambler & Co مع الحفريات لدينا.
كأساس وضعنا
كتابًا من Rambler & Co.
المهام الرئيسية التي ساعدنا VIPER في حلها:
- تقسيم الطبقات الكبيرة (وحدات التحكم في المشاهدة الشاملة) مع حدود مسؤولية محددة بشكل أو بآخر ؛
- تطبيق مبادئ الصلبة في كل مجدهم ؛
- عتبة منخفضة للموظفين الجدد الذين يدخلون المشروع ؛
- اختبار وحدة واجهة المستخدم.
من المهم أن نلاحظ على الفور أن VIPER ليس بأي حال مجموعة من النماذج والقواعد الصارمة. بدلاً من ذلك ، هذه قائمة بالتوصيات ، والتي يمكنك من خلالها بناء بنية تطبيقات محمولة مرنة وقابلة لإعادة الاستخدام.
كيف بدأ مشروعنا؟

هيكل وحدة VIPER في تطبيقنا:
1. الفئة "الرئيسية" الأكثر شيوعًا هي فئة الوحدة النمطية ، فهي تعرف كل شيء عن الجميع ، وتقوم بإنشاء كائنات الخدمات الضرورية لـ Interactor ، وتعرف كيفية توصيل جميع الأجزاء بينها ، العرض ، الموجه ، مقدم العرض ، إلخ.

كما يوفر التواصل مع وحدات VIPER الأخرى من خلال بروتوكولات الإدخال والإخراج ModuleInput و ModuleOutput.
تحتوي بروتوكولات الإدخال والإخراج المماثلة على جميع أجزاء وحدة VIPER (عرض ، جهاز توجيه ، مقدم ، إلخ).
اتفقنا على: إذا لم تكن هناك حاجة للبروتوكولات أو أجزاء من وحدة VIPER ، فإننا لا نستخدمها ولا نحتفظ بفصول فارغة لهم.
2. Interactors (Interactor) - إخفاء منطق العمل.
لقد قدمنا طبقة إضافية من الخدمات. خدمة - كائن مسؤول عن العمل بنوع البيانات المحدد الخاص به. على سبيل المثال ، تكون خدمة نظام المساعدة مسؤولة عن الأدلة (ملفات الاتفاقيات ، التفاصيل ، إلخ.)
3. مقدم - يتلقى معلومات من طريقة العرض حول تصرفات المستخدم ويحولها إلى طلبات لجهاز التوجيه ، Interactor ، ويتلقى أيضًا بيانات من Interactor ، يعدها ويرسل طريقة العرض للعرض.
4. جهاز التوجيه - هو المسؤول عن التنقل بين الوحدات.
5. العرض - هو المسؤول عن عرض البيانات على الشاشة وإخطار مقدم العرض عن تصرفات المستخدم. السلبي ، فهو لا يطلب البيانات مطلقًا ، ولا يستقبلها إلا من مقدم العرض.
وحداتنا يمكن أن تكون مركبة.وهذا هو ، وتشمل وحدات VIPER مستقلة. على سبيل المثال ، تتكون صفحة المنتج الرئيسية من مجموعة من الأجزاء المستقلة: التوازن ، عنصر واجهة القالب ، أقسام من أنواع مختلفة من المنتجات المصرفية ، وأسعار الصرف.
كل هذه الأجزاء مستقلة ويمكن أن تعيش حياتهم الخاصة - لديهم واجهة برمجة التطبيقات الخاصة بهم مع خادم البنك ، لديهم نماذج بيانات مستقلة. لعرضها على الصفحة الرئيسية ، يتم إعداد حاويات (Parent View) ، حيث يتم إدراج هذه الحاجيات (View).

تطبيقنا المحمول لنظام iOS ينمو ويتطور باستمرار. يتم استخدامه من قبل المزيد والمزيد من عملائنا.

ما هي الأدوات التالية التي نخطط لتقديمها:
- SwiftLint ، أداة مساعدة من مطوري Realm للتحقق التلقائي من رمز Swift ؛
- CI الكامل على أساس fastlane ؛
- الاستخدام الكامل للأدوات من Xcode (المخصصات ، التسريبات ، الزومبي ، إلخ)
اتبع مقالاتنا! نراكم وشكرا لاهتمامكم!