【uwp】浅谈China Daily中数据同步到One Drive的实现
新版China Daily与旧版相比新增了数据同步的功能,那这个功能具体是如何实现的呢,现在让我们来一起看看。
1.注册应用
开发者中心的应用注册就不用多说了(https://developer.microsoft.com/windows)。因为稍后的步骤会涉及到项目与应用关联,所以各位可以先行准备好。
2.在应用中添加相应的Nuget包
创建工程的部分就不用我赘述了,要是不会的……自个儿撞墙去吧(ˉ▽ˉ;)...

特别说明:安装Microsoft.OneDriveSDK的1.x版本!!
OneDriveSDK的2.x版本和1.x版本有较大程度的差异。很尴尬的是,对于2.x版本的正确使用方式,鄙人还未能掌握,所以本文皆是以1.x版本的API进行的讲解(个人使用的是1.2.0版本SDK)。
(PS: 如果觉得这种安装方式太low了,可以通过View -> Other Windows -> Package Manager Console安装,PM> Install-Package Microsoft.OneDriveSDK -Version 1.2.0)
3.应用关联
将应用程序与应用商店相关联


关联完成后,准备工作就算是做完了。
4.SDK的具体使用
OneDriveSDK在China Daily中的应用,总体来说分两步走:1.身份验证 2.通过上传、下载等方法实现数据同步的功能。
说明:我创建了一个OneDriveUtil的静态类,并在类里面实现身份验证、上传、下载的方法。所以下述(方法调用部分除外)的字段、方法都使用了static关键字进行限制。
1)部分全局变量
// Client
private static IOneDriveClient _client; // 所请求的权限
private static string[] scopes = new string[] { "onedrive.readwrite", "wl.offline_access", "wl.signin" };
至于权限的详细信息,请参见微软相关文档https://dev.onedrive.com/auth/msa_oauth.htm

2)身份验证
/// <summary>
/// 身份验证
/// </summary>
/// <returns></returns>
public static async Task<bool> LogInAsync()
{
try
{
_client = OneDriveClientExtensions.GetUniversalClient(scopes);
var session = await _client.AuthenticateAsync(); return session != null;
}
catch (OneDriveException ex)
{
Debug.WriteLine(ex.Message); return false;
}
}
OneDriveSDK是十分人性化的,因为我们不需要主动管理Session,只需要一个全局的Client即可。
3)上传功能
/// <summary>
/// 上传文件到OneDrive
/// </summary>
/// <returns></returns>
public static async Task<bool> UploadFileAsync()
{
var file = await StorageFile.GetFileFromPathAsync($"ms-appx:///Assets/Images/{fileName}"); return await UploadFileAsync(file, OneDriveFilePath);
} /// <summary>
/// 上传文件到OneDrive
/// </summary>
/// <param name="file"></param>
/// <param name="path"></param>
/// <returns></returns>
private static async Task<bool> UploadFileAsync(StorageFile file, string serverPath)
{
if (file != null)
{
var stream = await file.OpenStreamForReadAsync(); var item = await _client
.Drive
.Root
.ItemWithPath(serverPath)
.Content
.Request()
.PutAsync<Item>(stream); return true;
} return false;
}
4)下载功能
/// <summary>
/// 从OneDrive下载文件
/// </summary>
/// <returns></returns>
public static async Task<Stream> DownloadFileAsync()
{
return await DownloadFileAsync(OneDriveFilePath);
} /// <summary>
/// 从OneDrive下载文件
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
private static async Task<Stream> DownloadFileAsync(string serverPath)
{
var item = await _client
.Drive
.Root
.ItemWithPath(serverPath)
.Request()
.GetAsync(); var stream = await _client
.Drive
.Items[item.Id]
.Content
.Request()
.GetAsync(); return stream;
}
5)方法调用
注:代码中的UpdateProgressRing方法(更新进度条显示状态)以及ToastService.SendToast方法(弹框提示),各位不必太在意。
// 备份功能的实现
if (await OneDriveUtil.LogInAsync())
{
UpdateProgressRing(true, "Uploading data..."); var succeed = await OneDriveUtil.UploadFileAsync(); ToastService.SendToast(succeed ? "Succeed (●'◡'●)" : "Fail (⊙︿⊙)");
}
// 同步功能的实现
if (await OneDriveUtil.LogInAsync())
{
UpdateProgressRing(true, "Downloading data..."); using (var stream = await OneDriveUtil.DownloadFileAsync())
{
await ImportDataAsync(stream);
}
}
/// <summary>
/// 通过文件流导入数据
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public static async Task ImportDataAsync(Stream stream)
{
if (stream != null)
{
try
{
// 这个地方使用了图片库,一定要记得申请相关权限(见下图)
var lib = KnownFolders.PicturesLibrary;
var file = await lib.CreateFileAsync(OneDriveUtil.fileName, CreationCollisionOption.ReplaceExisting); byte[] buffer = new byte[stream.Length];
await stream.ReadAsync(buffer, , buffer.Length); var fs = await file.OpenStreamForWriteAsync();
fs.Write(buffer, , buffer.Length); ToastService.SendToast("Succeed (●'◡'●)");
}
catch
{
ToastService.SendToast("Fail (⊙︿⊙)");
}
}
else
{
ToastService.SendToast("Fail (⊙︿⊙)");
}
}

