Windows Phoneでスクリーンショットをとる

いきなり遅刻ですいません。
Windows Phone Advent Calendar : Consumer Track Day 1 です。

わりとアプリの開発ネタとか、アプリ作りましたとかいう話は結構多いのですが、こんなアプリを便利に使ってますとか、このアプリで人生変わりました!とかそういう話がiPhoneAndroidより少ないなーってことで、純粋にWindows PhoneのLife changingな使い方にフォーカスしてみようと思って立ててみました。
いやー、あれですね。企画趣旨が伝わらなかったのか、Windows Phoneを開発か積んでタワーにする以外に使ってる人がいないのか、全く人が集まらなくて"ひとり"化してしまいましたね。

先日落として割ってしまったIS12Tが基盤交換で結局バックアップをリストアできなかったんで、それをリストアしながら、僕のIS12T活用法を紹介していきます。WP8についてもわかるところは補足していこうと思っています。散々既出のところもあるかもしれませんが、そこはあえてこのシリーズで触れる方向けにということで、いこうとおもいます。

まずは、スクリーンショット。WP7ではスクリーンショットを基本的にはとることができません。著作権保護コンテンツに配慮してこうなっているのですが、でもblog書いたりとかするのに不便です。。

裏口を見つけた人達によって、開発者向けの端末ではXAPファイルをインストールすることによってできるようになっています。ななふぉの過去記事からインストールしましょう。*1

インストール後、アプリを起動して「start capture task」を押し、その後スクリーンショットを撮りたい画面でシャッターを半押しすればPictures Hubに保存されます。JPEGで保存されるのか、画質はちょっと残念です。

なお、Windows Phone 8 では標準機能となっており、電源とスタートボタンの同時押しでとれるようになっています。

*1:って、いま見たらリンク切れてました。ネタ元をたどってダウンロードしましょう

パスワードとかの機密情報を暗号化して保存する

アプリの中でログイン情報を保存するためにこういう画面を作ると思います。

で、パスワードを保存するためにこういうコード書いちゃうと思うんです。IsolatedStorageSettings つかって。

private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
    if (IsolatedStorageSettings.ApplicationSettings.Contains("UserName"))
    {
        this.userNameTextBox.Text = IsolatedStorageSettings.ApplicationSettings["UserName"] as string;

    }
    if (IsolatedStorageSettings.ApplicationSettings.Contains("Password"))
    {
        this.passwordBox.Password = IsolatedStorageSettings.ApplicationSettings["Password"] as string;
    }
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    IsolatedStorageSettings.ApplicationSettings["UserName"] = this.userNameTextBox.Text;
    IsolatedStorageSettings.ApplicationSettings["Password"] = this.passwordBox.Password;
    IsolatedStorageSettings.ApplicationSettings.Save();
}

この IsolatedStorageSettings って、IsolatedStorage の __ApplicationSettings に平文でデータを保存します。こんな感じ。

<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
	<KeyValueOfstringanyType>
		<Key>UserName</Key>
		<Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">iseebi</Value>
	</KeyValueOfstringanyType>
	<KeyValueOfstringanyType>
		<Key>Password</Key>
		<Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">Password</Value>
	</KeyValueOfstringanyType>
</ArrayOfKeyValueOfstringanyType>

いくらWindows PhoneではStoreから入ったアプリは保護されているとしても、バックアップするとかしちゃうとそのバイナリ経由でこのパスワードが入っている設定ファイルをかすめとられる可能性があるので、保護する必要があります。

iOS でも同様のことが言えまして、パスワードなどの機密情報の保存Keychain Servicesを使うことになっています。*1

Windows Phone では ProtectedDataクラス を使ってデータを暗号化して IsolatedStorage に保存します。

引数バイト配列なので、ラッパークラスつくってみました。

これをつかうと、こんなかんじに書けます。初期化コードを除けばさっきとほとんど同じですね。

private ProtectedSettingDictionary settings;

public MainPage()
{
    InitializeComponent();

    settings = new ProtectedSettingDictionary("ProtectedStore");
}

private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
    if (this.settings.ContainsKey("UserName"))
    {
        this.userNameTextBox.Text = this.settings["UserName"];

    }
    if (this.settings.ContainsKey("Password"))
    {
        this.passwordBox.Password = this.settings["Password"];
    }
}

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    this.settings["UserName"] = this.userNameTextBox.Text;
    this.settings["Password"] = this.passwordBox.Password;
    this.settings.Save();
}

これで保存すると、IsolatedStorage に ProtectedStore というファイルができ、このファイルに暗号化されて保存されます。こんなかんじ。

ぜひ、パスワードは暗号化して保存してくださいね。

*1:LKKeyChainとかをつかうと簡単ですね。 http://cocoadays.blogspot.jp/2011/05/ios-keychain-services-lkkeychain.html

Windows Phone の端末まるごとバックアップはMacなら正規手段で簡単にできる

昨夜うっかりIS12Tを床に落っことしてしまい割れてしまいました。割れただけなら使い続けるところなのですが、画面上半分がタッチ反応しなくなってしまったのでどうしようもありません。

買ったときに言われるがまま「安心ケータイサポート」に入ってて、まだ解約してなかったのが不幸中の幸いでしょうか。
修理に出すとおそらくデータは消えてしまうのでバックアップを取っておく必要があります。

が、Windows Phone を Zune Software でバックアップすることはできません。できるのは、バージョンアップの前後だけ。XDAの怪しいツールを使った方法 もありますが、これやってみたところうまくいかず。

どちみち、音楽とか全部はいってるとバックアップに時間がかかるので消さないといけないのですが、MacでWindows Phone Connectorを使ってiTunesで転送したファイルは「予約済み領域」に入っているといわれてZuneから消せないのでMacでみてみたところ…

