窓を作っては壊していた人のブログ

提督の窓や成績の窓を作ってました.今では適当に好き勝手に開発をしてます.

Xamarin StudioのAddinを作っていたらハマってしまってteratailで質問したら解決した話

毎回タイトルにセンスがないのは仕様

ということでタイトルのまんまのことでして,Xamarin StudioのAddin作りをしてみました.

成果物はこちら

GitHub - yamachu/VariableConsoleWriter

選択した変数をSystem.Diagnostics.Debug.WriteLineで囲って,実行されたメソッド名と一緒に出力するコードを挿入するアドイン. f:id:yamachu_co:20161107230248g:plain

デバッガ使えとかいうツッコミはなしで

やったこととか色々

右クリックをすると表示されるコンテキストメニューにコマンドを追加したかったのですが,なかなかうまくいかずに苦戦してました.

公式ドキュメントを読んでみると

Creating contextual menus
TODO

...ha?TODOじゃないんじゃ,書いてくれ,な?

という感じでどうしようかなぁ〜と考えた時あることに気がつきました.
「エディタ自体もAddinみたいので拡張されてるんだし,それパクればいけるじゃん」

そう,これとか

ということで中身の確認をしてみたのですが,基本的にはやっていることは同じ,なのにこちらでは出てこない.

困り果てたのでteratailに相談だ!ということで質問を投下

teratail.com

回答がかなり早いタイミングで来たんですけど,回答者,すごい回答者が来てしまった...という感じでした.本当にありがたかったです.

要点をまとめると * Addin実行してる時のApplication Output見よう * アセンブリの参照が足りない

ということでした.完全にビンゴでして,f:id:yamachu_co:20161107225847p:plain

このMonoDevelop.SourceEditor2を参照に加えたら動きました. ちゃんとコンソールにERRORで出ていたのですが,完全に見逃していました.これからエディタ上でのContextMenuに何か加えたいという人はこの辺りにご注意を...

まとめ

  • Addin実行してる時のApplication Output見よう
  • アセンブリの参照の確認をしよう
  • 公式リポジトリを見て実装のベースとなるところを確認しよう
  • ちゃんと途中経過とか色々書けば回答してくださる人もあらわれてくれる

XamarinでFirebase使う記事を投稿しました

まだiOS版のみ(Androidの方が楽なのに)

qiita.com

画像もなんもなくてツラい記事だけど,サンプルコードをアップしたから,許してね!

Xamarin.AndroidでJavaバインディングしてみたらちょっとツラかった話

TL;DR

remove-node使っとけ


またXamarin関係ネタ

先週の土曜日と日曜日でJPHACKSというイベントの東北予選に参加していました.

2016.jphacks.com

そこで提供されるAPIとかをぼーっと眺めていたらWebRTCの技術を使ったサービスのAndroidiOS向けのSDKがあるということを知りました.

あーそういえば前提督の窓にVNC埋め込むかWebRTC使ってリモート機能入れて,モバイル端末からでも使えるようにしたいなあとか思って勉強していたことを思い出しまして,WebRTCのサービス一回使ってみたいなあと思ったわけです.

そのサービスというのがNTTコミュニケーションズさんのSkyWayなわけで.

nttcom.github.io

まぁ最近はJavaAndroidアプリ書くことも減って,Xamarin.FormsでiOSのも作ってしまおうという流れで開発しています.そうした時既存のライブラリはどうしようという悩みが出てくるわけです.nuget探れば結構ラップされたものが出てくるのですが,今回に限っては見つからず,けど使いたい...ということになりました.

そのため今回目をつけたのがXamarin.AndroidJavaバインディングというか相互運用というか,そのあたりです.

Binding a Java Library - Xamarin

軽く読んでみると,なんだ,ほとんどこっちで書くことないし楽じゃん(歓喜)となっていたわけですが,ちょっと間違えるとツラくなるということがあったので書き残しておきます.

関係無いですけど,バインディングライブラリ作る程度にはこのサービス使ってるので企業賞ください(懇願)

