Windows phone 7 用密码锁定应用程序

Windows phone 7 用密码锁定应用程序,windows-phone-7,windows-phone-8,Windows Phone 7,Windows Phone 8,在WP应用程序中,我们需要提供用户选项以使用密码锁定应用程序 由于我了解WP应用程序生命周期,我需要在app.Application_激活、app.Application_停用和开始页面中设置锁定页面的导航,但我无法在app类中使用导航服务 我不想在其他页面中放置导航代码以锁定页面,或者没有其他选项?为什么不创建一个输入密码的起始页面 对于拥有MainPage.xaml的实例,请创建一个InsertPasswordPage.xaml,并在WMAppManifest上引用它作为起始页: <

在WP应用程序中,我们需要提供用户选项以使用密码锁定应用程序

由于我了解WP应用程序生命周期,我需要在app.Application_激活、app.Application_停用和开始页面中设置锁定页面的导航,但我无法在app类中使用导航服务


我不想在其他页面中放置导航代码以锁定页面,或者没有其他选项?

为什么不创建一个输入密码的起始页面

对于拥有MainPage.xaml的实例,请创建一个InsertPasswordPage.xaml,并在WMAppManifest上引用它作为起始页:

  <DefaultTask Name="_default" NavigationPage="InsertPasswordPage.xaml" />

并在InsertPasswordPage.xaml上插入所有密码逻辑,当用户成功登录时,只需导航到主页;)


编辑:正如Gambit所说,如果用户按下后退按钮,他将返回插入密码页面,但您可以通过在用户登录后从后退页面删除该页面来解决此问题。

您应该在
应用程序启动
应用程序激活
事件中添加检查

应用程序首次打开时的启动事件,以及用户离开后返回应用程序执行其他操作时的激活事件

让这些事件都设置一个标志,并使所有页面在导航到该标志时从检查中继承的基页。检查是否设置了该标志,如果设置了,则显示登录提示,然后在成功输入密码后清除该标志。
除了正常启动应用程序外,此方法还将处理FAS、远链接和深度链接


当心一些选择器返回应用程序时会触发激活的事件。如果需要,为这些添加额外的处理。

我编写了自己的解决方案,但可能它并没有那么优雅

应用程序锁定逻辑:用户使用密码启用应用程序锁定,我们在应用程序类中处理应用程序禁用和应用程序关闭事件,如果用户启用此选项,则将应用程序标记为锁定。然后,在每个页面上,我们应该检查:应用程序当前是否已锁定,如果已锁定,我们应该导航到AppLockedWithPasswordPage。在AppLockedWithPasswordPage上,我们需要检查用户的密码是否正确,请调用NavigationService.GoBack()

因此,我们需要执行6个步骤:

  • 您应该选择保存IsAppCurrentlyLocked(bool标志)、AppLockPassword(字符串)和IsUserEnabledAppLockWithPassword(bool标志)的位置。我选择了隔离存储设置

  • 创建AppLockedWithPassword页面,您需要在其中显示文本框和按钮,不要忘记为用户提供重置AppLock的选项,当然要删除应用程序数据

  • AppLockedWithPasswordPage应阻止BackButton导航,因此阻止它:

    // AppLockedWithPasswordPage
    protected override void OnBackKeyPress(CancelEventArgs e)
    {
        // Preventing back key navigation
        e.Cancel = true;
    }
    
  • 单击按钮时检查密码

    // AppLockedWithPasswordPage
    private void UnlockAppButton_Click(object sender, RoutedEventArgs e)
    {
        if (PasswordBox.Password.Equals(IsolatedStorageSettings["AppLockPassword"]))
        {
            NavigationService.GoBack();
        }
        else
        {
            // Say user, that password incorrect, etc...
        }
    }
    
  • 在App类find Application_Deactivated(用于处理应用程序最小化(windows按钮))和Application_Closing(用于处理用户关闭应用程序时的情况)方法中,如果发生此事件时用户启用了此选项,则应将应用程序标记为锁定

    private void SetIsAppCurrentlyLockedFlagIfUserEnabledAppLocking()
    {
        if ((bool)IsolatedStorageSettings["IsUserEnabledAppLockWithPassword"])
        {
            IsolatedStorageSettings["IsAppCurrentlyLocked"] = true;
        }
    }
    
    private void Application_Deactivated(object sender, DeactivatedEventArgs e)
    {
        SetIsAppCurrentlyLockedFlagIfUserEnabledAppLocking();
    }
    
    private void Application_Closing(object sender, ClosingEventArgs e)
    {
        SetIsAppCurrentlyLockedFlagIfUserEnabledAppLocking();
    }
    
  • 最后一步,在所有要锁定的页面上,您应该将check-in-on-navigated添加到方法中,如果应用程序当前被锁定,该方法将导航到AppLockedWithPasswordPage

    // Create some class, like PagesUtils or so on with check method
    private static Uri uriToAppLockedWithPasswordPage = new Uri("pathToAppLockedWithPasswordPage", UriKind.Relative);
    
    public static void NavigateToAppLockedWithPasswordPageIfAppLocked(PhoneApplicationPage page)
    {
        if ((bool)IsolatedStorageSettings["IsAppCurrentlyLocked"])
        {
            page.NavigationService.Navigate(uriToAppLockedWithPasswordPage); 
        }
    }
    
    // In each page you want to lock add
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        PagesUtils.NavigateToAppLockedWithPasswordPageIfAppLocked();
        base.OnNavigatedTo();
    }
    

  • 当然,真正的代码要好得多,这只是一个简单的例子,我希望它能帮助你

    这种方法的问题是,当用户点击主页上的后退按钮时,他会再次遇到密码页面。此外,如果用户从某个任意页面跳出应用程序,当他们跳回应用程序时,密码页面将不会显示以阻止他们。错误的是,您可以从后堆栈中获取该页面以解决该问题。感谢您提供的关于编辑帖子的提示;)从后堆栈中删除页面不会解决用户通过Home按钮跳出应用程序,然后通过back按钮返回应用程序的问题。即使在这个应用程序切换场景中,用户也需要被密码页面阻止。Gambit请阅读我的编辑,只有在用户登录后才从Backback中删除。现在,这取决于用例,如果应用程序被挂起,则应显示通行证或不显示通行证,这取决于情况,可以使用remove from Backback,也可以不确定您是否理解该场景。如果你的backbackback看起来像:Login->MainPage->Page2->Page3->Page4,那么现在用户将退出应用程序。当他返回应用程序时,backback被恢复,应用程序将希望将他放在第4页。但他应该立即被登录页面阻止。从Backback中删除或不删除登录页面并不能解决此问题。我正在处理Application_Deactivated和Application_Closing事件,并设置应用程序被锁定的标志,然后在每个页面上进行检查,如果标志被锁定,将打开LockPagetrue@ArtemZinnatullin你是说你已经按照我的建议做了,或者你的评论中还有其他问题吗?如果我的答案回答了你的问题,你应该接受答案并投票。不,我想说的是,应用程序启动和应用程序激活事件没有用处,因为我不能在这个事件中将导航代码放入AppLockedWithPassword页面。正如你所看到的,我已经解决了我的问题,并且写了自己的answer@ArtemZinnatullin我没说用这些事件来触发导航。我说用它们来跟踪何时显示密码提示。正如您在关闭和停用事件时所做的那样。我会为您的页面使用基类来调用
    PagesUtils.NavigateToAppLockedWithPasswordPageIfAppLocked()
    ,这样您就不必在每个页面上都添加它。