GolangでiOS / Android用のライブラリを開発する





クロスプラットフォームのモバイルアプリケーション開発は、当時非常に人気がありました。 このアプローチは、モバイル業界の発展中にほとんどの企業で使用されました。 クロスプラットフォーム開発を使用する主な理由は単純でした-市場での専門職の不足、開発のスピードとコスト。 残念ながら、ほとんどの場合、このアプローチは成果を上げていません。



しかし、なぜ彼に二度目のチャンスを与えませんか? 技術は進歩し、理論的には非常に高品質の製品を得ることができます。 この記事では、Golang言語でIOS / Android用のライブラリを開発する方法を実際に調べ、開発プロセスで遭遇した制限や問題を確認します。



主なタスクは、モバイルアプリケーションからログとクラッシュを構築するSDKを開発することです。一方、SDKはAndroidアプリケーションとiOSアプリケーションの両方に接続して動作する必要があります。 同時に、ライブラリは、データを集約および分析するメインLogPackerサービスと対話する必要があります。



Go言語の新機能を使用して、クロスプラットフォームライブラリを作成することにしました。 まず、メインアプリケーションはGoで記述されているため、Java / Objective-C開発者を引き付けるのではなく、この言語を使用する方が簡単でした。 第二に、開発時間を節約し、新機能を備えた古いアプローチを試しました。



gomobileとは何ですか?



gomobileプロジェクトは、AndroidおよびiOSモバイルプラットフォーム用のコードを構築するためのツールを開発者に提供します。



Goをモバイル環境に統合するには、次の2つの方法があります。





この機能は、Golangバージョン1.5以降でサポートされています。 新しいgomobileユーティリティは、Goをモバイルアプリケーションにコンパイルしたり、Java / Objective-C / Swiftコードをコンパイルしたりするのに役立ちます。



まず、実装方法の1つを選択します。 最初の方法は、問題の声明のために私たちには適していません-別個のアプリケーションではなく、小さなライブラリが必要です。 この方法はgoアプリケーションの速度とモバイルデバイスのリソース消費を最小限に抑えるため、非常に興味深く有望ですが。

2番目の方法を選択し、GoからJava / Objective-C / Swiftコードを生成します。



環境設定



最初に、開発環境を準備します。 Goバージョン1.5以降が必要です (高いほど、Goコミュニティは常にGo Mobileを改善しています)。



次に、gomobileユーティリティとAndroid SDKライブラリをインストールします。 gomobileのインストールから始めましょう。

go get golang.org/x/mobile/cmd/gomobile
      
      





注:OS Xでは、Xcodeコマンドラインツールをインストールする必要があります。



次に、gomobileを初期化します。これは、任意の作業ディレクトリで1回実行できます。

 gomobile init
      
      





注:このコマンドには数分かかる場合があります。



Javaコードをビルドするには、Android SDKとインストールされたJavaが必要です(OpenJDKで十分です)。



〜/ android-sdkなどのAndroid SDKをダウンロードしてホームディレクトリに解凍し、次のコマンドを実行してバージョンAPIをインストールします。

 ~/android-sdk/tools/android sdk
      
      





次に、環境変数を設定します。

 export ANDROID_HOME=$HOME"/android-sdk"
      
      





ライブラリを開発および構築するための環境が整いました。 コードの記述に直接進み、どのような制限に遭遇したかを見てみましょう。



AndroidおよびiOS用の汎用Goコード



同じコードを使用して、AndroidおよびiOSでさらにコンパイルできます。 このようなクロスプラットフォームのGoコードを記述することには制限があります。 現在、一部のデータ型のみを使用できます。 Goでアプリケーションを開発する場合、これを考慮する必要があります。 サポートされているタイプをより詳細に検討してください。



したがって、タイプがgomobile bindコマンドでサポートされていない場合、同様のエラーが表示されます。

 panic: unsupported basic seqType: uint64
      
      





間違いなく、サポートされているタイプのセットは非常に限られていますが、これはSDKを実装するのに十分です。



Java / Objective-C / Swiftでのビルドとインポート



Gobindは、Java、Objective-C、またはSwiftコードに相当するGoコードを生成します。 残念ながら、gomobileはWindows Phoneでは機能しないため、計画段階でこれを考慮する必要があります。



通常、gobindは直接使用されず、代わりにコードが自動的に生成され、 `gomobile bind`コマンドでパッケージにラップされます。 これについては、ここgolang.org/x/mobile/cmd/gomobileで詳しく説明しています



各プラットフォームのコンパイルプロセスのコマンドと機能の一部を検討してください。



生成するプラットフォームを定義する-targetフラグから始めましょう。 Androidの例:

 gomobile bind --target=android .
      
      





このコマンドは、現在のコードから.aarファイルを生成します。 このファイルをAndroid Studioにインポートするのは非常に簡単です。













注:Javaでは、インポートするパッケージの名前は常にgoで始まります。



同様のコマンドを使用して、Objective-C / Swiftコードをビルドします。

 gomobile bind --target=ios .
      
      





.frameworkフォルダーが現在のディレクトリに作成されます。



これはObjective-CとSwiftの両方で機能します。 .frameworkフォルダーをXcodeファイルブラウザーに移動し、インポートをプロジェクトに追加します。

 #import "Logpackermobilesdk/Logpackermobilesdk.h"
      
      









注:Goでは、SDKを作成できるだけでなく、main.goファイルからアプリケーション自体をapk / ipaファイルにコンパイルできますが、ネイティブモバイルUIのサポートは必要ありません。 間違いなく、これはGoコミュニティの非常に興味深い実験です。



接続されたパッケージの使用



Gomobileバインドは、getSomething()、setSomething()関数を自動的に作成します。 また、エクスポートされたすべての機能が公開されます。



たとえば、Android Studioでライブラリを使用する場合:

 import go.logpackermobilesdk.Logpackermobilesdk; // ... try { client = Logpackermobilesdk.NewClient("https://logpacker.mywebsite.com", "dev", android.os.Build.MODEL); msg = client.NewMessage(); msg.setMessage("Crash is here!"); // Use another optional setters for msg object client.Send(msg); // Send will return Cluster response } catch (Exception e) { // Cannot connect to Cluster or validation error }
      
      





彼女はObjective-C向けです。

 #import "ViewController.h" #import "Logpackermobilesdk/Logpackermobilesdk.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; GoLogpackermobilesdkClient *client; NSError *error; GoLogpackermobilesdkNewClient(@"https://logpacker.mywebsite.com", @"dev", [[UIDevice currentDevice] systemVersion], &client, &error); GoLogpackermobilesdkMessage *msg; msg = client.newMessage; msg.message = @"Crash is here!"; // Use another optional setters for msg object GoLogpackermobilesdkResult *result; [client send:(msg) ret0_:(&result) error:(&error)]; }
      
      





上記の例からわかるように、最終的には標準ライブラリが得られました。 アプリケーション内のライブラリの構成は非常に単純であり、開発者にはなじみがあります。



おわりに



各モバイルプラットフォームに個別の開発チームを作成することは、最も簡単で安価な喜びではないことを誰もが理解しています。 しかし、高品質の製品を作成するには、この段階でこれが必要です。 一方、クロスプラットフォーム開発のフレームワークで小さなタスクを完了することができ、そのすべての利点を活用しました。



欠点は、Windows Phoneでライブラリを構築できなかったことですが、これは事前に知っていました。

Golang言語で本格的なアプリケーションとSDKを作成する簡単な方法がまもなく提供されることを願っています。



リポジトリのクローンを作成することで、ベストプラクティスに慣れることができます



All Articles