[Universal App]_解決Universal App在Windows Phone上面,Mobile Service 身分驗證會有錯誤的問題
在官方的 Mobile Service 身分驗證教學中,有提到在OnNavigatedTo()裡面就可以進行驗證,
官方範例的todo items也是這麼做,驗證過之後再去跟Azure Mobile Service撈資料。
這樣子的作法在之前Windows Phone 8.0以前是可以這麼做的
但到了Universal App則會出現問題
主要是因為Windows Phone 8.1在OnNavigatedTo()地同時若運作Azure Mobile Service驗證,則會又換一頁
這樣會有UI執行續的問題
造成Azure Mobile Service吐一個看似不像UI問題的錯誤:
An exception of type 'System.Exception' occurred in mscorlib.ni.dll but was not handled in user code Additional information: The remote procedure call failed. (Exception from HRESULT: 0x800706BE)
解決這個問題讓Universal App Todoitem能夠順利運作必須要變動以下兩處
1.在App.xaml.cs裡面加入
protected override void OnActivated(IActivatedEventArgs args) { base.OnActivated(args); #if WINDOWS_PHONE_APP if (args.Kind == ActivationKind.WebAuthenticationBrokerContinuation) { App.MobileService.LoginComplete(args as WebAuthenticationBrokerContinuationEventArgs); } #endif }
複寫OnActivated,讓App啟動過程中Windows Phone檢查是否已經登入過。
2.原先寫在MainPage.cs裡面的內容,通通先註解移除吧!
protected override async void OnNavigatedTo(NavigationEventArgs e) { ////FB AUTH //var user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook); ////SHOW USER ID //await (new MessageDialog(App.MobileService.CurrentUser.UserId)).ShowAsync(); //if (App.MobileService.CurrentUser.UserId != null) //{ // //await InitLocalStoreAsync(); // offline sync // await RefreshTodoItems(); //} }
3.在開頭,讓頁面載入完之後開一個dispatcher讓他執行登入程序(auth)
public MainPage() { this.InitializeComponent(); Loaded += async (sender, args) => { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, auth); }; }
4.把登入程序另外寫成一個名為auth的副程式(名子隨便你)
private async void auth() { //FB AUTH var user = await App.MobileService.LoginAsync(MobileServiceAuthenticationProvider.Facebook); //SHOW USER ID await (new MessageDialog(App.MobileService.CurrentUser.UserId)).ShowAsync(); if (App.MobileService.CurrentUser.UserId != null) { //await InitLocalStoreAsync(); // offline sync await RefreshTodoItems(); } }
就大功告成啦!
thx for:
Leave a comment
很抱歉,必須登入網站才能發佈留言。