คำอธิบายของ iOS Static vs Dynamic frameworks


115

ฉันต้องยอมรับว่าด้วยการเปิดตัว iOS 8 ฉันสับสนเล็กน้อยเกี่ยวกับเฟรมเวิร์กแบบไดนามิกและคงที่ใน iOS

ฉันกำลังหาวิธีแจกจ่ายไลบรารีที่ฉันสร้างขึ้นและฉันต้องรองรับ iOS 7 ขึ้นไป (หมายเหตุ: นี่จะเป็นเฟรมเวิร์กที่เป็นกรรมสิทธิ์ฉันไม่สามารถใช้ฝักโกโก้และฉันไม่สามารถแจกจ่ายแหล่งที่มาได้) นี่คือสิ่งที่ฉันรู้อยู่แล้ว:

  • iOS 8 เปิดตัว "เฟรมเวิร์กแบบฝัง" สำหรับ iOS แต่ตามที่ฉันเข้าใจพวกเขาไม่สามารถใช้งานได้กับ iOS 7 เฉพาะสำหรับ iOS 8 ขึ้นไป
  • ฉันมีตัวเลือกในการกระจายไลบรารีของฉันเป็นไลบรารีแบบคงที่ (ไฟล์. a) และยังแจกจ่ายส่วนหัวด้วย ฉันรู้ว่านี่เป็นวิธีการทั่วไปในการจัดการกับสถานการณ์ แต่ฉันต้องการหาสิ่งที่ง่ายกว่านั้น (และรวมทรัพยากรบางอย่างไว้ด้วยถ้าเป็นไปได้)
  • ฉันยังพบว่า iOS 7 ไม่รองรับไลบรารี. เฟรมแบบไดนามิก (เฉพาะแบบคงที่) เนื่องจากไม่รองรับการลิงก์แบบไดนามิก แต่ iOS 8 ทำได้เช่นเดียวกับการลิงก์แบบคงที่

และนี่คือคำถามของฉันเกี่ยวกับข้อมูลนี้:

  • ฉันเห็นว่าฉันสามารถสร้างเป้าหมาย. เฟรมและทำให้มันคงที่ได้โดยเปลี่ยนประเภท Mach-O เป็น "ไลบรารีแบบคงที่นั่นจะเพียงพอหรือไม่ที่จะรองรับ iOS 7 โดยไม่มีปัญหาใด ๆ และยังแจกจ่ายไลบรารีของฉันเป็น .framework Bundle หรือไม่ถ้าเป็นเช่นนั้นเหตุใด "เฟรมเวิร์กแบบฝัง" ใน iOS 8 จึงเป็นข้อตกลงที่ยิ่งใหญ่เนื่องจากแหล่งข้อมูลจำนวนมากบนอินเทอร์เน็ตแนะนำฉันพลาดอะไรไปหรือเปล่า
  • จำเป็นหรือไม่ที่จะต้องเซ็นชื่อ. Framework เหมือนกับที่ฉันทำกับแอปพลิเคชันอื่น ๆ ที่ฉันสร้างขึ้น
  • จะเกิดอะไรขึ้นหากฉันต้องการรวมทรัพยากรอื่น ๆ (เช่นข้อมูลหลักหรือรูปภาพ) กับไฟล์. เฟรม ฉันจะต้องสร้างไฟล์. bundle แยกต่างหากหรือไม่?

1
"iOS 7 ไม่รองรับไลบรารี. เฟรมเวิร์คเพราะไม่รองรับการลิงก์แบบไดนามิก" คำสั่งนี้ไม่ถูกต้อง
ผดส.

1
ฉันเห็น. บอกประโยคที่ถูกต้องได้ไหม เป็นเท็จเนื่องจาก iOS 7 รองรับการลิงก์แบบไดนามิกหรือเนื่องจาก iOS 7 รองรับไลบรารี. เฟรมเวิร์ค? หรือทั้งคู่?
csotiriou

1
Remeber AVFoundation และ CoreGraphics ทั้งหมดเป็น. เฟรมเวิร์ค นี่อาจช่วยให้คุณพบคำตอบสำหรับทุกคำถามของคุณ: raywenderlich.com/65964/create-a-framework-for-ios
Midhun MP

ฉันแก้ไขประโยค ฉันได้อ่านลิงค์แล้วก่อนที่จะโพสต์คำถามของฉัน ลิงค์นี้ไม่ได้อธิบายอะไรเกี่ยวกับคำถามของฉัน เริ่มต้นจากไลบรารีแบบคงที่และรวมไว้ในไฟล์. Framework ด้วยตนเอง ฉันกำลังพูดถึงเป้าหมาย Cocoa Touch Framework ใน Xcode 6 แล้วเปลี่ยนประเภทเป็นไลบรารีแบบคงที่ ไม่ได้กล่าวถึงการลงนามรหัส (ทำไมและถ้าจำเป็น) ทรัพยากรเพิ่มเติม ฯลฯ
csotiriou

1
คุณสามารถใช้ CocoaPods เพื่อเผยแพร่กรอบงานที่เป็นกรรมสิทธิ์ (เช่น Parse)
Ric Santos

คำตอบ:


69

ก่อน iOS8 Xcode อนุญาตเฉพาะตัวเลือกในการสร้างไลบรารีแบบคงที่สำหรับ iOS ปัญหาที่พบบ่อยคือเราต้องจัดส่งไบนารีและส่วนหัวแยกกัน

