Tôi nên sử dụng những giá trị nào cho CFBundleVersion và CFBundleShortVersionString?


98

Đây là lần gửi ứng dụng iOS đầu tiên của tôi và tôi không muốn ứng dụng của mình bị từ chối.

Đây là từ Apple Docs:

CFBundleVersion (String - iOS, OS X) chỉ định số phiên bản xây dựng của gói, xác định số lần lặp lại (đã phát hành hoặc chưa phát hành) của gói. Số phiên bản xây dựng phải là một chuỗi bao gồm ba số nguyên không âm, được phân tách bằng dấu chấm với số nguyên đầu tiên lớn hơn 0. Chuỗi chỉ nên chứa các ký tự số (0-9) và dấu chấm (.). Các số không ở đầu được cắt bớt từ mỗi số nguyên và sẽ bị bỏ qua (nghĩa là 1.02.3 tương đương với 1.2.3). Khóa này không thể bản địa hóa.

CFBundleShortVersionString (String - iOS, OS X) chỉ định số phiên bản phát hành của gói, xác định phiên bản đã phát hành của ứng dụng. Số phiên bản phát hành là một chuỗi bao gồm ba số nguyên được phân tách bằng dấu chấm. Số nguyên đầu tiên đại diện cho các bản sửa đổi lớn đối với ứng dụng, chẳng hạn như các bản sửa đổi triển khai các tính năng mới hoặc các thay đổi lớn. Số nguyên thứ hai biểu thị các bản sửa đổi triển khai các tính năng ít nổi bật hơn. Số nguyên thứ ba đại diện cho các bản phát hành bảo trì.

Giá trị cho khóa này khác với giá trị cho “CFBundleVersion”, xác định một lần lặp lại (đã phát hành hoặc chưa phát hành) của ứng dụng. Khóa này có thể được bản địa hóa bằng cách đưa nó vào tệp InfoPlist.strings của bạn.

Nhưng nó có vẻ hơi lạ. Giải thích của tôi cho điều này là đặt cả hai giá trị giống nhau, tức là:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Ai đó có thể xác nhận 100% đó là những gì tôi phải đặt?


1
Theo đó, CFBundleShortVersionString có thể được bản địa hóa. Nhưng nếu nó phải là ba số nguyên cách nhau bởi dấu chấm, thì bản địa hóa nào có thể xảy ra?
Rick

@Rick Tôi cho rằng điều đó có nghĩa là bạn có thể chuyển đổi nó cho các ngôn ngữ thực sự có các chữ số khác nhau, như tiếng Ả Rập?
shiser

@shiser Nói một cách dễ hiểu, "chữ số Ả Rập" thực sự là những chữ số mà chúng ta sử dụng ở thế giới phương Tây và hầu hết những nơi khác. Nhưng tôi hiểu ý bạn, và có một số nơi trên thế giới tiếng Ả Rập không sử dụng "chữ số Ả Rập". en.wikipedia.org/wiki/Arabic_numerals
RenniePet

1
Một câu trả lời khác ở đây. stackoverflow.com/q/21125159/419348
AechoLiu

Câu trả lời:


77

Hãy nghĩ theo cách này: "Phiên bản ngắn" ( CFBundleShortVersionString) là số phiên bản công khai. "Phiên bản" ( CFBundleVersion) là một số phiên bản nội bộ có thể thay đổi thường xuyên hơn nhiều so với "phiên bản ngắn" công khai. Cá nhân tôi sử dụng giống nhau cho cả hai nhưng nhiều người cập nhật "phiên bản" trên mỗi bản dựng. Dù bằng cách nào, bạn thường cập nhật "phiên bản ngắn" khi phát hành cho Apple. Tần suất bạn cập nhật "phiên bản" là tùy thuộc vào bạn và nhu cầu của bạn.


14
Xin lưu ý rằng phiên bản gói (CFBundleVersion) phải vượt quá số lượng phiên bản gói của ứng dụng trước đó của bạn, nếu không phiên bản này sẽ gặp lỗi khi gửi lên App Store. Xem stackoverflow.com/questions/4933093/… .
Phil

3
Tương tự như những gì Phil đã nói ở trên, hiện nay, nếu bạn gửi lại bản dựng không thành công (không được App Store phê duyệt), có vẻ như bạn cần phải tăng CFBundleVersion cho mỗi lần gửi , vì vậy có khả năng những con số này sẽ khác nhau trừ khi bạn luôn hoàn hảo, hoặc bạn không ngại tăng phiên bản công khai (CFBundleShortVersionString) của mình # khi có bất kỳ thay đổi nào cần thiết để gửi thành công đến App Store.
likethesky

