ios تحميل - الإصدار مقابل بناء في Xcode




برنامج download (7)

لديّ تطبيق قمت بتطويره باستخدام Xcode 3 وبدأت التحرير مؤخرًا باستخدام Xcode 4. في الملخص الهدف لدي نموذج الاستهداف للتطبيق iOS مع الحقول: المعرف ، والإصدار ، والبناء ، والأجهزة ، وهدف النشر. حقل النسخة فارغ وحقل البناء 3.4.0 (الذي يطابق إصدار التطبيق من عندما كنت لا أزال أتحرير مع Xcode 3).

أسئلتي هي:

  1. ما هو الفرق بين الإصدار وحقول البناء؟

  2. لماذا كان حقل الإصدار فارغًا بعد أن قمت بالترقية إلى Xcode 4؟


Answers

بفضلnekno و @ ale84 للحصول على إجابات رائعة.

ومع ذلك ، قمت بتعديل البرنامج النصي @ ale84 قليلاً إلى زيادة أرقام الإنشاء للنقطة العائمة.

يمكن تغيير قيمة incl وفقاً لمتطلبات تنسيق عائم الخاص بك. على سبيل المثال: إذا incl = .01 ، سيكون تنسيق الإخراج ... 1.19 ، 1.20 ، 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

أبل نوع من إعادة ترتيب / إعادة توظيف الحقول.

من الآن فصاعدًا ، إذا نظرت إلى علامة التبويب "معلومات" في "هدف التطبيق" ، فيجب عليك استخدام "سلسلة إصدارات الباقة ، قصيرة" كإصدارك (على سبيل المثال ، 3.4.0) و "إصدار الحزمة" كالبناء الخاص بك (على سبيل المثال ، 500 أو 1A500 ). إذا كنت لا تراهم على حد سواء ، يمكنك إضافتها. سيتم تعيين هذه إلى الإصدار المناسب و textboxes على علامة التبويب ملخص؛ هم نفس القيم.

عند عرض علامة التبويب معلومات ، إذا قمت بالنقر بزر الماوس الأيمن وحدد إظهار المفاتيح / القيم الأولية ، فسترى الأسماء الفعلية هي CFBundleShortVersionString (Version) و CFBundleVersion (Build).

عادة ما يستخدم الإصدار كيف يبدو أنك تستخدمه مع Xcode 3. لست متأكدًا من المستوى الذي تسأله عن اختلاف الإصدار / البنية ، لذا سأجيب عليه بشكل فلسفي.

هناك أنواع مختلفة من المخططات ، لكن أحد الأنواع الشائعة هو:

{MajorVersion}. {MinorVersion}. {مراجعة}

  • إصدار رئيسي - تغييرات رئيسية ، وإعادة تصميم ، وتغييرات في الوظائف
  • إصدار بسيط - تحسينات طفيفة ، إضافات للوظيفة
  • مراجعة - رقم تصحيح لإصلاح الأخطاء

ثم يتم استخدام Build بشكل منفصل للإشارة إلى العدد الإجمالي للبنيات للإصدار أو طوال مدة حياة المنتج بالكامل.

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

  • الإصدار 1.0.0 قد يكون بناء 542. استغرق الأمر 542 إصدارًا للوصول إلى الإصدار 1.0.0.
  • الإصدار 1.0.1 قد يكون بناء 578.
  • الإصدار 1.1.0 قد يكون بناء 694.
  • الإصدار 2.0.0 قد يكون بناء 949.

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

إذا انتقلت إلى قائمة Xcode > حول Xcode ، فسترى أرقام الإصدار والإصدار. إذا ضغطت على زر " مزيد من المعلومات" ، فسترى مجموعة من الإصدارات المختلفة. نظرًا لإزالة الزر " مزيد من المعلومات ..." في Xcode 5 ، تتوفر هذه المعلومات أيضًا من قسم Software> Developer في تطبيق معلومات النظام ، والمتوفر عن طريق فتح قائمة Apple > About This Mac > System Report ....

على سبيل المثال ، Xcode 4.2 (4C139). الإصدار 4.2 التسويق هو الإصدار الرئيسي 4 ، إنشاء إصدار ثانوي C ، والبناء رقم 139. من المحتمل أن يكون الإصدار التالي (المفترض 4.3) بناء الإصدار 4D ، وسيبدأ رقم البناء عند 0 والزيادة من هناك.

أرقام iPhone Simulator Version / Build بنفس الطريقة ، مثل أجهزة iPhone و Mac ، إلخ.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

تحديث : حسب الطلب ، إليك خطوات إنشاء برنامج نصي يتم تشغيله في كل مرة تنشئ فيها تطبيقك في Xcode لقراءة رقم الإصدار ، وزيادة ذلك ، {App}-Info.plist مرة أخرى إلى ملف التطبيق {App}-Info.plist . هناك خطوات اختيارية إضافية إذا كنت ترغب في كتابة أرقام الإصدار / Settings.bundle/Root*.plist الخاصة بك إلى ملف (ملفات) Settings.bundle/Root*.plist .

يتم تمديد هذا من المادة الكيفية here .

