Search APIsとは
アプリの内容をSpotlightから検索し、検索結果からアプリに移動できる機能
Search APIsの種類
iOS8で追加されたHandoff用のNSUserActivityクラスを利用する
iOS9で追加されたCoreSpotlight.frameworkを利用する
アプリ側の対応ではなく関連ウェブページで対応
NSUserActivity APIの実装例
まず検索インデックスに登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| - (void)addToSearchableIndex { if (NSClassFromString(@"NSUserActivity")) { NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"info.hmhv.myapp.search"]; activity.title = @"タイトル"; activity.webpageURL = [NSURL URLWithString:@"http://hmhv.info"];;
if ([activity respondsToSelector:@selector(setEligibleForSearch:)]) { activity.eligibleForSearch = YES; activity.keywords = [NSSet setWithArray:@[@"keyword1", @"keyword2"]];
activity.needsSave = YES; activity.userInfo = @{@"key1" : @"value1", @"key2" : @"value2"}; activity.requiredUserInfoKeys = [NSSet setWithArray:@[@"key1", @"key2"]]; activity.expirationDate = [NSDate dateWithTimeIntervalSinceNow:(60 * 60 * 24 * 30)]; } [activity becomeCurrent]; self.userActivity = activity; } }
|
検索結果がタップされたらAppDelegateで処理する
1 2 3 4 5 6 7 8 9 10
| - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:@"info.hmhv.myapp.search"]) { return YES; } return NO; }
|
CoreSpotlight APIの実装例
まず検索インデックスに登録
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #import <CoreSpotlight/CoreSpotlight.h>
...
- (void)addToSearchableIndex { CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeText]; attributeSet.title = @"タイトル"; attributeSet.contentDescription = @"説明文"; attributeSet.keywords = @[@"keyword1", @"keyword2"]; NSString *uniqueIdentifier = [NSString stringWithFormat:@"myapp://hmhv.info/%@", self.recordId];
CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:uniqueIdentifier domainIdentifier:@"info.hmhv.myapp.search" attributeSet:attributeSet]; [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler: ^(NSError * __nullable error) { NSLog(@"Search item indexed (%@)", error); }]; }
|
検索結果がタップされたらAppDelegateで処理する
1 2 3 4 5 6 7 8 9 10 11 12 13
| - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:CSSearchableItemActionType]) { NSString *uniqueIdentifier = userActivity.userInfo[CSSearchableItemActivityIdentifier]; return YES; } return NO; }
|
参考:iOS Search API Best Practices and FAQs