14 شيء يجب أن يعرفه مطور iOS

بإذن من المؤلف ، أنشر ترجمة المقالة التي كتبها Norberto Gil Vasconcelos "يجب أن يعرف 14 لمطور iOS" ( رابط إلى الأصل ). في وقت نشر المقال ، كان إصدار Swift 3. ملائمًا.

بصفتي مطور iOS (يعتمد حاليًا بشكل مطلق على Swift) ، أنشأت تطبيقات من البداية ، ودعمت التطبيقات ، وعملت في فرق مختلفة. طوال الوقت الذي كنت أعمل فيه في هذه الصناعة ، غالبًا ما سمعت العبارة: "لا يمكنك التوضيح ، ثم لا تفهم". لذلك ، في محاولة لفهم ما أفعله كل يوم بالضبط ، أقوم بإنشاء قائمة بما هو مهم ، في رأيي ، لأي مطور iOS. سأحاول أن أشرح كل لحظة بأكبر قدر ممكن من الوضوح. [لا تتردد في تصحيح لي ، أو التعبير عن رأيك أو اقتراح إضافاتك إلى هذه القائمة.]


المواضيع: [ التحكم في الإصدار | الأنماط المعمارية | الهدف-ج مقابل سويفت | تفاعل | مدير التبعية | تخزين المعلومات | CollectionViews و TableViews | واجهة المستخدم | البروتوكولات | دوائر قصيرة | المخططات | الاختبارات | تحديد الموقع الجغرافي | سلاسل قابلة للترجمة ]


هذه قائمتي ، دون مزيد من اللغط ، بترتيب عشوائي.

1 - التحكم في الإصدار


تهانينا ، لقد تم قبولك! استخرج الرمز من المستودع وابدأ العمل. توقف ماذا؟

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

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

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

2 - الأنماط المعمارية


ترتجف أصابعك مع الإثارة ، لقد اكتشفت التحكم في الإصدار! أم بسبب القهوة؟ لا يهم! أنت على وشك الإيقاع وحان الوقت للبرمجة! لا. ماذا ننتظر؟
قبل أن تجلس على لوحة المفاتيح ، يجب عليك اختيار النمط المعماري الذي ستلتزم به. إذا لم تكن قد بدأت المشروع ، يجب أن تطابق النمط الحالي.
هناك مجموعة واسعة من الأنماط المستخدمة في تطوير التطبيقات المحمولة (MVC ، MVP ، MVVM ، VIPER ، إلخ). سأقدم لمحة موجزة عن الأكثر استخدامًا في تطوير iOS:

  • MVC — Model, View, Controller. Controller Model View, . View Controller , Controller . ? , View, (ViewController) . , MVC. MVC . ( !), , , Model, , . MVC , , iOS .


    MVC –
  • MVVMModel, View, ViewModel. ( ) View ViewModel, ViewModel , ViewModel, View - . ViewModel View, , .


    MVVM –


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

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

- بنجامين فرانكلين

هدفنا هو الحصول على كود بديهي وسهل القراءة يسهل استخدامه وصيانته.

3 - الهدف-س مقابل سويفت


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

مقارنةً بـ Objective-C ، يحقق Swift قفزة في نواح كثيرة. إنها سهلة القراءة ، وتبدو وكأنها لغة إنجليزية طبيعية ، ولأنها ليست مبنية على لغة C ، فإن هذا يسمح لك بالتخلي عن الأعراف التقليدية. بالنسبة لأولئك الذين يعرفون الهدف-ج ، هذا يعني عدم وجود فواصل منقوطة ، ولن تكون هناك حاجة لوضع مكالمات الأسلوب وشروط التعبير بين قوسين. من الأسهل أيضًا الحفاظ على شفرتك: يحتاج Swift فقط إلى ملف. swift بدلاً من ملفات .h و. m ، لأن Xcode ومترجم LLVM يمكنهما اكتشاف التبعيات وتنفيذ عمليات البناء الإضافية تلقائيًا. بشكل عام ، يجب أن تقلق بشأن إنشاء رمز موحد ، وستجد أنه يمكنك تحقيق نفس النتائج بخطوط أقل.

