Phiên bản so với bản dựng trong Xcode


660

Tôi có một ứng dụng mà tôi đã phát triển với Xcode 3 và gần đây đã bắt đầu chỉnh sửa bằng Xcode 4. Trong tóm tắt mục tiêu tôi có biểu mẫu mục tiêu ứng dụng iOS với các trường: định danh, phiên bản, bản dựng, thiết bị và mục tiêu triển khai. Trường phiên bản trống và trường xây dựng là 3.4.0 (khớp với phiên bản của ứng dụng từ khi tôi vẫn đang chỉnh sửa với Xcode 3).

Câu hỏi của tôi là:

  1. Sự khác biệt giữa các phiên bản và các trường xây dựng là gì?

  2. Tại sao trường phiên bản trống sau khi tôi nâng cấp lên Xcode 4?


Đối với một điều, tôi nghĩ đó là số Build xuất hiện trong danh sách lưu trữ Xcode Organizer. Ngoài ra, tôi không chắc nó dùng để làm gì.
Daniel Dickison

Câu trả lời:


1224

Apple sắp xếp lại / sắp xếp lại các lĩnh vực.

Đi tiếp, nếu bạn nhìn vào tab Thông tin cho Mục tiêu ứng dụng của mình, bạn nên sử dụng "Chuỗi phiên bản gói, ngắn" làm Phiên bản của bạn (ví dụ: 3.4.0) và "Phiên bản gói" làm Bản dựng của bạn (ví dụ: 500 hoặc 1A500 ). Nếu bạn không thấy cả hai, bạn có thể thêm chúng. Những người này sẽ ánh xạ tới các hộp văn bản Phiên bản và Xây dựng thích hợp trên tab Tóm tắt; chúng là những giá trị giống nhau

Khi xem tab Thông tin, nếu bạn nhấp chuột phải và chọn Hiển thị Khóa / Giá trị Nguyên , bạn sẽ thấy tên thực là CFBundleShortVersionString(Phiên bản) và CFBundleVersion(Bản dựng).

Phiên bản thường được sử dụng theo cách bạn dường như đã sử dụng nó với Xcode 3. Tôi không chắc bạn đang hỏi về mức độ khác biệt về Phiên bản / Bản dựng, vì vậy tôi sẽ trả lời về mặt triết học.

Có tất cả các loại kế hoạch, nhưng một kế hoạch phổ biến là:

{MajorVersion}. {MinorVersion}. {Sửa đổi}

  • Phiên bản chính - Thay đổi lớn, thiết kế lại và thay đổi chức năng
  • Phiên bản nhỏ - Cải tiến nhỏ, bổ sung chức năng
  • Sửa đổi - Một số bản vá cho sửa lỗi

Sau đó, Bản dựng được sử dụng riêng để chỉ ra tổng số bản dựng cho một bản phát hành hoặc cho toàn bộ thời gian sử dụng của sản phẩm.

Nhiều nhà phát triển bắt đầu xây dựng số Xây dựng ở mức 0 và mỗi khi họ xây dựng, họ tăng số lượng lên một, tăng mãi mãi. Trong các dự án của tôi, tôi có một tập lệnh tự động tăng số bản dựng mỗi lần tôi xây dựng. Xem hướng dẫn cho điều đó dưới đây.

  • Bản phát hành 1.0.0 có thể là bản dựng 542. Phải mất 542 bản dựng để có bản phát hành 1.0.0.
  • Phát hành 1.0.1 có thể là bản dựng 578.
  • Phiên bản 1.1.0 có thể là bản dựng 694.
  • Phiên bản 2.0.0 có thể là bản dựng 949.

Các nhà phát triển khác, bao gồm Apple, có số Build bao gồm một phiên bản chính + phiên bản nhỏ + số bản dựng cho bản phát hành. Đây là những số phiên bản phần mềm thực tế, trái ngược với các giá trị được sử dụng để tiếp thị.

