SlideShare ist ein Scribd-Unternehmen logo
1 von 25
Downloaden Sie, um offline zu lesen
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.title
attributeSet.

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 Club
View
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
Спасибо!
Давид Лашхи
lashkhi@me.com

Weitere ähnliche Inhalte

Andere mochten auch

Upstream Kennissessie sdl65: Project re:DDS Amsterdam Museum
Upstream Kennissessie sdl65: Project re:DDS Amsterdam MuseumUpstream Kennissessie sdl65: Project re:DDS Amsterdam Museum
Upstream Kennissessie sdl65: Project re:DDS Amsterdam MuseumTjarda de Haan
 
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 |  Shazam, Alexey OvcharovTargetSummit Moscow Late 2016 |  Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 | Shazam, Alexey OvcharovTargetSummit
 
Piezoelectric sens0 r
Piezoelectric sens0 rPiezoelectric sens0 r
Piezoelectric sens0 rvishal gupta
 
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.Webs.nl B2B Inbound Marketing
 
Проект "Збережемо природу разом"
Проект   "Збережемо природу разом" Проект   "Збережемо природу разом"
Проект "Збережемо природу разом" Viktoria Oliynuk
 
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...Indian dental academy
 
Feasibility study format
Feasibility study formatFeasibility study format
Feasibility study formattellstptrisakti
 
[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and TeamsAlexey Ivanov
 
Content Republic Methodologie
Content Republic MethodologieContent Republic Methodologie
Content Republic Methodologiecontentrepublic
 

Andere mochten auch (13)

Upstream Kennissessie sdl65: Project re:DDS Amsterdam Museum
Upstream Kennissessie sdl65: Project re:DDS Amsterdam MuseumUpstream Kennissessie sdl65: Project re:DDS Amsterdam Museum
Upstream Kennissessie sdl65: Project re:DDS Amsterdam Museum
 
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 |  Shazam, Alexey OvcharovTargetSummit Moscow Late 2016 |  Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
 
Patch Management
Patch ManagementPatch Management
Patch Management
 
Piezoelectric sens0 r
Piezoelectric sens0 rPiezoelectric sens0 r
Piezoelectric sens0 r
 
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
 
Проект "Збережемо природу разом"
Проект   "Збережемо природу разом" Проект   "Збережемо природу разом"
Проект "Збережемо природу разом"
 
Friction in orthodontics
Friction in orthodonticsFriction in orthodontics
Friction in orthodontics
 
Measuring and evaluating port performance and productivity
Measuring and evaluating port performance and productivityMeasuring and evaluating port performance and productivity
Measuring and evaluating port performance and productivity
 
Saliva (2)
Saliva (2)Saliva (2)
Saliva (2)
 
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
 
Feasibility study format
Feasibility study formatFeasibility study format
Feasibility study format
 
[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams
 
Content Republic Methodologie
Content Republic MethodologieContent Republic Methodologie
Content Republic Methodologie
 

Ähnlich wie iOS 9 Search

Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиГлеб Тарасов
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Noveo
 
хранение данных
хранение данныххранение данных
хранение данныхNoveo
 
UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)
UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)
UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)Ontico
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Paul Klimov
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Andrey Rebrov
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2Paul Klimov
 

Ähnlich wie iOS 9 Search (14)

Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с даннымиИнтуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 
хранение данных
хранение данныххранение данных
хранение данных
 
UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)
UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)
UI-тесты в iOS-проекте / Михаил Домрачев (Improve Digital)
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2Продвинутое использование ActiveRecord в Yii2
Продвинутое использование ActiveRecord в Yii2
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
msumobi2. Лекция 2
msumobi2. Лекция 2msumobi2. Лекция 2
msumobi2. Лекция 2
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 

iOS 9 Search

  • 3. Разработчики сами выбирают какой контент индексировать Результаты поиска появляются в Spotlight и Safari Результаты поиска видны даже когда приложение не установлено
  • 4. Поиск в приложении Три доступных API NSUserActivity CoreSpotlight Web Markup Просмотренный контент приложения Любой контент приложения Контент приложения в вебе
  • 5. NSUserActivity CoreSpotlight Web Markup Просмотренный контент приложения Любой контент приложения Контент приложения в вебе NSUserActivity + Search
  • 6. 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];
  • 8. 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
  • 9. NSUserActivity + Public Indexing serviceActivity.webpageURL = [NSURL URLWithString:service.webpageURL];
  • 10. - (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
  • 11. Core Spotlight NSUserActivity CoreSpotlight Web Markup Просмотренный контент приложения Любой контент приложения Контент приложения в вебе
  • 13. 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];
  • 14. 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
  • 15. Сами добавляем и удаляем CSSearchableItem Core Spotlight vs NSUserActivity index CSSearchableItem не имеет срока жизни Индексация большого объема данных Методы делегата и дополнения
  • 16. Core Spotlight vs NSUserActivity index NSUserActivity Core Spotlight
  • 17. NSUserActivity CoreSpotlight Web Markup Просмотренный контент приложения Любой контент приложения Контент приложения в вебе
  • 18. Web markup Позволить Apple находить ваш сайт Сайт имеет необходимую разметку для deep link Приложение поддерживает обработку deep link Контент структурирован по специальной форме
  • 19. Web markup Позволить Apple находить ваш сайт
  • 20. Web markup Сайт имеет необходимую разметку для deep link <meta name="myApp" content="app-id=123, app-argument=http://example.com/about”> Delivery Club View GET — On the App Store https://www.delivery-club.ru/pizza
  • 21. 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 } }
  • 22. 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
  • 23. Web markup Контент структурирован по специальной форме