คุณสามารถสร้างไลบรารีไดนามิกสำหรับ iOS และโหลดที่รันไทม์ได้หรือไม่?


114

ไลบรารีไดนามิกรองรับบน iOS (iPhone / iPad) หรือไม่

ใน Xcode ผมพยายามที่จะสร้างโครงการใหม่ -> กรอบ & Library -> โกโก้ห้องสมุด (Dynamic) ในการตั้งค่าโปรเจ็กต์ฉันตั้งค่าBase SDKเป็นiOS device 4.1และกำหนดเป้าหมายเป็นiOS4.1แต่มีข้อผิดพลาดในการสร้าง:

เป้าหมายระบุประเภทผลิตภัณฑ์ "com.apple.product-type.library.dynamic" แต่ไม่มีประเภทผลิตภัณฑ์ดังกล่าวสำหรับแพลตฟอร์ม "iphonesimulator"

สร้างฉันเลือกSimulator -> Debug -> i386



4
iOS8 + รองรับกรอบงานตามไลบรารีที่แชร์
eonil

1
@Eonil คุณช่วยอธิบายได้ไหม? ฉันต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้บทความหรือลิงก์ไปยังข้อมูลบางอย่างจะได้รับการชื่นชมมาก
Maxim Chetrusca

คำตอบ:


105

ในขณะที่ถามคำถามนี้ iOS ไม่รองรับไลบรารีไดนามิกและจะส่งผลให้แอปของคุณถูกปฏิเสธ อนุญาตเฉพาะไลบรารีแบบคงที่เท่านั้น

อย่างไรก็ตามใน iOS8 คุณสามารถใช้ไลบรารีและเฟรมเวิร์กแบบไดนามิกได้ ควร "ใช้ได้ผล"


14
มีใครรู้บ้างว่าทำไม? สำหรับฉันมันดูเหมือนบ้าไปแล้ว
Erik de Castro Lopo

73
@Erik de Castro Lopo: เหตุผลคือความปลอดภัยเนื่องจากไลบรารีแบบไดนามิกสามารถโหลดและยกเลิกการโหลดได้ที่รันไทม์คุณจึงสามารถดาวน์โหลดโค้ดปฏิบัติการเพิ่มเติมและโหลดได้ (คิดว่าเป็นปลั๊กอิน) สิ่งนี้อาจถูกแฮ็กเกอร์บุกรุกและการมีโค้ดที่เป็นอันตรายทำงานบนโทรศัพท์ของคุณเป็นสิ่งที่เลวร้ายมาก นอกจากนี้ยังทำให้สามารถเพิ่มคุณสมบัติที่ไม่ได้รับการอนุมัติลงในแอปที่ได้รับอนุมัติ ในระยะสั้น: อยู่ในสภาพแวดล้อมนี้แอปเปิ้ลจะพิจารณาเชื่อมโยงแบบไดนามิกจะเป็นกล่อง Pandoras ที่จะต้องควบคุมอย่างเคร่งครัดมิฉะนั้นอาจทำให้ขาดการรักษาความปลอดภัยและผมเห็นว่ามันไม่เข้าท่าบนโทรศัพท์มือถือ
DarkDust

6
ฉันกำลังพัฒนาแอปภายในซึ่งจะไม่เผยแพร่ผ่าน AppStore ดังนั้นฉันจึงไม่สนใจข้อ จำกัด ของ Apple สำหรับ AppStore ในทางเทคนิคสามารถสร้างไลบรารีแบบไดนามิกสำหรับแอป iOS ได้หรือไม่
Aliaksei

3
@Aliaksei: ใช่ในทางเทคนิคมิฉะนั้นคุณจะไม่สามารถเชื่อมโยงไปยังห้องสมุดของ Apple ได้ การสนับสนุนไลบรารีไดนามิกของ AFAIK จะเหมือนกับบน Mac OS X อย่างไรก็ตาม Xcode ไม่รองรับ แต่ดูเหมือนว่าคุณสามารถใช้บันเดิลได้ ดูบทความนี้
DarkDust

3
ไม่รองรับไม่เหมือนกับไม่ได้รับอนุญาต
dtech

162

ฉันไม่เห็นด้วยกับคำตอบของ DarkDustแต่ถ้าฉันสามารถถ่ายทอด Bill Clinton ภายในของฉันได้ก็ขึ้นอยู่กับความหมายของการสนับสนุนคือ :)

