25
iOS 9 Search

Давид Лашхи, Поиск в iOS 9

Embed Size (px)

Citation preview

Page 1: Давид Лашхи, Поиск в iOS 9

iOS 9 Search

Page 2: Давид Лашхи, Поиск в iOS 9

14 %

86 %

Приложения

Веб

Время проводимое в приложениях и веб

Page 3: Давид Лашхи, Поиск в iOS 9

Разработчики сами выбирают какой контент индексировать

Результаты поиска появляются в Spotlight и Safari

Результаты поиска видны даже когда приложение не установлено

Page 4: Давид Лашхи, Поиск в iOS 9

Поиск в приложении Три доступных API

NSUserActivity CoreSpotlight Web Markup

Просмотренныйконтент приложения

Любой контент приложения

Контент приложения в вебе

Page 5: Давид Лашхи, Поиск в iOS 9

NSUserActivity CoreSpotlight Web Markup

Просмотренныйконтент приложения

Любой контент приложения

Контент приложения в вебе

NSUserActivity + Search

Page 6: Давид Лашхи, Поиск в iOS 9

NSUserActivity + Search

NSDictionary *userInfoDictionary = @{@"id":[NSString stringWithFormat:@"service-%@",service.serviceId]}; NSUserActivity *serviceActivity = [[NSUserActivity alloc] initWithActivityType:serviceDomainIdentifier]; serviceActivity.title = service.title; serviceActivity.userInfo = userInfoDictionary; serviceActivity.keywords =[NSSet setWithArray:service.keywords]; serviceActivity.webpageURL = [NSURL URLWithString:service.webpageURL]; serviceActivity.requiredUserInfoKeys =[NSSet setWithObject:userInfoDictionary];

serviceActivity.contentAttributeSet = attributeSet;

CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeCompositeContent]; attributeSet.title = service.title; attributeSet.contentDescription = service.contentDescription; attributeSet.relatedUniqueIdentifier = [NSString stringWithFormat:@"service-%@",service.serviceId];

Page 7: Давид Лашхи, Поиск в iOS 9

serviceActivity.titleattributeSet. contentDescription

attributeSet. thumbnailData

Page 8: Давид Лашхи, Поиск в iOS 9

CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeCompositeContent]; attributeSet.title = service.title; attributeSet.contentDescription = service.contentDescription; attributeSet.relatedUniqueIdentifier = [NSString stringWithFormat:@“service-%@",service.serviceId];

NSDictionary *userInfoDictionary = @{@"id":[NSString stringWithFormat:@"service-%@",service.serviceId]}; NSUserActivity *serviceActivity = [[NSUserActivity alloc] initWithActivityType:serviceDomainIdentifier]; serviceActivity.title = service.title; serviceActivity.userInfo = userInfoDictionary; serviceActivity.keywords =[NSSet setWithArray:service.keywords];

serviceActivity.webpageURL = [NSURL URLWithString:service.webpageURL]; serviceActivity.requiredUserInfoKeys =[NSSet setWithObject:userInfoDictionary]; serviceActivity.contentAttributeSet = attributeSet;serviceActivity.eligibleForSearch = YES;serviceActivity.eligibleForPublicIndexing = YES;

NSUserActivity + Search

Page 9: Давид Лашхи, Поиск в iOS 9

NSUserActivity + Public Indexing

serviceActivity.webpageURL = [NSURL URLWithString:service.webpageURL];

Page 10: Давид Лашхи, Поиск в iOS 9

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:serviceDomainIdentifier]) {

NSString *identifierPath = [NSString stringWithFormat:@"%@",[userActivity.userInfo objectForKey:@"id"]]; [self continueActivityForItemWith:identifierPath]; return YES; } return NO; }

NSUserActivity delegate

NSUserActivity *serviceActivity = [[NSUserActivity alloc] initWithActivityType:serviceDomainIdentifier]; serviceDomainIdentifier

Page 11: Давид Лашхи, Поиск в iOS 9

Core Spotlight

NSUserActivity CoreSpotlight Web Markup

Просмотренныйконтент приложения

Любой контент приложения

Контент приложения в вебе

Page 12: Давид Лашхи, Поиск в iOS 9

Core Spotlight

CSSearchableItem CSSearchableItemAttributeSet

CSSearchableIndex