Nếu bạn đi tới menu Xcode > Giới thiệu về Xcode , bạn sẽ thấy các số Phiên bản và bản dựng. Nếu bạn nhấn nút Thông tin thêm ... bạn sẽ thấy một loạt các phiên bản khác nhau. Kể từ khi thông tin ... More nút được loại bỏ trong Xcode 5, thông tin này cũng có sẵn từ các phần mềm> Nhà phát triển phần của Hệ thống thông tin ứng dụng, có sẵn bằng cách mở của Apple menu> Giới thiệu về Mac > Báo cáo Hệ thống ... .

Ví dụ: Xcode 4.2 (4C139). Phiên bản tiếp thị 4.2 là Xây dựng phiên bản chính 4, Xây dựng phiên bản phụ C và Số xây dựng 139. Bản phát hành tiếp theo (có lẽ là 4.3) có thể sẽ là Bản phát hành 4D và số Bản dựng sẽ bắt đầu từ 0 và tăng dần từ đó.

Các số Phiên bản / Bản dựng của Trình mô phỏng iPhone cũng giống như vậy, như iPhone, Mac, v.v.

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

Cập nhật : Theo yêu cầu, đây là các bước để tạo tập lệnh chạy mỗi khi bạn xây dựng ứng dụng của mình trong Xcode để đọc số Build, tăng nó và ghi lại vào {App}-Info.plisttập tin của ứng dụng . Có các bước tùy chọn, bổ sung nếu bạn muốn viết số phiên bản / số bản dựng vào Settings.bundle/Root*.plist(các) tệp của mình.

Điều này được mở rộng từ bài viết hướng dẫn ở đây .

Trong Xcode 4.2 - 5.0:

  1. Tải dự án Xcode của bạn.
  2. Trong khung bên trái, nhấp vào dự án của bạn ở đầu phân cấp. Điều này sẽ tải trình soạn thảo cài đặt dự án.
  3. Ở phía bên trái của cửa sổ trung tâm, nhấp vào ứng dụng của bạn dưới tiêu đề TARGETS . Bạn sẽ cần phải cấu hình thiết lập này cho từng mục tiêu dự án.
  4. Chọn tab Build Ph Phase .
    • Trong Xcode 4, ở dưới cùng bên phải, nhấp vào nút Thêm giai đoạn xây dựng và chọn Thêm chạy tập lệnh .
    • Trong Xcode 5, chọn menu Editor > Add Build Phase > Add Run Script Build Phase .
  5. Kéo và thả giai đoạn Run Script mới để di chuyển nó đến ngay trước giai đoạn Sao chép tài nguyên gói (khi tệp app-info.plist sẽ được gói cùng với ứng dụng của bạn).
  6. Trong giai đoạn Run Script mới , hãy đặt Shell : /bin/bash.
  7. Sao chép và dán đoạn mã sau vào vùng tập lệnh cho số xây dựng số nguyên:

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

    Như @Bdebeez đã chỉ ra, Công cụ Phiên bản Chung của Apple ( agvtool) cũng có sẵn. Nếu bạn thích sử dụng nó thay vào đó, thì có một vài điều cần thay đổi trước tiên:

    • Chọn tab Cài đặt bản dựng .
    • Trong phần Phiên bản , đặt Phiên bản dự án hiện tại thành số bản dựng ban đầu bạn muốn sử dụng, ví dụ: 1 .
    • Quay lại tab Xây dựng giai đoạn , kéo và thả giai đoạn Run Script của bạn sau giai đoạn Sao chép tài nguyên gói để tránh điều kiện cuộc đua khi cố gắng xây dựng và cập nhật tệp nguồn bao gồm số bản dựng của bạn.

    Lưu ý rằng với agvtoolphương pháp, bạn vẫn có thể định kỳ nhận các bản dựng bị lỗi / bị hủy mà không có lỗi. Vì lý do này, tôi không khuyên bạn nên sử dụng agvtoolvới tập lệnh này.

    Tuy nhiên, trong giai đoạn Run Script của bạn, bạn có thể sử dụng tập lệnh sau:

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

    Đối next-versionsố tăng số bản dựng ( bumpcũng là bí danh cho cùng một thứ) và -allcập nhật Info.plistvới số bản dựng mới.

  8. Và nếu bạn có gói Cài đặt nơi bạn hiển thị Phiên bản và Bản dựng, bạn có thể thêm phần sau vào cuối tập lệnh để cập nhật phiên bản và bản dựng. Lưu ý: Thay đổi các PreferenceSpecifiersgiá trị để phù hợp với cài đặt của bạn. PreferenceSpecifiers:2có nghĩa là xem mục ở chỉ số 2 dưới PreferenceSpecifiersmảng trong tệp plist của bạn, vì vậy đối với chỉ mục dựa trên 0, đó là cài đặt ưu tiên thứ 3 trong mảng.

    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

    Nếu bạn đang sử dụng agvtoolthay vì đọc Info.plisttrực tiếp, bạn có thể thêm phần sau vào tập lệnh của mình:

    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. Và nếu bạn có một ứng dụng phổ biến cho iPad và iPhone, thì bạn cũng có thể đặt cài đặt cho tệp 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

