スポンサーサイト

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

NFCタグを使ってアプリを起動する(CustomURI編)

2012.11.14.Wed.23:50
前回、とりあえずDeviceArrivedとかでNFCタグをなんとなく認識していることは確認できたので、今回はCustomURIを使ってアプリを起動するNFCタグを作ってみたいと思います。

1.CustomURIで起動できるようにする
何はともあれ、CustomURIでアプリを起動できるようにしておきます。

Association launching sample(MSDN)
CustomURIについてはこのサンプルが参考になります。

まず、マニフェストにアプリを起動するためのスキームを宣言します。

今回は名前を nfcapp にしました。
CustomURI


次に、CustomURIで起動したときの処理をApp.xaml.csに追記します。
とりあえず、起動できればいいので必要最小限しか書きません。

protected override void OnActivated(IActivatedEventArgs args)
{
if (args.Kind == ActivationKind.Protocol)
{
var rootFrame = new Frame();
rootFrame.Navigate(typeof(MainPage));
Window.Current.Content = rootFrame;
}

Window.Current.Activate();
}


これで、nfcappでアプリが起動するようになるはずです。
エクスプローラーのアドレス欄に「nfcapp:」と入力してEnterキーを押下するとちゃんとアプリが起動しました。

2.CustomURIをタグに書き込む

こんな関数を作って、先ほど動作確認した「nfcapp:」をタグに書き込みます。

private void writeCustomUri()
{
var dataWriter = new DataWriter
{
UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf16LE
};
dataWriter.WriteString("nfcapp:");
device.PublishBinaryMessage("WindowsUri:WriteTag",dataWriter.DetachBuffer());
}


アプリ内にボタンを置いて、押下したときにこの関数を実行するようにしておきます。
ボタン押下後、NFCタグをリーダーライターにかざすと書き込み完了です。

一度アプリを終了し、先ほど書き込んだNFCタグをリーダーライターに再度かざすと、こんなトーストが表示されます。
toast

このトーストをクリックすると、アプリが起動しました!



アプリを起動するために、タグをかざした後、トーストをクリックしないといけないため、あまりスマートではないのが気に入らないのですが、ひとまずタグをかざしてアプリを起動するという目的は達成されました。
次回は、まだうまくいっていないLaunchAppタグで、アプリを直接起動する方法にチャレンジします。

NFC使ってみた

2012.11.10.Sat.01:22
Windows8ではOS標準でNFCをサポートしていて、WinRTのAPIもあるので使ってみました。

ProximityAPIのサンプル (MSDN)
Proximity API (MSDN)

私の知る限り、日本国内で一般的に手に入れられるProximity API対応のNFCリーダーライターは、SonyのRC-S380だけです。NFC CertifiedなNFC機器は他にもありますが、外付け対応なのは、RC-S380とDragonと評価キットくらいしか見つかりませんでした。

あと、NFCタグも必要です。
Mifare UltraLight(Type2)
Felica light(Type3)

まず、マニフェストにNFCを使うことを宣言します。
ProximityAPI使用時のマニフェスト設定


次にリーダーライターを取得します。

ProximityDevice _device = ProximityDevice.GetDefault();


もし、対応リーダーが接続されていなければ、_deviceがnullになります。

次に、NFC機器がタッチされたとき、離れた時のハンドラーを登録します。

_device.DeviceArrived += ProximityDeviceArrived;
_device.DeviceDeparted += ProximityDeviceDeparted;


これで、NFCのタグや、NFC搭載のスマホなどをリーダーにタッチすると、イベントが発生します。


次にNFCのタグからデータを読み込んでみます。
…の前に、タグにデータを書き込まないといけません。

NDEF Writerを使用して、NFCタグ(Felica lightやMifare UltraLight等)にデータを書き込みます。

さて、NDEFメッセージを読み込んでみましょう。

_device.SubscribeForMessage("NDEF", messageReceivedHandler);


