อธิบายการค้นหา iOS 9 Spotlight สำหรับนักพัฒนาซอฟต์แวร์อย่างกระจ่างแจ้ง
เผยแพร่แล้ว: 2022-03-11iOS มีจุดค้นหาสามจุด: Siri, Spotlight Search และ Safari search Siri หนึ่งในคุณสมบัติที่โดดเด่นที่สุดของ iOS คือสิ่งที่ผู้ใช้ iPhone ส่วนใหญ่คุ้นเคยอยู่แล้ว แต่หลายคนไม่รู้จักการค้นหา Spotlight ซึ่งเป็นส่วนสำคัญของ iOS มานานก่อนที่ Siri จะมีอยู่ คุณสามารถเข้าถึง Spotlight Search ได้เมื่อคุณเลื่อนหน้าจอหลักลง หรือเพิ่งเริ่มใช้ iOS 9 ปัดไปทางขวาจากหน้าจอหลักส่วนตัวของคุณ ซึ่งจะแสดงแถบค้นหาที่ด้านบนของหน้าจอ
จุดเน้นของเครื่องมือค้นหานี้ใน iOS 8 และรุ่นก่อนหน้าคือการค้นหาในโทรศัพท์เอง ดังนั้นหน้าผลการค้นหาจึงแสดงรายการแอปที่อยู่ในโทรศัพท์ของคุณ รวมทั้งอีเมล ข้อความ และรายการส่วนตัวอื่นๆ ภายในแอป Apple นอกจากนี้ยังจะแสดงคำจำกัดความของ Wikipedia หากดูเหมือนว่ามีความเกี่ยวข้อง สุดท้ายนี้มีตัวเลือกในการค้นหาเว็บผ่าน Safari เป็นขั้นตอนเพิ่มเติม
ตรงกันข้ามกับ Spotlight Search Safari คือโลกภายนอกโทรศัพท์ของคุณ ใน iOS 8 ผู้ใช้สามารถเลือกเสิร์ชเอ็นจิ้นที่จะใช้สำหรับการค้นหาใน Safari: Google, Yahoo, Bing และ DuckDuckGo โดยปกติ Google จะจัดการคำขอค้นหา Safari ส่วนใหญ่ โดยไม่คำนึงถึงเครื่องมือค้นหาที่เลือก ข้อความค้นหาที่เติมไว้ล่วงหน้าจะแสดงใน Safari ซึ่งอาจมีการจับคู่ Wikipedia
ใน iOS 9 Spotlight Search นั้นมีความโดดเด่นและมีขอบเขตที่กว้างกว่าเมื่อก่อนมาก อันที่จริง สิ่งแรกที่คุณเห็นคือ “คำแนะนำของ Siri” ตามรูปแบบการใช้งานของคุณ ตัวอย่างเช่น หากคุณใช้ Safari เป็นประจำในช่วงบ่าย Siri จะแนะนำให้คุณในช่วงเวลานั้น
และในขณะที่มันยังคงเป็นที่สำหรับค้นหา "สิ่งของในโทรศัพท์ของคุณ" มันกำลังกลายเป็นพอร์ทัลโดยตรงสำหรับ "สิ่งที่ไม่ได้อยู่ในโทรศัพท์ของคุณ" คุณเห็นสิ่งต่าง ๆ ใกล้เคียงและหัวข้อข่าวที่มาจากเว็บผ่านเครื่องมือค้นหาของ Apple เอง และผลลัพธ์ทางเว็บอื่น ๆ เพิ่งเริ่มปรากฏในขณะนี้
ใช่ Apple ได้สร้างเครื่องมือค้นหาเว็บสำหรับ iOS 9 ซึ่งเป็นขั้นตอนที่ใหญ่มาก ทักทายกับ Applebot
ในทำนองเดียวกันกับ Spotlight เป้าหมายของ Apple สำหรับ Safari ก็คือการแสดงผลลัพธ์และคำแนะนำจากดัชนีการค้นหาของ Apple ก่อนที่จะเสนอความสามารถในการค้นหาเว็บด้วย Google (หรือผู้ให้บริการรายอื่นที่เลือกไว้) สำหรับ iOS 9.1 นั้น Safari ดูเหมือนจะล้าหลังการค้นหา Spotlight โดยยังคงแสดงผลลัพธ์จากผู้ให้บริการค้นหาที่ผู้ใช้เลือกต่อไป ซึ่งอาจจะทำให้ Apple เปิดตัวฟีเจอร์การค้นหาช้าลงและมีเวลามากขึ้นในการปรับแต่งอัลกอริธึม
สิ่งที่น่าตื่นเต้นเป็นพิเศษเกี่ยวกับการเปิดตัว iOS 9 คือเป็นครั้งแรกที่นักพัฒนา iOS สามารถเชื่อมต่อกับฟังก์ชันการค้นหาเหล่านี้และรวมเนื้อหา จากภายในแอป ได้ นอกจากนี้ คำมั่นสัญญาก็คือการค้นหาจะรวมผลลัพธ์ ที่ไม่ได้อยู่บนโทรศัพท์ของผู้ใช้ใน ที่สุด นี่เป็นขั้นตอนใหญ่
ลองใส่สิ่งนี้ในบริบท เสิร์ชเอ็นจิ้นของ Google ได้ก่อให้เกิดอุตสาหกรรมทั้งหมดที่สร้างขึ้นจาก “SEO” ซึ่งเป็นกระบวนการในการเพิ่มประสิทธิภาพทรัพย์สินของคุณรอบ ๆ การค้นหาของ Google เมื่อเปิดตัวอย่างสมบูรณ์ เสิร์ชเอ็นจิ้นของ Apple จะเป็นเจ้าของตลาดการค้นหาบนมือถือประมาณ 50% ซึ่งคิดเป็น 50% (และเพิ่มขึ้น) ของปริมาณการค้นหาโดยรวม Applebot นั้นใหญ่ ซึ่งหมายความว่า "Apple Mobile Search Optimization" ก็จะใหญ่เช่นกัน
ความพยายามในการปรับให้เหมาะสมการค้นหาบนมือถือของ Apple จะมีผลกระทบอย่างมากต่อการค้นพบแอพโดยผู้ใช้มือถือมากกว่า SEO ปกติ
ยินดีต้อนรับสู่อุตสาหกรรม AMSO แรกเกิด
ข่าวร้ายก็คือการใช้คุณสมบัติทั้งหมดเหล่านี้เกี่ยวข้องกับเทคโนโลยีใหม่มากมายจาก Apple รวมถึงการเพิ่มประสิทธิภาพให้กับเทคโนโลยีเก่า และการผสมผสานขององค์ประกอบเหล่านี้อาจทำให้สับสนได้ เป้าหมายของชุดนี้คือการเดินผ่านส่วนต่างๆ และอธิบายให้ชัดเจนว่าจะนำไปปฏิบัติอย่างไร เริ่มจากสิ่งพื้นฐานและสร้างมันขึ้นมา
เพื่อสนับสนุนซีรีส์นี้ ฉันได้สร้างแอปง่าย ๆ สำหรับการอ้างอิงตลอด โครงการสามารถพบได้ที่นี่: https://github.com/rwforsythe/iOS9-Search นอกจากนี้ยังจะได้รับการอัปเดตเนื่องจากซีรีส์นี้ยังคงครอบคลุมองค์ประกอบอื่นๆ ของชุดเครื่องมือค้นหา
มูลนิธิ: CoreSpotlight Framework
เฟรมเวิร์กนี้ ซึ่งใหม่หมดใน iOS 9 ช่วยให้คุณสามารถสนับสนุนรายการต่างๆ ในดัชนีการค้นหาในเครื่องของ iPhone เพื่อให้ผู้ใช้ค้นพบได้ ตัวอย่างเช่น ก่อน iOS 9 จะสามารถค้นหาเฉพาะเนื้อหาภายในแอปอย่างเป็นทางการของ Apple เช่น ปฏิทิน ผ่านการค้นหาโดย Spotlight ตอนนี้ แอพใดๆ ที่เผยแพร่กิจกรรมในปฏิทินผ่านเฟรมเวิร์ก CoreSpotlight สามารถพบได้ผ่าน Spotlight Search และแม้แต่ Siri
โปรดทราบว่าจุดเน้นที่นี่คือข้อมูลส่วนบุคคล คุณไม่ต้องการให้ผู้ใช้พบกิจกรรมในปฏิทินส่วนตัวของคุณในโทรศัพท์เครื่องอื่น! Apple ชัดเจนมากว่าเฟรมเวิร์ก CoreSpotlight โต้ตอบกับดัชนีส่วนตัวบนโทรศัพท์ของแต่ละคนโดยเฉพาะ ไม่สามารถใช้ CoreSpotlight API เพื่อเผยแพร่เนื้อหานอกดัชนีของโทรศัพท์ได้
นั่นไม่ได้หมายความว่าไม่สามารถใช้ CoreSpotlight เพื่อจัดทำดัชนีข้อมูลสาธารณะอยู่แล้ว เป็นไปได้ที่จะใช้ CoreSpotlight เพื่อดึงข้อมูลจากคลาวด์และใส่ลงในดัชนีการค้นหาของโทรศัพท์ มันเป็นเพียงการรับประกันจาก Apple ว่าหากข้อมูลส่วนตัวและข้อมูลที่เป็นความลับได้รับการจัดทำดัชนีด้วย CoreSpotlight ข้อมูลนั้นจะถูกเก็บไว้เป็นความลับ
กรอบงานมาในสองส่วน: ออบเจ็กต์ CSSearchableItemAttributeSet ที่อนุญาตให้แอปอธิบายแต่ละรายการโดยละเอียด และอ็อบเจ็กต์ CSSearchableItem ที่ใช้เพื่อให้รายการมี ID ที่ไม่ซ้ำ รายการสปอตไลท์แต่ละรายการประกอบด้วยวัตถุเหล่านี้คู่หนึ่ง เหตุผลในการใช้สองออบเจ็กต์แทนที่จะเป็นหนึ่งออบเจ็กต์คือออบเจ็กต์ CSSearchableItemAttributeSet ใช้สำหรับการค้นหาแบบโต้ตอบประเภทอื่น (อธิบายในภายหลัง)
มันค่อนข้างง่ายที่จะทำพื้นฐาน
สำหรับผู้ที่อ้างอิงโค้ดตัวอย่าง การตั้งค่า CoreSpotlight ทำได้ใน AppDelegate
… @import CoreSpotlight; @import MobileCoreServices; …
สองโมดูลนี้จำเป็นสำหรับการทำงานใหม่
เพื่อความง่ายในแอปสาธิต จะ ใช้เมธอด application:didFinishLaunchingWithOptions: เพื่อเรียกเมธอดเฉพาะสำหรับการตั้งค่า CoreSpotlight:
if ([CSSearchableItemAttributeSet class]) [self setUpCoreSpotlight]; //Check for iOS version that supports CoreSpotlight API
เลื่อนลงไปที่เมธอด setUpCoreSpotlight เราเริ่มกระบวนการโดยสร้างวัตถุ CSSearchableItemAttributeSet :
CSSearchableItemAttributeSet * attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeItem];
ประเภทเนื้อหา มีความสำคัญเนื่องจากควรจะควบคุมวิธีการทั่วไปที่รายการได้รับการปฏิบัติโดยอัลกอริธึมการค้นหา “สมมุติ” เป็นคำที่ใช้ได้ผล เนื่องจากเป็นพื้นที่ที่ Apple ไม่ได้จัดทำเป็นเอกสารไว้อย่างดี มีเมนูประเภทรายการให้เลือกมากมาย (ประเภทรูปภาพ, ประเภทวิดีโอ, ประเภทเสียง, ประเภทการติดต่อ) แต่จำเป็นต้องมีการทดลองใช้และข้อผิดพลาดเพื่อกำหนดผลกระทบ (ถ้ามี) ที่มีต่อประสบการณ์ของผู้ใช้ บางประเภทอาจแสดงเนื้อหาข้อความมากกว่าประเภทอื่นเมื่อแสดงในผลการค้นหา นอกจากนี้ยังสามารถส่งผลกระทบต่อการแสดงภาพขนาดย่อพร้อมกับผลลัพธ์ kUTTypeItem เป็นจุดเริ่มต้นที่ดี
ตอนนี้อธิบายวัตถุในรายละเอียดเพิ่มเติม:
attributeSet.displayName = @"A Christmas Carol"; attributeSet.title = @"A Christmas Carol By Charles Dickens"; //Sounds similar to displayName but is not displayed to user attributeSet.contentDescription = @"Who would dare to say “Bah! Humbug” after reading A Christmas Carol? Charles Dickens wrote the novella in just six weeks before it was first published on December 19 1843 but his morality tale about a bitter old miser named Ebenezer Scrooge lives on to this day as a reminder of the importance of the Christmas spirit."; attributeSet.keywords = @[@"A Christmas Carol", @"Charles Dickens", @"Victorian Literature"]; UIImage *image = [UIImage imageNamed:@"CC-Cover"]; NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation(image)]; attributeSet.thumbnailData = imageData;
มีคุณสมบัติที่เป็นไปได้มากมาย โดยเฉพาะสำหรับประเภทสื่อ เช่น รูปภาพ วิดีโอ และอื่นๆ ข้อมูลเพิ่มเติมน่าจะดีกว่า แต่จำเป็นต้องลองผิดลองถูกเพื่อพิจารณาว่าข้อมูลใดถูกใช้จริงและ/หรือแสดงในผลการค้นหา ตัวอย่างเช่น ในขณะที่เขียน การให้ดาวดูเหมือนจะไม่แสดงสำหรับรายการดัชนีที่ระบุ แม้ว่าชุดแอตทริบิวต์จะมีข้อมูลการจัดระดับดาวก็ตาม

