2015-09-15

Search APIsとは

アプリの内容をSpotlightから検索し、検索結果からアプリに移動できる機能

Search APIsの種類

  • NSUserActivity API

iOS8で追加されたHandoff用のNSUserActivityクラスを利用する

  • CoreSpotlight API

iOS9で追加されたCoreSpotlight.frameworkを利用する

  • Web Markup API

アプリ側の対応ではなく関連ウェブページで対応

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;
//このuserInfoが重要
activity.userInfo = @{@"key1" : @"value1",
@"key2" : @"value2"};
activity.requiredUserInfoKeys = [NSSet setWithArray:@[@"key1", @"key2"]];
// 30日間有効
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"])
{
//userActivity.userInfoを用いて画面表示
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"];

//このuniqueIdentifierが重要
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])
{
//検索インデックスに登録時に指定したuniqueIdentifierを取得
NSString *uniqueIdentifier = userActivity.userInfo[CSSearchableItemActivityIdentifier];

//uniqueIdentifierを用いて画面表示
return YES;
}

return NO;
}

参考:iOS Search API Best Practices and FAQs

Share

Comments