106

CFBundleShortVersionString cung cấp cho bạn phiên bản ứng dụng của bạn. Nó thường tăng lên mỗi khi bạn xuất bản ứng dụng của mình lên App Store. Đây là phiên bản hiển thị trên phần "Phiên bản" cho trang App Store của ứng dụng của bạn.

CFBundleVersion cung cấp cho bạn số bản dựng được sử dụng để phát triển và thử nghiệm, cụ thể là các mục đích "kỹ thuật". Người dùng cuối hiếm khi quan tâm đến số bản dựng nhưng trong quá trình phát triển, bạn có thể cần biết những gì đang được phát triển và sửa chữa trên mỗi bản dựng. Điều này thường tăng lên sau mỗi lần lặp lại bản phát hành nội bộ. Và bạn có thể sử dụng các công cụ tích hợp liên tục như Jenkins để tự động tăng số bản dựng trên mỗi bản dựng.

Số phiên bản và bản dựng

Hai con số không phụ thuộc vào nhau nhưng nên để chúng song song với nhau để tránh nhầm lẫn. Hãy nhớ rằng sau khi ứng dụng của bạn đã vượt qua cuộc đánh giá của App Store, bạn cần phải tăng số bản dựng như Phil và likeTheSky đã nêu, bất kể bạn có xuất bản nó hay không.

Trường hợp sử dụng: Giả sử bạn có một bản dựng đã được thử nghiệm tốt, sẵn sàng để gửi. Số phiên bản của nó là 1.0.0 và số bản dựng là 1.0.0.32 . Sau khi gửi ứng dụng, bạn cần cập nhật phiên bản là 1.0.1 và số bản dựng là 1.0.1.0 .


4
Vì vậy, có an toàn không khi bỏ qua bit đó trong tài liệu (được trích dẫn trong câu hỏi) về việc CFBundleVersion là " ba " giá trị được phân tách bằng dấu chấm ?
big_m

Tôi nghĩ nó tùy thuộc vào bạn. Nếu bạn không xuất bản bản phát hành thường xuyên hoặc nếu bạn không cần tuân thủ nghiêm ngặt các bản sửa lỗi thông qua các chu kỳ kiểm tra thường xuyên; bạn cũng có thể sử dụng 3 chữ số cho cả hai.
Yunus Nedim Mehel

vậy CFBundleVersion có thể là 0 cho một bản dựng cửa hàng ứng dụng không? Apple sẽ từ chối nó?
kraftydevil

3
Có, bạn có thể sử dụng các giá trị khác với 3 số có dấu chấm câu. Tôi đã sử dụng giá trị ngày-giờ, chẳng hạn như 201606070620trong ứng dụng iOS vận chuyển.
Basil Bourque

3
@BasilBourque, nếu bạn không tuân theo các nguyên tắc, bạn có thể gặp sự cố nếu sử dụng tính năng mua hàng trong ứng dụng. Xem Ghi chú kỹ thuật 2413
DanSkeel

16

Câu trả lời của rmaddy là đúng. Tôi sẽ thêm hai suy nghĩ nữa.

Số phiên bản thứ ba

Hãy lưu ý đến số phiên bản thứ ba, được chỉ định trên trang web iTunesConnect như một phần của định nghĩa ứng dụng của bạn. Nếu số đó khác với hai trong Xcode, Apple sẽ đưa ra cảnh báo cho bạn. Bạn có thể bỏ qua cảnh báo, vì nó không phải là công cụ chặn chương trình (không phải "lỗi").

Ngày-giờ dưới dạng phiên bản

Ngoài ra, bạn không cần sử dụng ba số có dấu chấm câu. Điều đó có thể có ý nghĩa đối với một số ứng dụng, trong đó các thay đổi theo truyền thống ở số đầu tiên cho thấy một số loại thay đổi mạnh thường ảnh hưởng đến khả năng tương thích.

Đối với các ứng dụng khác, bạn có thể chỉ muốn sử dụng giá trị ngày-giờ ở kiểu định dạng tiêu chuẩn ISO 8601 (YYYYMMDDHHMM). Ví dụ 201606070620,. Thứ tự năm-tháng-ngày-giờ-phút đó hiển thị một số ngày càng tăng, luôn luôn có cùng độ dài do dấu đệm số 0, khi được sắp xếp theo thứ tự bảng chữ cái cũng theo thứ tự thời gian.

Tôi đã sử dụng thành công kiểu số phiên bản này trên một ứng dụng iOS vận chuyển hoạt động trong iOS 7, 8 và 9.