以下箇条書きで適当に(表現含み,あまり正しくない表現が含まれてます,自分が見てわかる程度のメモ)

  • inner classだったり,特に識別子がないclassはvisibleが空白になり,継承とか実装したいときにリファレンスがないとか言われる
  • override 指定子がついてるのにないって怒られる
  • visible を public に変える -> 別のエラーが出たり,namespaceが汚れるけど一応継承できる
  • <attr path="/api/package[@name='hoge.fuga']/class[@name='piyo']" name="visibility">public</attr>みたいな感じ

  • 使わないAPIだったり,内部API,別の namespace(Javaのpackage) は remove-node で消し去って良い <- めっちゃ重要

    • 適宜 attr で追加
  • public だとかはどうやって調べる?

    • Debugビルドとかした時の,obj/Debug/api.xml を見る <- めっちゃ便利
  • Hoge.Fuga.Piyo.Value class の Value パラメータはだめ(コンストラクタと同じ名前だから?)

    • attr name で変更する
  • partial class になっているから自分で書き加えて良い

  • ヘルパーとなるメソッドとか生やした方が使い易い

  • 先人に学べ <- これで今回成功した

先人に学べというのは

[JXUG#4] 2015-04-11 Binding Java Library // Speaker Deck

こういうものを見ることです,だいたい対策が載ってました.

追記)
id:ytabuchi さんからこんな参考スライド情報もいただきました.実際に試してツラさの溢れる内容でこれも面白いです.

Xamarin.AndroidでJavaバインディング云々

追記終わり

これを見る前はビルド時200個エラーが出て数時間かけてそのエラーを潰したらその後に200個以上のエラーが出てきて本当にこの業界から消え去りたいと思ったレベルでした.何度も言うけど

めんどくさいなら remove-node で消してみろ

ですね.

今回作ってみたラッパーライブラリはこちら

GitHub - yamachu/SkyWay-Android-SDK-forXamarin.Android

ほんと,情報量0の記事だこれ.

今年の夏は充実していたなと感じた秋の夜

夏休みにあったことを最後にまとめておこうとか思っていたらすっかり忘れていて,今はもう10月末...

そういえば数ヶ月間は何をしていたんだっけなぁと考え始めたら書いていないことが見つかったので軽く,さらっと...

8月の出来事

みたいなこととか

9月の出来事

みたいな感じのことが1週間おきぐらいにばんばん来てた気がします.学生のうちしかこんなにいろんなイベントだったり企業さんと関わること出来なそうな感じがするので,非常に充実していました. ここには書いていないけれども,この期間中ちょこちょこと学祭アプリの開発を進めたり,研究活動も進めてました.

もう遊んでられない時期になりましたからね,頑張っていきましょう.

そうえいばC90であおばやまどっとねっとの「アオバヤマノススメ vol.1」に寄稿したXamarinとGoを使ったクロスプラットフォームライブラリ作りの記事またそれに関係するものを世に出したいなーと思ってるんですけど, これ需要あるのかって感じで悩みどころであります.

Xamarinの時点でクロスプラットフォームでしょ何言ってるのこの人って感じはありますが,違うんです,PC,スマホ両方の対応という意味でのクロスプラットフォームなんです... C# あるし.NET Core使えばいいじゃん的あれもありますけど,まぁ,はい.

cgo使って作ったライブラリだから他の言語からも呼びやすいし,もちろんXamarinからでも呼べるよっていうことを言いたかった記事でした.気が向いたら公開します.

東北大学祭アプリをXamarin.Formsで作ってみた

タイトルの通り,第68回 東北大学祭 の公式アプリケーションをXamarin.Formsで作ってみました.

以下リンク

アプリ紹介ページ

東北大学祭公式アプリ - Google Play の Android アプリ

東北大学祭公式アプリを App Store で

↑ダウンロードはこちらから

開発までの背景と,バックエンドの技術,関連技術などを備忘録,また開発の一例として紹介できればと思います.

他大学さんも同じことしてたんだなぁと知った -> 大学の学園祭アプリをXamarin.Formsで作りました - andooownの開発ブログ(andwares)

ある程度書き溜めていたけどここまで構成とか似るとは誰が予想したであろうか...

続きを読む

FirebaseをXamarinのプロジェクトで使ってみて

勘違いしてたことがあったんですよ, Cloud Messaging(FCM)とNotificationってね,別物なんですよね

qiita.com

というわけで,ここで大きな勘違いや無駄な作業をしていましたというあれです.

