อะไรคือความแตกต่างระหว่าง Embedded Binaries และ Linked Frameworks


87

เมื่อใช้ Xcode เฟรมเวิร์กภายนอกตอนนี้จะมีไบนารีในตัวเช่นเดียวกับส่วนกรอบงานที่เชื่อมโยง

ป้อนคำอธิบายภาพที่นี่

เมื่อคุณดาวน์โหลดกรอบภายนอกและ Finder-> ลากมันเข้าไปใน Xcode ก็จะวางกรอบลงในกรอบและห้องสมุดที่เชื่อมโยงส่วน

เมื่อคุณสร้างห้องสมุดที่มีคาร์เธจมันแนะนำลากเข้าไปในไบนารีฝังตัวส่วน

ทั้งสองดูเหมือนจะทำงานในแง่ของการเชื่อมโยงเนื่องจาก API พร้อมใช้งานไม่ว่าจะด้วยวิธีใดก็ตามยิ่งไปกว่านั้นเมื่อเพิ่มเฟรมเวิร์กลงในส่วนEmbedded Binariesก็จะถูกเพิ่มเข้าไปในส่วนLinked Frameworks และ Librariesโดยอัตโนมัติ

แล้วใครล่ะที่ถูกต้อง? คาร์เธจหรืออินเทอร์เน็ตที่เหลือ? และเหตุใดจึงมี 2 ตัวเลือกในการรวมทรัพยากรภายนอกลงในโครงการ Xcode


และใช้งานได้หรือไม่เมื่อคุณทดสอบบนอุปกรณ์
โทรจัน

@trojanfoe ใช่เลย
Maxim Veksler

ไม่สมเหตุสมผลเว้นแต่ว่าจะเป็น 1) ในส่วนไบนารีที่ฝังไว้หรือ 2) มีขั้นตอนการสร้างเพื่อคัดลอกกรอบงานลงในชุดแอประหว่างการสร้าง
โทรจัน

2
Carthage แนะนำให้ลากไปที่ "Embedded Binaries" สำหรับแอปพลิเคชัน OSX เท่านั้น สำหรับ iOS ขอแนะนำ "กรอบงานและไลบรารีที่เชื่อมโยง" เท่านั้น
Damnum

คำตอบ:


72
  1. การเชื่อมโยง - เราต้องเชื่อมโยงกรอบงานหากเราใช้ API ใด ๆ ที่กำหนดไว้ในนั้น

  2. การฝัง - กระบวนการนี้จะช่วยให้มั่นใจได้ว่าเฟรมเวิร์กที่เพิ่มเข้ามาจะฝังอยู่ใน App Bundle และอาจช่วยแชร์โค้ดระหว่างแอพและบันเดิลส่วนขยายใด ๆ เราฝังเฉพาะเฟรมเวิร์กของบุคคลที่สามไม่ใช่เฟรมเวิร์กที่ iOS จัดหาให้เนื่องจากพร้อมใช้งานในอุปกรณ์ หากเรากำลังฝังนั่นหมายความว่าเราจะต้องเชื่อมโยงไปยังสิ่งเหล่านี้ด้วยเพื่อให้ Xcode สามารถคอมไพล์และสร้างบิลด์ได้ เมื่อแอปทำงานในอุปกรณ์เฟรมเวิร์กที่ฝังไว้จะถูกโหลดลงในหน่วยความจำเมื่อจำเป็น


1
คุณหมายถึงอะไรกับส่วน "เมื่อจำเป็น"? นั่นหมายความว่าเฟรมเวิร์กแบบฝังถูกโหลดเมื่อจำเป็นในระหว่างรันไทม์หรือไม่? นอกจากนี้คุณคิดว่าการเชื่อมโยงจะเกิดขึ้นสำหรับเฟรมเวิร์กแบบไดนามิกเมื่อใด
bartosss

มีกรณีที่เราจำเป็นต้องทำembedไม่ใช่linkหรือ? และในทางกลับกัน? และทำไม?
allenlinli

ฉันคิดว่าคุณต้องเชื่อมโยงเฟรมเวิร์กที่คุณใช้ API โดยตรงในโค้ดเท่านั้นควรฝังการอ้างอิงแบบสกรรมกริยาที่ไม่ได้อ้างอิงในรหัสแอปพลิเคชันหากฉันถูกต้อง
Werner Altewischer