Bạn thậm chí có thể tự động hóa việc tạo ra giá trị này. Trong dự án của bạn Target> Build Phases> Run Scriptbảng điều khiển:

  1. Chỉ định trong Shelltrường:/bin/sh
  2. Dán đoạn mã 5 dòng dưới đây.
  3. (tùy chọn) Đánh dấu vào Show environment variables in build loghộp kiểm.
  4. Bỏ chọn Run script only when installinghộp kiểm.

Mỗi khi bạn xây dựng, ngày-giờ hiện tại theo múi giờ UTC sẽ được ghi lại. Các -ulá cờ trong kịch bản tận dụng UTC hơn là múi giờ mặc định hiện tại của bạn. Nói chung là tốt nhất cho các lập trình viên và sysadmins sử dụng và suy nghĩ trong UTC hơn là múi giờ địa phương.

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

Hoặc thực hiện kết hợp, với quy ước 1.2.3cho Số phiên bản và ngày-giờ làm Số bản dựng. Để thực hiện phép lai, chỉ cần nhận xét CFBundleShortVersionStringdòng có dấu #ở phía trước.


7

Sơ đồ hợp lý nhất đối với tôi là sử dụng số phiên bản (tức là. CFBundleShortVersionString) Cho số phiên bản thực, sau đó sử dụng số bản dựng (tức là. CFBundleVersion) Để đại diện cho việc gửi đến App Store. Vì vậy, trừ khi có bất kỳ sự cố nào và do đó phải gửi lại, con số này luôn là 1. Đối với bản phát hành mới, tôi đặt lại thành 1 nếu bản trước đó có vấn đề trong thử nghiệm TestFlight hoặc đang xem xét.

Số bản dựng cung cấp một cách đặt tên cho từng bản đệ trình mà bạn cung cấp cho một bản phát hành cụ thể. Như được mô tả trong các định nghĩa ở trên, tập hợp tất cả các bản dựng mà bạn cung cấp cho một phiên bản ứng dụng cụ thể của mình được gọi là 'đợt phát hành' của phiên bản đó. Đối với các ứng dụng iOS, số bản dựng phải là duy nhất trong mỗi đợt phát hành, nhưng chúng không cần phải là duy nhất trên các đợt phát hành khác nhau [tôi nhấn mạnh]. Điều đó có nghĩa là, đối với Ứng dụng iOS, bạn có thể sử dụng lại các số bản dựng giống nhau trong các đợt phát hành khác nhau nếu bạn muốn.

Từ Ghi chú kỹ thuật TN2420: Số phiên bản và Số bản dựng .


1
Thật tốt khi thấy một câu trả lời cung cấp tài liệu tham khảo chính thức xác nhận các diễn giải được trình bày trong các câu trả lời khác trên trang này.
user2067021 29/09/17

6

Tôi sử dụng CFBundleVersion để chỉ ra bản dựng nội bộ cho CFBundleShortVersionString . Tôi sử dụng chuyến bay thử nghiệm để gửi các bản dựng cho người thử nghiệm của mình nên sự khác biệt giữa chúng cực kỳ hữu ích.

Các tài liệu của Apple nói rằng CFBundleVersion "nên là một chuỗi bao gồm 3 số nguyên không âm, được phân tách bằng dấu chấm" Nhưng thực tế nó có thể HƠN 3 phần (như câu trả lời ở trên cho thấy). Tôi sử dụng điều đó để chỉ ra bản dựng phát triển của mình, giả sử CFBundleShortVersionString của tôi là 1.0.0, tôi có thể sử dụng 1.0.0.11 cho CFBundleVersion để cho biết đó là bản dựng thứ 11 của tôi cho bản phát hành 1.0.0

Mỗi CFBundleVersion được gửi đến cửa hàng ứng dụng phải lớn hơn trước nếu không bạn sẽ nhận được LỖI ITMS-90478 : "Phiên bản không hợp lệ. Không thể nhập bản dựng có phiên bản“ xxx ”vì phiên bản mới hơn đã bị đóng để gửi bản dựng mới. Chọn một số phiên bản khác. "

CFBundleShortVersionString chỉ có thể có 3 phần hoặc bạn sẽ nhận được LỖI ITMS-90060: Giá trị cho khóa CFBundleShortVersionString 'xxx' trong tệp Info.plist phải là danh sách được phân tách bằng dấu chấm của nhiều nhất là ba số nguyên không âm. "

Con số thứ 3 mà Basil Bourque đề cập, tức là số phiên bản hiển thị trên iTunesConnect là nơi mọi thứ có thể trở nên phức tạp.

