2013-03-18 93 views
0

在WP應用程序中,我們需要提供用戶選項以使用密碼鎖定應用程序。使用密碼鎖定應用程序

據我瞭解WP應用程序生命週期,我需要把導航LockPage在App.Application_Activated,App.Application_Deactivated開始頁面,但我不能在App類使用的NavigationService ...

我不想把導航代碼鎖定在其他頁面的頁面,或者沒有其他選項?

回答

1

我所著自己的解決方案,但可能也不是那麼優雅,因爲它可以。

應用鎖定邏輯:用戶能夠應用與密碼鎖,我們在處理Application_Deactivated並在App類Application_Closing事件和鎖定用戶,如果啓用此選項標記的應用程序。然後,在每個頁面上,我們應該檢查:應用程序當前是否被鎖定,如果是,我們應該導航到AppLockedWithPasswordPage。在AppLockedWithPasswordPage上,我們需要檢查用戶的密碼,如果它是正確的,調用NavigationService.GoBack()。

因此,我們需要做的6個步驟:

  1. 你應該選擇在哪裏保存IsAppCurrentlyLocked(布爾標誌),AppLockPassword(串)和IsUserEnabledAppLockWithPassword(布爾標誌)。我選擇了IsolatedStorageSettings

  2. 創建AppLockedWithPassword頁面,在這裏你需要顯示文本框和按鈕,不要忘記提供選項供用戶當然有刪除的應用程序數據

  3. AppLockedWithPasswordPage應防止後退按鈕導航重置的AppLock,所以防止它:

    // 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鍵)),並在該事件發生

    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. 爲鎖定,如果用戶啓用該選項Application_Closing(處理當用戶關閉應用程序)的方法,我們應該紀念的應用
  7. ,也是最後一步,在所有網頁上,你想鎖定你應該加入的OnNavigatedTo方法檢查,這將導航到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(); 
    } 
    

P.S.當然,真正的代碼要好得多,這只是簡單的例子,我希望它會幫助你

+2

我會使用一個基類頁面調用'PagesUtils.NavigateToAppLockedWithPasswordPageIfAppLocked()'所以你不必添加它每一頁上。 – 2013-03-20 14:42:14

-1

爲什麼不創造一個輸入密碼的開始頁面?

對於情況下,你有你的MainPage.xaml中,創建一個InsertPasswordPage.xaml引用它WMAppManifest作爲起始頁:

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

而且插入的InsertPasswordPage.xaml所有密碼邏輯,當用戶成功登錄只是導航到您的主頁;)

編輯:由於Gambit說如果用戶按下後退按鈕,他將返回到插入密碼頁面,但您可以通過從後臺堆棧中刪除用戶登錄後的頁面英寸

+2

問題這種方法是,當用戶點擊的MainPage從後退按鈕,他會再次遇到密碼頁面。另外,如果用戶從某個任意頁面跳出應用程序,當他們跳回應用程序時,密碼頁面將不會顯示以阻止它們。 – Gambit 2013-03-18 17:33:16

+0

錯誤,您可以從後面的堆棧中解決該問題。謝謝你的提示編輯吼聲後;) – DVD 2013-03-18 22:03:43

+1

從後面堆棧中刪除的頁面不會解決通過Home鍵跳出應用程序,然後通過返回按鈕返回到應用程序的用戶的問題。即使在這種應用切換場景中,用戶也需要被密碼頁面阻止。 – Gambit 2013-03-18 22:31:00

0

您應該在Application_LaunchingApplication_Activated事件中添加支票。

當應用程序第一次打開並激活一個用於當用戶返回到應用程序在離開後做別的東西的發射活動。

有這些事件都設置一個標誌,並有基頁時,瀏覽到您的所有網頁的檢查繼承了這個標誌。如果設置了該標誌,則應該進行檢查,如果是,則顯示登錄提示,然後在成功輸入密碼後清除該標誌。
這種做法將處理FAS,FAR &深層鏈接,除了正常啓動的應用程序。

當心有些選擇器會在返回到應用程序時觸發激活的事件。根據需要爲這些添加額外的處理/如有必要。

+0

我處理Application_Deactivated和Application_Closing事件,並設置該應用程序被鎖定標誌,然後每一頁我都檢查,將打開LockPage如果標誌爲true – 2013-03-19 05:05:09

+0

@ArtemZinnatullin你只是說,你做了什麼我建議,或者你的評論還有另外一個問題嗎?如果我的回答解決了你的問題,你應該接受答案並且贊成。 – 2013-03-20 09:26:01

+0

不,我想說的話,那Application_Launching和Application_Activated事件不是有用的,因爲我不能把導航代碼AppLockedWithPassword頁面在此事件。正如你所看到的,我已經解決了我的問題,並且寫了自己的答案 – 2013-03-20 11:13:58