每个应用都需要存储数据,它是否用于在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上看到这篇博文中的样例。