การสร้างกรอบงาน iOS / OSX: จำเป็นต้องกำหนดรหัสก่อนที่จะแจกจ่ายให้กับนักพัฒนารายอื่นหรือไม่?


91

ฉันกำลังเรียนรู้วิธีสร้างเฟรมเวิร์ก iOS และ OSX ยกตัวอย่างเช่น iOS ขั้นตอนต่อไปนี้ใช้ได้ผลสำหรับฉัน:

  1. xcodebuild framework โดยใช้ -sdk iphonesimulator และ Build action
  2. xcodebuild framework โดยใช้ -sdk iphoneos และ Build action
  3. ใช้เครื่องมือ lipo เพื่อสร้างไบนารีสากลเพื่อให้ได้lipo -infoผลลัพธ์ที่คาดหวัง:

สถาปัตยกรรมในไฟล์ fat: Foo.framework / Foo are: i386 x86_64 armv7 arm64

คำถามคือ:

  1. ฉันอ่านว่าเฟรมเวิร์กของฉันสามารถลงนามใหม่ได้โดยนักพัฒนาที่ใช้มัน: "Code Sign on Copy" แต่ฉันไม่เข้าใจว่าอะไรคือเงื่อนไขเบื้องต้นสำหรับมันเช่นฉันควรเพิ่มขั้นตอนการลงรหัสเพื่อกำหนดรหัสไบนารีสากลนั้นด้วยเอกลักษณ์การเซ็นของฉันก่อน แจกจ่ายให้กับนักพัฒนาคนอื่น ๆ ?

  2. ถ้าก่อนหน้านี้เป็นค่าบวก - ฉันควรใช้ตัวตน "iPhone Distribution: ... " หรือ "iPhone Developer: ... " ก็เพียงพอแล้ว (เพื่อให้เฟรมเวิร์กของฉันเป็นส่วนหนึ่งของโปรเจ็กต์ iOS บางอย่างผ่านการตรวจสอบความถูกต้องทุกประเภทโดยเฉพาะการตรวจสอบความถูกต้องของ App Store )?.

ความเป็นมาสำหรับคำตอบของฉันคือ "ข้อผิดพลาด CodeSign: ต้องมีการลงชื่อรหัสสำหรับประเภทผลิตภัณฑ์" Framework "ใน SDK" iOS 8.3 "" ซึ่งฉันได้เห็นในกรอบของบุคคลที่สามจำนวนมากและไม่ได้ลงนามวัตถุCarthage # 235หรือ " ที่ทุกคน"(ตัวอย่างหนึ่ง: ปัญหาผมรายงานเมื่อวันที่Realm # 1998

ดังนั้นฉันจึงต้องการให้แน่ใจว่าผู้ใช้เฟรมเวิร์กของฉันจะไม่พบปัญหาการเขียนโค้ดใด ๆ เมื่อใช้งาน

ป.ล. คำถามนี้น่าสนใจยิ่งขึ้นเมื่อนำไปใช้ไม่ใช่กับนักพัฒนาคนเดียว แต่ใช้กับองค์กรที่เป็นผู้จำหน่ายกรอบงาน


ความคิดเห็นนี้แนะนำให้ใช้ "CODE_SIGN_IDENTITY = iPhone Developer" แต่ไม่ชัดเจนว่าเหตุใดจึงใช้ "Developer" แทน "การแจกจ่าย iPhone"
Stanislav Pankevich

หัวข้อที่เกี่ยวข้อง: การเอ็กซ์พอร์ตแอพที่มีเฟรมเวิร์กในตัวแต่ไม่มีคำตอบที่ชัดเจน
Stanislav Pankevich

ฉันยังได้ติดกับดักคำถามนี้แอปเปิ้ลฟอรั่มพัฒนา: forums.developer.apple.com/thread/6400
Stanislav Pankevich

ฉันมีคำถามเมื่อคุณแจกจ่ายเฟรมเวิร์กของคุณคุณแจกจ่ายบิวด์ดีบักหรือบิลด์รุ่น และถ้าคุณแจกจ่ายในรุ่น release จะทำอย่างไร?
niczm25

