酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

電話機IDのパーミッションについて

色々と省略して書きます。

WMAppManifest.xmlにてアプリケーションの権限を定義することが出来ます。以下のスクリーンショットは、WebMarketplaceで見つけたとあるアプリケーションです。

このアプリでは電話機IDが使用されているようです。電話機IDとは何か?というと、ユニークなデバイスID、メーカー名、またはモデル名などのデバイス固有の情報にあたります*1

WMAppManifest.xmlには以下の権限が付与されているはずです。



例えば、モデル名を取得するのにID_CAP_IDENTITY_DEVICEの権限が付与する必要があるのかどうか検証してみたいと思います。

DeviceExtendedPropertiesクラスを使った場合

Windows Phone OS 7.0まで使用されていたDeviceExtendedPropertiesクラスです。Windows Phone OS 7.1からのアプリでの使用は非推奨となっています。

Windows Phone OS 7.1よりDeviceStatusクラスが追加され、デバイスのユニークIDを取得する用途以外には、DeviceExtendedPropertiesクラスを使うべきではありません*2

しかし、Windows Phone OS 7.0との互換性維持のため、DeviceExtendedPropertiesでもモデル名を取得することが可能です。試してみましょう。

    var manufacturer2 = (string)Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceName");
    MessageBox.Show(manufacturer2);

Marketplace Testkitでアプリケーションの検証を調べると、このアプリケーションではデバイス固有情報にアクセスしているので、ID_CAP_IDENTITY_DEVICEの権限は必要と判断されます。

DeviceStatusクラスを使った場合

Windows Phone OS 7.1から追加されたDeviceStatusクラスを使った場合は、必要な権限はどうなるでしょうか。

    var manufacturer1 = Microsoft.Phone.Info.DeviceStatus.DeviceName;
    MessageBox.Show(manufacturer1);

Marketplace Testkitでアプリケーションの検証を調べると、ID_CAP_IDENTITY_DEVICEの権限は必要なしという結果になりました。

何故、同じモデル名にアクセスしているにも関わらず、必要な権限が異なるのでしょうか?(MSDNライブラリに記載を見つけることが出来なかったので推測ですが)DeviceStatusはDeviceExtendedPropertiesの下位互換クラスであるため、アクセス可能な情報が限られています。

例えば、DeviceExtendedPropertiesを使用すると下記のコードでデバイスのユニークIDを取得することが出来ますが、DeviceStatusクラスではユニークIDは取得できません。

   var id = (byte[])Microsoft.Phone.Info.DeviceExtendedProperties.GetValue("DeviceUniqueId");

結論としては、メーカー名とモデル名を取得する程度であれば、電話機IDは必要ないのではないでしょうか。

*1:[http://msdn.microsoft.com/en-us/library/ff769509%28v=vs.92%29.aspx#BKMK_Capabilities:title]

*2:[http://msdn.microsoft.com/en-us/library/ff941122%28v=vs.92%29.aspx:title]