Làm cách nào để hiển thị bản sửa đổi phiên bản ứng dụng trong gói cài đặt ứng dụng của tôi?


91

Tôi muốn bao gồm phiên bản ứng dụng và bản sửa đổi nội bộ, chẳng hạn như 1.0.1 (r1243), trong gói cài đặt ứng dụng của mình.

Tệp Root.plist chứa một đoạn như thế này ...

     <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>Key</key>
        <string>version_preference</string>
        <key>DefaultValue</key>
        <string>VersionValue</string>
        <key>Values</key>
        <array>
            <string>VersionValue</string>
        </array>
        <key>Titles</key>
        <array>
            <string>VersionValue</string>
        </array>
    </dict>

và tôi muốn thay thế chuỗi "VersionValue" tại thời điểm xây dựng.

Tôi có một tập lệnh có thể trích xuất số phiên bản từ kho lưu trữ của mình, những gì tôi cần là cách xử lý (xử lý trước) tệp Root.plist, tại thời điểm xây dựng và thay thế số phiên bản mà không ảnh hưởng đến tệp nguồn.

Câu trả lời:


69

Có một giải pháp khác có thể đơn giản hơn nhiều so với một trong hai câu trả lời trước. Apple đóng gói một công cụ dòng lệnh có tên PlistBuddy bên trong hầu hết các trình cài đặt của mình và đã đưa nó vào Leopard tại /usr/libexec/PlistBuddy.

Vì bạn muốn thay thế VersionValue, giả sử bạn có giá trị phiên bản được trích xuất vào $newVersion, bạn có thể sử dụng lệnh này:

/usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist

Không cần phải loay hoay với sed hoặc biểu thức chính quy, cách tiếp cận này khá đơn giản. Xem trang người đàn ông để được hướng dẫn chi tiết. Bạn có thể sử dụng PlistBuddy để thêm, xóa hoặc sửa đổi bất kỳ mục nhập nào trong danh sách thuộc tính. Ví dụ: một người bạn của tôi đã viết blog về việc tăng số bản dựng trong Xcode bằng PlistBuddy.

Lưu ý: Nếu bạn chỉ cung cấp đường dẫn đến plist, PlistBuddy sẽ vào chế độ tương tác, vì vậy bạn có thể đưa ra nhiều lệnh trước khi quyết định lưu các thay đổi. Tôi chắc chắn khuyên bạn nên làm điều này trước khi đưa nó vào tập lệnh xây dựng của bạn.


20
Có vẻ như tôi mất một lúc để tìm ra cách phù hợp để tham chiếu đến số phiên bản trong bảng xếp hạng của tôi; trong trường hợp của tôi, nó hóa ra là / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - hy vọng rằng điều đó sẽ hữu ích cho những người khác.
JosephH

Quinn Taylor, JosephH, nhờ câu trả lời của bạn, tôi đã có thể tự động triển khai số phiên bản ứng dụng của mình trong Settings.bundle. 1 cho cả hai bạn ;-)
Niko

7
Từ giai đoạn xây dựng "Run Script" tùy chỉnh, tôi cần đưa thêm đường dẫn đến Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "bộ PreferenceSpecifiers: 0: DefaultValue $ newVersion"
Chris Vasselli

2
Chỉ cần cho đầy đủ, đây là cách tiếp cận khác woth PListBuddy mà làm việc cho tôi: xcodehelp.blogspot.com/2012/05/...
Koen

cách đúng nhất là/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala

66

Giải pháp của gã lười biếng của tôi là cập nhật số phiên bản từ mã ứng dụng của tôi. Bạn có thể có giá trị mặc định (hoặc trống) trong Root.plist và sau đó, ở đâu đó trong mã khởi động của bạn:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];

Bí quyết duy nhất là ứng dụng của bạn phải được chạy ít nhất một lần để phiên bản cập nhật xuất hiện trong bảng cài đặt.