@ niczm25 นี่เป็นวิธีหนึ่งในการทำ: stanislaw.github.io/2015/11/23/… .
Stanislav Pankevich

คำตอบ:


138

ฉันเปิดความโปรดปราน: "กำลังมองหาคำตอบจากแหล่งข้อมูลที่น่าเชื่อถือและ / หรือเป็นทางการ" แต่ไม่ได้รับตั้งแต่นั้นมา

แม้ว่าคำตอบของ @jackslash จะถูกต้อง แต่ก็บอกเล่าเรื่องราวเพียงบางส่วนเท่านั้นดังนั้นฉันจึงต้องการเขียนของตัวเองในแบบที่ฉันอยากเห็นในตอนที่ฉันถามคำถามนี้

ความเป็นจริงของคำตอบนี้คือกรกฎาคม 2015 เป็นไปได้มากว่าสิ่งต่างๆจะเปลี่ยนไป

ก่อนอื่นเรามายืนยันว่าการดำเนินการที่จำเป็นสำหรับการเซ็นโค้ดของเฟรมเวิร์กที่ถูกต้องควรแบ่งออกเป็นขั้นตอนที่นักพัฒนาของเฟรมเวิร์กต้องดำเนินการและขั้นตอนที่ Consumer ของเฟรมเวิร์กต้องดำเนิน

TLDR;

สำหรับเฟรมเวิร์ก OSX: นักพัฒนามีอิสระที่จะเผยแพร่เฟรมเวิร์ก OSX โดยไม่ต้องเซ็นโค้ดเนื่องจากผู้บริโภคจะกำหนดโค้ดใหม่

สำหรับกรอบงาน iOS: นักพัฒนามีอิสระที่จะแจกจ่ายกรอบงาน iOS โดยไม่ต้องลงรหัสเนื่องจากผู้บริโภคจะกำหนดรหัสใหม่ แต่นักพัฒนาถูกบังคับให้ Xcode กำหนดรหัสกรอบงานของตนเมื่อสร้างขึ้นสำหรับอุปกรณ์ iOS

เพราะเรดาร์: "iOS ของกรอบที่มีชิ้นจำลองไม่สามารถส่งไปที่ App Store"ผู้บริโภคของกรอบ iOS ของคุณถูกบังคับให้ทำงานสคริปต์พิเศษเช่น "copy_frameworks" หรือ "strip_frameworks" ซึ่งใช้lipo -removeในการถอดชิ้นจำลองจากกรอบ iOS และอีกครั้ง -codesigns stripped framework เพราะ ณ จุดนี้การกำหนดรหัสประจำตัวไม่ว่าจะเป็นอะไรก็ตาม (หรือไม่ใช่) จะถูกลบออกเป็นผลข้างเคียงของการlipo -removeจัดการ

คำตอบอีกต่อไปนี้


คำตอบนี้ไม่ใช่ "ภาพวาดจากแหล่งข้อมูลที่น่าเชื่อถือและ / หรือเป็นทางการ" แต่เป็นไปตามข้อสังเกตเชิงประจักษ์หลายประการ

การสังเกตเชิงประจักษ์ # 1: ผู้บริโภคไม่สนใจเพราะพวกเขาจะกำหนดกรอบการออกแบบโค้ดใหม่ที่ได้รับจากนักพัฒนา

แจกแจงกรอบไบนารีที่รู้จักกันดีโครงการมาเปิดบน Github ไม่ได้ codesigned คำสั่งcodesign -d -vvvvให้: "วัตถุรหัสไม่ได้ลงนามเลย" ในกรอบงานไบนารี iOS และ OSX ทั้งหมดที่ฉันเคยสำรวจ ตัวอย่างบางส่วน: ReactiveCocoaและ เสื้อคลุม , อาณาจักร , PromiseKit

