สิ่งใดเล่าคือ xcframework ในยุทธภพของ iOS dev

Pattaravadee Luamsomboon
Finnomena
Published in
3 min readOct 7, 2022

--

สวัสดีชาวโลก 🌍🌍🌍 blog แรกของปี 2022 (จะจบปีอยู่ละ) จะเป็น blog เดียวของปีด้วยมั้ยเนี่ย 😂😂😂 โดยไม่รีรอเย๊อะ…สำหรับ blog นี้จะพาทุกคนไปรู้จักกับ xcframework พอดีช่วงเวลาที่ผ่านมาได้มีโอกาสลงไปคลุกคลีกับการทำ modular architecture iOS ซึ่งการทำ modular เนี่ย ก็เพื่อให้ project ของเราที่เริ่มใหญ่ขึ้นเรื่อยๆ ถูกแยกออกมาเป็นส่วนๆ จะได้ดูแลโค้ดในแต่ละส่วนได้ง่ายๆ แล้วแต่ละส่วนก็อาจจะถูกนำไป reuse ที่ project อื่นๆ ได้ด้วย เช่น เราอาจจะแยกเป็น core ui, core networking, login feature เป็นต้น พอต้องแยกของออกมาแบบนี้เลยถูกพ่วงมาด้วยการทำxcframework นั่นเอง เดี๋ยวไปอ่านกันว่าจะมีเนื้อหาอะไรให้ทุกคนได้อ่านกันบ้าง

สิ่งที่จะเขียนถึงใน blog นี้

  • xcframework คือสิ่งใดในยุทธภพเรา
  • xcframework เกิดมาเพื่ออออออ
  • วิทยายุทธการสร้าง xcframework

มาเริ่มกันที่หัวข้อแรกกันเลย xcframework คือสิ่งใดในยุทธภพเรา

xcframework ก็คือ framework ยังไงล๊าาาา ไม่มุก ไม่ตลกนะ มันคือ framework จริงๆ เป็น binary framework format ใหม่ของ apple ที่เกิดขึ้นมาในงาน WWCD เย้ย!!! WWDC2019 นั่นเอง (ก็ดูเนิ่นนานมาแล้วนะ) ซึ่งเจ้า binary framework format ใหม่เนี่ย เป็นของเล่นใหม่ตั้งแต่ Xcode11 ละ (คงไม่มีใครใช้ต่ำกว่า Xcode11 แล้วใช่มั้ย 🤔)

มาถึงตรงนี้อาจจะยังไม่ค่อยเก็ทว่าเป็น binary framework format ใหม่ ???
แล้วยังไง??? ยุทธภพเราก็มีการสร้าง framework อยู่ละนี่ งั้นเราไปดูหัวข้อถัดไปกัน ⬇️⬇️⬇️

xcframework เกิดมาเพื่อสิ่งใด

ย้อนกลับไปเมื่อ 2000 ปีก่อน (เยอะไป!!!) ย้อนกลับไปก่อนจะมี xcframework เกิดขึ้น ยุทธภพเราได้มีการสร้าง framework ขึ้นมาแล้วแหละ ซึ่งก่อนนี้เรามีสิ่งที่เรียกว่า Universal Static Library หรืออีกชื่อที่เรารู้จักกันก็คือ Fat Framework ซึ่งตัว Fat Framework เนี่ย มันคือของที่เราต้องมา combine framework แต่ละ architecture เอง … อะ อ้าววววว อะไร๊ ทำไมต้องมา combine เอง ปัญหามันอยู่ที่ตรงนี้ทุกคน ค่อยๆ ไล่กันไปทีละ step

ย้อนกลับไปอีก…ในช่วงที่ M1 ออกมา เวลาที่เรา build framework ออกมาด้วยการเลือก device เป็น simulator แบบในภาพนี้

framework ที่เราได้มาจะเป็น static framework ชะแว้บบบบ ✨✨

แต่เจ้า framework นี้ปัญหามันคือ พอเราเอาไป embed เข้าโปรเจคต์ เราจะ run ได้แค่บน simulator ที่ >iOS13.7 เพราะตัว simulator นี้จะเป็น x86_64-simulator and arm64-simulator architectures แต่ run บน device จริง framework จะใช้ไม่ได้

