本指南介绍如何使用适用于 Azure Mobile Apps 的最新 Apache Cordova 插件执行常见任务。如果您不熟悉 Azure Mobile Apps,建议先完成 Azure Mobile Apps 快速入门,以建立后端、创建数据表并下载预构建的 Apache Cordova 项目。本指南重点介绍客户端 Apache Cordova 插件。
支持的平台
该 SDK 支持 Apache Cordova v6.0.0 及以上版本,适用于 iOS、Android 和 Windows 设备。具体平台支持如下:
- Android API 19 及以上。
- iOS 8.0 及以上版本。
警告:本文基于即将淘汰的 v4.2.0 库版本。该库不再更新,包括安全更新。建议考虑迁移到 .NET 客户端,如 .NET MAUI,以获得持续支持。
设置和先决条件
本指南假设您已使用数据表建立后端。示例使用快速入门中的 TodoItem 数据表。要将 Azure Mobile Apps 插件添加到您的项目,请使用以下命令:
cordova plugin add cordova-plugin-ms-azure-mobile-apps
有关创建第一个 Apache Cordova 应用程序的详细信息,请参阅其文档。
配置 Ionic v2 应用程序
要正确配置 Ionic v2 项目,首先创建基本应用程序并添加 Cordova 插件:
ionic start projectName --v2
cd projectName
ionic plugin add cordova-plugin-ms-azure-mobile-apps
将以下行添加到 app.component.ts,以创建客户端对象:
declare var WindowsAzure: any;
var client = new WindowsAzure.MobileServiceClient("https://yoursite.azurewebsites.net");
现在可以在浏览器中构建并运行项目:
ionic platform add browser
ionic run browser
Azure Mobile Apps Cordova 插件同时支持 Ionic v1 和 v2 应用程序。只有 Ionic v2 应用程序需要额外声明 WindowsAzure 对象。
创建客户端连接
创建 WindowsAzure.MobileServiceClient 对象以建立客户端连接。将 appUrl 替换为移动应用的 URL。
var client = WindowsAzure.MobileServiceClient(appUrl);
使用数据表
要访问或更新数据,请创建后端数据表的引用。将 tableName 替换为数据表的名称。
var table = client.getTable(tableName);
一旦有了数据表引用,就可以进一步处理数据表,包括查询、插入、修改和删除数据。
查询数据表引用
有了数据表引用后,可以使用它来查询服务器上的数据。查询使用类似 LINQ 的语言。要返回表中的所有数据,请使用以下代码:
/**
* 处理通过调用 table.read() 接收到的结果
*
* @param {Object} results 作为伪数组的结果
* @param {int} results.length 结果数组的长度
* @param {Object} results[] 单个结果
*/
function success(results) {
var numItemsRead = results.length;
for (var i = 0 ; i < results.length ; i++) {
var row = results[i];
// 每行是一个对象 - 属性是列
}
}
function failure(error) {
throw new Error('加载数据时出错: ', error);
}
table.read().then(success, failure);
成功函数会使用结果调用。不要在成功函数中使用 for (var i in results),因为这会遍历结果中包含的其他信息,当使用其他查询函数如 .includeTotalCount() 时。有关查询语法的详细信息,请参阅 Query 对象文档。
在服务器上筛选数据
可以在数据表引用上使用 where 子句进行筛选:
table.where({ userId: user.userId, complete: false }).read().then(success, failure);
也可以使用筛选对象的函数,其中 this 变量被分配给正在筛选的当前对象。以下代码的功能与前面的示例相同:
function filterByUserId(currentUserId) {
return this.userId === currentUserId && this.complete === false;
}
table.where(filterByUserId, user.userId).read().then(success, failure);
分页数据
使用 take() 和 skip() 方法实现分页。例如,如果要将表分割成 100 条记录:
var totalCount = 0, pages = 0;
// 步骤 1 - 获取总记录数
table.includeTotalCount().take(0).read(function (results) {
totalCount = results.totalCount;
pages = Math.floor(totalCount/100) + 1;
loadPage(0);
}, failure);
function loadPage(pageNum) {
let skip = pageNum * 100;
table.skip(skip).take(100).read(function (results) {
for (var i = 0 ; i < results.length ; i++) {
var row = results[i];
// 处理每一行
}
});
}
.includeTotalCount() 方法用于将 totalCount 字段添加到结果对象,该字段填充了如果不使用分页将返回的记录总数。然后,可以使用 pages 变量和一些 UI 按钮提供页面列表,并通过 loadPage() 加载每个页面的新记录。建议实现缓存以加速访问已加载的记录。
返回排序后的数据
使用 .orderBy() 或 .orderByDescending() 查询方法进行排序:
table.orderBy('name').read().then(success, failure);
插入数据
创建 JavaScript 对象并异步调用 table.insert() 来插入数据:
var newItem = {
name: 'My Name',
signupDate: new Date()
};
table.insert(newItem).done(function (insertedItem) {
var id = insertedItem.id;
}, failure);
成功插入后,会返回插入的项目,其中包含同步操作所需的额外字段。使用此信息更新缓存以供后续更新。Azure Mobile Apps Node.js Server SDK 支持动态架构以供开发,允许在插入或更新操作中指定列,但建议在将应用程序移至生产环境之前关闭动态架构。
修改数据
创建 Update 对象并调用 .update() 来修改数据,update 对象必须包含要更新的记录标识符:
var updateItem = {
id: '7163bc7a-70b2-4dde-98e9-8818969611bd',
name: 'My New Name'
};
table.update(updateItem).done(function (updatedItem) {
// 现在可以更新缓存的副本
}, failure);
删除数据
调用 .del() 方法并传递记录标识符来删除数据:
table.del({ id: '7163bc7a-70b2-4dde-98e9-8818969611bd' }).done(function () {
// 记录现已删除 - 更新缓存
}, failure);
验证用户
Azure App Service 支持使用外部身份提供者(如 Facebook、Google、Microsoft 账户和 Twitter)来验证和授权用户。可以配置表的权限以限制访问,或在服务器脚本中使用已验证用户的身份实现授权规则。有关详细信息,请参阅 验证教程。在 Apache Cordova 应用程序中使用验证时,必须安装以下 Cordova 插件:
注意:iOS 和 Android 中最近的安全变更可能使服务器流程验证无法使用,此时必须使用客户端流程。支持两种验证流程:服务器流程和客户端流程。服务器流程依赖提供者的 Web 验证界面,提供简单体验;客户端流程允许更深入地集成设备特定功能(如单点登录),依赖提供者特定的 SDK。
向提供者进行验证(服务器流程)
要让 Mobile Apps 管理验证过程,需向身份提供者注册应用程序并在 Azure App Service 中配置应用程序标识符和秘密。注册后,使用提供者的名称调用 .login() 方法,例如使用 Facebook 登录:
client.login("facebook").done(function (results) {
alert("You are now signed in as: " + results.userId);
}, function (err) {
alert("Error: " + err);
});
有效提供者值为 'aad'、'facebook'、'google'、'microsoftaccount' 和 'twitter'。注意:某些提供者可能无法使用服务器流程,需改用客户端流程。服务器流程中,Azure App Service 管理 OAuth 2.0 流程,显示登录页面并生成验证令牌;登录函数返回包含 userId 和 authenticationToken 的 JSON 对象,令牌可缓存至到期。
向提供者进行验证(客户端流程)
应用程序可独立联系身份提供者,然后将令牌提供给 App Service 进行验证,以实现单点登录或检索额外用户数据。示例使用 Facebook 客户端 SDK:
client.login("facebook", {"access_token": token}).done(function (results) {
alert("You are now signed in as: " + results.userId);
}, function (err) {
alert("Error: " + err);
});
假设令牌存储在变量中,具体格式因提供者而异,请参阅 Azure App Service 验证文档 了解详细信息。
获取已验证用户的相关信息
通过 HTTP 调用 /.auth/me 端点可检索验证信息,需设置 X-ZUMO-AUTH 标头为验证令牌(存储在 client.currentUser.mobileServiceAuthenticationToken 中)。使用 Fetch API 的示例:
var url = client.applicationUrl + '/.auth/me';
var headers = new Headers();
headers.append('X-ZUMO-AUTH', client.currentUser.mobileServiceAuthenticationToken);
fetch(url, { headers: headers })
.then(function (data) {
return data.json();
}).then(function (user) {
// user 对象包含已验证用户的声明
});
Fetch 可从 npm 包 或 CDNJS 获取,数据以 JSON 对象形式返回。
为外部重定向 URL 配置您的移动 App Service
Apache Cordova 应用程序常使用回环地址处理 OAuth UI 流程(如 Ripple 模拟器、Ionic 实时重载、本地运行后端等),但验证服务默认不知如何处理 localhost。需配置 allowedExternalRedirectUrls 以添加回环 URL。
- 登录 Azure 门户。
- 选择 所有资源 或 应用服务,点击移动应用程序名称。
- 点击 工具。
- 在 观察 菜单中点击 资源管理器,然后点击 Go 打开新窗口。
- 展开左侧导航中 配置、authsettings 站点的验证设置。
- 点击 编辑。
- 找到 "allowedExternalRedirectUrls" 元素,将其值更改为包含服务 URL 的数组,例如:
"allowedExternalRedirectUrls": [
"http://localhost:3000",
"https://localhost:3000"
]
替换 URL 为您的实际服务地址(如 Node.js 服务的 http://localhost:3000 或 Ripple 服务的 http://localhost:4400)。
8. 点击 读/写 按钮,然后点击绿色 PUT 按钮保存设置。
同时,将这些回环 URL 添加到 App Service 的 CORS 设置:
- 在 Azure 门户中,选择移动应用程序。
- 打开 设置 边栏,或点击 所有设置。
- 在 API 菜单下点击 CORS。
- 输入 URL 并按 Enter,视需添加更多。
- 点击 保存。
新设置需约 10-15 秒生效。