في Xcode 4.2 - 5.0:

  1. قم بتحميل مشروع Xcode.
  2. في الجزء الأيسر ، انقر فوق المشروع في أعلى التسلسل الهرمي. سيؤدي هذا إلى تحميل محرر إعدادات المشروع.
  3. على الجانب الأيمن من جزء النافذة المركزية ، انقر على تطبيقك أسفل عنوان TARGETS . ستحتاج إلى تكوين هذا الإعداد لكل هدف مشروع.
  4. حدد علامة التبويب Phases البناء .
    • في Xcode 4 ، في أسفل اليمين ، انقر فوق الزر إضافة مرحلة البناء وحدد Add Run Script .
    • في Xcode 5 ، حدد قائمة Editor > Add Build Phase > Add Run Script Build Phase .
  5. قم بسحب وإسقاط مرحلة تشغيل Script الجديدة لنقلها إلى مرحلة ما قبل مرحلة نسخ حزمة البرامج (فقط عندما يكون ملف app-info.plist مع تطبيقك).
  6. في المرحلة Run Script الجديدة ، قم بتعيين Shell : /bin/bash .
  7. قم بنسخ ما يلي ولصقها في منطقة البرنامج النصي لأعداد إنشاء الأعداد الصحيحة:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
    

    كما أشار Bdebeez ، فإن أداة إصدار Apple Generic ( agvtool ) متوفرة أيضًا. إذا كنت تفضل استخدامه بدلاً من ذلك ، فهناك أمران يجب عليك تغييرهما أولاً:

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

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

    ومع ذلك ، في مرحلة تشغيل Script ، يمكنك استخدام البرنامج النصي التالي:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all
    

    يزيد الوسيطة next-version رقم Info.plist ( bump هو أيضاً اسم مستعار لنفس الشيء) و -all تحديثات Info.plist مع رقم Info.plist الجديد.

  8. وإذا كان لديك حزمة إعدادات تظهر فيها الإصدار والإصدار ، فيمكنك إضافة ما يلي إلى نهاية النص البرمجي لتحديث الإصدار وبناءه. ملاحظة: قم بتغيير قيم PreferenceSpecifiers لتتطابق مع إعداداتك. PreferenceSpecifiers:2 تعني النظر إلى العنصر في الفهرس 2 تحت صفيف PreferenceSpecifiers في ملف plist الخاص بك ، لذلك بالنسبة إلى فهرس يستند إلى 0 ، فهذا هو إعداد التفضيل الثالث في الصفيف.

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    

    إذا كنت تستخدم agvtool بدلاً من قراءة Info.plist مباشرةً ، يمكنك إضافة ما يلي إلى البرنامج النصي الخاص بك بدلاً من ذلك:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    
  9. وإذا كان لديك تطبيق عالمي لأجهزة iPad و iPhone ، فيمكنك أيضًا ضبط الإعدادات لملف iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist
    

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

أعتقد أنه من مثل هذا:

  • بناء ( CFBundleVersion ): عدد البناء. عادة ما تبدأ هذا في 1 وتزيد بنسبة 1 مع كل بناء من التطبيق. يسمح بسرعة مقارنات أكثر من بناء أحدث وهو يشير إلى إحراز تقدم في التعليمات البرمجية. يمكن أن تكون هذه القيمة ذات قيمة عالية جدًا عند العمل مع ضمان الجودة وتحتاج إلى التأكد من تسجيل الأخطاء وفقًا للبنى الصحيحة.
  • إصدار التسويق ( CFBundleShortVersionString ): الرقم الذي يواجه المستخدم والذي تستخدمه للإشارة إلى هذا الإصدار من تطبيقك. عادة ما يتبع هذا نظام إصدار Major.minor (على سبيل المثال MyAwesomeApp 1.2) للسماح للمستخدمين بمعرفة الإصدارات التي هي تحديثات صيانة أصغر وهي ميزات جديدة كبيرة.

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

لتستخدمها:

  • تعيين المشروع الخاص بك في Xcode ، تحت الإصدار ، لاستخدام "Apple Generic".
  • في المحطة
    • agvtool new-version 1 (قم بتعيين رقم البنية إلى 1)
    • agvtool new-marketing-version 1.0 (تعيين إصدار التسويق إلى 1.0)

انظر صفحة رجل agvtool لطن من معلومات جيدة


(فقط ترك هذا هنا لمراجعتي الخاصة). سيعرض هذا الإصدار ويبني حقلي "الإصدار" و "الإنشاء" التي تراها في هدف Xcode:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

في سويفت

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}

طريقة أخرى هي تعيين رقم الإصدار في appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application         didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

رقم إصدار التسويق هو للعملاء ، ويسمى رقم الإصدار . يبدأ من 1.0 ويذهب للحصول على التحديثات الرئيسية 2.0 ، 3.0 ، للتحديثات الطفيفة إلى 1.1 ، 1.2 ولإصلاح الأخطاء إلى 1.0.1 ، 1.0.2 . هذا الرقم موجه نحو الإصدارات والميزات الجديدة.

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

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

للحصول على رقم NSString كمتغير NSString :

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

للحصول على رقم الإصدار كمتغير NSString :

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

إذا كنت تريد كلا في NSString واحد:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

يتم اختبار ذلك مع الإصدار Xcode 4.6.3 (4H1503) . غالباً ما تتم كتابة رقم البنية بين قوسين / أقواس. رقم البنية بالنظام الست عشري أو عشري.

في Xcode يمكنك تلقائيًا زيادة رقم البنية كرقم عشري عن طريق وضع ما يلي في مرحلة Run script في إعدادات المشروع

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

للحصول على رقم بنية سداسي عشري استخدم هذا البرنامج النصي

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"


بالنسبة لي تغيير التكوين بناء من الإصدار إلى تصحيح حل المشكلة.

يمكنك العثور على تكوين البنية في نظام التعديل -> تشغيل -> معلومات -> تكوين البنية

قم بتنظيف مشروعك وأعد تشغيله.





ios xcode