Tôi mở tiền thưởng: "Tìm kiếm câu trả lời từ các nguồn đáng tin cậy và / hoặc chính thức." nhưng đã không nhận được như vậy kể từ đó.
Mặc dù câu trả lời được cung cấp bởi @jackslash là đúng, nhưng nó chỉ kể một phần của câu chuyện, vì vậy tôi muốn viết theo cách của riêng mình theo cách mà tôi muốn biết ngay tại thời điểm tôi đặt câu hỏi này.
Thực tế của câu trả lời này là: Tháng 7 năm 2015. Rất có thể mọi thứ sẽ thay đổi.
Trước hết, hãy khẳng định rằng các hành động cần thiết để ký mã chính xác của khuôn khổ phải được chia thành các bước mà Nhà phát triển của khuôn khổ phải thực hiện và các bước mà Người tiêu dùng của khuôn khổ đó phải thực hiện.
TLDR;
Đối với khung OSX: Nhà phát triển có thể tự do phân phối khung OSX mà không cần gán mã vì Người tiêu dùng sẽ ký mã lại.
Đối với khuôn khổ iOS: Nhà phát triển có thể tự do phân phối khuôn khổ iOS mà không cần gán mã vì Người tiêu dùng sẽ ký mã lại nó, nhưng Nhà phát triển bị Xcode buộc phải thiết kế khung của họ khi họ xây dựng cho thiết bị iOS.
Do radar: "Không thể gửi các khung công tác iOS chứa các lát trình mô phỏng đến App Store" Khung công tác Consumer of iOS buộc phải chạy tập lệnh đặc biệt như "copy_frameworks" hoặc "strip_frameworks", dùng lipo -remove
để loại bỏ các lát trình mô phỏng khỏi khuôn khổ iOS và tái -codesigns đã loại bỏ khung công tác bởi vì tại thời điểm này, mã xác định danh tính của nó bất kể nó là gì (hoặc không) bị loại bỏ như là tác dụng phụ của lipo -remove
thao tác.
Câu trả lời dài hơn sau đây.
Câu trả lời này không phải là "bản vẽ từ các nguồn đáng tin cậy và / hoặc chính thức" mà là dựa trên một số quan sát thực nghiệm.
Quan sát theo kinh nghiệm số 1: Người tiêu dùng không quan tâm vì họ sẽ thiết kế lại khuôn khổ thiết kế mã mà họ nhận được từ Nhà phát triển
Các bản phân phối khung nhị phân của các dự án nguồn mở nổi tiếng trên Github không được ký mã . Lệnh codesign -d -vvvv
cung cấp: "đối tượng mã hoàn toàn không được ký" trên tất cả các khung nhị phân iOS và OSX mà tôi đã sử dụng để khám phá. Một số ví dụ: ReactiveCocoa và Mantle , Realm , PromiseKit .
Từ quan sát này, rõ ràng là các tác giả của các khuôn khổ này dự định chúng được ký mã bởi Người tiêu dùng, thay mặt cho họ, tức là Người tiêu dùng phải sử dụng cờ "Ký mã khi sao chép" trong giai đoạn xây dựng "Khuôn khổ nhúng" do Xcode cung cấp hoặc sử dụng một số trình bao tùy chỉnh script thực hiện điều tương tự theo cách thủ công: mã thiết kế khuôn khổ thay mặt Người tiêu dùng.
Tôi không tìm thấy bất kỳ ví dụ nào về điều ngược lại: khung mã nguồn mở sẽ được phân phối với mã định danh trong đó, vì vậy trong phần còn lại của câu trả lời, tôi giả định cách tiếp cận được áp dụng rộng rãi này là đúng: không cần khung Nhà phát triển phân phối khuôn khổ của họ cho các nhà phát triển khác có mã xác định danh tính trong đó vì Người tiêu dùng dù sao cũng sẽ ký mã lại nó .
Quan sát theo kinh nghiệm # 2 chỉ áp dụng cho iOS và hoàn toàn là mối quan tâm của Nhà phát triển
Trong khi người tiêu dùng không quan tâm cho dù khuôn khổ mà họ nhận được từ nhà phát triển được codesigned hay không, nhà phát triển vẫn cần codesign khuôn khổ iOS của họ như là một phần của quá trình xây dựng của mình khi họ xây dựng nó cho thiết bị iOS bởi vì nếu không Xcode không xây dựng: CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'
. Để trích dẫn Justin Spahr-Summers :
Các khung OS X không cần phải được ký mã khi xây dựng ... Thật không may, Xcode yêu cầu các khung iOS phải được ký mã tại thời điểm xây dựng.
Câu trả lời khá tốt này cho câu hỏi số 2 của tôi: Danh tính "Nhà phát triển iPhone" đủ để tạo ra Xcode để nó xây dựng khung iOS cho thiết bị. Nhận xét này trên Carthage # 339 cũng nói điều tương tự.
Quan sát thực nghiệm # 3: Công cụ lipo
Hành vi cụ thể của công cụ lipo: khi áp dụng cho nhị phân khuôn khổ, nó luôn luôn đệ quy loại bỏ bất kỳ bản sắc codesign từ nó : lipo -create/-remove codesigned framework ... -> not codesigned framework
.
Đây có thể là câu trả lời tại sao tất cả các ví dụ trong quan sát số 1 hoàn toàn không được ký mã: danh tính ký mã của chúng bị biến mất sau khi lipo được áp dụng nhưng vì theo quan sát số 1 Người tiêu dùng không quan tâm nên vẫn ổn.
Quan sát này đặc biệt liên quan đến quan sát số 4 tiếp theo về AppStore.
Quan sát thực nghiệm # 4: Không thể gửi các khung iOS chứa các lát trình mô phỏng lên App Store
Điều này được thảo luận rộng rãi trong: Realm # 1163 và Carthage # 188 và radar được mở: rdar: // 19209161 .
Đây hoàn toàn là mối quan tâm của Người tiêu dùng: đối với khung phổ quát iOS mà Người tiêu dùng đưa vào ứng dụng của họ, khi ứng dụng đang được xây dựng, họ phải chạy tập lệnh đặc biệt (Giai đoạn chạy tập lệnh tùy chỉnh) để loại bỏ phần mô phỏng khỏi hệ nhị phân của khung đó để ứng dụng có thể vượt qua xác thực AppStore.
Ví dụ tốt cho các khung nhị phân mà tôi tìm thấy trong Realm: strip-frameworks.sh .
Nó sử dụng lipo
để loại bỏ tất cả các phần của kiến trúc khác ${VALID_ARCHS}
và sau đó mã hóa lại nó với danh tính của Người tiêu dùng - đây là nơi mà quan sát số 3 bắt đầu: khung công tác được thiết kế lại mã do các thao tác lipo trên đó.
Carthage có tập lệnh CopyFrameworks.swift thực hiện điều tương tự với tất cả các khung được Người tiêu dùng bao gồm: nó loại bỏ các lát trình mô phỏng và thay mặt Người tiêu dùng thiết kế lại khung mã.
Ngoài ra còn có bài viết hay: Tách các kiến trúc không mong muốn khỏi các thư viện động trong Xcode .
Bây giờ là tổng quan về các bước cần thiết để sản xuất cả iOS và OSX từ quan điểm của cả Nhà phát triển và Người tiêu dùng. Đầu tiên cái dễ hơn:
OSX
Nhà phát triển:
- Xây dựng khung OSX
- Cung cấp cho người tiêu dùng
Không có hoạt động thiết kế mã nào được yêu cầu từ Nhà phát triển.
Khách hàng:
- Nhận khung OSX từ Nhà phát triển
- Sao chép khuôn khổ vào Khung công tác / thư mục và tự động gán mã đó cho Người tiêu dùng, thay mặt cho họ, như một phần của quy trình "Ký mã khi sao chép".
iOS
Nhà phát triển:
- Xây dựng khung iOS cho thiết bị. Xcode cần thiết lập mã, danh tính "Nhà phát triển iPhone" là đủ.
- Xây dựng khuôn khổ iOS cho trình mô phỏng.
- Sử dụng lipo tạo ra khung iOS phổ biến từ hai phiên bản trước. Tại thời điểm này, danh tính thiết kế mã của 1 bước bị mất: nhị phân khung phổ quát "hoàn toàn không được ký" nhưng điều đó vẫn ổn vì "Người tiêu dùng không quan tâm".
- Cung cấp cho người tiêu dùng
Khách hàng:
- Nhận khung iOS từ Nhà phát triển
- Sao chép khung công tác vào thư mục Khung / (bước này có thể thừa tùy thuộc vào tập lệnh trong bước 3 là gì.)
- Sử dụng tập lệnh đặc biệt như một phần của quá trình xây dựng: tập lệnh này tách trình mô phỏng tách khỏi khuôn khổ iOS và sau đó mã hóa lại nó thay mặt cho Người tiêu dùng.