Ví dụ, bạn có thể đưa ra ý tưởng và cập nhật bộ đếm số lần ứng dụng của bạn đã được khởi chạy hoặc các thông tin thú vị khác.


9
Điều này sẽ hoạt động trừ khi người dùng truy cập Cài đặt trước khi khởi chạy ứng dụng của bạn.
Moshe

9
@Moshe True, nhưng để xử lý vấn đề này một cách tinh tế, bạn có thể chỉ cần chỉ định Giá trị mặc định trong tệp .plist, có lẽ là một cái gì đó như 'Chưa được khởi chạy'
Carlos P

1
mặc dù hầu hết các nhà phát triển có thể đặt CFBundleShortVersionStringCFBundleVersionở cùng một giá trị, nhưng CFBundleShortVersionStringthực sự là những gì Apple muốn bạn xem xét phiên bản đã phát hành của bạn , đó sẽ là những gì bạn hiển thị cho người dùng. CFBundleVersioncó thể là số phiên bản nội bộ, mà bạn có thể không nên hiển thị cho người dùng (nếu nó khác).
Nate

3
Tui bỏ lỡ điều gì vậy? Đây chính xác là những gì tôi đang làm, nhưng giá trị không bị thay đổi. Có phải các bạn không sử dụng thuộc tính Title, mà tôi tin rằng nó chỉ được đọc?
samon,

2
Ngoài ra còn có một vấn đề khác khi cập nhật ứng dụng. Gói cài đặt sẽ vẫn hiển thị phiên bản xây dựng cũ cho đến khi ứng dụng cập nhật được khởi chạy ít nhất một lần.
Legoless

61

Dựa trên câu trả lời của @ Quinn, đây là toàn bộ quy trình và mã làm việc mà tôi sử dụng để thực hiện việc này.

  • Thêm gói cài đặt vào ứng dụng của bạn. Đừng đổi tên nó.
  • Mở Settings.bundle / Root.plist trong trình soạn thảo văn bản

Thay thế nội dung bằng:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>DummyVersion</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
  • Tạo giai đoạn xây dựng Run Script , chuyển sang giai đoạn Copy Bundle Resources . Thêm mã này:

    cd "${BUILT_PRODUCTS_DIR}"
    buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" )
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
    
  • Thay thế MyAppName bằng tên ứng dụng thực tế của bạn và 1 sau PreferenceSpecifier làm chỉ mục của mục nhập Phiên bản của bạn trong Cài đặt. Ví dụ Root.plist ở trên có nó ở chỉ mục 1.


Tôi nghĩ đây là cách tốt nhất để đi
Tony

Tôi đã thử điều này và tôi thấy giá trị Tiêu đề thay đổi trong gói cài đặt của mình. Tiêu đề xuất hiện trong InAppSettingsKit, nhưng giá trị không thay đổi so với phiên bản ban đầu. Tiêu đề không bao giờ xuất hiện trong ứng dụng Cài đặt. Tôi từ bỏ và tôi chỉ cần đi để bật lên một hộp thoại khi người sử dụng chọn 'About' trong menu'
bugloaf

Khi sử dụng phương pháp này, cài đặt không chỉ đọc. tức là tôi có thể nhấn vào cài đặt số phiên bản trong settings.app và nó có thể chỉnh sửa được.
chuyển động

8
Các kịch bản bash @ ben-clayton đặt không làm việc cho tôi, vì vậy tôi làm lại nó dựa trên câu trả lời của mình, đây là nó:buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
Luis Ascorbe

1
bạn có thể sử dụng ${INFOPLIST_PATH}cho đường dẫn bảng thông tin
Tomer Even

23

Sử dụng plist của Ben Clayton https://stackoverflow.com/a/12842530/338986

Thêm Run scriptbằng đoạn mã sau sau Copy Bundle Resources.

version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

Phụ thêm CFBundleVersionngoài của CFBundleShortVersionString. Nó phát ra phiên bản như thế này:

