บทช่วยสอนเกี่ยวกับส่วนขยายแอป iOS 8
เผยแพร่แล้ว: 2022-03-11มีเพียงไม่กี่คนที่พยายามมาก่อน (ดูสิ่งนี้) แต่เป็น Apple ที่มี iPhone เครื่องแรกที่กำหนดว่าสมาร์ทโฟนและระบบปฏิบัติการมือถือควรมีลักษณะอย่างไร Apple สร้างความก้าวหน้าอย่างน่าทึ่งในด้านฮาร์ดแวร์และประสบการณ์ผู้ใช้ อย่างไรก็ตาม เรามักลืมไปว่าพวกเขายังกำหนดมาตรฐานว่าระบบปฏิบัติการมือถือควรทำงานอย่างไร และควรสร้างแอปพลิเคชันบนสมาร์ทโฟนอย่างไร
การสร้างกำแพงคอนกรีตระหว่างแอปพลิเคชัน ทำให้แยกออกจากกันโดยสิ้นเชิงและไม่รับรู้ซึ่งกันและกัน เป็นวิธีที่ดีที่สุดในการรักษาความปลอดภัยและปกป้องข้อมูล กิจกรรมทั้งหมดได้รับการตรวจสอบอย่างใกล้ชิดโดย iOS และมีการดำเนินการเพียงไม่กี่อย่างที่แอปสามารถทำได้นอกขอบเขต
“การละเว้นคือการป้องกันที่ดีที่สุด!” - แต่ความสนุกในนั้นอยู่ที่ไหน?
พวกเขาใช้เวลาสักครู่ นานเกินไปถ้าคุณถามฉัน แต่ด้วย iOS 8 Apple ตัดสินใจที่จะสนุก iOS 8 นำเสนอแนวคิดใหม่ที่เรียกว่าส่วนขยายแอป ฟีเจอร์ใหม่นี้ไม่ได้ทำลายกำแพงระหว่างแอปพลิเคชัน แต่เปิดประตูสองสามบานให้การสัมผัสที่นุ่มนวลแต่จับต้องได้ระหว่างบางแอพ การอัปเดตล่าสุดทำให้นักพัฒนา iOS มีตัวเลือกในการปรับแต่งระบบนิเวศ iOS และเราอยากเห็นเส้นทางนี้เปิดออกเช่นกัน
ส่วนขยายแอป iOS 8 คืออะไรและทำงานอย่างไร
พูดง่ายๆ ก็คือ ส่วนขยายแอป iOS 8 ให้วิธีการใหม่ในการโต้ตอบกับแอปพลิเคชันของคุณ โดยไม่ต้องเริ่มหรือแสดงบนหน้าจอ
ตามที่คาดไว้ Apple ทำให้แน่ใจว่าพวกเขาอยู่เหนือทุกสิ่ง ดังนั้นจึงมีจุดเริ่มต้นใหม่เพียงไม่กี่อย่างที่แอปพลิเคชันของคุณสามารถให้ได้:
- วันนี้ (เรียกอีกอย่างว่าวิดเจ็ต) - ส่วนขยายที่แสดงในมุมมองวันนี้ของศูนย์การแจ้งเตือนจะแสดงข้อมูลโดยย่อและช่วยให้สามารถทำงานด่วนได้
- แบ่งปัน - ส่วนขยายที่ช่วยให้แอปของคุณสามารถแบ่งปันเนื้อหากับผู้ใช้บนเครือข่ายสังคมและบริการแบ่งปันอื่นๆ
- การดำเนินการ - ส่วนขยายที่อนุญาตให้สร้างปุ่มการดำเนินการที่กำหนดเองในแผ่นการดำเนินการ เพื่อให้ผู้ใช้ดูหรือแปลงเนื้อหาที่มีต้นกำเนิดในแอปโฮสต์
- การแก้ไขรูปภาพ - ส่วนขยายที่ให้ผู้ใช้แก้ไขรูปภาพหรือวิดีโอภายในแอปรูปภาพ
- ผู้ให้บริการเอกสาร - ส่วนขยายที่ใช้สำหรับอนุญาตให้แอปอื่นๆ เข้าถึงเอกสารที่จัดการโดยแอปของคุณ
- แป้นพิมพ์แบบกำหนดเอง - ส่วนขยายที่มาแทนที่แป้นพิมพ์ของระบบ
ส่วนขยายแอปไม่ใช่แอปแบบสแตนด์อโลน พวกเขากำลังให้ฟังก์ชันการทำงานที่เพิ่มขึ้นของแอป (ซึ่งสามารถเข้าถึงได้จากแอปอื่น ๆ เรียกว่าแอปโฮสต์) ที่มีประสิทธิภาพและมุ่งเน้นไปที่งานเดียว พวกเขามีไบนารีของตัวเอง ลายเซ็นโค้ดของตัวเอง และชุดองค์ประกอบของตัวเอง แต่ถูกส่งผ่าน App Store โดยเป็นส่วนหนึ่งของไบนารีของแอปที่มีอยู่ หนึ่งแอป (ที่มี) สามารถมีได้มากกว่าหนึ่งส่วนขยาย เมื่อผู้ใช้ติดตั้งแอปที่มีส่วนขยายแล้ว จะสามารถใช้งานได้บน iOS
มาดูตัวอย่างกัน: ผู้ใช้ค้นหารูปภาพโดยใช้ Safari กดปุ่มแชร์และเลือกส่วนขยายแอปพลิเคชันของคุณสำหรับการแชร์ Safari "พูด" กับ iOS Social framework ซึ่งโหลดและนำเสนอส่วนขยาย โค้ดของส่วนขยายทำงาน ส่งข้อมูลโดยใช้ช่องทางการสื่อสารที่สร้างอินสแตนซ์ของระบบ และเมื่องานเสร็จสิ้น Safari จะฉีกมุมมองส่วนขยายออก หลังจากนั้นไม่นาน ระบบจะยุติกระบวนการ และแอปพลิเคชันของคุณจะไม่ปรากฏบนหน้าจอ มันยังเสร็จสิ้นฟังก์ชั่นการแบ่งปันรูปภาพ
iOS โดยใช้การสื่อสารระหว่างกระบวนการ เป็นผู้รับผิดชอบในการตรวจสอบว่าแอปโฮสต์และส่วนขยายแอปสามารถทำงานร่วมกันได้ นักพัฒนาใช้ API ระดับสูงที่มีให้โดยจุดต่อขยายและระบบ ดังนั้นพวกเขาจึงไม่ต้องกังวลเกี่ยวกับกลไกการสื่อสารพื้นฐาน
วงจรชีวิต
ส่วนขยายแอปมีวงจรชีวิตที่แตกต่างจากแอป iOS แอปโฮสต์เริ่มต้นวงจรชีวิตของส่วนขยายเพื่อตอบสนองต่อการกระทำของผู้ใช้ จากนั้นระบบจะยกตัวอย่างส่วนขยายแอปและตั้งค่าช่องทางการสื่อสารระหว่างกัน มุมมองของส่วนขยายจะแสดงในบริบทของแอปโฮสต์โดยใช้รายการที่ได้รับในคำขอของแอปโฮสต์ เมื่อแสดงมุมมองของส่วนขยายแล้ว ผู้ใช้สามารถโต้ตอบกับส่วนขยายนั้นได้ ในการตอบสนองต่อการกระทำของผู้ใช้ ส่วนขยายจะดำเนินการตามคำขอของแอปโฮสต์โดยดำเนินการ/ยกเลิกงานทันที หรือหากจำเป็น ให้เริ่มกระบวนการพื้นหลังเพื่อดำเนินการ หลังจากนั้น แอปโฮสต์จะทำลายมุมมองของส่วนขยาย และผู้ใช้กลับไปที่บริบทก่อนหน้าภายในแอปโฮสต์ ผลลัพธ์จากการดำเนินการตามกระบวนการนี้สามารถส่งคืนไปยังแอปโฮสต์ได้เมื่อกระบวนการเสร็จสิ้น ส่วนขยายมักจะถูกยุติในไม่ช้าหลังจากเสร็จสิ้นการร้องขอที่ได้รับจากแอปโฮสต์ (หรือเริ่มกระบวนการพื้นหลังเพื่อดำเนินการ)
ระบบจะเปิดส่วนขยายการดำเนินการของผู้ใช้จากแอปโฮสต์ ส่วนขยายจะแสดง UI ทำงานบางอย่าง และส่งคืนข้อมูลไปยังแอปโฮสต์ (หากเหมาะสมกับประเภทของส่วนขยาย) แอปที่บรรจุอยู่ไม่ทำงานแม้ในขณะที่ส่วนขยายกำลังทำงานอยู่
การสร้างส่วนขยายแอป - ตัวอย่างใช้งานจริงโดยใช้ส่วนขยายวันนี้
ส่วนขยาย Today หรือที่เรียกว่า วิดเจ็ต จะอยู่ในมุมมอง Today ของศูนย์การแจ้งเตือน เป็นวิธีที่ยอดเยี่ยมในการนำเสนอเนื้อหาที่ทันสมัยสำหรับผู้ใช้ (เช่น การแสดงสภาพอากาศ) หรือการทำงานด่วน (เช่น การทำเครื่องหมายสิ่งที่เสร็จสิ้นในวิดเจ็ตของแอปรายการสิ่งที่ต้องทำ) ฉันต้องชี้ให้เห็นว่า ไม่รองรับรายการแป้นพิมพ์
มาสร้างส่วนขยาย Today ที่จะแสดงข้อมูลล่าสุดจากแอปของเรา (รหัสบน GitHub) เพื่อเรียกใช้รหัสนี้ โปรดตรวจสอบให้แน่ใจว่าคุณได้กำหนดค่ากลุ่มแอปสำหรับโครงการ (เลือกทีมพัฒนาของคุณ โปรดจำไว้ว่าชื่อกลุ่มแอปต้องไม่ซ้ำกัน และปฏิบัติตามคำแนะนำของ Xcode)
การสร้างวิดเจ็ตใหม่
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ ส่วนขยายแอปไม่ใช่แอปแบบสแตนด์อโลน เราต้องการแอปที่มีซึ่งเราจะสร้างส่วนขยายแอป เมื่อเรามีแอปที่มีอยู่แล้ว เราเลือกที่จะเพิ่มเป้าหมายใหม่โดยไปที่ไฟล์ -> ใหม่ -> เป้าหมายใน Xcode จากที่นี่ เราเลือกเทมเพลตสำหรับเป้าหมายใหม่เพื่อเพิ่มส่วนขยายของวันนี้
ในขั้นตอนต่อไป เราสามารถเลือกชื่อผลิตภัณฑ์ได้ นั่นคือชื่อที่จะปรากฏในมุมมองวันนี้ของศูนย์การแจ้งเตือน มีตัวเลือกสำหรับเลือกภาษาระหว่าง Swift และ Objective-C ในขั้นตอนนี้ด้วย เมื่อทำตามขั้นตอนเหล่านี้เสร็จสิ้น Xcode จะสร้างเทมเพลต Today ซึ่งจัดเตรียมไฟล์ส่วนหัวและไฟล์การใช้งานเริ่มต้นสำหรับคลาสหลัก (ชื่อ TodayViewController
) พร้อมไฟล์ Info.plist
และไฟล์อินเทอร์เฟซ (ไฟล์กระดานเรื่องราวหรือ .xib) โดยค่าเริ่มต้น ไฟล์ Info.plist
จะมีลักษณะดังนี้:
<key>NSExtension</key> <dict> <key>NSExtensionMainStoryboard</key> <string>MainInterface</string> <key>NSExtensionPointIdentifier</key> <string>com.apple.widget-extension</string> </dict>
หากคุณไม่ต้องการใช้กระดานเรื่องราวที่เทมเพลตให้มา ให้ลบคีย์ NSExtensionMainStoryboard
และเพิ่มคีย์ NSExtensionPrincipalClass
ด้วยชื่อตัวควบคุมมุมมองของคุณเป็นค่า
วิดเจ็ตวันนี้ควร:
- ตรวจสอบให้แน่ใจว่าเนื้อหาดูทันสมัยอยู่เสมอ
- ตอบสนองอย่างเหมาะสมต่อการโต้ตอบของผู้ใช้
- ทำงานได้ดี (วิดเจ็ต iOS ต้องใช้หน่วยความจำอย่างชาญฉลาด มิฉะนั้นจะถูกยกเลิกโดยระบบ)
การแบ่งปันข้อมูลและคอนเทนเนอร์ที่ใช้ร่วมกัน
ส่วนขยายแอปและแอปที่มีอยู่ทั้งสองสามารถเข้าถึงข้อมูลที่แชร์ในคอนเทนเนอร์ที่ใช้ร่วมกันที่กำหนดไว้แบบส่วนตัว ซึ่งเป็นวิธีการสื่อสารทางอ้อมระหว่างแอปที่มีและส่วนขยาย
คุณไม่ชอบที่ Apple ทำให้สิ่งเหล่านี้ "เรียบง่าย" หรือไม่? :)
การแชร์รางข้อมูล NSUserDefaults
ทำได้ง่ายและเป็นกรณีใช้งานทั่วไป โดยค่าเริ่มต้น ส่วนขยายและแอปที่มีอยู่จะใช้ชุดข้อมูล NSUserDefaults
แยกกัน และไม่สามารถเข้าถึงคอนเทนเนอร์ของกันและกันได้ ในการเปลี่ยนพฤติกรรมนี้ iOS ได้แนะนำ App Groups หลังจากเปิดใช้งานกลุ่มแอปในแอปที่มีและส่วนขยายแล้ว แทนที่จะใช้ [NSUserDefaults standardUserDefaults]
ให้ใช้ [[NSUserDefaults alloc] initWithSuiteName:@"group.yourAppGroupName"]
เพื่อเข้าถึงคอนเทนเนอร์ที่ใช้ร่วมกันเดียวกัน
กำลังอัปเดตวิดเจ็ต
เพื่อให้แน่ใจว่าเนื้อหาเป็นปัจจุบันอยู่เสมอ ส่วนขยาย Today ได้จัดเตรียม API สำหรับจัดการสถานะของวิดเจ็ตและจัดการการอัปเดตเนื้อหา ระบบจับภาพสแน็ปช็อตของมุมมองของวิดเจ็ตเป็นบางครั้ง ดังนั้นเมื่อวิดเจ็ตปรากฏให้เห็น สแน็ปช็อตล่าสุดจะแสดงขึ้นจนกว่าจะแทนที่ด้วยมุมมองเวอร์ชันที่ใช้งานจริง โครงสร้างของโปรโตคอล NCWidgetProviding
มีความสำคัญต่อการอัปเดตสถานะของวิดเจ็ตก่อนที่จะถ่ายภาพ เมื่อวิดเจ็ตได้รับ widgetPerformUpdateWithCompletionHandler:
การเรียก มุมมองของวิดเจ็ตควรได้รับการอัปเดตด้วยเนื้อหาล่าสุด และควรเรียกตัวจัดการความสมบูรณ์ด้วยค่าคงที่ใดค่าหนึ่งต่อไปนี้เพื่ออธิบายผลลัพธ์ของการอัปเดต:

