1) Thêm mục tiêu mới vào dự án thuộc loại "Tổng hợp" của bạn, ví dụ: bạn có thể đặt tên cho nó là "Update Info.plist Prefix Header"; chỉ cần sử dụng đó là "Tên sản phẩm" trong hộp thoại.
2) Thêm một Run Script xây dựng giai đoạn với mục tiêu mới này với mã nguồn sau đây:
#!/bin/sh
SVN_REVISION=$(git svn find-rev HEAD)
echo "#define SVN_REVISION $SVN_REVISION" > "$SCRIPT_OUTPUT_FILE_0"
3) Thêm một tập tin đầu ra để kịch bản của bạn, tên nó
$(CONFIGURATION_TEMP_DIR)/InfoPlist.pch
4) Mở giai đoạn xây dựng của ứng dụng iOS của bạn.
5) Thêm mục tiêu tổng hợp bạn đã tạo trước đó làm mục tiêu phụ thuộc (thêm nó vào "Phụ thuộc mục tiêu"). Điều này có nghĩa là Xcode sẽ luôn xây dựng mục tiêu này trước khi nó sẽ xây dựng mục tiêu iOS của bạn.
6) Mở Cài đặt bản dựng của ứng dụng iOS của bạn.
7) Tìm kiếm cài đặt "Info.plist Prefixor Prefix File" và thay đổi chính xác cùng giá trị bạn đã sử dụng cho tệp đầu ra ở bước (3).
8) Tìm kiếm cài đặt "Preprocess Info.plist File" và đảm bảo rằng nó được bật.
9) Mở tệp Info.plist hiện tại của bạn và thay đổi giá trị của CFBundleVersion thành SVN_REVISION
. Không sử dụng $ (SVN_REVISION) hoặc $ {SVN_REVISION}; đây không phải là thiết lập xây dựng hoặc thay thế biến môi trường, đây là một sự thay thế tiền xử lý, vì vậy chỉ cần sử dụng SVN_REVISION.
Vậy đó. Mỗi lần bạn xây dựng ứng dụng iOS, Xcode đầu tiên xây dựng mục tiêu tổng hợp, cập nhật tệp PCH và khi nó xây dựng ứng dụng iOS của bạn, nó sẽ chạy tệp Info.plist thông qua bộ xử lý trước C (sử dụng tệp PCH làm tiền tố tiêu đề) trước khi sao chép nó vào ứng dụng của bạn. Bộ xử lý trước sẽ thay thế SVN_REVISION vì nó được định nghĩa là macro trong tệp PCH của bạn.
Lưu ý quan trọng
Một số người có thể nghĩ rằng đó là một ý tưởng tốt hơn để sử dụng $(DERIVED_FILE_DIR)
thay vì $(CONFIGURATION_TEMP_DIR)
. Vâng, về lý thuyết chúng là đúng, nhưng chỉ có một vấn đề trong thực tế: dir thư mục dẫn xuất là khác nhau cho mỗi mục tiêu, trong khi thư mục tạm thời cấu hình là như nhau (nó chỉ khác nhau cho mỗi cấu hình xây dựng). Khi sử dụng thư mục tệp dẫn xuất, tệp PCH được ghi vào thư mục tệp dẫn xuất của mục tiêu tổng hợp, nhưng khi xây dựng ứng dụng iOS, Xcode sẽ tìm kiếm tệp này trong thư mục tệp dẫn xuất của ứng dụng iOS và do đó sẽ không tìm thấy tập tin.
Một số người cũng có thể nghĩ rằng chỉ cần thêm giai đoạn chạy tập lệnh để cập nhật tiêu đề tiền tố là giai đoạn xây dựng đầu tiên của ứng dụng iOS thay vì tạo mục tiêu riêng cho nó. vấn đề tập tin dir đã đề cập ở trên). Một lần nữa, ý tưởng hay về lý thuyết nhưng không thể làm việc trong thực tế: Nếu được xử lý trước, Info.plist được xử lý trước khi giai đoạn tập lệnh đầu tiên được thực thi, vì vậy nếu tệp PCH không tồn tại hoặc chưa được cập nhật, hoặc xây dựng chấm dứt với một lỗi hoặc một sửa đổi SVN lỗi thời được ghi vào tập tin plist. Đó là lý do tại sao bạn cần một mục tiêu riêng cho nhiệm vụ này được đảm bảo sẽ được xây dựng trước mục tiêu thực sự của bạn.