Apple ไม่ต้องการให้คุณทำสิ่งนี้กับแอพ App Store แต่ระบบปฏิบัติการอนุญาตอย่างแน่นอน แอพ Jailbreak ใช้เทคนิคนี้ตลอดเวลา โดยทั่วไปคุณใช้เทคนิค UNIX มาตรฐานเพื่อเปิดเฟรมเวิร์ก / ไลบรารีแบบไดนามิกจากนั้นใช้สิ่งต่างๆในนั้น ฟังก์ชั่น dlopenช่วยให้คุณเปิดห้องสมุดโดยผ่านในเส้นทางไปยังกรอบที่หรือ dylib จากเอกสารบางชุดสำหรับการสร้างแอปเจลเบรคต่อไปนี้เป็นตัวอย่างของการเรียกใช้init()ฟังก์ชันที่ใช้งานภายใน dylib ของคุณเอง

#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);
    }
}

นอกจากนี้ข้อ จำกัด เริ่มต้นที่ไม่อนุญาตให้คุณสร้างโปรเจ็กต์ไลบรารีแบบไดนามิกสำหรับ iOS คือบางสิ่งใน Xcode ที่คุณมีความสามารถในการแทนที่โดยการแก้ไขไฟล์ xml XCode บางไฟล์:

สร้างและใช้ dylib บน iOS

เมื่อคุณทำเสร็จแล้วคุณสามารถสร้าง iOS .dylibตามปกติได้ไลบรารีและใช้ตามโค้ดตัวอย่างด้านบน (ใช่คุณอาจต้องปลดล็อกความสามารถนี้อีกครั้งเมื่อใดก็ตามที่คุณติดตั้ง XCode เวอร์ชันใหม่)

ดังนั้นจึงไม่ใช่ข้อ จำกัด ทางเทคนิค แต่เป็นข้อ จำกัด ด้านนโยบายของ App Store หากคุณไม่ จำกัด เฉพาะ App Store คุณก็ทำได้ โปรดทราบว่าเทคนิคนี้ไม่จำเป็นต้องมีการเจลเบรคแม้ว่าแอปจะเป็นแซนด์บ็อกซ์แต่ก็อาจ จำกัดตำแหน่งที่สามารถโหลด dylib ได้

แก้ไข:เพื่อให้แน่ใจว่าข้อมูลนี้จะไม่สูญหายไปกับลิงค์เน่าในอนาคตนี่คือเนื้อหาของลิงค์ที่ฉันให้ไว้เกี่ยวกับวิธีเปิดใช้งาน iOS dylib ใน Xcode ( หมายเหตุ:กระบวนการนี้ยังคงใช้ได้กับ Xcode 4 แต่โปรดดูความคิดเห็นด้านล่างสำหรับการอัปเดตเส้นทาง ฯลฯ ) แหล่งที่มาคือบล็อก iOS Place :


Xcode ไม่อนุญาตให้คุณสร้าง dylib สำหรับ iOS แอปจะถูกปฏิเสธหากไม่ใช่ไบนารีเดี่ยว แต่ฉันมีแอปพลิเคชันที่มีสถาปัตยกรรมปลั๊กอินสำหรับโหลดโมดูลเสริม ฉันแค่ต้องการต้นแบบอย่างรวดเร็วเพื่อพิสูจน์แนวคิดก่อนที่จะพอร์ตไปยัง iOS อย่างสมบูรณ์ ทำได้เร็วกว่าถ้า dylib สามารถทำงานได้ ดังนั้นโพสต์นี้จึงแสดงวิธีสร้างและใช้ dylib แต่โปรดทราบว่าจะไม่ได้รับการอนุมัติจาก App Store (ทดสอบด้วย Xcode 3.2.4 เมื่อวันที่ 10.6.4)

1.เปิดไฟล์เหล่านี้ในตัวแก้ไขรายการคุณสมบัติ: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product types.xcspecและ/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone Simulator ProductTypes.xcspec

2.ค้นหารายการใน“ MacOSX Product types.xcspec ” ที่มีประเภทผลิตภัณฑ์com.apple.product-type.library.dynamicแล้วลากไปที่“ iPhone Simulator ProductTypes.xcspec

ภาพหน้าจอ Xcode 1