となるはずです。
というのも、この書き方をしているサンプルコードはいくつか見かけたのですが、RC-S380ではFileNotFoundExceptionが発生します。対応していないのか、コードが悪いのか…。今のところ原因はわかっていません。

あと、最初のうちしばらくはDeviceArrivedとか全く反応せず頭を抱えていたのですが、突然反応するようになったりで、謎です。細かい動きを見るにはもう少し時間がかかりそうです。
続きを読む "NFC使ってみた"

Windowsストアアプリが審査通過!

2012.10.25.Thu.19:14
「疲れて過労気味の」ストアアプリ審査員との格闘した結果、無事(?)審査通過しました。

時系列に並べると
2012/9/25:アプリ提出
2012/10/3:リジェクト(1回目)
2012/10/3:アプリ提出
2012/10/12:リジェクト(2回目)
2012/10/12:アプリ提出
2012/10/19:リジェクト(3回目)
2012/10/19:アプリ提出
2012/10/24:審査通過

リジェクト(1回目)は、
"A privacy statement was not found in the Description page of the app."
を、
「アプリ内にプライバシーポリシー書いてないよ」
に空目してしまい、テストコメントに「設定パネルに入ってるでしょ!」と書いてしまいました。

リジェクト(2回目)では、
"A privacy statement was not found in the Description page of the app."
を、ようやく
「(ストア内の)アプリの説明ページにプライバシーポリシーが書いてないよ」
と認識しました。

そこで、アプリの説明文の最後に、
「プライバシーポリシー:
 このアプリケーションは個人情報を収集いたしません。」
と追記して再申請。

しかし、再度リジェクト(3回目)を食らったため、
テストコメントに

「アプリの説明文に書いてあるのじゃだめなんですか?ちゃんと見たんですか?駄目なら駄目でちゃんと理由書いてください!」


って書いたら、無事審査通過しました。


というわけで、意地でもプライバシーポリシーをWEB上におきたくない人は、アプリ内と、アプリ説明文にプライバシーポリシーを明記しておけば審査通過できる可能性があります。


聞くところによると、ネットワークに接続しないアプリもプライバシーポリシー書かないと落とされたとか、書かなくても通ったとか…
この辺りの基準はしっかりと審査員の間で確認しておいていただきたいところであります。

プライバシーポリシーはインターネット上におく必要がある?

2012.10.13.Sat.09:29
審査に出していたWinRTアプリが審査に落ちました…。

認定レポートによると、

「A privacy statement was not found in the Description page of the app. 」

つまり、
「ストアのアプリ紹介ページにプライバシーポリシーがないからダメ」
ってことですね(きっと)


審査に出したアプリのプライバシーポリシーはアプリ内に

「このアプリケーションは個人情報を収集いたしません。」

と表示するページを用意しています。
なので、「説明」ページのプライバシーポリシーの欄にその一文を書いてみたところ、

プライバシーポリシーエラー

URLじゃないとだめらしいです。


じゃ、やっぱりインターネット上に置かないとだめ?

最後の抵抗として、アプリの説明文の中に上の一文を入れて再申請してみます。

アプリ起動中にアプリが非表示状態になったことを検出する

2012.10.02.Tue.20:43
Windowsキーを押下してホーム画面が表示されたときとか、左からフリックして別のアプリに切り替えたときに、アプリを一時停止したいことってあると思います。

そんなときは、

Window.Current.VisibilityChanged += VisibilityChanged;

で、ハンドラを追加して


void VisibilityChanged(object sender, Windows.UI.Core.VisibilityChangedEventArgs e)
{
if(e.Visible)
{
// 表示されるときの処理
}
else
{
// 別のアプリに切り替えられるときの処理
}
}

みたいな感じで処理します。

たったこれだけのことにたどり着くのに大分時間かかった…。


(追記)

Window.Current.Activated でも同じようなタイミングでイベントが来てる。

差はまだ調べてない。
« Prev | HOME | Next »
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。