Build iOS Application ลงเครื่องแบบไม่ต้องง้อ Xcode

Patcharapon Joksamut
Nextzy
Published in
3 min readAug 31, 2018
https://unsplash.com/photos/e31ANd1PXUw

หลาย ๆ คนที่ทำแอพ iOS คงจะปวดหัวกันเวลาจะ Deploy แอพลงเครื่องเพื่อ Test เพราะว่ามีหลายอย่างมากที่จะต้องทำ ไม่ว่าจะ Certificate, Provisioning Profile และอื่น ๆ อีกมากมาย ซึ่งขนาดพวกเราที่เป็น iOS Dev ทำเองยังปวดหัวเลย ถ้าคนอื่นในทีมอย่าง Tester อยากจะ Build แอพใหม่เพื่อเทสล่ะ? ก็ต้องเดินมาหา iOS Dev เพื่อบอกให้ Build ทุกครั้งใช่มั้ย? มันคงไม่ฮาซักเท่าไรถ้าเรากำลังนั่งเขียนโค้ดอย่างเพลิดเพลินแล้วต้องถูกขัดจังหวะเพียงเพราะว่ามีคนในทีมต้องการ Build แอพใหม่ใช่มั้ยล่ะ

ดังนั้นวันนี้ผมจะมาเสนอทางออกที่จำทำให้ชีวิตของพวกเราง่ายขึ้นกันครับ

Code Signing = ปัญหาปวดใจของ iOS Dev ทั้งหลาย

ก่อนที่เราจะเข้าเรื่องกัน ผมอยากจะเล่าปัญหาอันปวดใจที่เหล่า iOS Dev เจอกับการทำ Code Signing บน iOS กันก่อน

ปกติแล้ว เวลาเราจะ Deploy แอพของเราขึ้น App Store, TestFlight หรือแม้แต่ลงในเครื่องของเราเอง เราจำเป็นต้องใช้สิ่งที่เรียกว่า Certificate ซึ่งถ้าเราอยู่ในทีม ทุกคนในทีมจะต้องมี Certificate คนละอัน

เพิ่มเติม — Certificate คือสิ่งที่ต้องใช้ในขั้นตอนการ Code Signing ที่ซึ่งเป็นเสมือนกุญแจที่บอกให้รู้ว่าแอพตัวนั้นๆเป็นของใครและไม่ได้ถูกดัดแปลงแก้ไขจากคนอื่น

แต่เมื่อตัว Certificate หมดอายุหรือเราต้องการ Setup เครื่อง Mac ใหม่โดยที่ยังใช้เครื่องเก่าอยู่ด้วย เราก็ต้องย้ายตัว Certificate จากเครื่องเก่าของเรามาลงในเครื่องใหม่เอง (ถ้าย้ายไปใช้เครื่องใหม่แทนเครื่องเก่าเลยก็สามารถสั่งให้ Xcode สร้างตัวใหม่ขึ้นมาแล้วไป Revoke ตัวเก่าทิ้งได้เลย)

ทั้งหมดนี้ทำให้เกิด Certificate ซ้อนกันหลายตัว และทำให้คนที่ไม่ใช่ iOS Dev แต่ต้องการจะ Build แอพต้องมานั่งปวดหัวกับเรื่องแบบนี้เพราะมันเข้าใจยาก

“เรามาช่วยคุณแล้ว” — Fastlane

หลาย ๆ คนคงจะเคยได้ยินชื่อนี้มาก่อน โดย Fastlane นั้นเป็น Open Source Platform ที่ช่วยในการ Automate หลาย ๆ อย่างทั้งในส่วนของการ Build และ Deploy ซึ่งในบทความนี้เราจะเน้นไปที่ Feature เกี่ยวกับทำ Code Signing ของ Fastlane กัน

สิ่งที่ Fastlane ทำให้เราคือ สร้างและจัดการ Certificate และรวม Provisioning Profile เอาไว้ใน Git Repository อันหนึ่ง

เพิ่มเติม — Provisioning Profile เป็นเสมือนใบอนุญาตสำหรับการ Deploy แอพ โดยมีได้แค่ 1 Profile ต่อ 1 Bundle ID เท่านั้น (ถ้าในทีมมีหลายคนก็ใช้ Profile เดียวกัน แต่แยก Certificate เป็นคนละตัวกัน)

เมื่อมีใครจะ Sign แอพนั้น ตัว Fastlane ก็จะดึงสิ่งที่ต้องใช้มาโดยอัตโนมัติ ซึ่งรวมไปถึงการสร้าง Certificate และ Provisioning Profile ให้ใหม้ด้วย (ถ้ายังไม่มี) โดยขั้นตอนทั้งหมดนี้ทำได้ด้วยการสั่ง Fastlane เพียงแค่คำสั่งเดียว

พอเราใช้ Fastlane มาช่วยจัดการให้ ก็จะช่วยแก้ปัญหาเรื่อง Certificates และ Provisioning Profile ที่ซ้ำซ้อนกันเมื่อทำงานกับทีมที่มีสมาชิกหลายๆคน และแก้ปัญหาเวลาที่เราต้องมา Copy ตัว Certificate ไปยังเครื่องใหม่หรือมีสมาชิกใหม่เข้ามาในทีม

วิธีการ Setup Fastlane

เราจะต้องไปสร้าง Apple ID ตัวใหม่ขึ้นมาเพื่อเป็น ID กลางให้ทุกคนในทีมใช้งานร่วมกัน และ สร้าง Private Git Repository สำหรับเก็บตัว Certificate และ Provisioning Profile

