Làm thế nào để ký lại tệp ipa?


107

Làm cách nào để ký tệp .ipa có hồ sơ cấp phép sau khi tôi tạo IPA như sau với hồ sơ cung cấp khác? Tôi muốn ký IPA với hồ sơ cấp phép đặc biệt để thử nghiệm beta, sau đó ký lại IPA chính xác với hồ sơ cấp phép gửi ứng dụng cho cửa hàng ứng dụng.

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "${RELEASE_BUILDDIR}/${APPLICATION_NAME}.app" -o "${BUILD_HISTORY_DIR}/${APPLICATION_NAME}.ipa" --sign "${DEVELOPER_NAME}" --embed "${PROVISONING_PROFILE}"

1
Có thể có bản sao của Đăng ký lại IPA (iPhone)
InnisBrendan

Câu trả lời:


207

Nó thực sự dễ dàng để làm từ dòng lệnh. Tôi đã có một ý chính của một kịch bản để làm điều này. Hiện nó đã được tích hợp vào tập lệnh ipa_sign trong https://github.com/RichardBronosky/ota-tools mà tôi sử dụng hàng ngày. Nếu bạn có bất kỳ câu hỏi nào về việc sử dụng các công cụ này, đừng ngần ngại hỏi.

Trung tâm của nó là thế này:

