256MB デバイスはバックグラウンドタスクをサポートしない!

#wpdev_jp

すみません!大事なことを伝えるのを忘れていました。

Windows Phone アプリケーション トライアスロン用にハンズオン資料とサンプルアプリケーションを公開しましたが、そのままだと審査に落ちます!

なぜ落ちる?

今回のサンプルの中で、タイルの更新用にバックグラウンドタスクを使っていますが、256MBデバイスではバックグラウンドタスクを動かすことはできません。そのため、バックグラウンドタスクを起動した瞬間にアプリケーションがフェイルして落ちてしまいます。

本来ならばこの辺のための処理を入れておかなければならなかったのですが、...すっかり忘れていました。

すいません。

 

対応方法

バックグラウンドタスクを必要とする場合、解決策は一つしかありません。アプリケーションの対象デバイスを512MB以上のデバイスに限定することです。

このためには、WMAppManifest.xaml ファイルの<Rqurements>の中に、以下のように ID_REQ_MEMORY_90 を追加してください。

</Capabilities>
<Requirements>
     <Requirement Name="ID_REQ_MEMORY_90" />
</Requirements>

上記設定をすることで、256MBデバイスは除外になりますので、問題は解決するかと思います。

 

512MBデバイスの判定方法

ただ、もしバックグラウンドタスクが必須でない場合、512MB以上のデバイスで動作している場合のみ、バックグラウンドタスクを起動させる、という方法も選択ができます。

その場合は以下のように DeviceExtendedPropertiesで、ApplicationWorkingSetLimit の値を取得して94371840 以上あるかどうかで判断します(94371840以上の場合は512MBデバイスとなります)

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    try
    {
        Int64 result = (Int64)DeviceExtendedProperties.GetValue("ApplicationWorkingSetLimit");
        if (result < 94371840L)
            MainPage.IsLowMemDevice = true;
        else
            MainPage.IsLowMemDevice = false;
    }
    catch (ArgumentOutOfRangeException)
    {
        // 7.0デバイスの場合は必然的に512MBデバイスとなる。
        MainPage.IsLowMemDevice = false;
    }
}

このようにアプリケーション起動時にチェックし、フラグを立てておくことで、アプリケーションの中で常に簡単にデバイスの状況を把握することができます。