ในขั้นตอนแรกนั้น เราจะทำการติดตั้ง Fastlane โดยใช้ Homebrew ให้รันคำสั่งนี้ใน Terminal

brew cask install fastlane

ต่อมาให้ Navigate ไปยังโฟลเดอร์โปรเจคของเรา

cd <your_project_directory>

แล้วรันคำสั่งนี้เพื่อ Setup Fastlane

fastlane init

ถ้ามีข้อความแสดงขึ้นมาถามเราว่าให้เรา setup สำหรับทำอะไร ให้เลือกเป็น Manual ไปก่อน

หลังจากนั้นเราต้องลง ios-deploy เพื่อใช้ในการ deploy แอพลงเครื่องของเรา ซึ่งตัว ios-deploy นั้นเป็น node package เราจึงต้องลง node.js ก่อน

brew install node

เมื่อเสร็จแล้วก็ทำการลง ios-deploy

npm install -g ios-deploy

ขั้นตอนสุดท้ายคือให้เราไปสร้างแอพใน App Store Connect ซึ่งถ้ายังไม่ได้สร้างและรู้สึกขี้เกียจ ก็สามารถสั่งให้ Fastlane สร้างให้แทนโดยใช้คำสั่ง

fastlane produce

แล้วกรอกข้อมูลตามที่ตัว Fastlane ถามมาให้เรียบร้อย

การสร้าง Lane ใน Fastlane

ขั้นตอนต่อไปนั้น เราจะสร้าง Lane ซึ่งเปรียบเสมือนชุดของคำสั่งที่เราจะให้ Fastlane ทำงาน โดยเราจะให้ Fastlane เตรียม Code Signing Identities ให้ไว้ใน Lane นั้น ๆ แล้วทำการ Build แอพ และ Deploy ลงเครื่อง

ในโฟลเดอร์โปรเจคของเราจะมีโฟลเดอร์ที่ชื่อว่า fastlane อยู่ ภายในนั้นจะมีไฟล์ชื่อว่า fastfile ซึ่งไฟล์นี้จะเป็นไฟล์ที่ใช้สร้าง Lane กัน ให้เปิดไฟล์นี้ด้วย Text Editor แล้วก็แก้ไขตามนี้

platform :ios do
desc "Sign and install build on local device"
lane :local_install do
match(git_url: "URL ของ Git Repo", type: "adhoc")
gym(scheme: "fastlanetest")
install_on_device(ipa: "fastlanetest.ipa")
end
end

โดยแต่ละส่วนมีรายละเอียดดังนี้

  • desc : เป็นคำอธิบายว่า Lane นี้ทำอะไร
  • lane :local_install do ประกาศชื่อ Lane
  • match(git_url: "…", type: "adhoc") ใช้ดึงข้อมูล Certificate และ Provisioning Profile (ถ้ามีอยู่แล้ว) หรือสร้างใหม่ (ถ้ายังไม่มี) และนำไปเก็บไว้ใน Git Repository โดยค่าที่กำหนดไว้ใน git_url จะเป็น HTTPS URL ของ Repository ที่จะใช้เก็บข้อมูลสำหรับ Code Signing
  • gym(scheme: "fastlanetest") ใช้ Build แอพเพื่อทำเป็น .ipa โดยใส่ชื่อ Target ที่จะ Build และกรณีที่ใช้ CocoaPods ให้ระบุ Workspace ลงไปด้วย เช่น workspace: "fastlanetest.xworkspace"
  • install_on_device(ipa: "fastlanetest.ipa") ทำการติดตั้งแอพลงไปในเครื่องที่ต่อกับ Mac ของเราอยู่

เมื่อเสร็จเรียบร้อยแล้วก็ถอยกลับมาที่โฟลเดอร์โปรเจคแล้วรันคำสั่งนี้

fastlane local_install

Fastlane ก็จะรันคำสั่งตามที่เราได้เขียนเอาไว้ ซึ่งก็คือ Sign, Build แล้วก็ Deploy ลงเครื่องให้เลย

คำเตือน — Fastlane ไม่สามารถ Revoke ตัว Provisioning Profile ให้เราได้ ถ้ารันแล้วในขั้นตอน Match แจ้งว่า Provisioning Profile ถึง Limit ก็ให้ไปลบทิ้งใน Developer Portal ก่อน

สรุป

เพียงเท่านี้เราก็สามารถ Build แอพลงเครื่องได้โดยไม่ต้องมานั่งหัวร้อนกับความยุ่งยากของ Certicate และไม่ต้องมานั่งง้อ Xcode อีกต่อไป

จะเห็นว่า Fastlane นั้นจะมีสิ่งที่เรียกว่า Lane ที่เราสามารถกำหนดคำสั่งลงในนั้นเพื่อบอกให้มัน Sign และ Deploy แอพลงเครื่องได้ทันทีโดยไม่ต้องใช้ Xcode จึงทำให้คนอื่น ๆ ในทีมอย่างเช่น Tester ไม่ต้องมาตอแยกับ Xcode และ Certificate (รวมไปถึง iOS Dev อย่างพวกเราด้วย) และนอกจากนี้ยังสามารถต่อยอดเพื่อสร้าง Lane สำหรับ Publish ขึ้น Testflight หรือ App Store ได้อีกด้วย

ข้อมูลเพิ่มเติม

--

--