Bằng cách viết thư $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist thay vì một trong những $SRCROOTcó một số lợi ích.

  1. Nó không sửa đổi các tệp trong bản sao đang hoạt động của kho lưu trữ.
  2. Bạn không cần phải viết hoa đường dẫn đến Settings.bundlein $SRCROOT. Đường dẫn có thể khác nhau.

Thử nghiệm trên Xcode 7.3.1


1
Đây là câu trả lời tốt nhất IMO nếu bạn thêm tập lệnh vào phần Xây dựng, Hành động trước của lược đồ dự án. Hãy nhìn câu trả lời của Andy.
Vahid Amiri

2
Điều này đang làm việc cho tôi. Chỉ cần nhớ thay đổi "DefaultValue" để dành riêng cho bạn. Ví dụ, tôi muốn thay đổi chân trang nên tôi đã sử dụng "FooterText". Bạn cũng cần thay đổi số sau "PreferenceSpecifiers" để nó tương quan với mục trong plist.
Richard Witherspoon

12

Dựa trên ví dụ ở đây , đây là tập lệnh tôi đang sử dụng để tự động cập nhật số phiên bản gói cài đặt:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle
settings_key = 'version_preference' # the key of your settings version

# these are used for testing only
info_path = '/Users/mrwalker/developer/My_App/Info.plist'
settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist'

# these environment variables are set in the XCode build phase
if 'PRODUCT_SETTINGS_PATH' in os.environ.keys():
    info_path = os.environ.get('PRODUCT_SETTINGS_PATH')

if 'PROJECT_DIR' in os.environ.keys():
    settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path)

# reading info.plist file
project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path)
project_bundle_version = project_plist['CFBundleVersion']

# print 'project_bundle_version: '+project_bundle_version

# reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
  for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = project_bundle_version

# print repr(settings_plist)
settings_plist.writeToFile_atomically_(settings_path, True)

Đây là danh sách Root.plist mà tôi có trong Settings.bundle:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>1.0.0.0</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Rất hữu ích - Tôi đang gặp sự cố khi thực thi PlistBuddy từ Python và tôi chưa bao giờ nghĩ đến việc sử dụng NSDictionary(và không nhận ra rằng nó cho phép bạn truy cập dễ dàng như vậy vào các tệp plist)
Dov