ต่อมานักพัฒนาบางคนมาพร้อมกับแนวคิดในการสร้าง 'เฟรมเวิร์กแบบคงที่' [.framework เป็นเพียงโฟลเดอร์ที่มีลิงก์สัญลักษณ์ไปยัง lib และส่วนหัว] ตัวอย่างเช่นhttps://github.com/jverkoey/iOS-Framework

ตัวเลือกนี้จะใช้ได้กับ iOS 7 หรือ 8 หรือก่อนหน้านั้น เนื่องจากเป็นเพียงไลบรารีแบบคงที่พร้อมความสะดวกในการรวมไฟล์ส่วนหัวเข้าด้วยกัน

สำหรับคำถามของคุณเกี่ยวกับทรัพยากรเราจะต้องรวมกลุ่มไว้ใน ".bundle" .. สำหรับการจัดส่งฉันไม่แน่ใจว่าเราสามารถใส่ไว้ในโฟลเดอร์. เฟรมได้หรือไม่ .. ในอดีตฉันเคยจัดส่ง libs เป็น เฟรมเวิร์กแบบคงที่และบันเดิล ...

อย่างไรก็ตามตัวเลือกข้างต้นจะไม่ทำงานสำหรับคุณหากคุณใช้ Swift Xcode ไม่สนับสนุนการสร้างไลบรารีแบบคงที่ที่มีโค้ดที่รวดเร็ว

คุณต้องใช้เฟรมเวิร์กแบบไดนามิกหากมีการใช้งานที่รวดเร็ว ในทางทฤษฎีเฟรมเวิร์กแบบไดนามิกใช้งานได้ใน iOS7 .. แต่ฉันคิดว่า iTunes Connect จะปฏิเสธหากแอปกำหนดเป้าหมายเป็น iOS7 และใช้เฟรมเวิร์กแบบไดนามิก :-)

หวังว่านี่จะช่วยได้


17

ด้วย Xcode 9 เป็นต้นไปคุณสามารถสร้างเฟรมเวิร์กแบบคงที่สำหรับ Swift ได้เช่นกัน สิ่งนี้เป็นไปได้เนื่องจากความเข้ากันได้ของแหล่งที่มา ABI สิ่งที่คุณต้องทำมีเพียงแค่เปลี่ยนการMach-O typeตั้งค่าภายใต้การสร้างของเป้าหมายกรอบงาน เทคนิคนี้ยังใช้ได้กับ Hybrid Frameworks (เฟรมเวิร์กที่มีโค้ด Swift และ Objective-C)


เคล็ดลับที่ดี ไม่รู้ว่าทำไมคำตอบนี้ถึงได้คะแนนต่ำเพราะมันช่วยฉันได้ \ Target'Build Settings \ Mach-O-Type และเลือก Static Framework
rustyMagnet

3
ความเข้ากันได้ของ Abi ไม่พร้อมใช้งานใน swift 4
csotiriou

8

staticหรือdynamicในชื่อมักจะเป็นจุดLinking[เกี่ยวกับ]ประเภท

กรอบสามารถเป็นstaticหรือdynamic[ตรวจสอบแบบคงที่หรือไดนามิก]

คุณสามารถเปลี่ยนรูปแบบของห้องสมุดที่จะมีผลกระทบในLinkerโดยการเปลี่ยนFramework target -> Build Settings -> Mach-O Type[เกี่ยวกับ]ไปหรือStatic Library Dynamic Libraryโดยค่าเริ่มต้น Xcode มีDynamic Libraryค่า

ขึ้นอยู่กับการตั้งค่านี้ไบนารีประเภทต่างๆจะถูกสร้างขึ้น

หลังจากที่คุณกำหนดค่าคอนซูมเมอร์[Link vs Embed]เรียบร้อยแล้ว

Static Linker ld : ในเวลาคอมไพล์จะรวมโค้ดทั้งหมดจากstatic libraryไฟล์อ็อบเจ็กต์ที่ปฏิบัติการได้

Dynamic Linker dyld : ในเวลาโหลด / รันจะพยายามค้นหาเฟรมเวิร์กแบบฝังโดยใช้@rpath[เกี่ยวกับ]และเชื่อมโยง

[คำศัพท์]


5

ฉันไม่มีคำตอบทั้งหมด แต่จะพยายามตอบคำถามของคุณที่นี่

  • คุณจะได้รับคำเตือนเกี่ยวกับการใช้เฟรมเวิร์กเหล่านี้ใน iOS 7 แต่นั่นคือคำเตือน ดูคำตอบนี้

  • คุณสามารถรวมทรัพยากรอื่น ๆ เช่น CoreData ได้อย่างไรก็ตามคุณจะต้องสร้างทรัพยากรเหล่านี้ในโค้ดด้วยตนเอง นี่คือบทช่วยสอนที่แสดงวิธีสร้างแบบจำลองข้อมูลหลัก

  • คุณต้องลงรหัสไลบรารีไดนามิกสำหรับ iOS

  • คุณต้องตรวจสอบให้แน่ใจว่าเฟรมเวิร์กของคุณรองรับทั้งตัวจำลองและสถาปัตยกรรมอุปกรณ์หากคุณวางแผนที่จะแจกจ่าย


5

Swift ไม่ทำงานใน lib แบบคงที่ หากคุณต้องใช้เฟรมเวิร์กแบบไดนามิกคุณต้องตั้งค่าขั้นต่ำของ iOS เป็น 8.0 เนื่องจาก AppStore ปฏิเสธios 7 ด้วยเฟรมเวิร์กแบบไดนามิก


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