จากการสังเกตนี้เป็นที่ชัดเจนว่าผู้เขียนของกรอบงานเหล่านี้ตั้งใจให้เป็นรหัสที่ลงนามโดย Consumer ในนามของพวกเขากล่าวคือผู้บริโภคต้องใช้แฟล็ก "Code Sign on Copy" ในขั้นตอนการสร้าง "Embed frameworks" ที่ Xcode จัดเตรียมไว้หรือใช้เชลล์ที่กำหนดเอง สคริปต์ที่ทำสิ่งเดียวกันด้วยตนเอง: รหัสกรอบงานในนามของผู้บริโภค

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

การสังเกตเชิงประจักษ์ # 2 ซึ่งใช้กับ iOS เท่านั้นและเป็นข้อกังวลของนักพัฒนา

ในขณะที่ผู้บริโภคไม่สนใจไม่ว่าจะเป็นกรอบการทำงานที่ได้รับจากนักพัฒนา codesigned หรือไม่ผู้พัฒนายังคงต้อง Codesign กรอบ iOS ของพวกเขาเป็นส่วนหนึ่งของการสร้างกระบวนการของมันเมื่อพวกเขาสร้างมันสำหรับอุปกรณ์ iOSเพราะมิฉะนั้น Xcode CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'ไม่ได้สร้าง: หากต้องการอ้างอิงJustin Spahr-Summers :

เฟรมเวิร์ก OS X ไม่จำเป็นต้องได้รับการลงนามในการสร้าง ... น่าเสียดายที่ Xcode ต้องการให้เฟรมเวิร์ก iOS ต้องลงนามในเวลาสร้าง

คำตอบนี้ค่อนข้างดีสำหรับคำถามของฉัน # 2: ข้อมูลประจำตัว "นักพัฒนา iPhone" นั้นเพียงพอที่จะย่อ Xcode เพื่อที่จะสร้างกรอบงาน iOS สำหรับอุปกรณ์ ความคิดเห็นเกี่ยวกับ Carthage # 339 นี้พูดในสิ่งเดียวกัน

การสังเกตเชิงประจักษ์ # 3: เครื่องมือ lipo

พฤติกรรมเฉพาะของเครื่องมือ lipo: เมื่อนำไปใช้กับเฟรมเวิร์กไบนารีมันจะลบรหัสประจำตัวใด ๆ ซ้ำ ๆ ออกจากมันlipo -create/-remove codesigned framework ... -> not codesigned frameworkเสมอ:

นี่อาจเป็นคำตอบว่าทำไมตัวอย่างทั้งหมดในข้อสังเกต # 1 จึงไม่ได้รับการออกแบบรหัสเลย: รหัสประจำตัวของพวกเขาจะหายไปหลังจากใช้ lipo แต่เนื่องจากตามข้อสังเกต # 1 ผู้บริโภคไม่สนใจว่ามันก็ดี

ข้อสังเกตนี้เกี่ยวข้องอย่างยิ่งกับข้อสังเกตถัดไป # 4 เกี่ยวกับ AppStore

การสังเกตเชิงประจักษ์ # 4: ไม่สามารถส่งกรอบงาน iOS ที่มีชิ้นส่วนจำลองไปยัง App Store ได้

นี้จะกล่าวถึงกันอย่างแพร่หลายใน: Realm # 1163และคาร์เธจ # 188และเรดาร์เปิด: rdar: // 19209161

นี่เป็นข้อกังวลของผู้บริโภคทั้งหมด: สำหรับเฟรมเวิร์กสากลของ iOS ที่ Consumer รวมไว้ในแอปพลิเคชันของพวกเขาเมื่อมีการสร้างแอปพลิเคชันพวกเขาจะต้องเรียกใช้สคริปต์พิเศษ (ขั้นตอนการรันสคริปต์ที่กำหนดเอง) ซึ่งจะลบชิ้นส่วนจำลองออกจากไบนารีของเฟรมเวิร์กนั้นเพื่อให้แอปผ่านการตรวจสอบความถูกต้องของ AppStore

ตัวอย่างที่ดีสำหรับกรอบไบนารีผมพบว่าในดินแดน: strip-frameworks.sh

