はじめに
flutterで内蔵辞書検索 on iOSを実装してみたので,その備忘録を書きます.
方法
以下の手順で行いました
iOS側で辞書検索のためのmethodを実装
flutter側からmethod channelで呼び出す
単純ッ
実装
iOS側の実装
iOSでは内蔵辞書検索のためのAPIとしてUIReferenceLibraryViewControllerが用意されています
こちらのapiは,単語を引数として受け取り,内蔵辞書に対する検索結果のViewControllerを返すという動作をします.辞書内に複数見つかった場合はリスト表示され,見つからなかった場合はNot Foundが表示されます.
あくまで辞書の検索結果のページを返すだけであり,検索結果をデータとして取得して弄るなどのことはできないようです(著作権のせい?).
ただ,MacOS用なのででiOSでは使えないのですが,swift自体にはDCSCopyTextDefinitionという検索結果をデータとして得られそうなAPIが用意されているみたいです.
とりあえず,今回はflutterからUIReferenceLibraryViewControllerを呼び出せるようにiOS側に実装します.method channelの実装は以下を参考にしました
FlutterでiOSのネイティブコードを呼び出す - Qiita
以下をmethod channelで呼び出します
func searchDictionary(result: FlutterResult, controller: FlutterViewController, queryWord: String){ let ref: UIReferenceLibraryViewController = UIReferenceLibraryViewController(term: queryWord) controller.present(ref, animated: true, completion: nil) } }
flutter側
iOS側に書いたmethodを呼び出すだけなので省略.
実際の動作
実際に使ってみると,レスポンスは遅いですが,辞書検索の結果が表示されることがわかります. iOSが検索窓などで提供してる辞書検索は一瞬で結果が出るのに,なぜアプリからだとこんなに遅いんだ
その他
内蔵辞書検索機能は,それだけを提供するような単純なアプリだとrejectになるとドキュメントや以下のブログにて言及されています
Apple Developer Documentation [iOS] 内蔵辞書機能を使うとリジェクトされる? | Cocoamix.jp
どの程度シンプルだとrejectになってしまうのかはわかりませんが,サブ機能程度にしておいた方が落ち込む危険性が低そうです