[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
很抱歉,必須登入網站才能發佈留言。