Cảm ơn vì điều này. Một sửa đổi - như bạn có bây giờ, nó thay đổi nguồn chứ không phải bản dựng - có nghĩa là những gì bạn thấy trên thiết bị của mình hoặc trong trình mô phỏng sẽ luôn là một phiên bản dựng sau phiên bản dựng thực tế. Để khắc phục điều này, tôi đã sửa đổi tập lệnh của bạn để lặp lại đầu tiên qua nguồn, sau đó đến cả builddir, tức là. settings_path_build = os.path.join (os.enosystem.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... và ngoài ra, tôi thêm githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod.

8

Các câu trả lời khác không hoạt động chính xác vì một lý do: Giai đoạn xây dựng tập lệnh chạy không được thực thi cho đến khi SAU KHI Gói cài đặt được đóng gói. Vì vậy, nếu phiên bản Info.plist của bạn là 2.0.11 và bạn cập nhật nó lên 2.0.12, sau đó xây dựng / lưu trữ dự án của bạn, gói Cài đặt sẽ vẫn là 2.0.11. Nếu bạn mở gói Cài đặt Root.plist, bạn có thể thấy rằng số phiên bản không được cập nhật cho đến khi KẾT THÚC của quá trình xây dựng. Bạn có thể xây dựng dự án LẠI để cập nhật chính xác gói Cài đặt hoặc bạn có thể thêm tập lệnh vào giai đoạn xây dựng trước ...

  • Trong XCode, Chỉnh sửa sơ đồ cho mục tiêu dự án của bạn
  • Nhấp vào mũi tên tiết lộ trên sơ đồ BUILD
  • Sau đó, nhấp vào mục "Hành động trước"
  • Nhấp vào dấu cộng và chọn "Hành động tập lệnh chạy mới"
  • Đặt giá trị shell thành / bin / sh
  • Đặt "Cung cấp cài đặt bản dựng từ" thành mục tiêu dự án của bạn
  • Thêm tập lệnh của bạn vào vùng văn bản. Kịch bản sau đây đã làm việc cho tôi. Bạn có thể cần phải sửa đổi các đường dẫn để phù hợp với thiết lập dự án của mình:

    versionString = $ (/ usr / libexec / PlistBuddy -c "Print CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"

Thao tác này sẽ chạy tập lệnh một cách chính xác TRƯỚC KHI gói Cài đặt được đóng gói trong quá trình xây dựng / lưu trữ. Nếu bạn mở gói Cài đặt Root.plist và xây dựng / lưu trữ dự án của mình, bây giờ bạn sẽ thấy số phiên bản được cập nhật khi bắt đầu quá trình xây dựng và gói Cài đặt của bạn sẽ hiển thị đúng phiên bản.


Cảm ơn bạn, chỉ có giải pháp của bạn hiển thị phiên bản xây dựng chính xác. Các giải pháp khác yêu cầu xây dựng hai lần.
Boris Y.

Điều này vẫn yêu cầu bản dựng thứ hai đối với tôi, sử dụng Xcode 10.0
Patrick

@Patrick Ứng dụng cài đặt iOS đôi khi giữ lại thông tin cũ. Để xem thay đổi, bạn phải xóa và khởi động lại ứng dụng Cài đặt.
Andy

1
BTW, tôi đã tìm thấy một cách đơn giản hơn để thêm tập lệnh này: Đi tới tab Xây dựng giai đoạn của mục tiêu dự án của bạn và nhấp vào biểu tượng "+". Chọn "Giai đoạn chạy tập lệnh mới" và thêm mã tập lệnh vào đó. ĐÂY LÀ TỪ KHÓA: nhấp và kéo tập lệnh chạy mới lên đầu danh sách Các giai đoạn xây dựng, trong Phụ thuộc Mục tiêu, nhưng trước khi Biên dịch Nguồn. Điều này sẽ hoạt động giống như một tập lệnh Pre-build và dễ tìm hơn.
Andy

Cảm ơn @Andy, giải pháp thêm vào tab Các giai đoạn xây dựng của bạn đã hoạt động hoàn hảo.
Patrick

7

Với Xcode 11.4, bạn có thể sử dụng các bước sau để hiển thị phiên bản ứng dụng trong gói cài đặt ứng dụng của mình.


Đặt $(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)biến

Lưu ý: nếu $(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)các biến xuất hiện cho Bundle version string (short)Bundle versioncác khóa trong Info.plist , bạn có thể bỏ qua các bước sau và chuyển sang phần tiếp theo.

  1. Mở dự án Xcode.
  2. Mở Project Navigator ( cmd1), chọn dự án của bạn để hiển thị cài đặt của dự án, sau đó chọn mục tiêu ứng dụng.
  3. Chọn tab Chung .
  4. Trong phần Identity , thay đổi nội dung trường Phiên bản thành một số giá trị mới (ví dụ 0.1.0) và thay đổi nội dung trường Xây dựng thành một giá trị mới nào đó (ví dụ 12). 2 thay đổi này sẽ tạo $(MARKETING_VERSION)$(CURRENT_PROJECT_VERSION)các biến trong tệp Info.plist .

Tạo và định cấu hình Gói cài đặt

  1. Trong Bộ điều hướng dự án , chọn dự án của bạn.
  2. Chọn Tệp > Mới > Tệp… ( cmdN).
  3. Chọn tab iOS .
  4. Chọn Gói cài đặt trong phần Tài nguyên , sau đó nhấp vào Tiếp theoTạo .
  5. Chọn Root.plist và mở nó dưới dạng mã nguồn. Thay thế nội dung của nó bằng mã bên dưới:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>DefaultValue</key>
            <string></string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Thêm tập lệnh chạy

  1. Trong Bộ điều hướng dự án , chọn dự án của bạn.
  2. Chọn mục tiêu ứng dụng.
  3. Chọn tab Xây dựng giai đoạn .
  4. Nhấp vào + > Giai đoạn Chạy Tập lệnh Mới .
  5. Kéo và thả giai đoạn mới ở đâu đó phía trên phần Tài nguyên của Gói sao chép . Bằng cách này, tập lệnh sẽ được thực thi trước khi biên dịch ứng dụng.
  6. Mở giai đoạn Run Script mới được thêm và thêm tập lệnh sau:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Chạy chương trình

  1. Chạy sản phẩm ( cmdR) trên thiết bị hoặc trình mô phỏng.
  2. Trên thiết bị hoặc trình mô phỏng, khi ứng dụng được khởi chạy, hãy mở ứng dụng Cài đặt và chọn ứng dụng của bạn trong danh sách ứng dụng của bên thứ ba. Phiên bản của ứng dụng sẽ được hiển thị như hình dưới đây:


Nguồn


Điều này ném một lỗi cho tôiSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H

2
Điều này đã làm việc cho tôi:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H

Cảm ơn. Đây là thế giới cho tôi. Nhưng của tôi được đặt tên là Settings-Watch.bundle và đã xóa($build)
Kurt Lane

3

Tôi đã quản lý để làm những gì tôi muốn bằng cách sử dụng porject mã nguồn mở pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. Sử dụng trình biên dịch này, bạn có thể ghi tệp thuộc tính trong tệp .plc bằng định dạng sau:

    plist {
        dictionary {
            key "StringsTable" value string "Root"
            key "PreferenceSpecifiers" value array [
                dictionary {
                    key "Type" value string "PSGroupSpecifier"
                    key "Title" value string "AboutSection"
                }
                dictionary {
                    key "Type" value string "PSTitleValueSpecifier"
                    key "Title" value string "Version"
                    key "Key" value string "version"
                    key "DefaultValue" value string "VersionValue"
                    key "Values" value array [
                        string "VersionValue"
                    ]
                    key "Titles" value array [
                        string "r" kRevisionNumber
                    ]
                }
            ]
        }
    }
    
  2. Tôi đã có một giai đoạn xây dựng tập lệnh chạy tùy chỉnh đang giải nén bản sửa đổi kho lưu trữ của tôi thành tệp .h như được mô tả bởi brad-larson tại đây .

  3. Tệp plc có thể chứa các chỉ thị tiền xử lý, như #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, các biến môi trường xcode. Vì vậy, tôi đã có thể tham chiếu đến biến kRevisionNumber bằng cách thêm lệnh sau

    #include "Revision.h"
    
  4. Tôi cũng đã thêm giai đoạn xây dựng tập lệnh tùy chỉnh vào mục tiêu xcode của mình để chạy trình biên dịch mỗi khi dự án đang xây dựng

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
    

Và đó là nó!


Điều đó nghe có vẻ như rất nhiều công việc chỉ để thay thế một giá trị duy nhất trong tệp plist ... Về mặt khái niệm, có thể truy cập vào một biến khi tạo plist, nhưng dễ dàng hơn nhiều khi sử dụng một công cụ xây dựng cho tệp plist. Tôi mô tả PlistBuddy trong câu trả lời của mình - hãy thử!
Quinn Taylor,

3

Ví dụ làm việc của tôi dựa trên câu trả lời của @Ben Clayton và nhận xét của @Luis Ascorbe và @Vahid Amiri:

Lưu ý: Cách tiếp cận này sửa đổi tệp Settings.bundle / Root.plist trong bản sao đang hoạt động của kho lưu trữ

  1. Thêm gói cài đặt vào gốc dự án của bạn. Đừng đổi tên nó

  2. Mở Settings.bundle / Root.plist dưới dạng Mã nguồn

    Thay thế nội dung bằng:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    
  3. Thêm tập lệnh sau vào phần Xây dựng, Hành động trước của lược đồ dự án (mục tiêu)

    version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
    build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
    
  4. Xây dựng và chạy chương trình hiện tại


2

Các câu trả lời trên không hoạt động đối với tôi do đó tôi đã tạo tập lệnh tùy chỉnh của mình.

Điều này cập nhật động mục nhập từ Root.plist

Sử dụng tập lệnh chạy bên dưới. Không hoạt động chắc chắn đã được xác minh trong xcode 10.3.

"var buildVersion" là phiên bản được hiển thị trong tiêu đề.

Và tên định danh là "phiên bản var" bên dưới cho tiêu đề trong settings.bundle Root.plist

cd "${BUILT_PRODUCTS_DIR}"

#set version name to your title identifier's string from settings.bundle
var version = "Version"

#this will be the text displayed in title
longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}")
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH})
buildVersion="$shortVersion.$longVersion"

