Ký lại IPA (iPhone)


129

Tôi hiện đang xây dựng tất cả các ứng dụng của mình với hudson bằng xcodebuild, sau đó là xcrun mà không gặp vấn đề gì

Tôi đã nhận được một vài tệp IPA từ những người khác nhau mà tôi muốn đăng nhập lại bằng tài khoản doanh nghiệp thay vì tài khoản công ty (đối với cửa hàng ứng dụng hoặc đôi khi được phân phối đặc biệt).

Vấn đề của tôi là khi tôi cố gắng từ chức ứng dụng, nó sẽ không cài đặt trên thiết bị của tôi (và nó sẽ là do bản dựng Enterprise). Thông báo lỗi nằm trên thiết bị (không phải trong iTunes) và nó cho tôi biết đơn giản là nó không thể cài đặt ứng dụng. Không có thêm thông tin được đưa ra.

Tôi đã tìm thấy một số thông tin, ( http://www.ketzler.de/2011/01/resign-an-iphone-app-insert-new-bundle-id-and-send-to-xcode- Organizer-for- tải lên / )

Và điều này có thể là có thể. Vấn đề tôi gặp phải là dường như không nhúng hồ sơ cung cấp thiết bị di động như tôi làm với các bản dựng thông thường của mình (sử dụng xcrun) để có thể kiểm soát bằng công cụ Codeign hoặc có thể đăng nhập lại bằng xcrun ?

Với kịch bản từ chức của tôi, tôi hiện đang làm

  • giải nén app.ipa
  • appname = $ (Tải trọng ls)
  • xcrun -sdk iphoneos GóiApplication -s "$ termsing_profile" "$ project_dir / Payload / $ appname" -o "$ project_dir / app-resign.ipa" - ký tên "$ cung cấp_profile" -

Tôi đã xem tệp ipa kết quả và có vẻ như nó rất giống với ứng dụng gốc. Những tập tin nào thực sự nên thay đổi ở đây? Ban đầu tôi nghĩ rằng _CodeSignature / CodeResource sẽ thay đổi, nhưng nội dung trông khá giống nhau.

Con trỏ được nhiều đánh giá cao.

Câu trả lời:


211

Cuối cùng đã làm việc này!

Đã thử nghiệm với IPA được ký với cert1 để gửi cửa hàng ứng dụng mà không có thiết bị nào được thêm vào trong hồ sơ cung cấp. Kết quả trong một IPA mới được ký với tài khoản doanh nghiệp và hồ sơ cung cấp điện thoại di động để triển khai tại nhà (hồ sơ cung cấp di động được nhúng vào IPA).

Giải pháp:

Giải nén IPA

unzip Application.ipa

Xóa CodeSignature cũ

rm -r "Payload/Application.app/_CodeSignature" "Payload/Application.app/CodeResources" 2> /dev/null | true

Thay thế hồ sơ cung cấp điện thoại di động nhúng

cp "MyEnterprise.mobileprovision" "Payload/Application.app/embedded.mobileprovision"

Ký lại

/usr/bin/codesign -f -s "iPhone Distribution: Certificate Name" --resource-rules "Payload/Application.app/ResourceRules.plist" "Payload/Application.app"

Gói lại

zip -qr "Application.resigned.ipa" Payload

Chỉnh sửa: Đã xóa phần Quyền lợi (xem hẻm bình luận, cảm ơn)


6
Một điều gây ra sự cố cho chúng tôi là tệp Entitlements, nếu bạn có, phải khớp với id ứng dụng do Apple cung cấp. Vì chúng tôi đã thay đổi id gói, các quyền lợi không khớp. Ứng dụng sẽ chạy, nhưng móc khóa sẽ xóa sau mỗi lần chạy.
tjg184

5
Theo oleb.net/blog/2011/06/code-signing-changes-in-xcode-4 ID ứng dụng được tích hợp vào nhị phân, do đó bạn chỉ có thể từ chức bằng cùng một ID ứng dụng. Tôi biết tôi không thể từ chức với một ID ứng dụng khác.
Michael Baltaks

7
@ValerioSantinelli Bạn sẽ cần thực hiện các quyền lợi từ việc ký mã trước đó. Thông báo đẩy FWIW sẽ không hoạt động nếu không có quyền. Sau khi giải nén: /usr/bin/codesign -d --entitlements :entitlements.plist /Payload/appname.appSau đó, trong quá trình từ chức--entitlements entitlements.plist
Peter

11
Codeign không thành công trên Yosemite - Cảnh báo: - quy tắc nguồn đã bị phản đối trong Mac OS X> = 10.10! Tải trọng / Aaa.app / ResourceRules.plist: không thể đọc tài nguyên
Jibeex

4
Cảnh báo: - quy tắc nguồn đã bị phản đối trong Mac OS X> = 10.10! Tải trọng / Ứng dụng.app / ResourceRules.plist: không thể đọc tài nguyên. Bắt lỗi này?
megha

44

Các câu trả lời cho câu hỏi này hơi lỗi thời và thiếu các bước chính có khả năng, vì vậy đây là hướng dẫn cập nhật để cài đặt ứng dụng từ nhà phát triển bên ngoài.

----- Cách từ chức một ứng dụng iOS -----

Giả sử bạn nhận được một ứng dụng (ví dụ MyApp.ipa) từ một nhà phát triển khác và bạn muốn có thể cài đặt và chạy nó trên thiết bị của mình ( ví dụ: bằng cách sử dụng ideviceinstaller ).

Chuẩn bị tài sản ký mới

Bước đầu tiên là đạt được Hồ sơ cung cấp bao gồm tất cả các thiết bị bạn muốn cài đặt và chạy. Đảm bảo rằng cấu hình chứa chứng chỉ mà bạn đã cài đặt trong Quyền truy cập Keychain của mình (ví dụ: Nhà phát triển iPhone: Một số cơ thể (XXXXXXXXXX)). Tải xuống hồ sơ (MyProfile.mobileprovision) để bạn có thể thay thế hồ sơ được nhúng trong ứng dụng.

Tiếp theo, chúng tôi sẽ chuẩn bị một tệp quyền lợi để đưa vào ký kết. Mở terminal của bạn và chạy như sau.

$ security cms -D -i path/to/MyProfile.mobileprovision > provision.plist

Điều này sẽ tạo một tệp xml mô tả Hồ sơ cung cấp của bạn . Tiếp theo, chúng tôi muốn trích xuất các quyền lợi vào một tệp.

$ /usr/libexec/PlistBuddy -x -c 'Print :Entitlements' provision.plist > entitlements.plist

Thay thế Hồ sơ cung cấp và Ứng dụng từ chức

Nếu bạn đang làm việc với tệp .ipa , trước tiên, hãy giải nén ứng dụng (nếu bạn có .app thay vào đó, bạn có thể bỏ qua bước này).

$ unzip MyApp.ipa

Thư mục làm việc của bạn bây giờ sẽ chứa Payload/Payload/MyApp.app/. Tiếp theo, loại bỏ các tập tin chữ ký mã cũ.

$ rm -rf Payload/MyApp.app/_CodeSignature

Thay thế hồ sơ cung cấp hiện tại (ví dụ: nhúng.mobileprovision) bằng hồ sơ của riêng bạn.

$ cp path/to/MyProfile.mobileprovision Payload/MyApp.app/embedded.mobileprovision

Bây giờ hãy ký vào ứng dụng với chứng chỉ có trong hồ sơ cung cấp của bạn và entitlements.plist mà bạn đã tạo trước đó.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app

QUAN TRỌNG: Bạn cũng phải từ chức tất cả các khung có trong ứng dụng . Bạn sẽ tìm thấy những trong Payload/MyApp.app/Frameworks. Nếu ứng dụng được viết bằng Swift hoặc nếu nó bao gồm bất kỳ khung bổ sung nào thì chúng phải được từ chức hoặc ứng dụng sẽ cài đặt nhưng không chạy.

$ /usr/bin/codesign -f -s "iPhone Developer: Some Body (XXXXXXXXXX)" --entitlements entitlements.plist Payload/MyApp.app/Frameworks/*

Bây giờ bạn có thể giải nén lại ứng dụng.

$ zip -qr MyApp-resigned.ipa Payload

Làm xong

Bây giờ bạn có thể xóa Payloadthư mục vì bạn có ứng dụng gốc (MyApp.ipa) và phiên bản đã từ chức của bạn (MyApp-resign.ipa). Bây giờ bạn có thể cài đặt MyApp-resign.ipa trên bất kỳ thiết bị nào có trong hồ sơ cung cấp của bạn.


Cách tiếp cận tương tự này sẽ áp dụng cho hồ sơ phân phối? IE: tôi có thể trích xuất các quyền lợi và đăng nhập lại từ distro.mobileprovision của mình không?
Đuổi theo Florell

@grez Công việc này có phân phối IPA không?
LearneriOS

Ý tôi là phân phối IPA ứng dụng 'doanh nghiệp' cũng như @grez
LearneriOS

@LearneriOS Điều này không làm việc cho tôi đối với Phân phối IPA cho doanh nghiệp. Tôi đang sử dụng Sierra, Xcode 8, iOS 10. Ứng dụng cài đặt qua iTunes nhưng sau đó sẽ bị xóa ngay sau khi cài đặt.
Bryan Bryce

@PhoenixFF Tôi không chắc chắn về việc cài đặt với iTunes, nhưng bạn có thể thử cài đặt từ dòng lệnh như thế này: $ ideviceinstaller -i myapp.ipa
InnisBrendan

11

Tôi đã thực hiện thành công câu trả lời này, nhưng vì quyền lợi đã thay đổi, tôi chỉ cần loại bỏ --entitlements "Payload/Application.app/Entitlements.plist"phần thứ hai đến câu cuối cùng và nó hoạt động như một lá bùa.


Tôi sẽ bình luận thứ 2 trước. Loại bỏ các quyền lợi để thực hiện công việc này với bộ công cụ hiện đại.
Bruno Bronosky

2
Không có quyền lợi, ứng dụng của tôi thực sự bắt đầu hoạt động kỳ lạ, đưa ra điều này trong nhật ký : SecItemCopyMatching: missing entitlement. Tôi không có tệp Entitlements.plist riêng biệt, vì vậy để duy trì các quyền lợi tôi đã sử dụng bình luận của @ LordT : trước tiên hãy tạo tệp quyền lợi: echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>/usr/bin/codesign -d --entitlements - temp/Payload/$APP_NAME | sed -E -e '1d'" > temp/newEntitlementssau đó sử dụng tệp khi ký : --entitlements temp/newEntitlements.
Bulat

5

Đã kiểm tra với Mac OS High Sierra và Xcode 10

Bạn chỉ có thể thực hiện tương tự bằng ứng dụng iResign .

Cho đường dẫn của 1) .ipa

2) Hồ sơ cung cấp mới

3) Tệp quyền lợi (Tùy chọn, chỉ thêm nếu bạn có quyền)

4) Gói id

5) Giấy chứng nhận phân phối

Bạn có thể thấy tệp .ipa đầu ra được lưu sau khi đăng nhập lại

Công cụ đơn giản và mạnh mẽ


4

Không có cách tiếp cận từ chức nào làm việc cho tôi, vì vậy tôi phải tìm ra cách khác.

Trong trường hợp của tôi, tôi đã có IPA với chứng chỉ hết hạn. Tôi có thể đã xây dựng lại ứng dụng, nhưng vì chúng tôi muốn đảm bảo rằng chúng tôi đang phân phối chính xác cùng một phiên bản (chỉ với một chứng chỉ mới), chúng tôi không muốn xây dựng lại nó.

Thay vì các cách từ chức được đề cập trong các câu trả lời khác, tôi đã chuyển sang phương pháp tạo IPA của Xcode, bắt đầu bằng .xcarchive từ bản dựng.

  1. Tôi đã sao chép một .xcarchive hiện có và bắt đầu thay thế nội dung. (Tôi bỏ qua tệp .dSYM.)

  2. Tôi đã trích xuất ứng dụng cũ từ tệp IPA cũ (thông qua việc giải nén; ứng dụng là thứ duy nhất trong thư mục Payload)

  3. Tôi đã chuyển ứng dụng này sang .xcarchive mới, dưới sự Products/Applicationsthay thế ứng dụng đã có.

  4. Tôi đã chỉnh sửa Info.plist, chỉnh sửa

    • ApplicationProperties/ApplicationPath
    • ApplicationProperties/CFBundleIdentifier
    • ApplicationProperties/CFBundleShortVersionString
    • ApplicationProperties/CFBundleVersion
    • Name
  5. Tôi thường chuyển .xcarchive vào thư mục lưu trữ của Xcode /Users/xxxx/Library/Developer/Xcode/Archives.

  6. Trong Xcode, tôi đã mở cửa sổ Sắp xếp, chọn kho lưu trữ mới này và thực hiện xuất (thông thường trong trường hợp này là Enterprise).

Kết quả là một IPA tốt hoạt động.


1
Đây là một giải pháp thiên tài vẫn hoạt động kể từ Xcode 9.2. Trong trường hợp của tôi, tôi chỉ sao chép tệp .app cũ dưới .xcarchive hiện có. Tôi đã không thay đổi Info.plist và vì vậy phiên bản ứng dụng vẫn là phiên bản cũ nhưng đã được ký với chứng chỉ doanh nghiệp mới.
dodgy_coder

3

Tôi nghĩ cách dễ nhất là sử dụng Fastlane:

sudo gem install fastlane -NV
hash -r # for bash
rehash # for zsh
fastlane sigh resign ./path/app.ipa --signing_identity "iPhone Distribution: Felix Krause" -p "my.mobileprovision"

Tôi đã thử nhiều cách nhưng không có may mắn. Giải pháp này đã làm việc cho tôi cảm ơn.
Omid Kia

1

Với tùy chọn từ chức của Fastlane thở dài, bạn có thể làm điều này rất dễ dàng.

sigh resign -p <path-to-profile-with-mobileprovision-ext> -i <code-sighning-identity-of-your-app>

Bạn cũng có thể tải xuống hồ sơ bằng cách thở dài, ngay trước lệnh.


0

Cảm ơn bạn, Erik, vì đã đăng bài này. Điều này làm việc cho tôi. Tôi muốn thêm một ghi chú về một bước thêm tôi cần. Trong "Payload / Application.app /" có một thư mục có tên " CACertChains " có chứa một tệp có tên " cacert.pem ". Tôi đã phải xóa thư mục và .pem để hoàn thành các bước này. Cảm ơn một lần nữa! -


-1

Nếu bạn có một ứng dụng có tiện ích mở rộng và / hoặc ứng dụng đồng hồ và bạn có nhiều hồ sơ cung cấp cho mỗi ứng dụng tiện ích mở rộng / đồng hồ thì bạn nên sử dụng tập lệnh này để ký lại tệp ipa.

Ký lại kịch bản tại Github

Dưới đây là một ví dụ về cách sử dụng tập lệnh này:

./resign.sh YourApp.ipa "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovision -p <path_to_provisioning_profile_for_watchkitapp>.mobileprovision -p <path_to_provisioning_profile_for_todayextension>.mobileprovision  resignedYourApp.ipa

Bạn cũng có thể bao gồm các hồ sơ cung cấp tiện ích mở rộng khác bằng cách thêm nó với tùy chọn -p khác.

Đối với tôi - tất cả các hồ sơ cung cấp đã được ký bởi cùng một chứng nhận / ký nhận dạng.


Liên kết của bạn bị hỏng ... tìm thấy sự thay thế này bằng cách nhìn vào github của tác giả. github.com/fastlane/fastlane/blob/ từ
jugutier

đây là một câu trả lời cũ và có lẽ nên bị xóa vì nó không còn hoạt động nhưng không có cách nào để xóa nó trong StackOverflow
RPM

1
Điều này làm việc cho chúng tôi, chỉ cần cập nhật liên kết đến đây: github.com/fastlane/fastlane/blob/
mẹo

ok tốt để biết rằng nó vẫn hoạt động. Không thể chỉnh sửa câu trả lời ban đầu nữa để mọi người sẽ phải đọc các bình luận :)
RPM

Sử dụng fastlane sigh resign YourApp.ipa --signing_identity "iPhone Distribution: YourCompanyOrDeveloperName" -p <path_to_provisioning_profile_for_app>.mobileprovision -p <path_to_provisioning_profile_for_watchkitextension>.mobileprovisionthay thế.
green0range
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.