iOS9 App Search之NSUserActivity與Core Spotlight

最近因為項目要求,開始研究起iOS9推出的feature--App Search APIs。何為App Search?在iOS9之前,用戶通過spotlight只能搜索app的名字,或者蘋果自帶app的一些內容,比如搜索通訊錄、備忘錄中的內容。iOS9開始,用戶可以通過spotlight搜索網頁內容或者任何app內的數據。

1、search APIs主要包括三部分

1.1、NSUserActivity

NSUserActivity在iOS8中就出現了,當時用于Handoff。
在iOS9中,我們可以把想要在spotlight中搜出來的內容放到NSUserActivity中。userActivityUIResponser的屬性,通常會在用戶訪問某一個頁面時,對UIViewControlleruserActivity屬性賦值。
NSUserActivity可以用來對歷史訪問記錄

1.2、Core Spotlight

通過該技術,用戶可以通過spotlight搜到app中曾經出現過或者現有的所有內容。

1.3、Web Markup

當你web頁面添加了標記語言,蘋果的爬蟲會根據用戶在spotlight的輸入,去抓取你網站的數據,如果有找到合適的結果,你的網站就可能會(蘋果有自己的權重計算方法)顯示在spotlight的結果列表中。這時候如果安裝了相對應的app并且支持deep link,用戶就可以打開對應的app內容頁面。
對于經常使用spotlight的用戶來說,這會很有助于提升app的曝光度。
蘋果官方推薦Web Markup結合smart app banneruniversal links使用。
這次花了很多時間在搞的這個東西,不難搞,但是需要web端和服務端配合。重要的是,你的web站點要支持https訪問,我們公司的還不支持,糾結再三之后,暫時放棄這個功能。

在本文會簡單記錄第一、二部分內容的實現。至于第三部分內容,雖然因為https不支持,無法成功實現,但是還是會在下文中做一個學習整理。

2、NSUserActivity

2.1、創建NSUSerActivity實例

在viewModel層中創建的NSUSerActivity實例

- (NSUserActivity *)serviceProjectUserActivity
{
    if (!_serviceProjectUserActivity) {
        _serviceProjectUserActivity = [[NSUserActivity alloc] initWithActivityType:@"com.xxxx.appIdentifier.serviceProject"];
        _serviceProjectUserActivity.title = self.projectEntity.projectTitle ?: @"";
        _serviceProjectUserActivity.userInfo = @{@"id" : self.projectEntity.projectId ?: @""};
        _serviceProjectUserActivity.keywords = [NSSet setWithObjects:self.projectEntity.destination ?: @"", nil];
        // 好像并沒有什么卵用,不知道哪里用錯了
        _serviceProjectUserActivity.expirationDate = [NSDate dateWithTimeIntervalSinceNow:60 * 60 * 24 *31];
        // 如果沒有顯示設置為yes,則不可搜索到
        _serviceProjectUserActivity.eligibleForSearch = YES;
        //
        CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:CFBridgingRelease(kUTTypeContact)];
        attributeSet.contentDescription = self.projectEntity.features ?: @"";
        // ??????網絡路徑不可顯示
        attributeSet.thumbnailURL = [NSURL URLWithString:self.projectEntity.backImgUrl ?: @""];
        // 防止NSUserActivity和Core Spotlight可能重復索引,這里設置為nil
        attributeSet.relatedUniqueIdentifier = nil;
        _serviceProjectUserActivity.contentAttributeSet = attributeSet;
    }
    return _serviceProjectUserActivity;
}

2.2、賦值給UIViewController的userActivity屬性

在viewController層監測,如果頁面數據請求完成,給userActivity屬性賦值

 __weak typeof(self)weakSelf = self;
    [RACObserve(self.viewModel, projectEntity) subscribeNext:^(id x) {
        if (x) {
            __strong __typeof(weakSelf)strongSelf = weakSelf;
            strongSelf.userActivity = strongSelf.viewModel.serviceProjectUserActivity;
        }
    }];

2.3、在Appdelegate中處理頁面跳轉

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    if ([userActivity.activityType isEqualToString:@"com.xxxx.appIdentifier.serviceProject"]) {
        NSString *projectID = userActivity.userInfo[@"id"];
        if (projectID.length > 0) {
            // 處理具體頁面跳轉
            return YES;
        }
        return NO;
    }
    return NO;
}

3、Core Spotlight

3.1、創建要搜索的項,并將所有的項加入默認索引空間

- (void)indexAllDomesticCityForAppSearch
{
    // 把國內一級城市從數據庫中拿出來
    NSString *sql = [NSString stringWithFormat:@"select cn, zone_id from %@ where rank == '1' and zone_id <= 900000", self.tableName];
    
    [self loadDestinationWithSQL:sql andResultSetHandler:^(FMResultSet *result) {
        NSMutableArray *searchableItems = [[NSMutableArray alloc] init];
        while ([result next]) {
            NSString *zoneName = [result stringForColumnIndex:0];
            NSString *zoneID = [result stringForColumnIndex:1];
           // 創建對應的CSSearchableItem
            CSSearchableItemAttributeSet *attributeSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:kUTTypeContent];
            attributeSet.title = zoneName;
            attributeSet.contentDescription = @"專業旅游";
            // 這個屬性主要是將NSUserActivity與Core Spotlight indexed object進行一個關聯,防止出現重復的內容(如果出現重復內容,是因為開始的時候測試NSUserActivity的時候沒有設置id,還原一下模擬器就好了)
            attributeSet.relatedUniqueIdentifier = zoneID;
            CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:zoneID domainIdentifier:@"com.xxxx.appIndetifier.destinations" attributeSet:attributeSet];
            [searchableItems addObject:item];
        }
         // 所有的items加入索引
        CSSearchableIndex *defaultSearchableIndex = [CSSearchableIndex defaultSearchableIndex];
        [defaultSearchableIndex indexSearchableItems:[searchableItems copy] completionHandler:^(NSError * _Nullable error) {
            
        }];
    }];
}

3.2、在Appdelegate中處理從spotlight打開app

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
    if ([userActivity.activityType isEqualToString:@"com.xxxx.appIndetifier.destinations"]) {
        NSString *zoneID = userActivity.userInfo[CSSearchableItemActivityIdentifier];
        if (zoneID.length > 0) {
            // 處理具體頁面跳轉
            return YES;
        }
        return NO;
    }
    return NO;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • SearchAPI是什么 iOS 9.0 系統以后,下拉屏幕或者向右滑到最后會顯示"spotlight"頁面(不支...
    superD閱讀 951評論 0 4
  • 原文地址 在 iOS9 之前,你只能在 spotlight 中輸入關鍵字,比如應用名字,搜索到應用。在 iOS9 ...
    Nathan_Bao閱讀 6,875評論 4 12
  • 前言:先放出原文地址: AppCoda, 支持原創作品哈.本文為上面這篇文章的譯文, 原文中使用 Swift 語言...
    李國安閱讀 1,948評論 0 2
  • iOS9新特性:App搜索編程 這里基本按照官方文檔, 但是沒有百分百一致, 夾帶了私貨. 下面是一個總的結構圖,...
    windgo閱讀 1,234評論 0 1
  • 健全學術剽竊法律法規,立法主體要對學術剽竊主體及涉及學校,平臺等進行深入調查分析把握該行為的特點和產生背景,初步明...
    來自申論55的覺悟閱讀 267評論 0 0