3.เปิด“ MacOSX Package types.xcspec ” และ“ iPhone Simulator PackageTypes.xcspec ” ที่พบในที่เดียวกัน

4.ค้นหารายการใน“ MacOSX Product types.xcspec ” ที่มีประเภทแพ็กเกจcom.apple.package-type.mach-o-dylibแล้วลากไปที่“ iPhone Simulator PackageTypes.xcspec

ภาพหน้าจอ Xcode 2

5.ทำซ้ำขั้นตอนสำหรับ“ iPhoneOS.platform ” และเปิด Xcode ใหม่หากยังทำงานอยู่

ตอนนี้ให้สร้าง dylib เริ่มต้นด้วยเทมเพลต“ Cocoa Touch Static Library ” ซึ่งควรรวม Foundation.framework ไว้ในโครงการ นี่คือการเปลี่ยนแปลงที่ฉันทำที่ด้านบนของเทมเพลตเพื่อสร้าง dylib

1.เปิดไฟล์project.pbxproj (อยู่ในชุดไฟล์โครงการ Xcode) ในโปรแกรมแก้ไขข้อความ ค้นหาสตริง " producttype " เปลี่ยนค่าเป็นcom.apple.product-type.library.dynamic;

ตอนนี้เปิดโครงการด้วย Xcode ไปที่โครงการ -> แก้ไขการตั้งค่าโครงการ

2.ไดเรกทอรีการติดตั้ง " ตั้งค่าเป็น@executable_path/เพราะฉันวางแผนที่จะใส่ dylib ในไดเร็กทอรีเดียวกันกับไฟล์ปฏิบัติการของแอป

3ตั้งค่า" Mach-O Type " เป็นไดนามิกไลบรารี

4ตั้งค่า" Executable Extension " เป็น dylib

5ปฏิบัติการคำนำหน้า ” ชุดที่ว่างเปล่า

6.เพิ่มวิธีง่ายๆหนึ่งหรือสองวิธีในไลบรารีและสร้างขึ้น

ตอนนี้สร้างแอปเพื่อทดสอบ ครั้งนี้ผมเลือกดูตามแอพลิเคชัน เชื่อมต่อ UIButton และ UILabel เพื่อเรียก lib และแสดงข้อความส่งคืน คุณสามารถดาวน์โหลด TestApp โครงการที่สมบูรณ์และเล่นกับมันได้


2
สำหรับ XCode 4.5 ไฟล์เหล่านี้สามารถพบได้ที่ (เช่น) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
Chris Devereux

@ChrisDevereux ขอบคุณ! ฉันจดบันทึกเพื่อตรวจสอบความคิดเห็นของคุณสำหรับเส้นทางที่ทันสมัย ​​... ซึ่งแน่นอนว่าอาจมีการเปลี่ยนแปลงอีกครั้งในเวอร์ชันอนาคต :)
เนท

3
คำตอบนี้ต้องการการโหวตมากขึ้น (และควรเป็นคำตอบที่ยอมรับได้จริง ๆ แต่ฉันสงสัยว่า user510951 จะกลับมาหลังจากห่างจาก SO เป็นเวลา 2 ปี) เนทตอบดีมาก!
chown

1
ควรมีการแทนที่ต้นแบบบางอย่างที่ถ้า @chown บอกว่าคำตอบถูกต้อง ... ก็ถูกต้อง
ทิม

@ Panagiotis โปรดโพสต์คำถามใหม่เพื่อให้สามารถจัดการได้อย่างถูกต้อง แสดงรหัสที่คุณใช้และข้อความแสดงข้อผิดพลาดทั้งหมด หากคุณต้องการคุณสามารถยังเชื่อมโยงกลับไปที่คำถามนี้ / คำตอบ ถ้าคุณเพิ่มแท็ก "iphone-privateapi" ฉันจะเห็น คุณควรระบุว่านี่ไม่ใช่สำหรับร้านแอปหรือผู้คนอาจโหวตให้ปิดคำถาม
เนท

0

ไม่อนุญาตให้ใช้ไลบรารีไดนามิกตั้งแต่ Xcode 11.4.1 (โปรเจ็กต์ของคุณจะไม่รวบรวมสำหรับปลายทางทั้งหมด) วิธีใหม่ในการใช้ libs / frameworks คือ create-xcframework จาก xcodebuild

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.