هل ما زلت في شك؟ يعد Swift أكثر أمانًا وسرعة ويهتم بإدارة الذاكرة (في الغالب!). هل تعلم ماذا يحدث في Objective-C عندما تستدعي طريقة ذات متغير مؤشر غير مهيأ؟ لا شيئ. يصبح التعبير غير نشط ويتم تخطيه. يبدو الأمر رائعًا ، لأنه لا يؤدي إلى تعطل التطبيق ، ومع ذلك ، فإنه يتسبب في عدد من الأخطاء والسلوك غير المستقر ، والذي ستحتاج إلى التفكير في تغيير مهنتك بسببه. بجدية. تألقت فكرة أن تصبح مشواً محترفاً للكلاب بألوان جديدة. في نفس الوقت ، يعمل عداد Swift مع القيم الاختيارية. لن تحصل فقط على فكرة أفضل عما يمكن أن يكون صفرًا وتعيين الشروط لمنع استخدام قيم الصفر ، ولكن أيضًا ستحصل على تعطل وقت التشغيل إذا كان لا يزال هناك استخدام اختياري ، مما سيبسط التصحيح.يساعدك ARC (العد المرجعي التلقائي) على إدارة ذاكرتك بشكل أفضل في Swift. في Objective-C ، لا يعمل ARC مع C الإجرائي أو مع API مثل Core Graphics.

4 - رد فعل أم لا رد فعل؟ (هذا هو السؤال)


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

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

// 
let timmySavings = Variable(5)
let jennySavings = Variable(10)

var isConsoleAttainable =
Observable
.combineLatest(timmy.asObservable(), jenny.asObservable()) { $0 + $1 }
.filter { $0 >= 300 }
.map { "\($0)    !" }

//  
timmySavings.value = 10
jennySavings.value = 20
isConsoleAttainable
   .subscribe(onNext: { print($0) }) //   

//  
timmySavings.value = 100
jennySavings.value = 200
isConsoleAttainable
   .subscribe(onNext: { print($0) }) // 300    !

هذا مجرد مثال على ما يمكن القيام به باستخدام FRP ، بمجرد إتقانك له ، فإنه سيفتح عالماً جديداً من الاحتمالات ، حتى اعتماد هندسة أخرى غير MVC ... نعم ، نعم! MVVM!
يمكنك إلقاء نظرة على اثنين من المتقدمين الرئيسيين للحصول على لقب رئيس Swift FRP:


5 - مدير التبعية


CocoaPods و Carthage هما أكثر مديري التبعية شيوعًا لمشاريع Cocoa Swift و Objective-C. يبسطون عملية تنفيذ المكتبة وتحديثها باستمرار. يحتوي

CocoaPods على العديد من المكتبات التي تم إنشاؤها باستخدام Ruby ويمكن تثبيتها باستخدام الأمر التالي:

$ sudo gem install cocoapods

بعد التثبيت ، ستحتاج إلى إنشاء Podfile لمشروعك. يمكنك تشغيل الأمر التالي:

$ pod install

أو أنشئ ملفًا مخصصًا باستخدام هذه البنية:

platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
pod 'AFNetworking', '~> 2.6'
pod 'ORStackView', '~> 3.0'
pod 'SwiftyJSON', '~> 2.3'
end

بمجرد إنشائه ، حان الوقت لتثبيت وحداتك الجديدة:

$ pod install

الآن يمكنك فتح .xcworkspace لمشروعك ، لا تنس استيراد تبعياتك .

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

لمزيد من المعلومات حول التثبيت والاستخدام ، تحقق من مشروع GitHub .

6 - مخزن البيانات


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

  • NSData
  • NSDate
  • NSNumber
  • NSDictionary
  • Nsstring
  • NSArray

للتوافق مع Swift ، يمكن لـ NSNumber قبول الأنواع التالية:

  • UInt
  • Int
  • تطفو
  • مزدوج
  • منطقي

يمكن تخزين الكائنات في NSUserDefaults على النحو التالي (قم أولاً بإنشاء ثابت يقوم بتخزين المفتاح للكائن المخزن):

let keyConstant = "objectKey"

let defaults = NSUserDefaults.standardsUserDefaults()
defaults.setObject("Object to save", objectKey: keyConstant)

لقراءة كائن من NSUserDefaults ، يمكننا القيام بما يلي:

if let name = defaults.stringForKey(keyConstant) {
   print(name)
}

هناك العديد من الطرق الملائمة للقراءة والكتابة إلى NSUserDefaults التي تتلقى كائنات معينة بدلاً من AnyObject.