6)初次运行
初次运行时,系统会弹框提示用户是否授权(如图)。如果授权成功,则以后一般都不会再弹出提示,除非身份验证过期。

5.Demo
http://files.cnblogs.com/files/lary/OneDriveDemo.rar
6.参考
Win10开发:OneDrive SDK 的使用 http://blog.csdn.net/zmq570235977/article/details/50520247
【uwp】浅谈China Daily中数据同步到One Drive的实现的更多相关文章
- 【uwp】浅谈China Daily 中划词翻译的实现
学习uwp开发也有一段时间了,最近上架了一个小应用(China Daily),现在准备将开发中所学到的一些东西拿出来跟大家分享交流一下. 先给出应用的下载链接:China Daily , 感兴趣的童鞋 ...
- 浅谈hbase表中数据导出导入(也就是备份)
转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=23916356&id=3321832 最近因为生产环境hbase ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 浅谈C++11中的多线程(三)
摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...
- 浅谈C++11中的多线程(二)
摘要 本篇文章围绕以下几个问题展开: 进程和线程的区别 何为并发?C++中如何解决并发问题?C++中多线程的基本操作 浅谈C++11中的多线程(一) - 唯有自己强大 - 博客园 (cnblogs.c ...
- 转:浅谈C/C++中的指针和数组(一)
再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...
- 转: 浅谈C/C++中的指针和数组(二)
转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈C语言中的强符号、弱符号、强引用和弱引用
摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...
随机推荐
- html 框架 2017-03-11
1. 框架frameset (不在body中编写) Eg: 显示如下框架 第一步: <frameset rows="100,100,*" frmameborder=&qu ...
- 基于Spring-WS的Restful API的集成测试
在很多Java企业级应用中,Spring占据了非常重要的位置,这就导致了基本上的技术选型都是围绕着Spring来, 比方说笔者最近的项目需要开发一个Restful的API接口,选型的时候就说,客户架构 ...
- mysql数据库开启慢查询日志
修改配置文件 在配置文件my.ini中加上下面两句话 log-slow-queries = C:\xampp\mysql_slow_query.log long_query_time=3 第一句使用来 ...
- 为什么用IP无法访问网站,域名可以访问?
我们访问网站都是通过域名进行访问的,偶尔会使用网站IP进行访问,如学校通常使用IP登录教务处,但很多的时候我们无法通过ip进行访问其他网站,这就涉及到服务器的问题了. 网站都是依托在服务器上面的,而服 ...
- 时间相关库<ctime>解析
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5649487.html 一.定义的类型 1.clock_t:时钟类型 2.size_t:unsign ...
- iOS开发之UIDynamic
1.概述 什么是UIDynamic? UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架. 可以认为是一种物理引擎,能模拟和仿真现实生活中的物理现象.比如:重力.弹性碰撞等现象 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log
日常啰嗦 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外,这段时间也在学习docker的相关知识,所以博客就没有继续写了,推荐一本书<Docker技术入门与实战>(第二版) ...
- javaScriptCore 实战 与 小结
源码在这,看不懂的直接撸源码就行,转载声明出处 原生调用JS的大致流程,做了个思维简图 这是代码流程 // JS数据 func getJSVar() { let context: JSContex ...
- line-height属性总结
line-height属性的继承性: 子元素不设置line-height时, 在父元上设置带单位的值和百分比时会先计算父元素的line-height大小然后继承过来,在父元素上设置无单位的数值时,子 ...
- IOS开发创建开发证书及发布App应用(四)——创建配置概要文件
4.创建配置概要文件 继续上一篇所讲,今天写的这个是创建配置概要文件 依然在个人中心创建证书这里, 如果不知道的,可以查看以前写的 配置概要文件也分为两种 1)创建开发配置概要文件 2)创建发布配置概 ...