15

หากคุณฝังไบนารีจะรวมอยู่ในผลิตภัณฑ์ของคุณ หากคุณเพียงเชื่อมโยงไลบรารีหรือเฟรมเวิร์กโดยไม่ฝังไว้มันจะไม่เป็นส่วนหนึ่งของผลิตภัณฑ์

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


2
"การฝังไบนารีจะทำให้ง่ายต่อการติดตั้งผลิตภัณฑ์ของคุณสำหรับผู้ใช้ในกรณีที่พวกเขายังไม่มีการติดตั้งสิ่งนั้นในเครื่องของพวกเขา" ดูเหมือน OSX ไม่ใช่ iOS ... หากไม่มีไลบรารี ติดตั้งแล้ว (เช่นมันไม่ได้มาตรฐาน) จากนั้นแอปจะไม่โหลด
โทรจัน

มันจะไม่เพียง แต่ไม่โหลด @trojanfoe แต่จะถูกปฏิเสธและคุณไม่สามารถติดตั้งได้ตั้งแต่แรก (เว้นแต่คุณจะเป็นผู้พัฒนาหรือใช้บัญชีองค์กร ... )
dogsgod

เฟรมเวิร์กที่เชื่อมโยงแบบไดนามิกสามารถทำได้ตั้งแต่ iOS 8
Basti

เมื่อผู้ใช้ติดตั้งแอปของคุณและหากแอปนั้นมีเฟรมเวิร์กที่เชื่อมโยงแบบไดนามิกเฟรมเวิร์กนั้นจะถูกค้นหาโดยอัตโนมัติ อย่างไรก็ตามนี่เป็นจุดเพิ่มเติมที่อาจล้มเหลวในระหว่างขั้นตอนการติดตั้งของผู้ใช้ทำให้เกิดข้อผิดพลาดในการแก้ไขลิงก์ซึ่งจะยุติแอปพลิเคชัน ดังนั้นฉันจึงไม่เห็นเหตุผลว่าทำไมคำตอบควรใช้กับ OS X เท่านั้นไม่ใช่กับ iOS โปรดระบุให้ชัดเจนยิ่งขึ้นหากคุณเห็นช่องว่างสำหรับการปรับปรุงเกี่ยวกับคำตอบของฉัน หรือโหวตคำตอบนั้นเพื่อให้เพื่อนนักพัฒนาเป็นสมาชิก SO เต็มรูปแบบถ้าคุณคิดว่าคำตอบนั้นถูกต้องแล้ว;)
Basti

เป็นแง่มุมที่เป็นทางเลือกสำหรับคำตอบของคุณที่ฉันคัดค้าน หากเฟรมเวิร์กเป็นของบุคคลที่สามจะต้องเป็นส่วนหนึ่งของ App Bundle ระยะเวลา นี่เป็นความจริงส่วนใหญ่สำหรับแอพ OSX เช่นกัน (แน่นอนสำหรับแอพที่แจกจ่ายผ่าน Mac App Store)
โทรจัน

0

Linkingเพิ่มเติมเกี่ยวกับการLinkerทำงานในเวลาคอมไพล์หรือเวลาโหลด / รัน Linker คัดลอกLibraryเป็นไบนารีเป้าหมาย เนื่องจากFrameworkเป็นแบบอิสระLinkerในกรณีนี้จึงมีหน้าที่ค้นหาและเชื่อมโยงDynamic Frameworkภายในเส้นทางตัวโหลดระบบหรือค้นหาและเชื่อมโยงภายในบันเดิ

Embeddingเป็นกระบวนการคัดลอกไบนารีลงในไบนารีเป้าหมาย ดังนั้นจึงจะอยู่ภายใน

อ่านเพิ่มเติมที่นี่


-3

ตามที่ฉันเข้าใจไบนารีที่ฝังไว้จะมีเฉพาะเฟรมเวิร์กแบบไดนามิกที่พร้อมใช้งานบน iOS 8 ขึ้นไปมิฉะนั้นคุณสามารถเชื่อมโยงได้เฉพาะเฟรมเวิร์กที่เป็นแบบคงที่เท่านั้น

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