Keychain هو نظام إدارة كلمات المرور وقد يحتوي على كلمات مرور أو شهادات أو مفاتيح خاصة أو ملاحظات شخصية. تحتوي Keychain على مستويين من تشفير الجهاز. يستخدم المستوى الأول رمز قفل شاشة القفل كمفتاح التشفير. يستخدم المستوى الثاني مفتاحًا تم إنشاؤه وتخزينه على الجهاز.

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

الحل الأفضل هو استخدام التشفير الخاص بك. (لا تخزن المفتاح على الجهاز)

CoreData- هذا إطار عمل تم تطويره بواسطة Apple بحيث يتفاعل تطبيقك مع قاعدة البيانات بطريقة موجهة نحو الكائنات. هذا يبسط العملية عن طريق تقليل كمية التعليمات البرمجية وإلغاء الحاجة إلى اختبار هذا القسم.

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

7 - CollectionViews و TableViews


يحتوي كل تطبيق تقريبًا على واحد أو أكثر من CollectionViews و / أو TableViews. إن معرفة كيفية عملهم ووقت استخدام واحد أو آخر سيمنع التغييرات المعقدة في تطبيقك في المستقبل. تعرض

TableViews قائمة بالعناصر الموجودة في عمود واحد عموديًا وهي محدودة فقط عن طريق التمرير العمودي. يتم تمثيل كل عنصر بواسطة UITableViewCell ، والتي يمكن تخصيصها بالكامل. يمكن فرزها حسب الأقسام والصفوف.

تعرض CollectionViews أيضًا قائمة بالعناصر ، ولكن يمكن أن تحتوي على أعمدة وصفوف متعددة (على سبيل المثال ، شبكة). يمكن تمريرها أفقيًا و / أو عموديًا ، ويتم تمثيل كل عنصر بواسطة UICollectionViewCell. مثل UITableViewCells ، يمكن تخصيصها حسب الرغبة وفرزها حسب القسم والصف.

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

مهما كان اختيارك ، فمن الجيد إنشاء TableView / CollectionView عام. هذا يسهل التنفيذ ويسمح بإعادة استخدام كميات كبيرة من التعليمات البرمجية.

8 - القصص المصورة VS Xibs VS برمجة قابلة للبرمجة


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

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

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

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

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

9 - البروتوكولات!


في الحياة اليومية ، توجد بروتوكولات حتى نعرف في حالة معينة كيف نرد. افترض أنك رجل إطفاء ، وحدثت حالة طوارئ. يجب على كل رجال الاطفاء اتباع بروتوكول يحدد متطلبات الاستجابة الناجحة. الأمر نفسه ينطبق على البروتوكولات في Swift / Objective-C.

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

فيما يلي مثال على إنشاء بروتوكول واستخدامه:

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

enum ExtinguisherType: String {

   case water, foam, sand

}

بعد ذلك سأقوم بإنشاء بروتوكول استجابة للطوارئ.

protocol RespondEmergencyProtocol {

   func putOutFire(with material: ExtinguisherType)

}

الآن سأقوم بإنشاء صف إطفائي يطيع البروتوكول.

class Fireman: RespondEmergencyProtocol {

    func putOutFire(with material: ExtinguisherType) {

       print("Fire was put out using \(material.rawValue).")

    }

}

غرامة! والآن نستخدم إطفائي.

var fireman: Fireman = Fireman()

fireman.putOutFire(with: .foam)

يجب أن تكون النتيجة ما يلي: "تم إخماد الحريق باستخدام الرغوة".

يتم استخدام البروتوكولات أيضًا في التفويض. يسمح ذلك للفئات أو الهياكل بتفويض وظائف معينة لمثيل من نوع آخر. يتم إنشاء بروتوكول بمسؤوليات مفوضة للتأكد من أن وظائفها من النوع المناسب.
مثال صغير!

protocol FireStationDelegate: AnyObject {

func handleEmergency()

}

مندوبي إدارة الإطفاء إلى تدابير الاستجابة الطارئة لرجال الإطفاء.

class FireStation {
   weak var delegate: FireStationDelegate?

   func emergencyCallReceived() {
      delegate?.handleEmergency()
   }
}

هذا يعني أنه يجب على رجال الإطفاء أيضًا الامتثال لبروتوكول FireStationDelegate.