17
"Trong các dự án của tôi, tôi có một tập lệnh tự động tăng số bản dựng mỗi lần tôi xây dựng" - bạn có thể chia sẻ cách bạn làm điều đó không? cảm ơn các chi tiết anwers và cho câu hỏi ban đầu.
Zsolt

2
@Andrews - Tôi đã cập nhật câu trả lời của mình với các chi tiết về tập lệnh xây dựng.
nekno

9
Để tăng số Hex bạn có thể sử dụngbuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"
Alon Amir

8
Nói tóm lại: HEX không được phép trong AppStore.
Nicolas Miari

3
(Người dùng Xcode 5) Bạn có thể cần thay đổi bước 5 để đọc: "Từ Thanh Menu, chọn Trình chỉnh sửa -> Thêm giai đoạn xây dựng -> Thêm giai đoạn xây dựng tập lệnh"
Greg M. Krsak

72

(Chỉ để lại ở đây để tham khảo của riêng tôi.) Điều này sẽ hiển thị phiên bản và bản dựng cho các trường "phiên bản" và "bản dựng" mà bạn thấy trong mục tiêu Xcode:

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

Trong Swift

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

2
OT: Bạn có một rò rỉ trong phương thức của mình - bạn alloc/ initchuỗi giữ lại chuỗi, nhưng bạn không phát hành nó. Trên một đối tượng bạn trả về từ một phương thức, bạn thường nên sử dụng một phương thức tiện lợi để chuỗi được tự động phát hành hoặc gọi autorelease. Hoặc: return [NSString stringWithFormat:@"%@ build %@", version, build]; HOẶC return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];
nekno

1
Cảm ơn @nekno, đã thay đổi câu trả lời để nó thân thiện với ARC hoặc không ARC.
Dan Rosenstark

2
Có lẽ tốt hơn là sử dụng các hằng số có sẵn (ví dụ: kCFBundleVersionKey), để tránh lỗi chính tả. Mặc dù vậy, tôi không thể tìm thấy một cái cho "CFBundleShortVersionString" :)
DannyA

Bạn có một lỗi trong mã nhanh chóng - bạn đang gọi CFBundleShortVersionString hai lần
Yariv Nissim

Cảm ơn @ yar1vn, tôi đã sửa nó và KHÔNG nó không bị ngược.
Dan Rosenstark

53

Số bản dựng là số nội bộ cho biết trạng thái hiện tại của ứng dụng. Nó khác với số Phiên bản ở chỗ nó thường không phải là người dùng phải đối mặt và không biểu thị bất kỳ sự khác biệt / tính năng / nâng cấp nào như số phiên bản thường có.

Hãy nghĩ về nó như thế này:

  • Build ( CFBundleVersion): Số lượng bản dựng. Thông thường, bạn bắt đầu điều này ở mức 1 và tăng thêm 1 với mỗi lần xây dựng ứng dụng. Nó nhanh chóng cho phép so sánh trong đó bản dựng gần đây hơn và nó biểu thị ý nghĩa của sự tiến bộ của cơ sở mã. Chúng có thể cực kỳ có giá trị khi làm việc với QA và cần chắc chắn rằng các lỗi được ghi lại dựa trên các bản dựng phù hợp.
  • Phiên bản tiếp thị ( CFBundleShortVersionString): Số mặt người dùng bạn đang sử dụng để biểu thị phiên bản ứng dụng này. Thông thường, điều này tuân theo sơ đồ phiên bản Major.minor (ví dụ MyAw đũaApp 1.2) để cho người dùng biết bản phát hành nào là bản cập nhật bảo trì nhỏ hơn và tính năng mới nào lớn.

