• เพื่อแก้ปัญหาการใช้งานที่ช้าและขั้นตอนการเข้าใช้งานที่ยุ่งยากของแอป PureGym ผู้เขียนจึงปรับแต่งให้เหมาะกับ Apple Wallet เป็นการส่วนตัว
  • เดิมที QR code ต้องเปิดแอปและรอโหลดข้อมูลทุกครั้ง เป็นวิธีเข้าใช้งานที่ไม่มีประสิทธิภาพและใช้เวลาราว 47 วินาที
  • ผู้เขียนสร้าง Wallet pass ที่ต่ออายุอัตโนมัติได้ ผ่านกระบวนการทางเทคนิคต่างๆ เช่น reverse engineering, การใช้ mitmproxy และเฟรมเวิร์ก PassKit
  • ระหว่างทางยังพบการทำงานภายในของ PureGym ที่เปิดเผยอยู่บนเว็บ เช่น ช่องโหว่ด้านความปลอดภัยของรหัส PIN, โครงสร้างการยืนยันตัวตนของ API และข้อมูลตำแหน่งสาขา
  • ท้ายที่สุดจึงสร้างประสบการณ์ผู้ใช้ที่ เข้าได้ภายใน 3 วินาที และย้ำชัดว่าเป็นเพียงการทดลองส่วนตัว ไม่ใช่บริการทางการ

47 วินาที: จุดเริ่มต้นของความไม่สะดวก

  • เวลา 11:15 น. ของวันธรรมดา การเปิดแอปที่หน้าทางเข้า PureGym ใช้เวลาถึง 47 วินาที
  • สัญญาณอ่อน ต้องเชื่อมต่อ Wi-Fi เปิดแอป และกดข้ามการแจ้งเตือนต่างๆ รวมถึงข้อเสนอส่วนลดพิเศษ กว่า QR code จะปรากฏ
  • ต้องรอนานกว่าจะเห็น QR code จริงๆ และทำให้รู้สึกเกรงใจสมาชิกคนอื่นที่รออยู่
  • หากเกิดขึ้นสัปดาห์ละ 6 ครั้ง จะเสียเวลาไป 282 วินาทีต่อสัปดาห์กับประสบการณ์ที่ไม่มีประสิทธิภาพ
  • เมื่อเทียบกับประสบการณ์แบบแทบไม่ต้องหยิบอะไรขึ้นมาใช้ของ Amazon Fresh แล้ว UX การเข้าใช้งานของ PureGym ถือว่าล้าหลังมาก

ปริศนาของ PIN อายุ 8 ปี

  • ผู้เขียนใช้ รหัส PIN 8 หลัก เดิมมานาน 8 ปี
  • PIN นี้ไม่เคยหมดอายุและไม่เคยถูกเปลี่ยน
  • ในทางกลับกัน QR code ในแอป จะถูกเปลี่ยนเป็นค่าใหม่ทุก 1 นาที
  • จึงเกิดความขัดแย้งอย่างมากระหว่างระดับความปลอดภัยที่แท้จริงกับการนำไปใช้จริง
  • วิธีแบบ PIN ถูกปล่อยให้ใช้ได้นานผิดปกติ แต่ QR code กลับถูกปกป้องอย่างเข้มงวด เป็นสภาวะของ "การแสดงความปลอดภัย"

ทำความเข้าใจ PureGym ด้วย mitmproxy

  • ตอนแรกผู้เขียนพยายามนำภาพหน้าจอ QR code ไปใส่ใน Apple Wallet แต่ใช้งานไม่ได้ทันที
  • QR code ของ PureGym ถูกสร้างแบบไดนามิก หมดอายุราว 1 สัปดาห์ แต่ในแอปจะรีเฟรชทุก 1 นาที
  • จากการค้นหาเรโปที่เกี่ยวกับ "PureGym" บน GitHub ทำให้พบโครงสร้างการยืนยันตัวตนของ API
    • PIN 8 หลักสำหรับล็อกอินถูกใช้เป็นรหัสผ่าน API เช่นกัน
    • ข้อมูล basic auth ที่เข้ารหัสด้วย Base64 ก็มีความปลอดภัยต่ำ
  • เพื่อวิเคราะห์ทราฟฟิกของแอป ผู้เขียนจึงดักจับคำขอด้วยเครื่องมือพร็อกซีอย่าง mitmproxy
    • โครงสร้าง JSON ของ QR code ประกอบด้วย part1 (id คงที่), part2 (timestamp), part3 (salt สำหรับรีเฟรช)
    • API ยังบอกทั้งจังหวะการรีเฟรชและเงื่อนไขการหมดอายุไว้อย่างครบถ้วน