class Fireman: RespondEmergencyProtocol, FireStationDelegate {

   func putOutFire(with material: ExtinguisherType) {
      print("Fire was put out using \(material.rawValue).")
   }

   func handleEmergency() {
      putOutFire(with: .water)
   }

}

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

let firestation: FireStation = FireStation()
firestation.delegate = fireman
firestation.emergencyCallReceived()

ونتيجة لذلك ، حصلنا على: "تم إخماد الحريق باستخدام الماء".

10 - دوائر قصيرة


سيكون الأمر فقط حول إغلاق Swift. يتم استخدامها بشكل أساسي لإرجاع كتلة زائدة أو بوظائف مرتبة عالية. يتم استخدام الكتل النهائية ، كما يوحي الاسم ، لتنفيذ كتلة التعليمات البرمجية بعد اكتمال المهمة.
تتشابه عمليات الإغلاق في Swift مع الكتل في C و Objective-C.

عمليات الإغلاق هي كائنات من الدرجة الأولى * ، بحيث يمكن تداخلها وتمريرها (مثل الكتل في Objective-C).

تعتبر الوظائف في Swift حالة خاصة من حالات الإغلاق.

المصدر - fuckingswiftblocksyntax.com **

هذا المورد هو مكان رائع لتعلم صيغة الإغلاق.

* كائنات من الدرجة الأولى - كائنات يمكن استخدامها بدون قيود: يتم تعيينها إلى متغير ، تمرير / إرجاع من دالة ، إنشاء / تدمير أثناء تنفيذ البرنامج ، إلخ. مزيد من التفاصيل . (فيما يلي - مترجم تقريبًا)
** الموقع لا يعمل ، ولكن لا تزال هناك صور في آلة backbackmachine ، كمثال .


أحد عشر - مخطط


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

يظهر الأرجواني نمط واحد ممكن.

12- الاختبارات


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

لنبدأ مع سلبيات اختبار الوحدة:

  • زيادة وقت التطوير ؛
  • زيادة كمية التعليمات البرمجية.

الإيجابيات :

  • الحاجة إلى إنشاء كود معياري (لتبسيط الاختبار) ؛
  • من الواضح الكشف عن معظم الأخطاء قبل إطلاقها ؛
  • تبسيط الدعم.

بالاقتران مع الأداة المساعدة Tools ، سيكون لديك كل شيء لجعل التطبيق مرنًا ويعمل بدون أخطاء أو أعطال.

هناك العديد من الأدوات التي يمكنك استخدامها لاختبار التطبيق الخاص بك. بناءً على ما تريد تتبعه ، يمكنك تحديد واحد أو أكثر منهم. ربما تكون الأدوات الأكثر استخدامًا هي Leaks و Time Profiler و Allocations .

13 - تحديد الموقع الجغرافي


في العديد من التطبيقات ، تتطلب بعض الوظائف تحديد موقع المستخدم. لذلك سيكون من الجيد أن يكون لديك فكرة عامة عن كيفية عمل الموقع لنظام iOS.

هناك إطار يسمى الموقع الأساسي ، والذي يسمح لك بالوصول إلى كل ما تحتاجه:

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

* كما أفهمها ، يتعلق الأمر بتكنولوجيا iBeacon

رائع ، أليس كذلك؟ تحقق من وثائق Apple والمثال هناك لفهم إمكانات الإطار بشكل أفضل.

14 - سلاسل قابلة للترجمة


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

يمكن إضافة المورد إلى اللغة من خلال مفتش الملف. للحصول على سلسلة باستخدام NSLocalizedString ، تحتاج إلى كتابة ما يلي:

NSLocalizedString(key:, comment:)

لسوء الحظ ، لإضافة سطر جديد إلى الملف Localizable ، يجب القيام بذلك يدويًا. هنا هيكل مثال:

{
"APP_NAME" = "MyApp"
"LOGIN_LBL" = "Login"
...
}

الآن لغة أخرى (البرتغالية) ، الملف المترجم:

{
"APP_NAME" = "MinhaApp"
"LOGIN_LBL" = "Entrar"
...
}

بل هناك طرق لتطبيق الجمع.

شارك دائمًا ما تعلمته.

- سيد يودا

نأمل أن تكون هذه المقالة مفيدة!

All Articles