用密码锁定应用程序

时间:2013-03-18 12:05:47

标签: windows-phone-7 windows-phone-8

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

据我了解WP app生命周期,我需要在App.Application_Activated,App.Application_Deactivated和启动页面中将导航放到LockPage,但我不能在App类中使用NavigationService ...

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

3 个答案:

答案 0 :(得分:1)

我写了自己的解决方案,但可能不是那么优雅。

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

所以我们需要做6个步骤:

  1. 您应该选择保存 IsAppCurrentlyLocked (bool标志), AppLockPassword (字符串)和 IsUserEnabledAppLockWithPassword (bool标志)的位置。我选择了IsolatedStorageSettings

  2. 创建AppLockedWithPassword页面,您需要显示TextBox和Button,不要忘记为用户提供重置AppLock的选项,当然还有删除应用数据

  3. AppLockedWithPasswordPage应该阻止BackButton导航,因此阻止它:

    // AppLockedWithPasswordPage
    protected override void OnBackKeyPress(CancelEventArgs e)
    {
        // Preventing back key navigation
        e.Cancel = true;
    }
    
  4. 点击按钮上的密码

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

    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();
    }
    
  6. 最后一步,在你要锁定的所有页面上,你应该添加一个OnNavigatedTo方法,如果app当前被锁定,它将导航到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();
    }
    
  7. P.S。当然真正的代码要好得多,这只是一个简单的例子,我希望它能帮到你

答案 1 :(得分:0)

您应该在Application_LaunchingApplication_Activated事件中添加支票。

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

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

小心某些选择器会在返回应用时触发激活的事件。如果需要,可以根据需要为这些添加额外的处理。

答案 2 :(得分:-1)

为什么不创建输入密码的起始页?

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

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

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

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