每个应用都需要存储数据,它是否用于在Azure移动服务中用简单的表存储相同类型的记录集合,或者通过访问Web服务.暴漏的SQL数据库。 当数据是无结构的时候,可以使用Azure DocumentDB这个NoSQL。对于可伸缩性和高可用性,在这两种情况下都可以使用Azure CosmosDb。在企业情况下,然而,在不同类型的文件需要存储和共享的同时,最好的解决方案是商业版的OneDrive。商业OneDrive是Office365的一部分,并提供多个方便访问的Office365服务。我们已经知道使用Xamari进行移动应用开发,并整合商业版OneDrive。
自那时以来,已经有了这样的API和SDK集成简单的变化。我们从这篇博文中可以看到这些变化。
第1步:应用程序注册
为了在移动应用中集成商业OneDrive,应用程序需要注册到Azure活动目录服务。在访问这些资源的时候需要用户的验证和授权。这个过程和其他注册Azure活动目录的程序一样。
访问https://apps.dev.microsoft.com/并点击Add an app开始入门。 输入你的应用程序的名字并继续,请确保标注应用程序的Id。点击Add Platorm并选择Native Application。
确保你明确委托授权应用程序来访问存储在商业OneDrive中的文件:
- Files.Read
- Files.Read.All
- Files.Read.Selected
- Files.ReadWrite
- Files.ReadWrite.All
- User.Read
第2步:调用API
一旦注册了应用程序,创建一个包含PCL代码共享策略的空白Xamarin.Forms应用程序。确保选择了PCL设置为Profile7的概要文件,右键单击PCL工程并选择Properties > Build > General。添加两个Nuget包:Microsoft.Identity.Client和Microsoft.Graph。
在App.xaml.cs代码后置中使用Microsoft认证库(MSAL)来验证这个用户。
using Microsoft.Identity.Client; ... public static PublicClientApplication IdentityClientApp = null; public static string ClientID = "4f91166f-c946-438f-8d07-33792251026d"; public static string[] Scopes = { "User.Read", "User.ReadBasic.All", "Files.Read", "Files.Read.All", "Files.ReadWrite", "Files.ReadWrite.All" }; public static UIParent UiParent = null; public App() { InitializeComponent(); MainPage = new XamarinDrive.MainPage(); IdentityClientApp = new PublicClientApplication(ClientID); MainPage = new NavigationPage(new MainPage()); }
在认证过程完成之后,创建一个GraphServiceClient对象,他将在代码后置MainPage.xaml.cs中处理相应的请求。
using Microsoft.Graph; using Microsoft.Identity.Client; ... private async Task CreateGraphClientAsync() { try { Client = new GraphServiceClient("https://graph.microsoft.com/v1.0", new DelegateAuthenticationProvider( async (requestMessage) => { var tokenRequest = await App.IdentityClientApp.AcquireTokenAsync(App.Scopes, App.UiParent).ConfigureAwait(false); requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", tokenRequest.AccessToken); })); Me = await Client.Me.Request().GetAsync(); Username.Text = $"Welcome {((User)Me).DisplayName}"; return true; } catch (MsalException ex){ await DisplayAlert("Error", ex.Message, "OK", "Cancel"); return false; } }
使用GraphServiceClient和Graph模型,遍历驱动器并得到驱动器下的项目列表(文件和文件夹)。在ListPage.xaml.cs文件中将这个列表分配给列表视图控件。
using Microsoft.Graph; ... var client = new GraphServiceClient("https://graph.microsoft.com/v1.0", new DelegateAuthenticationProvider( async (requestMessage) => { var tokenRequest = await App.IdentityClientApp.AcquireTokenSilentAsync(App.Scopes, App.IdentityClientApp.Users.FirstOrDefault()); requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", tokenRequest.AccessToken); })); var data = await client.Me.Drive.Root.Children.Request().GetAsync(); var list = data.ToList(); FileList.ItemsSource = list;
通过绑定到ListView,驱动器列表项目列表将显示在ListPage上。当用户点击列表中的某一项,将通过请求打开文件。这个可以通过OnItemTapped事件触发。
var item = ((DriveItem) e.Item); if (item.Folder != null) await DisplayAlert("Type", "Selected Item is a Folder!", "Ok"); else Xamarin.Forms.Device.OpenUri(new Uri(item.WebUrl));
和某些Xamarin.Forms应用要求实现平台指定功能不一样,正对每一个不同的平台,实现不同的认证服务。
第3步:运行应用程序
在设备或者模拟器上运行这个应用程序,使用你的Office365认证登录。应用程序会要求适当的权限。一旦授权,应用程序将显示文件列表。
结束语
商业OneDrive,是Office365的一部分,允许用户存储,共享和协调不同类型的文档。使用Microsoft图形客户端库和Microsoft认证库,可以非常简单的集成Office365服务,比如OneDrive。实际上,你可以在GitHub上看到这篇博文中的样例。