Bạn có thể tạo thư viện động cho iOS và tải chúng trong thời gian chạy không?


114

Thư viện động có được hỗ trợ trên iOS (iPhone / iPad) không?

Trong Xcode, tôi đã cố gắng tạo một dự án Mới -> Framework & Library -> Cocoa Library (động) . Trong cài đặt dự án, tôi đặt SDK cơ sở thành iOS device 4.1và nhắm mục tiêu đến iOS4.1, nhưng nó có lỗi xây dựng:

target chỉ định loại sản phẩm 'com.apple.product-type.library.dynamic', nhưng không có loại sản phẩm nào như vậy cho nền tảng 'iphonesimulator' ".

Bản dựng mà tôi đã chọn là Simulator -> Debug -> i386 .



4
iOS8 + hỗ trợ các khuôn khổ dựa trên thư viện được chia sẻ.
eonil

1
@Eonil, bạn có thể nói rõ hơn về điều đó không? Tôi muốn tìm hiểu thêm về nó, một bài báo hoặc liên kết đến một số thông tin sẽ được đánh giá cao.
Maxim Chetrusca

Câu trả lời:


105

Tại thời điểm câu hỏi này được hỏi, Thư viện động không được iOS hỗ trợ và sẽ dẫn đến việc ứng dụng của bạn bị từ chối. Chỉ các thư viện tĩnh mới được phép.

Tuy nhiên, trong iOS8, bạn có thể sử dụng các thư viện và khuôn khổ động. Nó sẽ "chỉ hoạt động"


14
Có ai biết tại sao lại như vậy không? Đối với tôi nó dường như hoàn toàn điên rồ.
Erik de Castro Lopo,

73
@Erik de Castro Lopo: Lý do là bảo mật: vì một thư viện động có thể được tải và tải xuống trong thời gian chạy, bạn có thể tải xuống mã thực thi bổ sung và tải nó (hãy nghĩ đến trình cắm thêm). Điều này có thể bị hacker xâm nhập và sau đó mã độc thực thi trên điện thoại của bạn là một điều rất tồi tệ. Nó cũng sẽ giúp bạn có thể thêm các tính năng chưa được phê duyệt vào một ứng dụng đã được phê duyệt. Tóm lại: trong môi trường này, Apple coi liên kết động là một hộp Pandoras phải được kiểm soát chặt chẽ, nếu không nó có thể ảnh hưởng đến bảo mật và tôi đồng ý rằng nó có ý nghĩa trên điện thoại .
DarkDust

6
Tôi đang phát triển một ứng dụng nội bộ sẽ không được phân phối qua AppStore, vì vậy tôi không quan tâm đến các hạn chế của Apple đối với AppStore. Về mặt kỹ thuật, có thể tạo thư viện động cho ứng dụng iOS không?
Aliaksei

3
@Aliaksei: Về mặt kỹ thuật là có, nếu không bạn sẽ không thể liên kết đến các thư viện của Apple. Hỗ trợ thư viện động AFAIK cũng giống như trên Mac OS X. Tuy nhiên, Xcode không hỗ trợ nó, nhưng có vẻ như bạn có thể sử dụng gói. Xem bài viết này .
DarkDust

3
Không được hỗ trợ không giống như không được phép.
dtech

162

Tôi không thực sự không đồng ý với câu trả lời của DarkDust , nhưng nếu tôi có thể chuyển tải nội tâm của tôi về Bill Clinton, điều đó phụ thuộc vào ý nghĩa của việc ủng hộ là gì :)

Apple không muốn bạn làm điều này cho các ứng dụng trên App Store, nhưng hệ điều hành chắc chắn cho phép. Ứng dụng bẻ khóa sử dụng kỹ thuật này mọi lúc. Về cơ bản, bạn sử dụng một kỹ thuật UNIX tiêu chuẩn để mở động một khuôn khổ / thư viện và sau đó sử dụng những thứ trong đó. Hàm dlopen cho phép bạn mở thư viện bằng cách chuyển đường dẫn đến khung công tác đó , hoặc dylib. Từ một số tài liệu để xây dựng ứng dụng bẻ khóa , đây là ví dụ về cách gọi một init()hàm được triển khai bên trong dylib riêng của bạn:

#include <dlfcn.h>

initWrapper() {
    char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";

    void *libHandle = dlopen(dylibPath, RTLD_NOW);
    if (libHandle != NULL) {
        // This assumes your dylib’s init function is called init, 
        //    if not change the name in "".
        void (*init)() = dlsym(libHandle, "init");
        if (init != NULL)  {
            init();
        }
        dlclose(libHandle);
    }
}

Hơn nữa, hạn chế mặc định chống lại việc cho phép bạn xây dựng một dự án thư viện động cho iOS là thứ trong Xcode mà bạn có thể ghi đè bằng cách chỉnh sửa một số tệp xml XCode:

Xây dựng và sử dụng dylib trên iOS

Sau khi làm điều này, bạn có thể tạo một iOS bình thường thư viện .dylib và sử dụng nó theo mã mẫu ở trên. (có, bạn có thể sẽ phải mở khóa lại khả năng này bất cứ khi nào bạn cài đặt phiên bản XCode mới).

Vì vậy, đó không phải là giới hạn kỹ thuật mà là giới hạn chính sách của App Store. Nếu bạn không bị giới hạn trong App Store, thì bạn có thể làm điều đó. Lưu ý rằng kỹ thuật này không yêu cầu bẻ khóa, mặc dù nếu ứng dụng được hộp cát, nó có thể hạn chế bẻ khóa nơi có thể tải dylibs.