CODESIGN_ALLOCATE=`xcrun --find codesign_allocate`; export CODESIGN_ALLOCATE
IPA="/path/to/file.ipa"
PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in keychain
# unzip the ipa
unzip -q "$IPA"
# remove the signature
rm -rf Payload/*.app/_CodeSignature
# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision
# sign with the new certificate (--resource-rules has been deprecated OS X Yosemite (10.10), it can safely be removed)
/usr/bin/codesign -f -s "$CERTIFICATE" Payload/*.app
# zip it back up
zip -qr resigned.ipa Payload

Ứng dụng đã ký mới của bạn có tên là resigned.ipa


31
7 phiếu bầu và không có một câu hỏi nào. Tôi đoán bash của tôi chỉ rõ ràng như vậy.
Bruno Bronosky

4
Quả thực là tốt bụng thưa ngài.
Rui Peres

3
@RahmathullahMPulikkal Tôi thấy tôi đã mã hóa sai một đường dẫn trong ý chính. Bạn thực sự nên sử dụng github.com/RichardBronosky/ota-tools/blob/master/ipa_sign thay vì ý chính. Đó là mã được duy trì.
Bruno Bronosky,

5
Bạn có thể gặp cảnh báo / lỗi trên các tham số --resource-rules, đã không còn được dùng trong OS X Yosemite (10.10), chỉ cần xóa tham số này là có thể giải quyết được vấn đề này.
ıɾuǝʞ

4
Một lưu ý nhỏ: có vẻ như CodeResourcesbây giờ nằm bên trong các _CodeSignaturethư mục, vì vậy bạn chỉ cần phải loại bỏ thư mục đó.
dadude999

36

Kiểm tra iResign để biết một công cụ đơn giản về cách thực hiện việc này!

[sửa] sau một số lần mò mẫm, tôi đã tìm ra giải pháp cho việc từ chức nhận thức được keychain. Bạn có thể kiểm tra tại https://gist.github.com/Weptun/5406993


có công cụ nào có thể thay đổi Tên hiển thị cùng với id Gói khi từ chức không? Điều này sẽ giúp có các tên hiển thị khác nhau cho các môi trường khác nhau. như App-Dev, App-QA, App-Stage, vv
Nishanth Nair

1
Có, floatsign.sh thực hiện chính xác điều đó.
Blitz

Làm. Đơn giản và đẹp.
Arjun Kalidas

13

Loại câu hỏi cũ, nhưng với XCode mới nhất, codesignthật dễ dàng:

$ codesign -s my_certificate example.ipa 

$ codesign -vv example.ipa
example.ipa: valid on disk
example.ipa: satisfies its Designated Requirement

2
@Pavel Câu hỏi này đã được trả lời khi iOS 6.x là phiên bản mới nhất. Kể từ đó, chúng tôi đã có hai bản phát hành chính, điều này rõ ràng đã thay đổi nhiều thứ. Bạn có thể muốn giới hạn tìm kiếm của mình ở những câu trả lời nhắm mục tiêu đến công nghệ hiện tại.
BryanH

Nó đã làm việc cho tôi. bạn phải thay thế "my_certificate" bằng tên của khóa trong chuỗi chìa khóa của bạn.
Franziskus Karsunke

2
codesignlệnh cũng được sử dụng trong phản hồi @BrunoBronosky. Tôi không thể sử dụng nó trực tiếp trên tệp "* .ipa" và các tùy chọn "-vv" luôn trả về code object is not signed at alltrên các tệp mà tôi biết chúng đã được ký ...
Mariano Paniga

12

Tất cả các câu trả lời được đăng ở đây không hoàn toàn phù hợp với tôi. Họ chủ yếu bỏ qua việc ký kết các khuôn khổ nhúng (hoặc bao gồm các quyền).

Đây là những gì phù hợp với tôi (giả sử rằng có một tệp ipa tồn tại trong thư mục hiện tại):

PROVISION="/path/to/file.mobileprovision"
CERTIFICATE="Name of certificate: To sign with" # must be in the keychain

unzip -q *.ipa
rm -rf Payload/*.app/_CodeSignature/

# Replace embedded provisioning profile
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# Extract entitlements from app
codesign -d --entitlements :entitlements.plist Payload/*.app/

# Re-sign embedded frameworks
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/Frameworks/*

# Re-sign the app (with entitlements)
codesign -f -s "$CERTIFICATE" --entitlements entitlements.plist Payload/*.app/

zip -qr resigned.ipa Payload

# Cleanup
rm entitlements.plist
rm -r Payload/

Nhận xét hữu ích từ bài đăng ở trên (Phong phú): stackoverflow.com/questions/5160863/…
Serzas

9

Tiếng thở dài của Fastlane cung cấp một giải pháp khá mạnh mẽ để từ chức IPA.

Từ README của họ:

Từ chức

Nếu bạn đã tạo ipatệp của mình nhưng muốn áp dụng cách ký mã khác vào tệp ipa, bạn có thể sử dụng sigh resign:

fastlane sigh resign

sigh sẽ tìm thấy tệp ipa và hồ sơ cấp phép cho bạn nếu chúng nằm trong thư mục hiện tại.

Bạn có thể chuyển thêm thông tin bằng cách sử dụng dòng lệnh:

fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

Nó thậm chí sẽ xử lý các hồ sơ cấp phép cho các ứng dụng lồng nhau (ví dụ: nếu bạn có ứng dụng watchkit)


8

Tôi đã cập nhật mã của Bryan cho Sierra iMac của mình:

# this version was tested OK vith macOs Sierra 10.12.5 (16F73) on oct 0th, 2017
# original ipa file must be store in current working directory 

IPA="ipa-filename.ipa"
PROVISION="path-to.mobileprovision"
CERTIFICATE="hexadecimal-certificate-identifier" # must be in keychain
# identifier maybe retrieved by running: security find-identity -v -p codesigning

# unzip the ipa
unzip -q "$IPA"

# remove the signature
rm -rf Payload/*.app/_CodeSignature

# replace the provision
cp "$PROVISION" Payload/*.app/embedded.mobileprovision

# generate entitlements for current app
cd Payload/
codesign -d --entitlements - *.app > entitlements.plist
cd ..
mv Payload/entitlements.plist entitlements.plist

# sign with the new certificate and entitlements
/usr/bin/codesign -f -s "$CERTIFICATE" '--entitlements' 'entitlements.plist'  Payload/*.app

# zip it back up
zip -qr resigned.ipa Payload

i git các entitlements.plist lỗi sau: không được công nhận loại blob (chấp nhận một cách mù quáng) entitlements.plist: chiều dài không hợp lệ trong quyền blob
Amr Angry

bạn có thể chia sẻ nội dung tập tin quyền được không?
Pierre Priot

Làm việc như người ở!
Luis E. Prado

5
  1. Giải nén tệp .ipa bằng cách thay đổi phần mở rộng của nó bằng .zip
  2. Chuyển đến Tải trọng. Bạn sẽ tìm thấy tệp .app
  3. Nhấp chuột phải vào tệp .app và nhấp vào Hiển thị nội dung gói
  4. Xóa _CodeSignedthư mục
  5. Thay thế embedded.mobileprovisiontệp bằng hồ sơ cung cấp mới
  6. Truy cập KeyChain Access và đảm bảo rằng chứng chỉ được liên kết với hồ sơ tạm thời có sẵn
  7. Thực hiện lệnh được đề cập dưới đây: /usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

  8. Bây giờ hãy nén lại thư mục Payload và thay đổi phần mở rộng .zip bằng .ipa

Hy vọng điều này hữu ích.

Để tham khảo, hãy làm theo liên kết được đề cập dưới đây: http://www.modelmetrics.com/tomgersic/codesign-re-signs-an-ipa-between-apple-accounts/


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.