ถ้างั้นๆ ลองเปลี่ยน device ตอน build framework ดูดีกว่า

ชะแว้บบบบ ได้ framework ใหม่มาแล้ว ซึ่งเป็นตัว static framework เหมือนด้านบนเลย ✨✨

แต่เจ้า framework นี้ก็จะ support แค่การ build บน real device อยู่ดี อะ อ้าว…

แบบแรกก็ไม่ได้ แบบที่สองก็ไม่ได้ แล้วเราจะทำยังไงกันดีล่ะทีนี้… คำตอบก็คือก่อนจะมี xcframework เกิดขึ้น เราต้องทำ fat framework เอง เพื่อให้สามารถ build framework ได้ทั้งบน simulator และเครื่องจริง โดยใช้การ combine 2 framework ด้วย lipo ซึ่งมันก็จะยุ่งยากๆ หน่อย สามารถดูขั้นตอนได้ตามคลิป https://www.youtube.com/watch?v=OsxzfcUR8GQ&ab_channel=iOSCoderAbhimanyuDaspan

แต่แล้ว apple ก็เห็นใจชาวยุทธภพของเรา ชีวิตจะยุ่งยากไปทำไม รับ new item ไปล่าบอสใหม่ซะ item ที่ได้รับมาใหม่ก็คือ xcframework นั่นเอง ตัวนี้เราสามารถเขียนเป็น script แล้ว run ได้เลย ซึ่งจะอยู่ในหัวข้อถัดไปนั่นเอง

วิทยายุทธการสร้าง xcframework

สำหรับวิทยายุทธการสร้างมีอยู่ง่ายๆ เลยเพียงแค่เราเอา script ด้านล่างนี้ไปวางไว้ที่ project แล้ว run ด้วยคำสั่ง sh <filename>.sh

# Set bash script to exit immediately if any commands fail.set -e# Setup some constants for use later on.FRAMEWORK_NAME=”TestFramework”OUTPUT_DIR=”./build”// สร้าง iOS framework
xcodebuild archive \
-scheme ${FRAMEWORK_NAME} \-configuration Release \-destination ‘generic/platform=iOS’ \-archivePath “${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework-iphoneos.xcarchive” \SKIP_INSTALL=NO \BUILD_LIBRARY_FOR_DISTRIBUTION=YES
//สร้าง iOS Simulator framework
xcodebuild archive \-scheme ${FRAMEWORK_NAME} \-configuration Release \-destination ‘generic/platform=iOS Simulator’ \-archivePath “${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework-iphonesimulator.xcarchive” \SKIP_INSTALL=NO \BUILD_LIBRARY_FOR_DISTRIBUTION=YES
// สร้าง xcframework
xcodebuild -create-xcframework \-framework “${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework” \-framework “${OUTPUT_DIR}/${FRAMEWORK_NAME}.framework-iphoneos.xcarchive/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework” \-output “${FRAMEWORK_NAME}.xcframework”

จากนั้นก็รอให้ script ทำงานตาม 3 คำสั่งบนไป

หลังจาก script หยุด run แล้ว มีข้อสังเกตนิดนึงนะ เราต้อง make sure ว่า xcframework มันถูก build success จริงๆ โดยบน terminal เราต้องมีประโยคแบบรูปด้านล่างนี้

และของด้านใน xcframework ก็จะมีตามภาพด้านล่างนี้

เพียงแค่นี้เราก็นำเอา TestFramework.xcframework ไป embed ต่อใน project ของเราได้เลย แล้วก็ใช้งาน framework นี้ได้ทั้งบน simulator และ real device แล้ววววววว 👏🏼👏🏼👏🏼

สำหรับ blog นี้เนื้อหาก็จะมีเพียงเท่านี้ หวังว่าจะเป็น blog ที่มีประโยชน์กับชาวยุทธภพของเราที่ได้เข้ามาอ่าน แล้วเจอกันใหม่ใน blog ฮ้าฟฟฟฟ

--

--