バックアップボタンあるー!!

というわけで、Windows Phone のバックアップするならMacのWindows Phone Connectorを使うのが一番簡単です。

結論:もうみんなMac買おう

アメリカでMango本来の力を解き放つ

今週はなぜかアメリカに行く人が多そうな気がしますが、そんな皆さんに試していただきたいのが日本では封印されている(というかサービスが開始されていない)Windows Phone 7.5の機能。OSが日本語設定にしてても使えますよ!

アメリカに降り立ったら設定から「地域&言語」を開いて、一番下にある「ブラウザーと検索に使用する言語」を「英語(米国)」をえらんでください。

これで、検索ボタンから起動するBingでユーザーの地域情報によって周辺の情報を調べることができる Local Scout (周辺情報) が使えるようになります。

あ、現地での回線契約についてはMSの高橋さんがまとめてくれてるのでそっち参照で。ちなみにパスポート必要でした。 →2年の間にいらなくなったみたい

もっとタイルを更新しよう - 端末の中での競争に打ち勝つために -

Windows Phone Advent Calender 2011 Day 1



いきなり出遅れてしまいましたが、Windows Phone Advent Calendar 2011 1日目です。技術的な話を最初からやっちゃうと後ろの人がネタかぶりしちゃうかもなので、ちょっと最近考えてることを書いてみようと思います。

スタート画面という表舞台で活躍する or リストで眠り続ける

Windows Phone のアプリはインストールされると、アプリ一覧に入ります。

この中からユーザーは使いたいアプリを「スタート画面に追加」します。

使われるアプリは「スタート画面に固定」されるわけです。そして、スタート画面にいるアプリと、アプリ一覧で眠り続けるアプリの2つに大きく分けられてしまいます。インストールしてあっても使われるアプリと使ってもらえないアプリというのはあると思うのですが、iPhoneAndroidみたいに、アプリ一覧で自由な並び替えができないWindows Phoneは「アプリ一覧で眠り続ける」アプリの数は相対的に多くなってしまうのではないでしょうか。

アプリを長く使ってもらうためにはユーザーに「スタート画面に追加」させないといけないのです。

いかにして「スタート画面に追加」させるか

では、スタート画面に追加したくなるアプリとは何でしょうか。

アイコンがきれい

アイコンがきれいなアプリは単純に並べておきたくなりますね。アイコンはアプリの顔ですので、みなさんこだわりを持って作られていると思います。

その中でもとくにきれいで、ユーザーに気に入られるものがここに該当するわけです。

よく使う

アプリの機能が特によく使われる場合は、ホームにおいておきたくなります。たとえば路線検索などの生活密着系のアプリが該当するでしょう。

情報を提供してくれる

Windows Phoneではアプリのタイルを更新できます。定期的に新しい情報を提供してくれるアプリはスタート画面においておきたくなります。この機能はタイルである必要があるので、この機能を使うためにはユーザーは必然的にスタート画面に追加せざるを得ません。

ソラダスお天気予報はとてもよいお手本です。僕はこのアプリをあまり起動しないのですが、常に最新の天気情報を更新してくれるのでずっと固定しています。

iPhoneAndroidにない、Windows Phoneならではの機能です。端末の中での競争に打ち勝つために、ぜひ活用したい機能です。

タイルの情報を更新するために

タイルの情報を更新するためには以下の3つの方法が使えるのではないでしょうか。

アプリ起動中に更新

アプリ起動中にデータを受信してタイルを更新する方法です。好きなタイミングに更新することはできませんが、ユーザーがアプリを起動する回数が特に多いことが考えられる場合には、一番手間のかからないよい方法となります。

プッシュ通知

タイルを外部のサーバーから書き換えることのできる機能です。一番強力ではありますが、アプリとは別にサーバープログラムを用意する必要があるので実装のコストが結構あがるのと、サーバーの運用コストもかかります。

また、Windows Phoneのプッシュ通知は使えるアプリの数が限られているので競争率が高いです。

しかし、外的要因に基づいて柔軟に指定することができますし、自由なタイミングで更新したいのであればこの方法しか考えることができません。ソラダスお天気予報などがこれにあたります。

Background Agent

バックグラウンド実行の定期実行を使えば、プッシュよりも手軽に、任意のタイミングでタイルを更新することができます。ただし、実行可能時間が15秒とにかく短いので、キャッシュ処理をうまく活用して表示を更新しないといけません。

宝塚市ごみの日カレンダーで使っているのはこの方法で、一度アプリを起動すると、2ヶ月分のカレンダーを先読みします。あとはキャッシュの情報で処理できるので1秒かからず処理が終わります。

まとめ

  • アプリをインストールしてもらえても、端末の中で起動してもらえるかもらえないかの戦いがある。
    • 特にWindows Phoneではタイルに追加してもらえるか、一覧で眠り続けるか。
    • リストの並び替えが自由にできない分競争はほかのプラットフォームよりも激しいと考える。
  • スタート画面においてもらえるよう、タイルを活用しよう。
  • タイルを更新するのはプッシュもいいけどバックグラウンドタスクも考えてみて。

Facebookのふりがなフィールドを埋めてほしい

久々のエントリで唐突ですが、Facebookのアカウントを持っている方にお願いしたいこと。名前のふりがなフィールドを埋めてほしいんです。

Windows Phoneのpeople hubには、名前のふりがなでインデックスを表示する機能がありますが、ふりがなが降っていないとすべて地球マークのところにきてしまって思うように使えないんです。

なので、以下のやり方を見て設定してくれるとWindows Phoneユーザーがうれしいです。

設定方法

Facebookのページ右上からアカウント設定を開きます。

名前のところを開くとふりがな入れるところがあるので入力します。