คุณสมบัติข้อความส่วนใหญ่จะรวมอยู่ในคำค้นหา ดังนั้นแม้ว่าคุณสมบัติหัวเรื่องจะไม่ปรากฏ แต่สามารถค้นหาข้อความได้ผ่านการค้นหา ดังนั้นจึงไม่ชัดเจนนักว่าพร็อพเพอร์ตี้ของคีย์เวิร์ดมีความแตกต่างโดยพื้นฐานจากคุณสมบัติของชื่ออย่างไร
ดูเอกสารของ Apple สำหรับข้อมูลเพิ่มเติม: developer.apple.com
ขั้นตอนสุดท้ายคือการทำแพ็กเกจ CSSearchableItemAttributeSet ด้วย CSSearchableItem และลงทะเบียนกับดัชนี
CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:@”https://www.notestream.com/streams/564159e4e5c24” domainIdentifier:@"notestream.com" attributeSet:attributeSet];
สองสิ่งใหม่ที่นี่ คุณสมบัติ domainIdentifier อนุญาตให้คุณจัดกลุ่มไอเท็มเข้าด้วยกันสำหรับการดำเนินการแบบแบตช์ ตัวอย่างเช่น @“meetingItem” และ @”reminderItem” ในแอปปฏิทินจะอนุญาตให้คุณลบรายการ Spotlight ทั้งหมดประเภทหนึ่งในขณะที่ออกจากรายการอื่น
คุณสมบัติ uniqueIdentifier มีบทบาทสำคัญยิ่งกว่า ขั้นแรก ข้อมูลจะถูกส่งกลับไปยังแอปของคุณเมื่อผู้ใช้คลิกที่รายการในดัชนี CoreSpotlight (จะกล่าวถึงในภายหลัง) ประการที่สอง มีคำแนะนำจาก Apple เกี่ยวกับลักษณะนี้เมื่อใช้องค์ประกอบอื่นๆ ของโครงสร้างพื้นฐานการค้นหา สำหรับตอนนี้ เราจะใช้สตริงที่อันที่จริงแล้วเป็น URL ที่แสดงถึงรายการนี้โดยเฉพาะ ในทางเทคนิค คุณสมบัตินี้อาจเป็นสตริงใดก็ได้ ตราบใดที่คุณสมบัตินี้ไม่ซ้ำกับรายการ
ขั้นตอนสุดท้าย: ผลักดันรายการที่คุณสร้างลงในดัชนีจริง
[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item1, item2, item3] completionHandler: ^(NSError * __nullable error) { if (!error) NSLog(@"Search item(s) journaled for indexing."); }];
สองสามจุดที่ต้องทำที่นี่:
วิธีนี้ใช้อาร์เรย์ของอ็อบเจ็กต์ (และมีวิธีการอื่นที่สามารถใช้เพื่อแบทช์กระบวนการหากมีข้อมูลจำนวนมากที่จะสร้างดัชนี)
สิ่งสำคัญคือต้องตระหนักว่าวิธีนี้ไม่ได้ทำให้กระบวนการสร้างดัชนีเสร็จสมบูรณ์ ตัวจัดการความสมบูรณ์จะถูกเรียกก็ต่อเมื่อรายการค้นหาของคุณอยู่ในคิวเพื่อทำดัชนี ใช้ CSSearchableIndexDelegate เพื่อจัดการกับสถานการณ์ที่กระบวนการสร้างดัชนีเองล้มเหลวด้วยเหตุผลบางประการ และแอปของคุณต้องจัดการกับสถานการณ์
ขอแสดงความยินดี คุณได้เพิ่มรายการลงในดัชนีการค้นหา CoreSpotlight ของโทรศัพท์แล้ว
การค้นหาทำงานอย่างไรใน iOS 9
โดยปกติ Apple จะเก็บอัลกอริธึมการค้นหาไว้ใกล้ตัว ดังนั้นจึงคุ้มค่าที่จะติดตั้งแอพตัวอย่างและลองใช้คีย์เวิร์ด ตัวอย่างเช่น เห็นได้ชัดว่า Apple กำลังเพิ่มผลลัพธ์ที่นำเสนอโดยให้ผลลัพธ์ที่แตกต่างกันมากเมื่อผู้ใช้พิมพ์ตัวอักษรแต่ละตัว:
ดูเหมือนว่าหลักการคือผลลัพธ์ที่คิดว่าเหมาะสมกว่าจะถูกนำเสนอหลังจากพิมพ์ตัวอักษรเพียงไม่กี่ตัว เมื่อผู้ใช้พิมพ์ตัวอักษรมากขึ้น ผลลัพธ์ในช่วงแรกๆ เหล่านั้นก็จะหายไป และสิ่งอื่น ๆ (ซึ่งเดิมคาดว่าจะมีโอกาสน้อยกว่า) จะถูกนำเสนอแทน
โดยทั่วไปแล้ว Apple มีเพียงไม่กี่สิ่งที่จะพูดเกี่ยวกับวิธีการปรับปรุงการจัดอันดับภายใต้อัลกอริทึมของพวกเขา หน้านี้ประกอบด้วยคำแนะนำของ Apple: ปรับปรุงผลการค้นหาของคุณ
ประเด็นสำคัญประการหนึ่งจากเอกสารประกอบของ Apple คือการจัดอันดับจะดีขึ้นเมื่อแอปใช้เทคโนโลยีการค้นหาที่หลากหลายเพื่อสร้างดัชนีเนื้อหา เราจะเจาะลึกถึงเทคโนโลยีอื่นๆ เหล่านี้ในบทความหน้า ในขณะเดียวกัน เรายังต้องใช้โค้ดเพื่อจัดการกับสถานการณ์เมื่อผู้ใช้คลิกที่ผลการค้นหา
เมื่อผู้ใช้คลิก
เราได้สร้างโค้ดเพื่อเติมดัชนีด้วยผลการค้นหาที่เป็นไปได้ แต่จะเกิดอะไรขึ้นเมื่อผู้ใช้คลิกที่ผลลัพธ์ คำตอบคือ CoreSpotlight ยืมเมธอด application:continueUserActivity:restorationHandler:
จากโปรโตคอล UIApplicationDelegate นี้ถูกนำมาใช้ใน iOS 8 สำหรับกลไกแฮนด์ออฟที่อนุญาตให้ส่งกิจกรรมของผู้ใช้จากอุปกรณ์หนึ่งไปยังอีกอุปกรณ์หนึ่ง (เช่น ผู้ใช้เห็น URL ของเว็บบน iWatch ใช้แฮนด์ออฟเพื่อรับบนเบราว์เซอร์ Safari ของ iPhone และดูในที่สุด บน Mac เมื่อไปถึงที่ทำงาน)
ความท้าทายแรกคือการพิจารณาว่าวิธีการนั้นถูกเรียกเนื่องจากกิจกรรมแฮนด์ออฟหรือจากการค้นหาโดย Spotlight คุณสมบัติ activityType ของพารามิเตอร์กิจกรรมจะบอกคุณ แต่ถ้ารหัสอาจทำงานบน iOS 8 คุณจะต้องหลีกเลี่ยงความผิดพลาดในกรณีนั้น
โค้ดง่ายๆ อาจมีลักษณะดังนี้:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)activity restorationHandler:(void (^)(NSArray *))restorationHandler { NSString * valueCSSearchableItemActionType; BOOL wasHandled = NO; if ([CSSearchableItemAttributeSet class]) //iOS 9 { valueCSSearchableItemActionType = CSSearchableItemActionType; } else { // iOS 8 – This method was introduced in iOS 8, so iOS 7 is not a possible scenario valueCSSearchableItemActionType = @"not supported"; } if ([activity.activityType isEqual: valueCSSearchableItemActionType]) { // Invoked via CoreSpotlight, we can assume iOS 9 from now on… NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier]; wasHandled = YES; NSLog(@"Continuing user activity %@", activityIdentifier); } else { //the app was launched via Handoff protocol //or with a Universal Link } return wasHandled; }
สังเกตบรรทัดของรหัส:
NSString * activityIdentifier = [activity.userInfo valueForKey:CSSearchableItemActivityIdentifier];
สิ่งนี้จะแยกตัวระบุเฉพาะที่วางไว้ในดัชนีสปอตไลท์เมื่อสร้างวัตถุ CSSearchableItem โดยปกติ แอปของคุณควรใช้ตัวระบุที่ไม่ซ้ำกันนี้เพื่อนำเสนอเนื้อหาที่พวกเขาเลือกจากดัชนีการค้นหาแก่ผู้ใช้ เพื่อความง่ายในที่นี้ เราแค่ NSLog ตัวระบุเฉพาะ
สรุป
จนถึงตอนนี้ เราได้ตรวจสอบฟังก์ชันการค้นหาของ iOS 9 เพียงส่วนเดียว เราได้ใช้ฟังก์ชันหลักที่จำเป็นในการโหลดดัชนีการค้นหา Spotlight ของโทรศัพท์ด้วยสิ่งที่ผู้ใช้อาจพบว่ามีประโยชน์ เช่น เอกสาร รายการปฏิทิน รายชื่อติดต่อ และอื่นๆ เมื่อผู้ใช้ค้นหาบางสิ่ง เห็นผลลัพธ์จากแอพของคุณและคลิกที่มัน แอพจะสามารถจัดการคำขอและแสดงรายการที่เหมาะสมสำหรับผู้ใช้
สิ่งที่เรายังไม่ได้พูดถึงคือเทคโนโลยีที่เกี่ยวข้องกับดัชนีสาธารณะที่ Apple กำลังสร้าง ดัชนีนี้มีขึ้นเพื่อให้ผู้ใช้ค้นหาเนื้อหาในแอปของคุณได้โดยไม่ต้องติดตั้งบนโทรศัพท์ เราจะแก้ไขปัญหานั้นในโพสต์ถัดไป