関西モバイルアプリ研究会 #5 で発表しました。 #関モバ

去る8月26日に行われた関西モバイルアプリ研究会#5で発表してきました。

同僚が RoboVM やると公言していたので、ちょうど似たようなのぶつけたら面白いんじゃないかなと思って最近やってた J2ObjC の話をしました。もう完全に世の中は Swift なのに Objective-C の発表で大変申し訳ありませんでした。*1

speakerdeck.com

そういえば Xamarin 以外のネタでしゃべったの久しぶりでしたね。

*1:しかも Android 枠だったはずなのに思った以上にAndroid感が出なかった

C#エンジニア養成読本 で記事を書きました

お知らせです。C#エンジニア養成読本 というムック本でちょっとした記事を書かせていただきました。

僕のパートはXamarinとかGadgeteerとか、WindowsやWeb以外のところで動くC#みたいな話を書かせていただきました。興味のある方はお手にとっていただけますと幸いでございます。

紙の本はこちらから。

C#エンジニア養成読本 (Software Design plus)

C#エンジニア養成読本 (Software Design plus)

Kindle版もあります。部屋に物を増やしたくない方はこちらをどうぞ。他の電子書籍サイトでも取り扱いあるそうです。

C#エンジニア養成読本

C#エンジニア養成読本

PDF欲しい方は出版社の電子書籍サイトから買えるみたいです。

gihyo.jp

ANAアプリが羽田空港でiBeacon使うようになったのでビーコンの位置を特定してきた

ANAアプリがこのたびのアップデートで、羽田空港内でのiBeaconガイダンスを追加しました。

ANA

ANA

  • ANA (All Nippon Airways)
  • 旅行
  • 無料

よく知らない人のために言っておくと、羽田空港第2ビルはANA専用みたいになってるんですが、乗る飛行機の出発ゲートによって通るべき手荷物検査場が違うのです*1。なので、以前からANAアプリはジオフェンスで羽田空港の圏内に入ったら行くべき手荷物検査場を案内するLocal Notificationを出したりしていました。今回はこの案内をさらにわかりやすくするためにiBeaconを使ったサービスを開始したということらしいです。

iBeaconは仕様が決まっているので、スキャンしたり強度を調べることでどこにあるか位置を特定することができます。ちょうどこのアップデートが降ってきた直後に羽田空港に行く用事があったので、ビーコンを探してきました。

iBeacon のしくみ

実際の話の前に、iBeaconのしくみをおさらいしておきましょう。

*1:正確にはどこから入ってもOKだけど、推奨じゃないところから入るとすごく歩かないといけなくなる

続きを読む

Xamarin.iOS/Android で Bonjour サービスを検索する

ちょっと気になってやってみたら簡単にできた。NuGet から Zeroconf 入れるだけ。ライセンスは Ms-PL。

www.nuget.org

このライブラリはZeroconfResolverというクラスを提供していて、メソッドResolveAsyncBrowseDomainsAsyncというstaticなメソッドを提供している。アプリのプロジェクトにもパッケージを追加しておけば、PCL からも使える。

Android の場合は、[assembly: UsesPermission(Manifest.Permission.ChangeWifiMulticastState)]を書いておく必要あり。

サンプルコードとして MvvmCross で使用するときの ViewModel だけはっておく。

続きを読む

Xamarin + MvvmCrossでViewとViewModelの対応付けを変更する必要なんてある?

MSDNXamarin + 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つのアプリがランチャに登録されます。

f:id:iseebi:20150301171745p:plain

この状態だと、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防水スピーカーを買うことにした。

たまたま会社から見える範囲にヨドバシ梅田があって、ちょうど早めに帰れそうだったので、帰りに買って帰ろうと思ったら、結局遅くなってしまった。
 
欲しい気が止まらない上に、前々から気になってたのもあったので、夜間受け取り行ってみることにした。
 
ヨドバシのネットサイトから店頭受け取りでマルチメディア梅田を選んで注文して、確認メール届くところまでは普段のネットショッピングと変わりなし。
その後20分もすると、商品の確保ができたとメールが届く。
 
夜間受け取りの入り口は、グランフロント側、駐車場の入り口あたりにある。