これはFirebaseのことであってXamarinそこまで関係ないですね. Xamarinのことにフォーカスすると,現時点では正式リリース(安定版?)でFCM使えるライブラリないんじゃないかなと思います(詳しくは調べてませんが

なのでiOSで使いたい場合は前の記事にあるように自分でnupkg作ったり,Androidの場合はnugetでプレリリース版を入れるなどして使うのがいいでしょう. ドキュメントがそこまで整備されていなかったのでだいぶ試行錯誤を重ねた感じはありますが.

今度ミニマム実装のサンプルでもGitHubに投げようかしら.

Xamarin.iOSでFCM(Firebase Cloud Messaging)を使う

経緯

GCMのAPIキー取りに行こうと思ったらFCMの方が新しいよ!こっちとったほうがいいよ(強制)という感じでFirebaseを使うかーと思い立ったため.

実際に検索してみると動作してるライブラリがあまり見つからず困っていたところ

Google Firebase Support · Issue #29 · xamarin/XamarinComponents · GitHub

を発見.ビルドして動かしてみることを決意.

追記: 2016/10/01 nugetパッケージがもうビルドされてリポジトリの中にあったので,それ使えばいいと思います.自分でビルド試してみたい方は以下の記事をお読みください.

おことわり

完全に備忘録に近いのでだいぶ不親切な感じですが,自分も完全に理解できたわけではないので...もうちょっと理解が深まったらQiitaとかにまとめます.

動作環境は * Mac OSX El Capitan 10.11.6 * Xamarin Studio Community 6.0.2

Macでしか確認してませんが,多分Windowsでもコマンドに違いはあれど問題なくトレースできると思います(まともなWindows環境持ってないのどうなんだという)

リポジトリのクローン

公式リポジトリにもfirebaseのブランチは存在するが,実際にはFirebase関連のファイルが存在していない. そのためforkリポジトリをベースに作業を行う.

git clone git@github.com:SotoiGhost/GoogleApisForiOSComponents.git
cd GoogleApisForiOSComponents
git checkout firebase

READMEに沿ってBuildを進めていく.CocoaPodsはbrewなどで入れるのが良いだろう.

cd Google.Core
sh ../build.sh --target libs

環境によってはここでエラーが出るかと思う.エラー文としては

The UTC time represented when the offset is applied must be between year 0 and 10,000.
Parameter name: offset

といったものである.これはnugetのバグだそうなので,公式リポジトリIssueにあるように

cd Google.Core
rm ../tools/nuget.exe
curl -Lsfo ../tools/nuget.exe "https://dist.nuget.org/win-x86-commandline/v2.8.6/nuget.exe"
sh ../build.sh --target externals

とすればnugetに関するエラーが取れるはずである.

Firebaseのnupkg化

今回の目的はFCM(Firebase Cloud Messaging)を使うことなので,FCMを使えるようにビルドを行う.Firebase.ClouldMessagingは * Firebase.InstanceID * Firebase.Analytics

に依存している.そのためまず初めにFirebase.InstanceIDからビルドを行う.

他のプロジェクトで使い回しがしやすいようにそれぞれのプロジェクトをnupkg化する.

cd Firebase.InstanceID
sh ../build.sh --target nuget

この二行で Firebase.InstanceID/output 下に${パッケージ名}.nupkgが生成される.あとはこのnupkgをローカルのリポジトリに格納し, nugetリポジトリの参照先をローカルに向けるだけで使用することができる.

同様にFirebase.Analytics, Firebase.ClouldMessagingのnupkg化を行い,ローカルのnugetリポジトリに格納する.

これで大まかな準備は完了である.

localのnugetパッケージを設定する - Qiita

Xamarinのプロジェクトで使ってみる

実際にXamarin.iOSのプロジェクトにnugetで追加を行う. GoogleService-Info.plist はビルドアクションをBundleResourceに設定すること. これで完了ではなく,最後にビルドオプションを加える必要がある.

iOSのプロジェクトのプロジェクトオプション->iOS BuildのAdditional mtouch argumentsに -gcc_flags "-ObjC" を記入する.これがないとこんなエラー で頭を悩ませることになる.

アプリの実装だったり証明書など

公式のドキュメントを追えばどうにかなるが,

FirebaseのPush通知をiOSで使ってみる - Qiita

SwiftでFirebaseを使ってNotificationを送ってみた(が、色々詰まった話) - Qiita

が非常に分かりやすくまとまっているので参考にするといいかもしれない.

実装はFirebaseのquick-startをほぼ丸写しで動いた(丸写しで動きそうなライブラリを探してたらここに行き着いた

その他

実際ビルドも面倒だったが,動かしてみるとトークンが取れないなどの別の障害が出てきて苦労したこと,またその解決法を書こうにもどれが効いてきたのかが実際のところ見当がついていない.

実際のプロダクトに導入する際に確かめてみようと思う.

f:id:yamachu_co:20160909225432j:plain:w200

これを出すために何時間かけてしまったんだ...