0

パスコードで保護する必要がある 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 を使用する際 の最大の問題: アプリが休止状態から再アクティブ化されると、マップまたはリダイレクトできるナビゲーションがありません...

4

1 に答える 1