パスコードで保護する必要がある Windows Phone 8 アプリに取り組んでいます。アプリが起動またはアクティブ化されるたびにパスコード画面を表示する最良の方法は何ですか?
アクションの中心は、Launch および Activation イベント ハンドラーを備えた App.xaml.cs であると思います。しかし、パスコード画面を正確に表示するにはどうすればよいですか?
問題は、アプリの起動時または再アクティブ化時にどのページが表示されるかわからないことです。アプリが非アクティブ化されたときに最後に表示されたメイン ページまたはその他のページのいずれかです。
最初のページへのナビゲーションを傍受してキャンセルし、代わりにパスコード ページを表示しようとしました。
// App.xaml.cs
private void InitializePhoneApplication() {
...
RootFrame.Navigating += HandleFirstNavigation;
...
}
private void HandleFirstNavigation(object sender, NavigatingCancelEventArgs e) {
RootFrame.Navigating -= HandleFirstNavigation;
e.Cancel = true;
RootFrame.Dispatcher.BeginInvoke(new Action(this.OpenPasscodePage));
}
private void OpenPasscodePage() {
RootFrame.Navigate(PasscodePageUri);
}
これは機能しますが、アプリが起動したときのみです。アプリが再アクティブ化 (休眠または廃棄) されると、e.Cancel は無視されます。パスコード ページへのナビゲーションは元のページと呼ばれますが、表示されます。
パスコード ページのナビゲーションを Navigating から Navigated に移動しても、次のいずれかの価値はありません。
private void InitializePhoneApplication() {
...
RootFrame.Navigated += PasscodePageAfterFirstNavigation;
...
}
private void PasscodePageAfterFirstNavigation(object sender, EventArgs e) {
RootFrame.Navigated-= PasscodePageAfterFirstNavigation;
RootFrame.Navigate(PasscodePageUri);
}
これはある種の競合状態のようです。パスコード ページが表示される場合もあれば、元のページが表示される場合もあります。パスコード ページが表示されたとしても、アプリがさらにパスコード ページに移動する前に、最初に元のページがほんの一瞬表示されるため、これは見栄えが悪くなります。
どちらのソリューションも機能しません。これを実装する正しい方法は何ですか?
編集:その間、私はどちらもうまくいかない3番目の解決策を試しました。このソリューションでは、Uri マッパーを使用します。
App.xaml.cs
public bool PasscodeWasConfirmed; private void Application_Launching(object sender, LaunchingEventArgs e) {
...
PasscodeWasConfirmed = false;
...
}
private void Application_Activated(object sender, ActivatedEventArgs e) {
...
PasscodeWasConfirmed = false;
...
}
public Uri InitialPageUri;
public bool ShouldRedirectToPasscodePage(Uri uri) {
if (PasswordWasConfirmend == false) {
InitialPageUri = uri;
return true;
}
return false;
}
UriMapper
public class AppUriMapper : UriMapperBase {
public override Uri MapUri(Uri uri) {
App app = (Application.Current as App);
if (app != null) {
if (app.ShouldRedirectToPasscodePage(uri))
return PasscodeQueryPage.PageUri;
}
// default
return uri;
}
}
パスコードページ
public partial class PasscodePage : PhoneApplicationPage {
...
private void PasscodeConfirmed() {
App app = (Application.Current as App);
app.PasscodeWasConfirmed = true;
NavigationService.Navigate(app.InitialPageUri);
}
}
ロジックは問題なく動作していますが、パスコードが確認された後、アプリは InitialPageUri に移動しません。Uri Mapper が正しく呼び出され、InitialPageUri を返します (リダイレクトはもうありません)。しかし、ナビゲーションは行われません...
エラー、例外、またはデバッグ出力はありません。ただ何も起こらない...
Uri Mapper を使用する際 の最大の問題: アプリが休止状態から再アクティブ化されると、マップまたはリダイレクトできるナビゲーションがありません...