path="${WRAPPER_NAME}/Settings.bundle/Root.plist"

settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l`

for (( idx=0; idx<$settingsCnt; idx++ ))
do
#echo "Welcome $idx times"
val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}`
#echo $val

#if ( "$val" == "Version" )
if [ $val == "Version" ]
then
#echo "the index of the entry whose 'Key' is 'version' is $idx."

# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path

# just to be sure that it worked
ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path`
#echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver

fi

done

Mục nhập mẫu trong Root.plist

    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>DefaultValue</key>
        <string>We Rock</string>
        <key>Key</key>
        <string>Version</string>
    </dict>

Mục nhập Root.plist mẫu làm việc


1

Tôi tin rằng bạn có thể làm điều này bằng cách tương tự như những gì tôi mô tả trong câu trả lời này (dựa trên bài đăng này ).

Trước tiên, bạn có thể đặt VersionValue thành một biến trong Xcode bằng cách đổi tên nó thành $ {VERSIONVALUE}. Tạo một tệp có tên là versionvalue.xcconfig và thêm nó vào dự án của bạn. Chuyển đến mục tiêu ứng dụng của bạn và chuyển đến cài đặt Xây dựng cho mục tiêu đó. Tôi tin rằng bạn cần thêm VERSIONVALUE làm cài đặt bản dựng do người dùng xác định. Ở góc dưới bên phải của cửa sổ đó, thay đổi giá trị Dựa trên thành "giá trị phiên bản".

Cuối cùng, đi đến mục tiêu của bạn và tạo giai đoạn xây dựng Run Script. Kiểm tra giai đoạn Chạy tập lệnh đó và dán tập lệnh của bạn vào trường văn bản Tập lệnh. Ví dụ: tập lệnh của tôi để gắn thẻ cài đặt BUILD_NUMBER của tôi với bản dựng Subversion hiện tại như sau:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

Điều này sẽ thực hiện thủ thuật thay thế biến khi các giá trị này thay đổi trong dự án của bạn.


Điều này hoạt động nếu tôi muốn nhúng số phiên bản vào tệp Info.plist. Nhưng tôi không thể làm cho nó hoạt động với các tệp plist khác, chẳng hạn như tệp Root.plist nằm trong Settings.bundle. Có cài đặt bản dựng nào mà tôi có thể sử dụng để bật tính năng này không?
Panagiotis Korros

0

Đối với tôi, đây là giải pháp dễ dàng nhất:

Thêm giai đoạn xây dựng tập lệnh mới trước bước Sao chép tài nguyên gói

Vỏ: /usr/bin/env python

Nội dung:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

# Key to replace
settings_key = 'version_preference' # the key of your settings version

# File path
settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist"

# Composing version string
version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_VERSION') + ")"

# Reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = version_string

# Save new settings
settings_plist.writeToFile_atomically_(settings_path, True)
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.