29: 來做 Side Project 系列之好用的搜尋功能

搜尋是 app 常有的功能。本集來聊怎麼把搜尋的體驗做好一些呢?Bonus 則是探討如何讓 app 支援 iOS Spotlight Search,提高使用者回流的機會。

{ 完整節目筆記請按我 }

開場閒聊做 UI 的另類方法

聊了 13 在嘗試用 userflow unit tests + SwiftUI preview 的 UI 另類開發方式。

搜尋外部資料

很多 app 有資料搜尋的功能,大致上可以分成搜尋外部資料、過濾內部資料兩種。先說第一種:

  • 要打遠端 API 或從區網取得資料
  • 限制 query 頻率,不能隨打即找
  • 考慮不可控的回應時間
  • 捨棄已經不符合目前搜尋條件的結果
  • API 可以提供搜尋建議
  • Debounce vs throttle

過濾內部資料

  • 直接讀取裝置上的資料庫
  • 效能可控,幾乎可以一邊打字一邊顯示結果
    也是要測量
  • 沒有 API,所以自己保留搜尋條件的歷史
    保留搜尋條件變成資料入口,曾是 Evernote 的特色之一
    要能夠清除搜尋歷史
    更好的話是讓使用者能關掉這個功能,因為不是每個人都喜歡留下記錄
    如果是靜態資料,可以 cache 搜尋結果

搜尋介面實作

  • 通常搜尋結果會是列表,所以可能是 UITableView 放在 UINavigationController 裡面
  • 用 UISearchController,是把搜尋框「藏」在 navigation bar,往下捲動時搜尋框會看不到。如果搜尋功能真的很少用到的話還算可以考慮。效果可以參考系統設定的搜尋功
  • 如果搜尋是重要入口的話,還是傳統方法把 UISearchBar 放在 navigationItem.titleView 比較簡單實際,bug 也比較少…

支援 iOS 搜尋

除了 app 內的搜尋以外,也可以支援 iOS 的搜尋。有幾個方法:

  1. NSUserActivity 把使用者操作過的動作,或是點開過的項目加到 index
    這個有做沒有壞處,還可以順便支援 HandoffSiri Shortcuts 等等
  2. Core Spotlight framework 批次操作
    CS 的 index 是 private、on-device
    甚至可以做成 app extension
    甚至可以拿 CSSearchQuery 來做自己 app 的搜尋引擎。也就是 app 內與外都共用同一個 index 跟搜尋引擎(但我沒有這樣做過)
  3. 如果有內容相通的網站,可以寫 web markup 來支援 Applebot 爬蟲
    適用於公開資料
    支援 Twitter Cards 與 Facebook 的 App Links 標準
    如果網站想要導流到 app 的話,可以搭配 Universal Links 和 Smart Banner 一起規劃
    App Search API Validation Tool

詳情都可以查看 App Search Programming Guide。但是這份文件已經很久沒更新,放在 Archive。

講起來好像很複雜,但是加個 NSUserActivity 沒有幾行程式碼。

更多 weak self

Om Podcasten

在 iOS 開發圈打滾的台灣工程師,專為 Apple & iOS 開發者而製作的中文 Podcast。內容涵蓋 Apple 開發圈的新知討論、踩坑經驗、人物採訪、社群活動、職場生活。更多資訊請見官網 https://weakself.dev 或是 Twitter @weak_self