Giải thích rõ về khung công tác iOS tĩnh và động


115

Tôi phải thừa nhận rằng với việc phát hành iOS 8, tôi hơi bối rối về các khung động và khung tĩnh trong iOS.

Tôi đang tìm cách phân phối thư viện mà tôi đã tạo và tôi cần hỗ trợ iOS 7 trở lên. (Lưu ý: Đây sẽ là khuôn khổ độc quyền. Tôi không thể sử dụng trái ca cao, và tôi cũng không thể phân phối nguồn). Đây là những gì tôi đã biết:

  • iOS 8 đã giới thiệu "khung nhúng" cho iOS, nhưng theo tôi hiểu, chúng không hoạt động với iOS 7, chỉ dành cho iOS 8 trở lên.
  • Tôi có tùy chọn phân phối thư viện của mình dưới dạng thư viện tĩnh (tệp .a) và cũng phân phối tiêu đề. Tôi biết rằng đây là cách phổ biến để đối phó với tình huống, nhưng tôi muốn tìm một cách đơn giản hơn thế (và cũng có thể kết hợp một số tài nguyên với nó, nếu có thể).
  • Tôi cũng nhận thấy rằng iOS 7 không hỗ trợ các thư viện .framework động (chỉ tĩnh) vì nó không hỗ trợ liên kết động. Nhưng iOS 8 cũng vậy, cũng như liên kết tĩnh.

Và đây là những câu hỏi của tôi liên quan đến thông tin này:

  • Tôi thấy rằng tôi có thể tạo mục tiêu .framework và làm cho nó tĩnh, bằng cách thay đổi loại Mach-O thành "thư viện tĩnh. Điều đó có đủ để hỗ trợ iOS 7 mà không gặp bất kỳ sự cố nào và cũng để phân phối thư viện của tôi dưới dạng Gói .framework? Nếu vậy, tại sao "các khung nhúng" trong iOS 8 lại là một vấn đề lớn khi nhiều tài nguyên trên internet đang gợi ý? Tôi có thiếu thứ gì đó không?
  • Có cần thiết phải mã hóa .framework giống như tôi làm với bất kỳ ứng dụng nào khác mà tôi tạo không?
  • Điều gì sẽ xảy ra nếu tôi cần bao gồm các tài nguyên khác (như Dữ liệu cốt lõi hoặc Hình ảnh) với tệp .framework của mình? Tôi có cần tạo một tệp .bundle riêng cho việc đó không?

1
"iOS 7 không hỗ trợ các thư viện .framework vì nó không hỗ trợ liên kết động" Câu này không đúng.
Midhun MP

1
Tôi hiểu rồi. bạn có thể cho tôi biết câu đúng không? Điều đó là sai vì iOS 7 hỗ trợ liên kết động hay vì iOS 7 hỗ trợ thư viện .framework? Hoặc cả hai?
csotiriou

1
Nhớ lại AVFoundation và CoreGraphics đều là .framework. Có lẽ điều này sẽ giúp bạn tìm ra câu trả lời cho tất cả các câu hỏi của bạn: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

Tôi đã sửa câu. Tôi đã đọc liên kết trước khi tôi đăng câu hỏi của mình. Liên kết này không giải thích bất cứ điều gì liên quan đến câu hỏi của tôi. Nó bắt đầu từ một thư viện tĩnh và kết thúc nó thành một tệp .framework THỦ CÔNG. Tôi đang nói về mục tiêu Cocoa Touch Framework trong Xcode 6 và sau đó thay đổi loại thành thư viện tĩnh. Nó không đề cập đến ký mã (lý do tại sao và nếu nó là cần thiết), nguồn lực bổ sung, vv
csotiriou

1
Bạn có thể sử dụng CocoaPods để phân phối khung độc quyền (ví dụ: Phân tích cú pháp)
Ric Santos

Câu trả lời:


69

Trước iOS8, Xcode chỉ cho phép tùy chọn tạo thư viện tĩnh cho iOS. Vấn đề chung với điều đó là chúng tôi phải gửi nhị phân và tiêu đề riêng biệt.

Sau đó, một số nhà phát triển đã nảy ra ý tưởng tạo ra các 'khuôn khổ tĩnh'. [.framework chỉ là một thư mục với các liên kết tượng trưng đến lib và các tiêu đề]. Một ví dụ như vậy là https://github.com/jverkoey/iOS-Framework

