Давид Лашхи, Поиск в ios 9
TRANSCRIPT
![Page 1: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/1.jpg)
iOS 9 Search
![Page 2: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/2.jpg)
14 %
86 %
Приложения
Веб
Время проводимое в приложениях и веб
![Page 3: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/3.jpg)
Разработчики сами выбирают какой контент индексировать
Результаты поиска появляются в Spotlight и Safari
Результаты поиска видны даже когда приложение не установлено
![Page 4: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/4.jpg)
Поиск в приложении Три доступных API
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
![Page 5: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/5.jpg)
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
NSUserActivity + Search
![Page 6: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/7.jpg)
serviceActivity.titleattributeSet. contentDescription
attributeSet. thumbnailData
![Page 8: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/9.jpg)
NSUserActivity + Public Indexing
serviceActivity.webpageURL = [NSURL URLWithString:service.webpageURL];
![Page 10: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/10.jpg)
- (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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/11.jpg)
Core Spotlight
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
![Page 12: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/12.jpg)
Core Spotlight
CSSearchableItem CSSearchableItemAttributeSet
CSSearchableIndex
Item 1 Item 2 Item 3 Item 4 Item 5
![Page 13: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/15.jpg)
Сами добавляем и удаляем CSSearchableItem
Core Spotlight vs NSUserActivity index
CSSearchableItem не имеет срока жизни
Индексация большого объема данных
Методы делегата и дополнения
![Page 16: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/16.jpg)
Core Spotlight vs NSUserActivity index
NSUserActivity
Core Spotlight
![Page 17: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/17.jpg)
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
![Page 18: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/18.jpg)
Web markup
Позволить Apple находить ваш сайт
Сайт имеет необходимую разметку для deep link
Приложение поддерживает обработку deep link
Контент структурирован по специальной форме
![Page 19: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/19.jpg)
Web markupПозволить Apple находить ваш сайт
![Page 20: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/23.jpg)
Web markupКонтент структурирован по специальной форме
![Page 24: Давид Лашхи, Поиск в iOS 9](https://reader031.vdocuments.net/reader031/viewer/2022022205/58d13e501a28ab455d8b542d/html5/thumbnails/24.jpg)
Итоги
NSUserActivity CoreSpotlight Web Markup