Item 1 Item 2 Item 3 Item 4 Item 5

Page 13: Давид Лашхи, Поиск в iOS 9

Core Spotlight

CSSearchableItemAttributeSet *attributeSetPizza = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeCompositeContent]; attributeSet.title = @"Пицца"; attributeSet.contentDescription = @“Заказать пиццу”; attributeSet.keywords = [NSArray arrayWithObjects:@"пицца", @"pizza", @"🍕 ", nil];

CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:uniqueIdentifierPizza domainIdentifier:restaurantTypeDomainIdentifier attributeSet:attributeSetPizza];

[[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:[NSArray arrayWithObjects:item1, item2] completionHandler:^(NSError * _Nullable error) { NSLog(@"Search item indexed"); }];

CSSearchableItemAttributeSet *attributeSetSushi = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(NSString *)kUTTypeCompositeContent]; attributeSet.title = @"Суши"; attributeSet.contentDescription = @“Заказать суши”; attributeSet.keywords = [NSArray arrayWithObjects:@"суши", @"susi", @"🍣 ", nil];

CSSearchableItem *item2 = [[CSSearchableItem alloc] initWithUniqueIdentifier:uniqueIdentifierSushi domainIdentifier:restaurantTypeDomainIdentifier attributeSet:attributeSetSushi];

Page 14: Давид Лашхи, Поиск в iOS 9

Core Spotlight Restore

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { if ([userActivity.activityType isEqualToString:CSSearchableItemActionType]) { NSString * identifierPath = [NSString stringWithFormat:@"%@",[userActivity.userInfo objectForKey:CSSearchableItemActivityIdentifier]]; [self continueActivityForItemWith:identifierPath]; return YES; }

return NO; }

CSSearchableItem *item1 = [[CSSearchableItem alloc] initWithUniqueIdentifier:uniqueIdentifierPizza domainIdentifier:restaurantTypeDomainIdentifier attributeSet:attributeSetPizza];

uniqueIdentifierPizza

Page 15: Давид Лашхи, Поиск в iOS 9

Сами добавляем и удаляем CSSearchableItem

Core Spotlight vs NSUserActivity index

CSSearchableItem не имеет срока жизни

Индексация большого объема данных

Методы делегата и дополнения

Page 16: Давид Лашхи, Поиск в iOS 9

Core Spotlight vs NSUserActivity index

NSUserActivity

Core Spotlight

Page 17: Давид Лашхи, Поиск в iOS 9

NSUserActivity CoreSpotlight Web Markup

Просмотренныйконтент приложения

Любой контент приложения

Контент приложения в вебе

Page 18: Давид Лашхи, Поиск в iOS 9

Web markup

Позволить Apple находить ваш сайт

Сайт имеет необходимую разметку для deep link

Приложение поддерживает обработку deep link

Контент структурирован по специальной форме

Page 19: Давид Лашхи, Поиск в iOS 9

Web markupПозволить Apple находить ваш сайт

Page 20: Давид Лашхи, Поиск в iOS 9

Web markupСайт имеет необходимую разметку для deep link

<meta name="myApp" content="app-id=123,app-argument=http://example.com/about”>

Delivery ClubView

GET — On the App Store

https://www.delivery-club.ru/pizza

Page 21: Давид Лашхи, Поиск в iOS 9

Web markupПриложение поддерживает обработку deep link

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options { NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES]; NSString *path = components.path; NSString *query = components.query; if ([path isEqualToString:@"/pizza"]) { //go to pizza controller passing query } }

Page 22: Давид Лашхи, Поиск в iOS 9

Web markupКонтент структурирован по специальной форме

<meta property="og:image" content="http://example.com/hello.jpg"> <meta property="og:audio" content="http://example.com/music.m4a"> <meta property="og:video" content="http://example.com/cats.mp4">

Open Graph

<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/ AggregateRating"> <span itemprop="ratingValue">4</span> stars - <span itemprop="reviewCount">250</span> reviews </div>

schema.org

Page 23: Давид Лашхи, Поиск в iOS 9

Web markupКонтент структурирован по специальной форме

Page 24: Давид Лашхи, Поиск в iOS 9

Итоги

NSUserActivity CoreSpotlight Web Markup

Page 25: Давид Лашхи, Поиск в iOS 9

Спасибо!

Давид Лашхи [email protected]