Tùy chọn này sẽ hoạt động cho iOS 7 hoặc 8 hoặc trước đó. Bởi vì chúng chỉ là các thư viện tĩnh với sự tiện lợi của việc đóng gói các tệp tiêu đề cùng với nhau.

Đối với các câu hỏi của bạn về tài nguyên, chúng tôi cần phải gói chúng trong '.bundle' .. Để vận chuyển chúng, tôi không chắc liệu chúng tôi có thể đưa chúng vào thư mục .framework hay không .. Trước đây, tôi đã từng gửi lib của mình dưới dạng một khung và gói tĩnh ...

Tuy nhiên tùy chọn trên sẽ không hoạt động với bạn nếu bạn sử dụng Swift. Xcode không hỗ trợ xây dựng thư viện tĩnh bao gồm mã nhanh.

Bạn phải sử dụng Khung động nếu có tốc độ sử dụng nhanh. Về lý thuyết, khung động hoạt động trong iOS7 .. Tuy nhiên, tôi nghĩ iTunes Connect sẽ từ chối nếu ứng dụng đang nhắm mục tiêu iOS7 và sử dụng khung động :-).

Hi vọng điêu nay co ich


16

Với Xcode 9 trở đi, bạn cũng có thể tạo các khung công tác tĩnh cho Swift. Điều này có thể do khả năng tương thích nguồn ABI. Tất cả những gì bạn cần làm chỉ là thay đổi Mach-O typecài đặt đang xây dựng của mục tiêu khung. Kỹ thuật này cũng có thể áp dụng cho các Khung công tác lai (các khung công tác với mã Swift và Objective-C).


Mẹo hay. Không biết tại sao câu trả lời này lại bị hạ điểm vì nó đã giúp tôi. \ Target'Build Settings \ Mach-O-Type và chọn Static Framework.
gỉMagnet 12/1217

3
Khả năng tương thích Abi không có sẵn trong nhanh chóng 4
csotiriou

7

statichoặc dynamictên thường điểm thành Linking[Về] loại

Khung có thể là statichoặc dynamic[Kiểm tra tĩnh hoặc động]

Bạn có thể thay đổi định dạng của thư viện sẽ ảnh hưởng đến a Linkerbằng cách thay đổi Framework target -> Build Settings -> Mach-O Type[Giới thiệu] thành Static Libraryhoặc Dynamic Library. Theo mặc định Xcode có Dynamic Librarygiá trị.

Tùy thuộc vào cài đặt này, các loại nhị phân khác nhau sẽ được tạo ra

Sau khi bạn định cấu hình thành công người tiêu dùng [Liên kết so với Nhúng]

Static Linker ld : tại thời điểm biên dịch sẽ bao gồm tất cả mã từ static librarytệp vào tệp đối tượng thực thi.

Dynamic Linker dyld : tại thời gian tải / chạy sẽ cố gắng tìm khung được nhúng bằng @rpath[Giới thiệu] và liên kết nó

[Từ vựng]


6

Swift không hoạt động trong lib tĩnh. Nếu bạn phải sử dụng khung động, bạn phải đặt iOS tối thiểu là 8.0 AppStore từ chối ios 7 với khung động


Bạn có thể nhập một thư viện tĩnh vào một dự án dựa trên nhanh chóng
C0D3

5

Tôi không có tất cả câu trả lời nhưng tôi sẽ cố gắng giải quyết một số câu hỏi của bạn ở đây.

  • Bạn sẽ nhận được cảnh báo khi sử dụng các khung này trong iOS 7, tuy nhiên đó là tất cả, một cảnh báo. Xem câu trả lời này .

  • Bạn có thể bao gồm các tài nguyên khác như CoreData, tuy nhiên bạn sẽ cần tạo chúng bằng mã theo cách thủ công. Dưới đây là hướng dẫn cách tạo mô hình dữ liệu cốt lõi.

  • Bạn phải ký mã các thư viện động cho iOS.

  • Bạn cần đảm bảo rằng khung của bạn hỗ trợ cả kiến ​​trúc mô phỏng và thiết bị nếu bạn định phân phối nó.

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.