iOSでGoogle Natural Language APIのサンプルコードを実行できるようにする
はじめに
GoogleのCloud PlatformのサービスにCloud Natural Languageというものがあります。
これはテキストデータを入力すると機械学習を使用してテキスト構造や意味を解析した結果を返してくれるサービスになります。
Cloud Natural Language | Google Cloud
ドキュメントにはサーバー向けのSDKは用意されています。
しかし、今回はiOSアプリに組み込みたかったので、下記のNatural LanguageのiOS版サンプルコードを動かしてみようとしました。
ios-docs-samples/natural-language/swift at master · GoogleCloudPlatform/ios-docs-samples
しかし、セットアップの手順を実行してもプロジェクトのビルドでエラーになってしまいます。(2021-05-16 現在)
動かない原因をいろいろと調べた結果、このサンプルコードは不完全な状態であることがわかりました。
なので、これを実際にiOSアプリとしてビルドして動かせるようにするまでの手順を説明していきます。
プロジェクトの修正方法
- INSTALL-COCOAPODSスクリプトの修正
- APIキーのみで動作するように修正
INSTALL-COCOAPODSスクリプトの修正
まずはセットアップの手順で使用するINSTALL-COCOAPODSというスクリプトがありますが、
この内容がNatural Languageを使用するようには作られていません。
github からダウンロードした状態でプロジェクトをXcodeでビルドしても下記のようなエラーが表示されます。
google/protobuf/Descriptor.pbobjc.h file not found
Descriptorのprotoファイルがダウンロードされていませんでした。
他のファイルのダウンロード先などを見ると下記のリポジトリからダウンロードしているようなので、ここから必要なファイルを探してきます。
googleapis/googleapis: Public interface definitions of Google APIs.
protocolbuffers/protobuf: Protocol Buffers – Google’s data interchange format
Descriptorについては下記のコードを追加します。
mkdir protobuf
curl https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/descriptor.proto >> protobuf/descriptor.proto
他にもNatural Languageで使用するクラスが記述されたprotoファイルもダウンロードされておらず、なぜかtranslationのクラスをダウンロードする処理になっています。
こちらも下記のコードを追加してダウンロードするように修正します。
Natural Languageで使用するクラスはlanguage_service.protoファイルにあります。
mkdir -p cloud/language/v1
curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/cloud/language/v1/language_service.proto >> cloud/language/v1/language_service.proto
language_service.protoの内容を確認すると、下記のようなimport文があります。
import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
language_service.protoを使用するにはimportで指定されるprotoファイルも必要になるのでそれぞれ追加します。
追加したprotoファイルにもimportを含むものがあるので、同じようにすべてのprotoファイルを集めます。
不要なファイルをダウンロードしていた部分を削除して、
最終的にprotoファイルをダウンロードする部分は下記のようになります。
mkdir google
cd google
mkdir api
curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/api/annotations.proto >> api/annotations.proto
curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/api/client.proto >> api/client.proto
curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/api/field_behavior.proto >> api/field_behavior.proto
curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/api/http.proto >> api/http.proto
mkdir protobuf
curl https://raw.githubusercontent.com/protocolbuffers/protobuf/master/src/google/protobuf/descriptor.proto >> protobuf/descriptor.proto
mkdir -p cloud/language/v1
curl https://raw.githubusercontent.com/googleapis/googleapis/master/google/cloud/language/v1/language_service.proto >> cloud/language/v1/language_service.proto
cd ..
スクリプトの残りの部分については、Clean BoringSSL module.modulemapとFix the bad imports in the generated filesは不要なので削除します。
以上でINSTALL-COCOAPODSについては修正は終わりになます。
sh INSTALL-COCOAPODS
を実行します。
うまくいくとXcodeでプロジェクトが立ち上がり、protoファイルからObjective-Cのコードがgoogleフォルダ配下に生成されます。
もし生成されてない場合は、依存するprotoファイルが足りてないなどが考えられます。
APIキーのみで動作するように修正
元のサンプルコードでは認証トークンを使用していますが、APIキーで動かすほうがGCPの設定も簡単です。
また、Xcodeのバージョンが新しいと依存しているCryptoSwiftが未対応でビルドが通らなかったのでAPIキーを使用したほうがシンプルで動かす分にはいいです。
GCPのAPIキーの設定については下記などを参考にしてもらえばと思うので、ここでは説明しません。
それほど手間はかからないです。
iOSでGoogle Cloud Vision APIのサンプルをランするまでの手順(5分以内に) – Qiita
それではプロジェクトファイルを修正していきます。
Podfileに下記の2つのライブラリがあります。
認証トークンのために導入しているライブラリなのでこれを削除します。
pod AuthLibrary, :git =https://github.com/google/auth-library-swift.git
pod Firebase/Messaging
Xcodeで削除したライブラリを使用している箇所にエラーがでるようになっているので、削除するなりコメントアウトしていきます。
NaturalLanguageService.swiftを開いて、
認証トークンを使用していた箇所がるので、
call.requestHeaders.setObject(NSString(string:authToken), forKey:NSString(string:"Authorization"))
この部分を下記のようにAPIキーを使用するように修正します。
call.requestHeaders.setObject(NSString(string: apiKey), forKey: NSString(string: "X-Goog-Api-Key"))
あとはビルドしてアプリが起動すれば完成です。
適当にネットからニュース記事などをコピペして試すと、テキストが解析されてアプリの画面にこのような結果が表示されます。
まとめ
iOSアプリ自体が不慣れなのとgRPCを初めていじったのもあって勝手がわからず、調べるのに時間がかかりました。
また、Googleのサンプルコードが不完全な状態だったのも不運でした。
GCPの他のサービスのサンプルコードについても、今回の対応を参考にすれば動くようにできるかもしれません。
最終的に動くように修正したサンプルは下記のリポジトリにアップしてあります。
APIキーに自分のキーを入力すれば動作するはずです。