개발자를 위한 iOS 9 Spotlight 검색 이해하기
게시 됨: 2022-03-11iOS에는 Siri, Spotlight 검색 및 Safari 검색의 세 가지 검색 포인트가 내장되어 있습니다. iOS의 가장 상징적인 기능 중 하나인 Siri는 대부분의 iPhone 사용자에게 이미 친숙한 기능입니다. 그러나 많은 사람들은 Spotlight 검색에 대해 알지 못합니다. 이는 Siri가 존재하기 오래 전에 iOS의 필수적인 부분이었습니다. Spotlight 검색은 홈 화면을 아래로 밀거나 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와 유사한 맥락에서, Safari에 대한 Apple의 명시된 목표는 Google(또는 기타 선택한 제공업체)을 통해 웹을 검색할 수 있는 기능을 제공하기 전에 Apple의 검색 색인에서 결과와 제안을 표시하는 것입니다. 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 프레임워크
iOS 9에서 완전히 새로운 이 프레임워크를 사용하면 사용자가 검색할 수 있도록 iPhone의 로컬 검색 색인에 항목을 제공할 수 있습니다. 예를 들어 iOS 9 이전에는 캘린더와 같은 공식 Apple 앱 내의 콘텐츠만 Spotlight 검색을 통해 찾을 수 있었습니다. 이제 CoreSpotlight 프레임워크를 통해 캘린더 이벤트를 게시하는 모든 앱은 Spotlight Search 및 Siri를 통해 찾을 수 있습니다.
여기서는 개인 정보에 중점을 둡니다. 다른 전화에서 사용자가 개인 캘린더 이벤트를 찾는 것을 원하지 않습니다! Apple은 CoreSpotlight 프레임워크가 각 개인의 휴대전화에 있는 비공개 색인과 독점적으로 상호 작용한다는 점을 매우 명확하게 알고 있습니다. CoreSpotlight API를 사용하여 전화기 자체 색인 외부에 콘텐츠를 게시하는 것은 불가능합니다.
그렇다고 CoreSpotlight가 이미 공개된 정보를 색인화하는 데 사용할 수 없다는 의미는 아닙니다. CoreSpotlight를 사용하여 클라우드에서 정보를 가져와 전화의 검색 색인에 넣는 것은 확실히 가능합니다. 개인 및 기밀 정보가 CoreSpotlight로 인덱싱되면 기밀로 유지된다는 Apple의 보증일 뿐입니다.
프레임워크는 앱이 각 항목을 자세히 설명할 수 있도록 하는 CSSearchableItemAttributeSet 개체와 항목에 고유한 ID를 부여하는 데 사용되는 CSSearchableItem 개체의 두 부분으로 제공됩니다. 각 Spotlight 항목은 이러한 개체 쌍으로 구성됩니다. 하나가 아닌 두 개의 개체를 사용하는 이유는 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];
콘텐츠 유형 은 항목이 검색 알고리즘에 의해 처리되는 일반적인 방법을 제어해야 하므로 중요합니다. "Supposed"는 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;
이미지, 비디오 등과 같은 미디어 유형에 따라 가능한 속성이 많이 있습니다. 더 많은 정보가 더 나을 수 있지만 실제로 사용되거나 검색 결과에 표시되는 정보를 결정하려면 시행착오가 필요합니다. 예를 들어 작성 당시에는 attributeSet에 별표 평점 데이터가 포함되어 있어도 지정된 색인 항목에 대해 별표 평점이 표시되지 않는 것 같습니다.

대부분의 텍스트 속성은 검색 쿼리에 포함되어 있으므로 제목 속성이 표시되지 않더라도 검색을 통해 텍스트를 찾을 수 있습니다. 따라서 키워드 속성이 제목 속성과 근본적으로 어떻게 다른지 완전히 명확하지 않습니다.
자세한 내용은 Apple 문서를 참조하십시오. developer.apple.com
마지막 단계는 CSSearchableItem 과 함께 CSSearchableItemAttributeSet 을 패키징하고 인덱스에 등록하는 것입니다.
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가 UIApplicationDelegate 프로토콜에서 application:continueUserActivity:restorationHandler:
메소드를 차용한다는 것입니다. 이것은 원래 iOS 8에서 사용자 활동이 기기에서 기기로 전달될 수 있도록 하는 핸드오프 메커니즘을 위해 도입되었습니다(예: 사용자가 iWatch에서 웹 URL을 보고, 핸드오프를 사용하여 iPhone Safari 브라우저에서 선택하고, 궁극적으로 볼 수 있음) 사무실에 도착하면 Mac에서.)
첫 번째 과제는 메서드가 Handoff 활동으로 인해 호출되었는지 아니면 Spotlight Search에서 호출되었는지 확인하는 것입니다. 활동 매개변수의 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이 구축하고 있는 공개 지수와 관련된 기술입니다. 이 색인은 사용자가 휴대전화에 앱을 설치하지 않고도 앱에서 콘텐츠를 찾을 수 있도록 하기 위한 것입니다. 다음 포스트에서 다루도록 하겠습니다.