スポンサーサイト

--.--.--.--.--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

IBuffeのインスタンスでToArrayを使うには

2012.12.27.Thu.16:20
MSDNでNFC関連の記事(例えばこれとか)を見ていると、ProximityMessageのインスタンスに対して、

message.Data.ToArray();

とか、普通に使われているけど、message.DataはIBuffer型でCapacityとLengthプロパティしか持っていない。
じゃぁ、どっからToArrayが出てくるかというと、拡張メソッドである。

WindowsRuntimeBufferExtensionsをインポートすると使えるようになるので、

using System.Runtime.InteropServices.WindowsRuntime;

を追加してやれば、message.Data.ToArray();と書いてもエラーが出なくなる。
スポンサーサイト

[AdventCalender2012]NFCタグを使ってアプリを起動する(LaunchApp編)

2012.12.17.Mon.01:40
このエントリは Windows 8 Store apps Advent Calendar の17日目のエントリです。

前回、LaunchAppタイプのタグでアプリ起動ができず、CustomURIで逃げてみましたが、ようやく起動できるようになったので今回はNFCのLaunchAppをつかってアプリを起動します。

○用意するもの
・RC-S380 (NFCカードリーダー)
・NFCタグ (今回はFelica Liteを使用。Mifareでもたぶん可能)

1.LaunchApp:WriteTag
LaunchApp:WriteTagはProximityDevice.PublishBinaryMessageで引数に指定するメッセージタイプの一つです。
特定のフォーマットの文字列を、このLaunchAppとして書き込むとアプリを起動することが出来ます。

フォーマットは
 アプリ起動パラメータ[tab]プラットフォーム名[tab]アプリ名[tab]プラットフォーム名[tab]アプリ名・・・
となります。

今回はパラメータなし/Windows8のみとして、タグに書き込む文字列は
 " \tWindows\t"+[アプリ名]
とします。
このときパラメータに当たる部分に半角スペース等空白以外のものを入れないと私の環境では反応しませんでした。
サンプルコードでは「The string can be an empty string ("").」とか書いてあったから完全に騙されたじゃねーか…

アプリ名の部分はAPIを通して取得したものを使用しますので後述のコードを参考にしてください。

2.アプリの作成
今回は面倒なのでタグ書き込みアプリと、起動されるアプリは同じにします。
タグを書き込むコードはこんな感じです。

void publishLaunchApp()
{
var device = ProximityDevice.GetDefault();

if (device == null)
return;

var appName = Package.Current.Id.FamilyName + "!" + CoreApplication.Id;

var launchAppMessage = " \tWindows\t" + appName;

var writer = new DataWriter();
writer.UnicodeEncoding = UnicodeEncoding.Utf16LE;
writer.WriteString(launchAppMessage);
var launchAppPubId = device.PublishBinaryMessage("LaunchApp:WriteTag", writer.DetachBuffer());
}


あとは、ボタン押すなりなんなり適当なタイミングでpublishLaunchApp関数を呼んで、NFCタグをリーダーライターにタッチすれば変な音とともにタグの情報が書き込まれます。

3.アプリを起動する
いったんアプリを終了し、先ほど書き込んだNFCタグをNFCリーダーにタッチします。
すると、
taptolaunch.png

ってのが出てきますので、これをクリックするとアプリが起動します。
個人的にはタッチと同時にアプリが起動すると思ってたんですが、いったんユーザー操作をかますのはWindows8のポリシーですかね…。

4.まとめ

・CustomURIだとおなじURIschemeがあった時にアプリの選択画面が出るが、LaunchApp:WriteTagでタグ情報を書き込むとアプリが直接起動できる
・起動パラメータはなくてもスペース一個入れとけ
・トーストを操作しないといけないので、タッチで直起動とはならない

[AdventCalender2012]アプリと広告とSnapとAppBar

2012.12.05.Wed.01:14
このエントリは Windows 8 Store apps Advent Calendar の5日目のエントリです。

