WindowsPhoneアプリに問題があります。
アプリはすべてのデバイスセンサーを使用します:gps、加速度計、コンパス
エミュレーターで実行すると問題なく、電話でデバッグすると問題ありません。
しかし、デバイスからUSBケーブルを取り外してアプリを再起動すると、すぐにクラッシュし、デバッガーが接続されていないため、理由を見つける方法がわかりません。
このような問題をどのようにデバッグできますか?
WindowsPhoneアプリに問題があります。
アプリはすべてのデバイスセンサーを使用します:gps、加速度計、コンパス
エミュレーターで実行すると問題なく、電話でデバッグすると問題ありません。
しかし、デバイスからUSBケーブルを取り外してアプリを再起動すると、すぐにクラッシュし、デバッガーが接続されていないため、理由を見つける方法がわかりません。
このような問題をどのようにデバッグできますか?
これが発生する理由はいくつかあります。デバッグ出力なしで何が起こっているのかを正確に特定することは困難ですが、考えられる原因の簡単な要約を次に示します。
非デバッグモードでアプリがクラッシュする原因として最も可能性が高いのは、起動時間が短いことです。このSOの質問が何であるかについてあなたが遭遇しているのではないかと思います。デバッガーが接続されている場合、ランタイムは、ロードに10秒以上かかるアプリを強制終了するオペレーティングシステムの機能をバイパスします。これは簡単にテストできます。アプリの起動時に実行されているすべてのコードを削除するだけです(その時点でGPSに接続していると想定しているので、コメントしてください)。
上記はあなたの問題を解決するかもしれませんが、あなたはあなたがまた遭遇するかもしれない他のいくつかの問題に注意しなければなりません:
GPS /加速度計/コンパスにアクセスするときは、最初にそれらのセンサーが実際にアクセス可能であり、電話から提供されているかどうかを確認する必要があります。コンパスを提供するためにすべてのWindowsPhoneが必要なわけではありません。WindowsPhoneのハードウェア仕様をご覧ください。コンパスにアクセスしようとしていて、デバイスがコンパスをサポートしていない場合は、それが問題である可能性があります。詳細については、こちらをご覧ください。次のコードは、デバイス上のコンパスの存在を確認する方法の例です(デバイスのコンパスがオフの場合でも、IsSupportedはtrueを返すことに注意してください)。
using Microsoft.Device.Sensors;
public partial class MainPage : PhoneApplicationPage
{
Compass compass;
public MainPage()
{
if (Compass.IsSupported)
{
// awesome. you have a compass
}
else
{
// uh oh… you have a crappy phone, no compass for you :(
}
}
}
あなたが考慮しなければならない他のことの1つはあなたが使用しているデバイスがGPSをオフにしているということです(あなたよりも偉大な開発者はもっと愚かな間違いを犯したと私は確信しています)。GPSがオフになっているか無効になっている場合、またはユーザー(デバイスを持っているユーザー)がアプリにGPSデータの使用を許可していない場合。位置に関する考慮事項のみを扱う場合は、この記事を参照してください(GPS対応のWP7アプリを開発している場合は必読です)。
最後に、デバイスからアクセスしているものをアプリケーションマニフェストファイルで宣言しないと、問題が発生する可能性があります。基本的に、これらをアプリが使用するアイテムとして宣言しないと、問題が発生する可能性があります。アプリが何を使用しているかを宣言する必要がある理由は、Microsoftが、アプリの操作に必要な情報をマーケットプレイスからアプリをダウンロードしているユーザーに適切にフィルタリング/警告/通知できるようにするためです。
Windows Phoneがバッテリーセーバーモードの場合、バッテリー寿命を節約するために一部のセンサーがオフになります(GPS、コンパス、加速度計など)。これは、デバイスが開発マシンに接続されているときにデバイスが実際に充電されていない場合に簡単に発生する可能性があります。
上記の1つまたはすべてが、問題の診断に役立つことを願っています。Lemmeは、それが他の何かであることがわかった場合、他に何がこの問題を引き起こしている可能性があるかを知りたいと思うでしょう。
特定の例外メッセージやスタックトレースを表示しなければならない可能性のある例外処理コードにMessageBox.Showメソッド呼び出しを追加することを検討しましたか?App.xaml.csのApplication_UnhandledExceptionイベントハンドラーに対しても同じことを検討してください。
できることは、スタックトレースやメッセージなどのすべてのデバッグ情報をIsolatedStorageに書き込み、それを別のページに表示できるようにすることです。
電話が接続されている場合、電話がPCのインターネットを使用するため、問題が発生する可能性があります(かなり長い間同じ問題がありました)
AndyPennellがここのブログで説明しているLittleWatsonの手法を使用する価値があります。これにより、例外の詳細が分離ストレージに保存され、アプリケーションが次に起動したときにアプリから電子メールで送信されます。ブログには完全なコードがあります。
電子メールの部分を削除し、開発用PCの分離ストレージからクラッシュの詳細を手動で取得したい場合は、コードを簡単に適応させることができます。