Để sử dụng hiệu quả điều này trong các dự án của bạn, Apple cung cấp một công cụ tuyệt vời được gọi là agvtool. Tôi thực sự khuyên bạn nên sử dụng điều này vì nó đơn giản hơn nhiều so với kịch bản thay đổi số nguyên. Nó cho phép bạn dễ dàng đặt cả số bản dựng và phiên bản tiếp thị. Nó đặc biệt hữu ích khi tạo kịch bản (ví dụ, dễ dàng cập nhật số bản dựng trên mỗi bản dựng hoặc thậm chí truy vấn số bản dựng hiện tại là gì). Nó thậm chí có thể làm những điều kỳ lạ hơn như gắn thẻ SVN cho bạn khi bạn cập nhật số bản dựng.

Để dùng nó:

  • Đặt dự án của bạn trong Xcode, bên dưới Phiên bản, để sử dụng "Apple Generic".
  • Trong thiết bị đầu cuối
    • agvtool new-version 1 (đặt số Build thành 1)
    • agvtool new-marketing-version 1.0 (đặt phiên bản Tiếp thị thành 1.0)

Xem trang người đàn ông agvtoolcủa rất nhiều thông tin tốt


một bài viết khác về agvtool Phiên bản ứng dụng iPhone dễ dàng với agvtool
Gon

25

Tập lệnh tự động tăng số bản dựng trong câu trả lời ở trên không hoạt động với tôi nếu số bản dựng là giá trị dấu phẩy động, vì vậy tôi đã sửa đổi một chút:

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

21

Số phát hành tiếp thị dành cho khách hàng, được gọi là số phiên bản . Nó bắt đầu với 1.0 và tăng các bản cập nhật lớn lên 2.0 , 3.0 , cho các bản cập nhật nhỏ lên 1.1 , 1.2 và sửa lỗi cho 1.0.1 , 1.0.2 . Con số này được định hướng về phát hành và các tính năng mới.

Số bản dựng chủ yếu là số bản dựng nội bộ đã được tạo cho đến lúc đó. Nhưng một số sử dụng các số khác như số nhánh của kho lưu trữ. Số này phải là duy nhất để phân biệt các bản dựng gần như khác nhau.

Như bạn có thể thấy, số bản dựng là không cần thiết và tùy thuộc vào số bản dựng bạn muốn sử dụng. Vì vậy, nếu bạn cập nhật Xcodelên phiên bản chính, trường xây dựng trống. Trường phiên bản có thể không trống!.


Để lấy số bản dựng dưới dạng một NSStringbiến:

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

Để lấy số phiên bản làm NSStringbiến:

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

Nếu bạn muốn cả hai trong một NSString:

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

Điều này được thử nghiệm với Xcode Phiên bản 4.6.3 (4H1503) . Số bản dựng thường được viết bằng dấu ngoặc đơn / dấu ngoặc nhọn. Số bản dựng ở dạng thập lục phân hoặc thập phân.

xây dựng


Trong Xcode bạn có thể tự động tăng các số xây dựng như một số thập phân bằng cách đặt những điều sau đây trong Run scriptgiai đoạn xây dựng trong các thiết lập dự án

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

Đối với số bản dựng thập lục phân, sử dụng tập lệnh này

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"

Thiết lập dự án


6

Cảm ơn @nekno và @ ale84 vì những câu trả lời tuyệt vời.

Tuy nhiên, tôi đã sửa đổi tập lệnh của @ ale84 để tăng số lượng bản dựng cho dấu phẩy động.

giá trị của inc có thể được thay đổi theo yêu cầu định dạng nổi của bạn. Ví dụ: if incl = .01, định dạng đầu ra sẽ là ... 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"

1

Một cách khác là đặt số phiên bản trong 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];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.