PassKit: ศักยภาพของ Apple Wallet

  • pass ของ Apple Wallet ไม่ใช่แค่การ์ดแบบคงที่ แต่เป็นโครงสร้างคล้ายมินิแอปที่รองรับการรีเฟรชเอง การแจ้งเตือนแบบพุช และการตอบสนองตามตำแหน่ง
  • การทำ PassKit ต้องมีทั้งสเปก JSON, ทรัพยากรรูปภาพ, การลงลายมือชื่อด้วยใบรับรอง และเว็บเซอร์วิสสำหรับการอัปเดตแบบเรียลไทม์
  • จำเป็นต้องออก Pass Type ID และใบรับรอง WWDR จากพอร์ทัลนักพัฒนาของ Apple
  • แม้การลงลายมือชื่อและการจัดการใบรับรองจะยุ่งยาก แต่เมื่อทำสำเร็จแล้วจะมอบประสบการณ์ที่ลื่นไหลบนอุปกรณ์จริง

สร้างแบ็กเอนด์ด้วย Swift

  • แม้โดยทั่วไปจะใช้ Node.js แต่ผู้เขียนเลือกพัฒนาเว็บเซอร์วิส PassKit ด้วย Vapor ที่ใช้ Swift
    • เมื่อ pass ต้องอัปเดต ระบบจะส่ง silent push เพื่ออัปเดตให้อัตโนมัติ
    • ทำให้เกิดการรีเฟรช pass อย่างเป็นธรรมชาติโดยที่ผู้ใช้แทบไม่สังเกตเห็น

ทำระบบตำแหน่งของ PureGym ทั่วประเทศแบบอัตโนมัติ

  • pass ของ Apple Wallet สามารถแสดงขึ้นมาอัตโนมัติเมื่ออยู่ในตำแหน่งที่กำหนด
  • แม้เว็บไซต์ทางการของ PureGym จะไม่มีพิกัดละเอียด แต่ API ให้รายการพิกัดของทุกสาขาทั่วประเทศมาได้
  • ผู้เขียนจึงพาร์สพิกัดของทุกสาขาและกำหนดสาขาใกล้เคียงให้กับแต่ละ pass
  • ข้อเสียคือถ้า PureGym อยู่ในศูนย์การค้า pass ก็อาจเด้งขึ้นมาแม้จะแค่มาช้อปปิ้ง เป็นความรำคาญเล็กน้อย

การเชื่อมต่อกับ Apple Watch

  • pass ของ Apple Wallet ซิงก์ไปยัง Apple Watch โดยอัตโนมัติโดยไม่ต้องตั้งค่าเพิ่ม
  • แค่กดสองครั้งที่ข้อมือแล้วสแกน ใช้เวลาเพียง 3 วินาที จนเข้ายิมได้
  • ลดเวลาได้มากกว่า 93%

การเปลี่ยนแปลงในรูปตัวเลข

  • เวลาเข้าใช้งานผ่านแอป PureGym เดิม: 47 วินาที
  • เวลาเข้าใช้งานผ่าน Apple Wallet pass: 3 วินาที
  • เวลาเฉลี่ยที่ประหยัดได้ต่อสัปดาห์: 4.4 นาที (3.8 ชั่วโมงต่อปี)
  • สมาชิกข้างๆ ถามว่า "มีแอปแบบนี้ด้วยเหรอ" 23 ครั้ง และผู้เขียนก็อธิบายทุกครั้งว่าไม่เป็นทางการ
  • แม้จะมีคนขอ แต่ไม่มีแผนเผยแพร่เนื่องจากข้อจำกัดด้านลิขสิทธิ์และนโยบายบริการ

โบนัส: เชื่อมต่อกับ Home Assistant

  • ใช้ endpoint ของ API สำหรับ จำนวนคนภายในยิม เพื่อแสดงความหนาแน่นปัจจุบันของยิมบนแดชบอร์ด IoT
  • ช่วยตัดสินใจได้ว่าจะกลับมาในช่วงเวลาที่คนน้อยกว่าโดยอิงจากข้อมูล เพิ่มทั้งประสิทธิภาพและแรงจูงใจในการออกกำลังกาย

ความจริงและจริยธรรมของงานวิศวกรรม

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

ขั้นต่อไปและบทสรุป

  • ต่อไปอาจมีการเสนอไอเดียขยายผล เช่น "การแจ้งเตือนความอับอาย"
  • แม้ประโยชน์เชิงรูปธรรมจะไม่ใหญ่มาก แต่ผู้เขียนก็พอใจกับการปรับลด "ขั้นตอนที่ไม่จำเป็น" ได้ปีละ 3.8 ชั่วโมง
  • หาก PureGym นำไปทำเป็นฟีเจอร์ทางการ ก็อาจช่วยอำนวยความสะดวกให้ผู้ใช้ได้มากขึ้น
  • จึงเป็นกรณีตัวอย่างของการสร้าง "ประสบการณ์ที่ไม่เป็นทางการแต่ได้ผล"

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น