Upload
mailru-group
View
3.580
Download
0
Embed Size (px)
Citation preview
iOS 9 Search
14 %
86 %
Приложения
Веб
Время проводимое в приложениях и веб
Разработчики сами выбирают какой контент индексировать
Результаты поиска появляются в Spotlight и Safari
Результаты поиска видны даже когда приложение не установлено
Поиск в приложении Три доступных API
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
NSUserActivity + Search
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];
serviceActivity.titleattributeSet. contentDescription
attributeSet. thumbnailData
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
NSUserActivity + Public Indexing
serviceActivity.webpageURL = [NSURL URLWithString:service.webpageURL];
- (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
Core Spotlight
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
Core Spotlight
CSSearchableItem CSSearchableItemAttributeSet
CSSearchableIndex
Item 1 Item 2 Item 3 Item 4 Item 5
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];
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
Сами добавляем и удаляем CSSearchableItem
Core Spotlight vs NSUserActivity index
CSSearchableItem не имеет срока жизни
Индексация большого объема данных
Методы делегата и дополнения
Core Spotlight vs NSUserActivity index
NSUserActivity
Core Spotlight
NSUserActivity CoreSpotlight Web Markup
Просмотренныйконтент приложения
Любой контент приложения
Контент приложения в вебе
Web markup
Позволить Apple находить ваш сайт
Сайт имеет необходимую разметку для deep link
Приложение поддерживает обработку deep link
Контент структурирован по специальной форме
Web markupПозволить Apple находить ваш сайт
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
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 } }
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
Web markupКонтент структурирован по специальной форме
Итоги
NSUserActivity CoreSpotlight Web Markup
Спасибо!
Давид Лашхи [email protected]