-
NCUpdateResultNewData
- เนื้อหาใหม่ต้องมีการวาดมุมมองใหม่ -
NCUpdateResultNoDate
- วิดเจ็ตไม่ต้องอัปเดต -
NCUpdateResultFailed
- มีข้อผิดพลาดเกิดขึ้นระหว่างกระบวนการอัพเดต
- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { // Perform any setup necessary in order to update the view. // If an error is encountered, use NCUpdateResultFailed // If there's no update required, use NCUpdateResultNoData // If there's an update, use NCUpdateResultNewData [self updateTableView]; completionHandler(NCUpdateResultNewData); }
การควบคุมเมื่อสามารถดูวิดเจ็ตได้
ในการควบคุมเวลาแสดงวิดเจ็ต ให้ใช้ setHasContent:forWidgetWithBundleIdentifier:
จากคลาส NCWidgetController
วิธีนี้จะให้คุณระบุสถานะของเนื้อหาของวิดเจ็ตได้ สามารถเรียกได้จากวิดเจ็ตหรือจากแอปที่มีอยู่ (หากเปิดใช้งานอยู่) คุณสามารถส่งแฟล็ก NO
หรือ YES
ไปยังเมธอดนี้ โดยกำหนดว่าเนื้อหาวิดเจ็ตพร้อมหรือไม่ หากเนื้อหาไม่พร้อม iOS จะไม่แสดงวิดเจ็ตของคุณเมื่อเปิดมุมมองวันนี้
NCWidgetController *widgetController = [[NCWidgetController alloc] init]; [widgetController setHasContent:YES forWidgetWithBundleIdentifier:@"com.your-company.your-app.your-widget"];
การเปิดแอปที่ประกอบด้วยจากวิดเจ็ต
วิดเจ็ต Today เป็นส่วนขยายเดียวที่สามารถขอเปิดแอปที่มีได้โดยเรียก openURL:completionHandler:
เพื่อให้แน่ใจว่าแอปที่มีอยู่เปิดขึ้นในลักษณะที่เหมาะสมในบริบทของงานปัจจุบันของผู้ใช้ ควรกำหนดรูปแบบ URL ที่กำหนดเอง (ที่ทั้งวิดเจ็ตและแอปที่มีอยู่)
[self.extensionContext openURL:[NSURL URLWithString:@"customURLsheme://URLpath"] completionHandler:nil];
ข้อควรพิจารณาเกี่ยวกับ UI
เมื่อออกแบบวิดเจ็ตของคุณ ให้ใช้ประโยชน์จากคลาส UIVisualEffectView
โดยคำนึงถึงมุมมองที่ควรเบลอ/มีชีวิตชีวาต้องถูกเพิ่มใน contentView
ไม่ใช่ UIVisualEffectView
โดยตรง วิดเจ็ต (สอดคล้องกับโปรโตคอล NCWidgetProviding
) ควรโหลดสถานะแคชใน viewWillAppear:
เพื่อให้ตรงกับสถานะของมุมมองจากมุมมองล่าสุดจะหายตัวไป viewWillDisappear:
แล้วเปลี่ยนอย่างราบรื่นไปยังข้อมูลใหม่เมื่อมาถึง ซึ่งไม่ใช่กรณีที่มีมุมมองปกติ คอนโทรลเลอร์ (UI ได้รับการตั้งค่าใน viewDidLoad
และจัดการภาพเคลื่อนไหวและการโหลดข้อมูลใน viewWillAppear
) วิดเจ็ตควรได้รับการออกแบบสำหรับการทำงาน หรือเปิดแอปที่มีอยู่ด้วยการแตะเพียงครั้งเดียว ไม่มีรายการแป้นพิมพ์ภายในวิดเจ็ต ซึ่งหมายความว่าไม่ควรใช้ UI ที่ต้องการการป้อนข้อความ
ไม่สามารถเพิ่มการเลื่อนลงในวิดเจ็ตได้ทั้งแนวตั้งและแนวนอน หรือแม่นยำกว่านั้น การเพิ่มมุมมองการเลื่อนสามารถทำได้แต่การเลื่อนจะไม่ทำงาน ท่าทางการเลื่อนแนวนอนในมุมมองเลื่อนในส่วนขยายวันนี้จะถูกขัดขวางโดยศูนย์การแจ้งเตือนซึ่งจะทำให้เลื่อนจากวันนี้ไปยังศูนย์การแจ้งเตือน การเลื่อนมุมมองแบบเลื่อนในแนวตั้งภายในส่วนขยายของวันนี้จะถูกขัดจังหวะด้วยการเลื่อนมุมมองวันนี้
หมายเหตุทางเทคนิค
ในที่นี้ ฉันจะชี้ให้เห็นสิ่งสำคัญบางประการที่ควรคำนึงถึงเมื่อสร้างส่วนขยายแอป
คุณสมบัติทั่วไปของส่วนขยายทั้งหมด
รายการต่อไปนี้เป็นจริงสำหรับส่วนขยายทั้งหมด:
วัตถุ sharedApplication ถูกจำกัด : ส่วนขยายแอพไม่สามารถเข้าถึงวัตถุ sharedApplication หรือใช้วิธีการใด ๆ ที่เกี่ยวข้องกับวัตถุนั้น
กล้องและไมโครโฟนถูกจำกัด : ส่วนขยายแอปไม่สามารถเข้าถึงกล้องหรือไมโครโฟนบนอุปกรณ์ได้ (แต่ไม่ใช่กรณีสำหรับองค์ประกอบฮาร์ดแวร์ทั้งหมด) ซึ่งเป็นผลมาจากความไม่พร้อมใช้งานของ API บางตัว ในการเข้าถึงองค์ประกอบฮาร์ดแวร์บางอย่างในส่วนขยายแอป คุณจะต้องตรวจสอบว่า API นั้นพร้อมใช้งานสำหรับส่วนขยายแอปหรือไม่ (ด้วยการตรวจสอบความพร้อมใช้งานของ API ที่อธิบายข้างต้น)
งานพื้นหลังส่วนใหญ่มีข้อจำกัด : ส่วนขยายแอปไม่สามารถทำงานเบื้องหลังที่ใช้เวลานาน ยกเว้นการเริ่มต้นการอัปโหลดหรือการดาวน์โหลด ซึ่งจะอธิบายไว้ด้านล่าง
AirDrop ถูกจำกัด : ส่วนขยายแอปไม่สามารถรับ (แต่สามารถส่ง) ข้อมูลโดยใช้ AirDrop
กำลังอัปโหลด/ดาวน์โหลดในเบื้องหลัง
งานเดียวที่สามารถทำได้ในพื้นหลังคือการอัปโหลด/ดาวน์โหลด โดยใช้ NSURLSession object
หลังจากที่งานอัปโหลด/ดาวน์โหลดเริ่มต้นขึ้น ส่วนขยายสามารถดำเนินการตามคำขอของแอปโฮสต์และยุติลงโดยไม่มีผลกระทบใดๆ ต่อผลลัพธ์ของงาน หากส่วนขยายไม่ทำงานในขณะที่งานพื้นหลังเสร็จสิ้น ระบบจะเรียกใช้แอปที่มีในพื้นหลังและเรียกวิธีการรับมอบสิทธิ์ของแอ application:handleEventsForBackgroundURLSession:completionHandler:
แอปที่ส่วนขยายเริ่มต้นงาน NSURLSession
พื้นหลังต้องมีการตั้งค่าคอนเทนเนอร์ที่ใช้ร่วมกันซึ่งทั้งแอปที่มีอยู่และส่วนขยายสามารถเข้าถึงได้
อย่าลืมสร้างเซสชันพื้นหลังที่แตกต่างกันสำหรับแอปที่มีอยู่และส่วนขยายแอปแต่ละรายการ (เซสชันพื้นหลังแต่ละรายการควรมีตัวระบุที่ไม่ซ้ำกัน) นี่เป็นสิ่งสำคัญเนื่องจากมีเพียงกระบวนการเดียวเท่านั้นที่สามารถใช้เซสชันพื้นหลังในแต่ละครั้ง
การกระทำเทียบกับการแบ่งปัน
ความแตกต่างระหว่างส่วนขยาย Action และ Share นั้นไม่ชัดเจนจากมุมมองของผู้เขียนโค้ดโดยสิ้นเชิง เพราะในทางปฏิบัติจะคล้ายกันมาก เทมเพลตของ Xcode สำหรับเป้าหมายส่วนขยายการแชร์ใช้ SLComposeServiceViewController
ซึ่งมี UI มุมมองการเขียนมาตรฐานที่คุณสามารถใช้ได้สำหรับการแชร์ทางสังคม แต่ไม่จำเป็น ส่วนขยายการแชร์ยังสามารถรับช่วงโดยตรงจาก UIViewController สำหรับการออกแบบที่กำหนดเองอย่างสมบูรณ์ เช่นเดียวกับส่วนขยาย Action สามารถสืบทอดจาก SLComposeServiceViewController
ความแตกต่างระหว่างส่วนขยายทั้งสองประเภทนี้คือวิธีการใช้งาน ด้วยส่วนขยายการดำเนินการ คุณสามารถสร้างส่วนขยายที่ไม่มี UI ของตัวเองได้ (เช่น ส่วนขยายที่ใช้สำหรับการแปลข้อความที่เลือกและส่งคืนการแปลไปยังแอปโฮสต์) ส่วนขยายการแชร์ช่วยให้คุณแชร์ความคิดเห็น รูปภาพ วิดีโอ เสียง ลิงก์ และอื่นๆ ได้จากแอปโฮสต์โดยตรง UIActivityViewController
ขับเคลื่อนทั้งส่วนขยาย Action และ Share โดยที่ส่วนขยาย Share จะแสดงเป็นไอคอนสีในแถวบนสุด และส่วนขยาย Action จะแสดงเป็นไอคอนขาวดำในแถวด้านล่าง (ภาพที่ 2.1)
API ต้องห้าม
ไม่สามารถใช้ API ที่ทำเครื่องหมายในไฟล์ส่วนหัวด้วยมาโคร NS_EXTENSION_UNAVAILABLE
หรือมาโครที่คล้ายกันสำหรับความไม่พร้อมใช้งาน (เช่น กรอบงาน HealthKit และ EventKit UI ใน iOS 8 ไม่พร้อมใช้งานในส่วนขยายแอปใดๆ)
หากคุณกำลังแชร์รหัสระหว่างแอปและส่วนขยาย คุณต้องจำไว้ว่าแม้การอ้างอิง API ที่ไม่อนุญาตสำหรับส่วนขยายแอปจะนำไปสู่การปฏิเสธแอปของคุณจาก App Store คุณสามารถเลือกที่จะจัดการกับสิ่งนี้ได้โดยการจัดแบ่งกลุ่มคลาสที่แบ่งใช้ใหม่เป็นลำดับชั้น โดยมีพาเรนต์ทั่วไปและคลาสย่อยที่แตกต่างกันสำหรับเป้าหมายที่แตกต่างกัน อีกวิธีหนึ่งคือใช้ตัวประมวลผลล่วงหน้าโดยการตรวจสอบ #ifdef
เนื่องจากยังไม่มีเงื่อนไขเป้าหมายในตัว คุณต้องสร้างเงื่อนไขของคุณเอง
อีกวิธีที่ดีในการทำเช่นนี้คือการสร้างกรอบงานแบบฝังของคุณเอง เพียงตรวจสอบให้แน่ใจว่าไม่มี API ที่ไม่พร้อมใช้งานสำหรับส่วนขยาย ในการกำหนดค่าส่วนขยายแอปสำหรับการใช้เฟรมเวิร์กแบบฝัง ให้ไปที่การตั้งค่าบิลด์ของเป้าหมายและตั้งค่า "Require Only App-Extension-Safe API" เป็น ใช่ เมื่อกำหนดค่าโปรเจ็กต์ Xcode ในขั้นตอนการสร้าง Copy Files ต้องเลือก “Frameworks” เป็นปลายทางสำหรับเฟรมเวิร์กแบบฝัง หากคุณเลือกปลายทาง "SharedFrameworks" การส่งของคุณจะถูกปฏิเสธโดย App Store
หมายเหตุเกี่ยวกับความเข้ากันได้ย้อนหลัง
แม้ว่าส่วนขยายแอปจะใช้งานได้ตั้งแต่ iOS 8 เท่านั้น แต่คุณสามารถทำให้แอปที่มีอยู่ของคุณพร้อมใช้งานใน iOS เวอร์ชันก่อนหน้าได้
การปฏิบัติตามข้อกำหนดของอินเทอร์เฟซสำหรับมนุษย์ของ Apple
คำนึงถึงแนวทาง iOS Human Interface ของ Apple เมื่อออกแบบส่วนขยายแอป คุณต้องตรวจสอบให้แน่ใจว่าส่วนขยายแอปของคุณเป็นแบบสากล ไม่ว่าอุปกรณ์ใดที่แอปของคุณรองรับ เพื่อให้แน่ใจว่าส่วนขยายแอปเป็นแบบสากล ให้ใช้การตั้งค่าการสร้างตระกูลอุปกรณ์เป้าหมายใน Xcode โดยระบุค่า “iPhone/iPad” (บางครั้งเรียกว่าสากล)
บทสรุป
ส่วนขยายแอปมีผลกระทบที่มองเห็นได้ชัดเจนที่สุดใน iOS 8 เนื่องจากอุปกรณ์ 79% ใช้ iOS 8 อยู่แล้ว (ซึ่งวัดโดย App Store เมื่อวันที่ 13 เมษายน 2015) ส่วนขยายแอปจึงเป็นคุณสมบัติที่น่าทึ่งที่แอปควรใช้ประโยชน์ ด้วยการรวมข้อ จำกัด ของ API และวิธีการแบ่งปันข้อมูลระหว่างส่วนขยายและแอพที่มีอยู่ ดูเหมือนว่า Apple สามารถจัดการกับข้อร้องเรียนที่ใหญ่ที่สุดประการหนึ่งเกี่ยวกับแพลตฟอร์มโดยไม่กระทบต่อรูปแบบความปลอดภัย ยังไม่มีวิธีใดที่แอปของบุคคลที่สามจะแชร์ข้อมูลกับแอปอื่นโดยตรง แม้ว่านี่จะเป็นแนวคิดใหม่ แต่ก็ดูมีความหวังมาก