ใช้lipoเพื่อลบส่วนของสถาปัตยกรรมทั้งหมดนอกเหนือ${VALID_ARCHS}จากนั้นออกแบบรหัสใหม่ด้วยอัตลักษณ์ของผู้บริโภค - นี่คือสิ่งที่ข้อสังเกต # 3 เริ่มต้นขึ้น: เฟรมเวิร์กจะถูกกำหนดรหัสใหม่เนื่องจากการปรับแต่งไลโป

Carthage มีสคริปต์CopyFrameworks.swiftซึ่งทำสิ่งเดียวกันกับเฟรมเวิร์กทั้งหมดที่รวมอยู่ใน Consumer: มันจะตัดส่วนของตัวจำลองออกและกรอบการออกแบบโค้ดใหม่ในนามของ Consumer

นอกจากนี้ยังมีบทความดี: ตัดเส้นสถาปัตยกรรมที่ไม่พึงประสงค์จากห้องสมุดแบบไดนามิกใน Xcode


ตอนนี้ภาพรวมของขั้นตอนที่จำเป็นในการสร้างทั้ง iOS และ OSX จากทั้งมุมมองของนักพัฒนาและผู้บริโภค สิ่งแรกที่ง่ายกว่า:

OSX

ผู้พัฒนา:

  1. สร้างกรอบ OSX
  2. มอบให้กับผู้บริโภค

นักพัฒนาไม่จำเป็นต้องมีกิจกรรมการเขียนโค้ด

ผู้บริโภค:

  1. รับ OSX framework จาก Developer
  2. คัดลอกกรอบงานไปยังไดเร็กทอรี Frameworks / และกำหนดรหัสโดยอัตโนมัติในนามของผู้บริโภคซึ่งเป็นส่วนหนึ่งของกระบวนการ "Code Sign on Copy"

iOS

ผู้พัฒนา:

  1. สร้างกรอบงาน iOS สำหรับอุปกรณ์ Xcode จำเป็นต้องมีการออกแบบรหัสข้อมูลประจำตัว "นักพัฒนา iPhone" ก็เพียงพอแล้ว
  2. สร้างกรอบงาน iOS สำหรับโปรแกรมจำลอง
  3. ใช้ lipo ที่สร้างกรอบงาน iOS สากลจากสองก่อนหน้า ณ จุดนี้รหัสประจำตัวการเซ็นชื่อของ 1 ขั้นตอนจะหายไป: ไบนารีเฟรมเวิร์กสากล "ไม่ได้ลงนามเลย" แต่ก็เป็นเรื่องปกติเนื่องจาก "ผู้บริโภคไม่สนใจ"
  4. มอบให้กับผู้บริโภค

ผู้บริโภค:

  1. รับกรอบงาน iOS จากนักพัฒนา
  2. คัดลอกเฟรมเวิร์กไปยังไดเร็กทอรี Frameworks / (ขั้นตอนนี้อาจซ้ำซ้อนขึ้นอยู่กับว่าสคริปต์ในขั้นตอนที่ 3 คืออะไร)
  3. ใช้สคริปต์พิเศษเป็นส่วนหนึ่งของกระบวนการสร้าง: สคริปต์นี้จะตัดตัวจำลองออกจากเฟรมเวิร์ก iOS จากนั้นออกแบบโค้ดใหม่ในนามผู้บริโภคของพวกเขา

10
นี่คือการเขียนที่มีคุณค่า Nice one
jackslash

@Stanislaw ขอบคุณสำหรับข้อมูลเชิงลึกและข้อมูลที่มีค่า ในขณะที่ฉันกำลังเขียนกรอบงานที่ออกแบบมาสำหรับนักพัฒนาด้วยตนเองฉันต้องการให้พวกเขาสามารถใช้กรอบงานได้ตามที่เป็นอยู่และใช้งานได้โดยไม่จำเป็นต้องสร้างสคริปต์พิเศษเพื่ออัปโหลดไปยัง app-store ฉันคิดว่า GoogleMobileAd ทำงานได้ดี แต่คุณบอกว่าพวกเขาต้องเรียกใช้สคริปต์บางอย่าง? คุณมีความคิดว่า GoogleMobileAds ไม่ต้องการสิ่งนั้นอย่างไร ขอบคุณ
Michael A