Chỉnh sửa: để đảm bảo thông tin này không bị mất liên kết trong tương lai, đây là nội dung liên kết mà tôi đã cung cấp về cách bật iOS dylibs trong Xcode. ( Lưu ý: quá trình này vẫn hoạt động trên Xcode 4, nhưng hãy xem (các) nhận xét bên dưới để biết các cập nhật cho đường dẫn, v.v.) Nguồn là blog iOS Place :


Xcode không cho phép bạn tạo dylib cho iOS. Ứng dụng sẽ bị từ chối nếu nó không phải là tệp nhị phân duy nhất. Nhưng tôi có một ứng dụng có kiến ​​trúc trình cắm thêm để tải các mô-đun tùy chọn. Tôi chỉ muốn có một nguyên mẫu nhanh chóng để chứng minh khái niệm trước khi chuyển hoàn toàn nó sang iOS. Sẽ nhanh hơn nếu dylib có thể hoạt động. Vì vậy, bài đăng này hướng dẫn cách xây dựng và sử dụng dylib nhưng lưu ý rằng nó sẽ không được chấp thuận cho App Store. (Đã kiểm tra với Xcode 3.2.4 trên 10.6.4)

1. Mở các tệp này trong Trình chỉnh sửa danh sách thuộc tính: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specilities/MacOSX Product Types.xcspec/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specilities / iPhone Simulator ProductTypes.xcspec

2. Tìm mục trong “ MacOSX Product Types.xcspec ” có loại sản phẩm com.apple.product-type.library.dynamicvà kéo nó vào “ iPhone Simulator ProductTypes.xcspec ”.

Ảnh chụp màn hình Xcode 1

3. Mở “ MacOSX Package Types.xcspec ” và “ iPhone Simulator PackageTypes.xcspec ” được tìm thấy ở cùng một vị trí.

4. Tìm mục trong “ MacOSX Product Types.xcspec ” có loại gói com.apple.package-type.mach-o-dylibvà kéo nó vào “ iPhone Simulator PackageTypes.xcspec ”.

Ảnh chụp màn hình Xcode 2

5. Lặp lại các bước cho “ iPhoneOS.platform ” và khởi chạy lại Xcode nếu nó đang chạy.

Bây giờ, hãy xây dựng một dylib. Bắt đầu với Mẫu “ Thư viện tĩnh cảm ứng ca cao ”. Điều đó nên bao gồm Foundation.framework trong dự án. Đây là những thay đổi tôi đã thực hiện trên đầu mẫu để xây dựng dylib.

1. Mở tệp project.pbxproj (được tìm thấy bên trong gói tệp dự án Xcode) trong Trình soạn thảo văn bản. Tìm kiếm chuỗi “ producttype ”, thay đổi giá trị của nó thành com.apple.product-type.library.dynamic;

Bây giờ, mở dự án bằng Xcode, đi tới Dự án-> Chỉnh sửa Cài đặt Dự án

2.Thư mục cài đặt ” được đặt thành@executable_path/ vì tôi định đặt dylib trong cùng thư mục với tệp thực thi của ứng dụng.

3.Loại Mach-O ” được đặt thành Thư viện động

4.Phần mở rộng có thể thực thi ” được đặt thành dylib

5.Tiền tố thực thi ” được đặt thành trống

6. Thêm một hoặc hai phương thức đơn giản vào thư viện và xây dựng nó.

Bây giờ, hãy tạo một ứng dụng để kiểm tra nó. Lần này, tôi chọn Ứng dụng dựa trên chế độ xem . Kết nối UIButton và UILabel để gọi lib và hiển thị thông báo trả về. Bạn có thể tải xuống TestApp dự án hoàn chỉnh và chơi với nó.


2
Tính đến XCode 4.5, những tập tin này có thể được tìm thấy tại /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications (ví dụ.)
Chris Devereux

@ChrisDevereux, cảm ơn! Tôi đã ghi chú để kiểm tra nhận xét của bạn để biết các đường dẫn cập nhật ... tất nhiên, đường dẫn này có thể thay đổi lại trong phiên bản trong tương lai :)
Nate

3
Câu trả lời này cần nhiều lượt ủng hộ hơn (và thực sự phải là câu trả lời được chấp nhận, nhưng tôi nghi ngờ rằng user510951 sẽ trở lại sau khi rời SO 2 năm). Câu trả lời rất hay Nate!
chown

1
Nên có một số kiểu ghi đè tổng thể trong đó nếu @chown nói rằng một câu trả lời là đúng ... nó đúng thật.
Tim

@Panagiotis, vui lòng đăng một câu hỏi mới để vấn đề này có thể được giải quyết đúng cách. Hiển thị mã bạn đang sử dụng và tất cả các thông báo lỗi. Nếu muốn, bạn cũng có thể liên kết lại câu hỏi / câu trả lời này. Nếu bạn thêm thẻ "iphone-privateapi", tôi sẽ thấy nó. Bạn nên nói rằng đây không phải là cửa hàng ứng dụng, nếu không mọi người có thể bỏ phiếu để đóng câu hỏi.
Nate

0

Bắt đầu từ các thư viện động Xcode 11.4.1 không được phép (dự án của bạn sẽ không biên dịch cho tất cả các đích). Cách mới để sử dụng libs / framework là tạo-xcframework từ xcodebuild.

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.