WindowsPhoneにはMS公式の広告コントロールがありましたが、Windowsストアアプリにも公式広告コントロールがあります。

Windows 8 Ads in Apps
http://advertising.microsoft.com/ads-in-apps

今回はこのコントロールをSnapped状態(以下スナップ状態)と、Full/Fill状態(以下フル状態)で画面下に表示するネタで行こうと思います。
広告サイズは、スナップ状態は292x60,フル状態は728x90を使います。
adSize.png


アプリに組み込む場合にはPubCenterに登録して、ApplicationIdとAdUnitIdを取得する必要がありますが、とりあえず今回のエントリ内容を試してみたい場合はテスト用のIDを使うと良いでしょう。
http://msdn.microsoft.com/en-us/library/hh506361(v=msads.10).aspx

○広告のスナップ対応
さて、スナップ状態とフル状態に広告を表示する方法は何通りか考えられます。
1.広告コントロールを一つ配置し、状態に応じてサイズを変更する
2.スナップ状態用とフル状態用の広告コントロールを配置する

簡単なのは1.の方法ですが、フル状態用の広告サイズをスナップ状態サイズに縮小すると広告の内容まで縮小されてしまいます。
screenshot_12022012_011923.png

screenshot_12022012_011914.png


2.の方法で実装するとそれぞれのサイズにあった広告が表示されます。
screenshot_12032012_003431.png


今回は2.の方法で実装しましょう。

○広告コントロールの配置
「基本ページ」に広告コントロール2つをそれぞれ下記のように配置します。
<AD:AdControl x:Name="adForFull"
      ApplicationId="d25517cb-12d4-4699-8bdc-52040c712cab"
      AdUnitId="10042998"
      Width="728"
      Height="90"
      VerticalAlignment="Bottom"
      Grid.Row="1" />
<AD:AdControl x:Name="adForSnapped"
      ApplicationId="d25517cb-12d4-4699-8bdc-52040c712cab"
      AdUnitId="10043074"
      Width="292"
      Height="60"
      VerticalAlignment="Bottom"
      Visibility="Collapsed"
      Grid.Row="1" />


次に、VSMでスナップ状態の時はAdForSnappedをVisibleに、AdForFullをCollapsedになるようにします。


これで、VisualStateに応じて広告コントロールが切り替わるようになりました。

○AppBarへの対応
次にAppBarを追加します。

AppBarを表示したとき広告コントロールが前面に表示されてしまいますが、これはバグ仕様です。
screenshot_12032012_005136.png


「広告コントロールはWebView使ってるから最前面にでちゃうの。ResumeとSuspendで対応してね!」
http://msdn.microsoft.com/en-us/library/jj157023(v=msads.10).aspx

仮にこのままの状態でストアに申請すると、もちろんリジェクトされます
なので、AppBarが表示されたときに広告コントロールをSuspendし、非表示になったらResumeするようにします。

private void AppBar_Opened(object sender, object e)
{
    adForFull.Suspend();
    adForSnapped.Suspend();
}
private void AppBar_Closed(object sender, object e)
{
    adForFull.Resume();
    adForSnapped.Resume();
}


これでAppBarが出たときには広告コントロールが一時停止し、AppBarが前面に表示されるようになります。
screenshot_12052012_012051.png

screenshot_12052012_012132.png


なお、ちゃんとSuspendするようにしても、タイミングによってはAppBarの上に広告コントロールが表示されます。さらにそのせいでリジェクトされることもありますが、テストメモに
AdControlのバグだからどうしようもありません
って書いて、審査通過することを祈るしかありません。

○まとめ
スナップ状態でも広告を表示したい場合は、広告コントロールを2つ配置して、それぞれに適切なサイズのAdUnitIdを設定する。
AppBarと被る位置に広告がある場合は、SuspendとResumeを使ってリジェクトされないように対応する。

それでは!
 | HOME | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。