@MichaelA น่าสนใจจริงๆ ฉันจะดู
Stanislav Pankevich

คุณช่วยให้ลิงก์ไปยัง GoogleMobileAds ที่คุณใช้งานได้ไหม
Stanislav Pankevich

1
ขอบคุณสำหรับการประหยัดเวลาของฉันที่ได้ผลสำหรับฉัน Xcode 7.3, Mac OS X 10.11.4
eugen

21

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

เหตุผลที่คุณต้องลงรหัสเมื่อคุณแจกจ่ายไบนารีเฟรมเวิร์กคือ Xcode จะไม่สร้างไบนารีเฟรมเวิร์กโดยไม่มีการเซ็นรหัส หากคุณพยายามไม่ให้รหัสเซ็นชื่อในกรอบไบนารีคุณจะได้รับข้อผิดพลาดนี้:

CodeSign error: code signing is required for product type 'Framework' in SDK 'iOS 8.1'

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

ในตอนท้ายของวันคุณอาจลงรหัสไบนารี. เฟรมของคุณได้เช่นกันเนื่องจากคุณไม่ต้องการที่จะต้องรักษากระบวนการสร้างที่แปลกใหม่และเนื่องจาก Xcode จะส่งออกเฉพาะเฟรมเวิร์กที่มีการเซ็นชื่อคุณจึงไม่ควรย้ายออกไปไกลจาก ค่าเริ่มต้น มันไม่สำคัญอยู่แล้วเพราะผู้บริโภคปลายทางจะเซ็นชื่อใหม่


ในคำตอบของคุณในย่อหน้าที่สองคุณกำลังบอกว่าไม่จำเป็นต้องใช้ codeign framework เพราะมันจะถูกออกแบบใหม่โดยผู้บริโภคและตอนนี้ฉันมั่นใจ 95% แล้วว่ามันเป็นความจริง แต่ฉันไม่เข้าใจ ทำไมในย่อหน้าแรกในเวลาเดียวกันคุณถึงพูดว่า: "ถ้าคุณจะแจกจ่ายเฟรมเวิร์กไบนารีคุณต้องเซ็นรหัส" - อะไรคือความแตกต่าง - ถ้าฉันแจกจ่ายไบนารีเฟรมเวิร์ก (เช่นไม่ใช่แหล่งที่มาผ่านคาร์เธจหรือโคโคพอด) ทำไม ฉันจะต้องเขียนโค้ดหรือไม่?
Stanislav Pankevich

ฉันคิดว่าฉันไม่ควรกำหนดรหัสกรอบงานของฉันว่าฉันใช้การแจกจ่ายประเภทใด (ไฟล์. เฟรมแบบซิปหรือคาร์เทจหรือโกโก้) ตัวอย่าง: ทั้งหมดของการกระจายกรอบไบนารีต่อไปนี้จะไม่ codesigned: Realm , ReactiveCocoa , OCMockito
Stanislav Pankevich

ดังนั้นฉันจึงสับสนเล็กน้อยกับ "หากคุณกำลังกระจายเฟรมเวิร์กไบนารีคุณต้องลงรหัส" ซึ่ง (imho) ขัดแย้งกับคำตอบที่เหลือของคุณ กรุณาชี้แจง. นอกจากนี้โปรดทราบว่าฉันเปิดรางวัลนี้เป็น "กำลังมองหาคำตอบจากแหล่งข้อมูลที่น่าเชื่อถือและ / หรือเป็นทางการ"
Stanislav Pankevich

1
ใช่ฉันได้ดู Realm และ OCMockito แล้ว Realm มีข้อมูลประจำตัว "นักพัฒนา iPhone" และใช่ OCMockito เป็นไลบรารีแบบคงที่ ฉันคิดว่าฉันเข้าใจปัญหา - มันเป็น lipo ที่ลบการออกแบบโค้ดออกจาก iphoneos เมื่อรวม iphoneos ที่มีรหัสและ iphonesimulator ที่ไม่ได้ออกแบบโค้ด
Stanislav Pankevich

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