Tôi sử dụng một số iTunesConnect khác với CFBundleShortVersionString vì khi tôi lần đầu tiên gửi ứng dụng của mình lên cửa hàng ứng dụng, chúng tôi đã có nhiều đợt phát hành nội bộ. Vì vậy, tôi đã sử dụng 1.0 cho số iTunesConnect và 5.x cho CFBundleShortVersionString. Trong bản phát hành tiếp theo cho cửa hàng ứng dụng, tôi đã cung cấp một chức năng để kiểm tra xem có phiên bản mới hơn trong cửa hàng ứng dụng hay không và nhận ra rằng tôi đã gặp sự cố ngay bây giờ vì tôi chỉ có thể nhận số iTunesConnect (đang sử dụng http://itunes.apple.com/lookup?bundleId=) vì vậy tôi cần thực hiện một số phép tính trước khi so sánh nó với số CFBundleShortVersionString.

Tôi đã cố gắng khắc phục điều đó bằng cách sử dụng số iTunesConnect làm CFBundleShortVersionString của mình, nhưng gặp lỗi, LỖI ITMS-90062 : "Gói này không hợp lệ. Giá trị cho khóa CFBundleShortVersionString [xxx] trong tệp Info.plist phải chứa phiên bản cao hơn của phiên bản đã được phê duyệt trước đó [xxx]. "

Vì vậy, tôi sẽ đề nghị luôn luôn làm cho chúng giống nhau.


5

Điều mà tôi chưa từng thấy được thảo luận ở bất cứ đâu là số lượng tối đa cho mỗi trường trong CFBundleVersion là bao nhiêu?

Bằng cách đặt CFBundleVersion trong ứng dụng thành 1.1.1 và nhìn vào vaue thập lục phân cho phiên bản trong "lsregister -dump", tôi đã xác định rằng giá trị lớn nhất cho trường đầu tiên là (2 ^ 22) -1 hoặc 4194303 và giá trị tối đa giá trị cho trường thứ hai và thứ ba là (2 ^ 21) -1 hoặc 2097151.

3 trường cộng lại tối đa 64 bit.

Điều này có ý nghĩa đối với những người trong chúng ta sử dụng CFBundleVersion dựa trên ngày và giờ.

Tôi đã đặt trường đầu tiên thành YYYYMMDD. Con số này luôn lớn hơn số phiên bản được phép tối đa và nó dẫn đến kết quả không thể đoán trước, ít nhất là khi Launch Services quyết định phiên bản ứng dụng nào sẽ chạy khi bạn đã cài đặt nhiều phiên bản và đang sử dụng một cái gì đó như 'open -a Appname 'từ dòng lệnh.

Hãy phổ biến rộng rãi điều này. Tôi chắc chắn rằng rất nhiều người sẽ không hài lòng với điều này.


Bạn có nhớ lại những gì được thực hiện nếu trường thứ tư được thêm vào (1.1.1.20191201) và những gì bạn sẽ sử dụng thay thế? Tôi thực sự ước Apple chỉ sử dụng cùng một giá trị số mà android đã làm ở đây. PS cảm ơn vì đã tìm kiếm điều này!
spaceuitdiver

Tôi tin rằng hạn chế được ghi lại ở đây và hơi hạn chế hơn những gì được đề cập ở đây.
saagarjha

3

Hiện tại, tài liệu của Apple choCFBundleVersion các tiểu bang [nhấn mạnh của tôi]:

Phiên bản xây dựng xác định một lần lặp lại của gói.

...

Khóa này là một chuỗi mà máy có thể đọc được bao gồm một đến ba số nguyên được phân tách bằng dấu chấm, chẳng hạn như 10.14.1. Chuỗi chỉ có thể chứa các ký tự số (0-9) và dấu chấm.

...

Bạn có thể bao gồm nhiều số nguyên hơn nhưng hệ thống bỏ qua chúng.

Đối với CFBundleShortVersionString[nhấn mạnh của tôi]:

Bản phát hành hoặc số phiên bản của gói.

...

Khóa này là một chuỗi mà người dùng có thể nhìn thấy cho phiên bản của gói. Định dạng bắt buộc là ba số nguyên được phân tách bằng dấu chấm, chẳng hạn như 10.14.1. Chuỗi chỉ có thể chứa các ký tự số (0-9) và dấu chấm.

Tôi khuyên bạn chỉ nên tự động tăng CFBundleVersioncho mỗi bản dựng (hoặc mỗi bản phát hành cho TestFlight) và đặt lại nó về 0 bất cứ khi nào bạn thay đổi CFBundleShortVersionString.

Bạn nên lập kế hoạch rõ ràng hoặc nghĩ ra một phương tiện nhất quán để cập nhật phiên bản có thể nhìn thấy của người dùng trong CFBundleShortVersionString.

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.