関西モバイルアプリ研究会 #5 で発表しました。 #関モバ
去る8月26日に行われた関西モバイルアプリ研究会#5で発表してきました。
同僚が RoboVM やると公言していたので、ちょうど似たようなのぶつけたら面白いんじゃないかなと思って最近やってた J2ObjC の話をしました。もう完全に世の中は Swift なのに Objective-C の発表で大変申し訳ありませんでした。*1
そういえば Xamarin 以外のネタでしゃべったの久しぶりでしたね。
C#エンジニア養成読本 で記事を書きました
お知らせです。C#エンジニア養成読本 というムック本でちょっとした記事を書かせていただきました。
僕のパートはXamarinとかGadgeteerとか、WindowsやWeb以外のところで動くC#みたいな話を書かせていただきました。興味のある方はお手にとっていただけますと幸いでございます。
紙の本はこちらから。
C#エンジニア養成読本 (Software Design plus)
- 作者: 岩永信之,山田祥寛,井上章,伊藤伸裕,熊家賢治,神原淳史
- 出版社/メーカー: 技術評論社
- 発売日: 2015/08/26
- メディア: 大型本
- この商品を含むブログを見る
Kindle版もあります。部屋に物を増やしたくない方はこちらをどうぞ。他の電子書籍サイトでも取り扱いあるそうです。
- 作者: 岩永信之,山田祥寛,井上章,伊藤伸裕,熊家賢治,神原淳史
- 出版社/メーカー: 技術評論社
- 発売日: 2015/08/26
- メディア: Kindle版
- この商品を含むブログを見る
PDF欲しい方は出版社の電子書籍サイトから買えるみたいです。
ANAアプリが羽田空港でiBeacon使うようになったのでビーコンの位置を特定してきた
ANAアプリがこのたびのアップデートで、羽田空港内でのiBeaconガイダンスを追加しました。
ANAアプリが面白そうな機能載せてたので明日試してみる pic.twitter.com/JCKDxhw9my
— Shin Ise (@iseebi) 2015, 8月 29
よく知らない人のために言っておくと、羽田空港第2ビルはANA専用みたいになってるんですが、乗る飛行機の出発ゲートによって通るべき手荷物検査場が違うのです*1。なので、以前からANAアプリはジオフェンスで羽田空港の圏内に入ったら行くべき手荷物検査場を案内するLocal Notificationを出したりしていました。今回はこの案内をさらにわかりやすくするためにiBeaconを使ったサービスを開始したということらしいです。
iBeaconは仕様が決まっているので、スキャンしたり強度を調べることでどこにあるか位置を特定することができます。ちょうどこのアップデートが降ってきた直後に羽田空港に行く用事があったので、ビーコンを探してきました。
iBeacon のしくみ
実際の話の前に、iBeaconのしくみをおさらいしておきましょう。
*1:正確にはどこから入ってもOKだけど、推奨じゃないところから入るとすごく歩かないといけなくなる
Xamarin.iOS/Android で Bonjour サービスを検索する
ちょっと気になってやってみたら簡単にできた。NuGet から Zeroconf 入れるだけ。ライセンスは Ms-PL。
このライブラリはZeroconfResolver
というクラスを提供していて、メソッドはResolveAsync
とBrowseDomainsAsync
というstaticなメソッドを提供している。アプリのプロジェクトにもパッケージを追加しておけば、PCL からも使える。
Android の場合は、[assembly: UsesPermission(Manifest.Permission.ChangeWifiMulticastState)]
を書いておく必要あり。
サンプルコードとして MvvmCross で使用するときの ViewModel だけはっておく。
続きを読むXamarin + MvvmCrossでViewとViewModelの対応付けを変更する必要なんてある?
MSDN の Xamarin + MvvmCrossでViewとViewModelの対応付けを変更するというコードレシピがあったのですが、少し疑問に思ったので少し調べてみました。
ViewModelからViewを生成する仕組み
以前、MvvmCrossのiOS UniversalアプリでiPadで画面分割を作るでも書いたとおり、ViewModelから対応するViewを生成しているのはIMvxViewPresenterです。ですので、ViewModelとViewの関連づけを変えたい場合はここからの動きを変更するのが正攻法で、MvxAndroidViewPresenter.Show(MvxViewModelRequest) や MvxAndroidViewsContainer.ViewModelFromRequest、MvxAndroidViewsContainer.GetIntentFor などでフックする形の方が本来のやり方です。
おそらくコードレシピで書かれている内容では、画面遷移を発生させるとおかしくなってしまうのではと思いました(未検証ですが)。
そもそも、このような方法をとらないといけない場面は通常起こりえません。検証コードを書いていましたが、手間の割に得られるものが少なすぎると判断して中止しました。この方法が本当に必要なのか再度検討してください。
MainLauncher = false にしないと動かない?
Xamarin.Android のプロジェクトを新規作成して MvvmCross をプロジェクトに導入すると、その時点でプロジェクトには3つの Activity が存在することになります。
このうち、Xamarin Studio のテンプレートが作成する MainActivity と、MvvmCross の起動ポイントである SplashScreen は、ActivityAttribute にアプリの最初の Activity であることを示す MainLauncher = true というプロパティが指定されています。このため、二つ MainLauncher があると、同じアプリの中に 2 つアプリが存在するという形になり、ランチャに 2 つアイコンが登録されます。
つまり、MainActivity.cs が以下の場合
// using namespace Test02.Droid { [Activity( Label = "Test02.Droid (Main)" , MainLauncher = true , Icon = "@drawable/icon")] public class MainActivity : Activity { // ... } }
そして、SprashScreen.cs が以下となっている場合
// using namespace Test02.Droid { [Activity([f:id:iseebi:20150301171745p:plain] Label = "Test02.Droid (Splash)" , MainLauncher = true , Icon = "@drawable/icon" , Theme = "@style/Theme.Splash" , NoHistory = true , ScreenOrientation = ScreenOrientation.Portrait)] public class SplashScreen : MvxSplashScreenActivity { // ... } }
実際にアプリがインストールされると1つのapkに対して2つのアプリがランチャに登録されます。
この状態だと、Xamarin Studioからは実行するときに SplashScreen から起動しなければならないはずが、MainActivity から起動してしまいます。
MvvmCross を Android プロジェクトに導入した後は、Xamarin Studio のテンプレートで生成される以下のファイルは不要になるので削除しましょう。
- Resources/layout/Main.axml
- MainActivity.cs
また、この ActivityAttribute などは最終的に AndroidManifest.xml に変換されてアプリに埋め込まれます。どのようなものが使えるかについてはa. AndroidManifest.xml ファイル - ソフトウェア技術ドキュメントを勝手に翻訳や Working with AndroidManifest.xml | Xamarinなどを一読した方がいいと思います。
ヨドバシ梅田の夜間受け取り試してみた
最近あまりに寒くてちゃんとお風呂浸かってるんですが、ちょっとつまらなくて、radikoでラジオでも聴きたいと思い、Bluetooth防水スピーカーを買うことにした。