nativescript-azure-mobile-apps
Azure 移动应用 NativeScript 插件
npm i --save nativescript-azure-mobile-apps

NativeScript Azure 移动应用插件

Build Status npm downloads npm downloads npm

一个 NativeScript Azure 移动应用插件。

安装

从项目的根目录运行以下命令

tns plugin add nativescript-azure-mobile-apps

此命令将自动安装必要的文件,并将 nativescript-azure-mobile-apps 作为依赖项存储在项目的 package.json 文件中。

配置

对于大多数功能,您只需要知道您的 Azure 移动应用门户的名称。唯一需要额外配置的是 iOS 下的社交登录。请按照以下步骤操作 (以下)

从版本 2.0 开始,由于库的更新,Microsoft 现在要求 Android 的最小 SDK 为 19。因此,您需要调整应用中的 2 个文件

  1. app/App_Resources/Android/AndroidManifest.xml 中,必须将 android:minSdkVersion 设置为 19 或更高。
  2. app/App_Resources/Android/app.gradle 中,您必须确保在您的 defaultConfig 中将 minSdkVersion 设置为与 AndroidManifest.xml 文件中相同的数字。假设您将其设置为 19,则您的文件应类似于以下内容
android {  
defaultConfig {
generatedDensities = []
applicationId = "......"
minSdkVersion 19
}
}

API

MobileServiceClient

静态方法

  • configureClientAuthAppDelegate(): void
    配置 iOS 认证代理。如果您将在 iOS 下使用社交登录,则需要在此应用启动之前调用此方法!

方法

  • 构造函数(string)
    使用给定的 Azure 门户 URL 初始化一个新客户端。

  • getTable(string): MobileServiceTable
    获取具有给定名称的表的引用。

  • login(AuthenticationProvider, string?): Promise
    使用给定的提供者和 URL 方案执行社交登录。

  • loginFromCache(): boolean
    尝试从之前缓存的身份验证中登录用户。如果成功,则返回 true

属性

  • user - MobileServiceUser
    返回当前社交登录的用户。

  • push - MobileServicePush 返回一个 MobileServicePush 对象,您可以使用该对象来处理推送通知。

MobileServicePush

方法

  • register(string): Promise
    将给定的本地推送令牌注册到 Azure 的推送通知。

  • registerWithTemplate(string, string, string): Promise
    将给定的本地推送令牌、模板名称和模板注册到 Azure 推送通知。有关模板的更多信息,请参阅 以下 的用法。

  • registerWithTags(string, string[]): Promise
    将给定的本地推送令牌注册到 Azure 推送通知,并将给定的标签与设备安装相关联。有关标签的更多信息,请参阅 此处

  • registerWithTagsAndTemplate(string, string[], string, string): Promise
    此方法结合了上述两种方法,因此您可以使用模板和标签进行注册。

  • unregister(): Promise
    从 Azure 推送通知中注销设备。

属性

  • installationId - 字符串 返回设备在 Azure 通知中心注册的 installationId。这在需要自定义标签并调用后端添加标签的情况下非常有用。

MobileServiceUser

静态方法

  • clearCachedAuthenticationInfo(): void
    清除之前缓存的认证信息。

  • getFromCache():MobileServiceUser
    返回之前缓存的用户。

方法

  • getProviderCredentials(): Promise
    返回有关当前用户的各种详细信息(例如姓氏、给定名称、用户 ID、声明等)。

属性

  • userId - 字符串
    获取此用户的用户 ID。

  • authenticationToken - 字符串
    获取此用户的 OAuth 令牌。

MobileServiceTable

方法

  • read(): Promise<Array>
    返回表中的所有记录。

  • insert(T): Promise
    将给定项添加到表中。返回更新后的项(例如分配了 ID)。

  • update(T): Promise
    更新表中的给定项。返回更新后的项。

  • deleteById(number|string): Promise
    从表中删除具有给定 ID 的项。

  • deleteItem(T): Promise
    从表中删除给定项。

  • where(): MobileServiceQuery
    返回一个查询对象,您可以使用它来筛选、排序和分页表中的数据。

MobileServiceQuery

查询对象提供了一个非常易于使用的可链式接口,用于筛选、排序和分页表中的数据。

方法

  • field(string): this
    指定我们将根据给定的字段进行筛选。之后,您可以应用以下筛选操作之一。

  • eq(string|number|boolean|Date): this
    根据之前指定的 field 筛选表,使其值等于给定的值。

  • ne(string|number|boolean|Date): this
    根据之前指定的 field 筛选表,使其值与给定的值不同。

  • gt(string|number||Date): this
    根据之前指定的 field 筛选表,使其值大于给定的值。

  • ge(string|number||Date): this
    根据之前指定的 field 筛选表,使其值大于或等于给定的值。

  • lt(number||Date): this
    根据之前指定的 field 筛选表,使其值小于给定的值。

  • le(number||Date): this
    根据之前指定的 field 筛选表,使其值小于或等于给定的值。

  • startsWith(string, string): this
    根据给定的字段筛选表,使其值以给定的值开头。

  • endsWith(string, string): this
    根据给定的字段筛选表,使其值以给定的值结尾。

  • and(): this
    在之后可以开始另一个筛选条件之后应用逻辑 AND 运算符。

  • or(): this
    在之后可以开始另一个筛选条件之后应用逻辑 OR 运算符。

  • orderBy(string, SortDir): this
    按给定的字段和方向排序结果集。应该在指定筛选器之后应用此操作!

  • skip(number): this
    从当前结果集中跳过给定数量的记录。应该在所有筛选和排序之后应用此操作!

  • top(number): this
    仅从结果集中获取给定数量的记录。应该在所有筛选和排序之后应用此操作!

  • read(): Promise
    读取并返回当前筛选、排序和窗口的结果集的记录。

用法

请注意,在 Angular NativeScript 应用中使用插件时没有区别,因此以下用法也适用于 Angular 应用。

创建客户端

import { MobileServiceClient } from "nativescript-azure-mobile-apps/client";
var client = new MobileServiceClient("https://<PORTAL_NAME>.azurewebsites.net");

获取表的引用

var todoItemTable = client.getTable("TodoItem");

获取表中的所有项

todoItemTable.read<TodoItem>().then(function(results) {
// results is array of TodoItem-s
console.log(results.length);
console.log(results[0].id);
});

向表中添加项

var item = new TodoItem();
item.text = "NativeScript Rocks!";
todoItemTable.insert(item).then(function(result) {
// result is the inserted item with the id changed
console.log(result.id);
});

更新项

item.text = "Changed Text";
todoItemTable.update(item).then(function(result) {
// result is the updated item
console.log(result);
});

删除项

todoItemTable.deleteItem(item).then(function() {
console.log("Deleted!");
});

按 ID 删除项

todoItemTable.deleteById("some id").then(function() {
console.log("Deleted!");
});

查询表

todoItemTable.where().field("completed").eq(true).read().then(function(results) {
console.log("There are " + results.length.toString() + "completed items");
});

排序

import { SortDir } from "nativescript-azure-mobile-apps/query";
todoItemTable.where().field("completed").eq(true).orderBy("createdAt", SortDir.Desc).read().then(function(results) {
// ...
});

分页

import { SortDir } from "nativescript-azure-mobile-apps/query";
todoItemTable.where().field("completed").eq(true).orderBy("createdAt", SortDir.Asc).skip(2).top(3).read().then(function(results) {
// Skips 2 completed tasks and returns the next 3 ordered chronologically by creation.
});

用户认证(社交登录)

iOS登录要求

在版本1.0.0及以下版本中,iOS登录使用了应用程序内浏览器。这将被禁止,因此我们需要切换到SafariViewController,它不是“应用程序内”。因此,我们需要能够在外部浏览器之间来回切换。主要好处是,这个浏览器可以利用已经设置好的cookie,例如Facebook登录,因此用户不需要再次输入他的凭据。

这需要一点工作,但这是一次性努力,应该只需要大约5分钟就能完成这些步骤

自定义URL方案

切换到外部浏览器没有问题,但切换回来需要您配置一个“自定义URL方案”。打开app/App_Resources/iOS/Info.plist并添加

<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>my.bundle.id</string>
<key>CFBundleURLSchemes</key>
<array>
<string>x-msauth-tns-azure-sample</string>
</array>
</dict>
</array>

确保上述自定义URL方案字符串x-msauth-tns-azure-sample在用户的设备上是唯一的,因此包括您的包ID是一个好开始(用短横线代替点)。

另外,将my.bundle.id替换为您的包ID。

添加允许的外部重定向URL

x-msauth-tns-azure-sample://easyauth.callback添加到以下这些截图中的您的Azure后端的“允许的外部重定向URL”字段

确保将x-msauth-tns-azure-sample替换为您自己的自定义URL方案。

应用程序代理绑定

现在,虽然您的应用程序可以由外部方调用,但它仍然不能切换回前台,除非您在应用程序代理中绑定一个方法。不用担心,此插件会为您处理这件事,您唯一需要做的是在app.js / app.ts中在app.start()之前添加此行。

// add this
require("nativescript-azure-mobile-apps/client").MobileServiceClient.configureClientAuthAppDelegate();

// something like this is already there
application.start({ moduleName: "main-page" });
将URL方案传递给login

请注意,调用login的方式有所改变;现在,您需要向此函数传递第二个参数以使用新的登录机制。如果未这样做,将回退到已弃用的应用程序内浏览器认证方法。确保在将Info.plist中配置的方案替换为x-msauth-tns-azure-sample之前。如果您仅针对Android,可以省略它。

import { AuthenticationProvider } from "nativescript-azure-mobile-apps/user";
client.login(AuthenticationProvider.Google, "x-msauth-tns-azure-sample").then((user) => {
console.log(`Logged In! UserID:${user.userId}`);
}, (e) => {
console.log("Error Logging in!", e);
});

一旦认证,userId和token将被缓存,因此您可以通过简单地调用来登录

client.loginFromCache(); // Will return true if there are cached credentials and will setup the client accordingly

如果您想获取有关用户的其他信息(如提供者令牌、姓名、电子邮件、个人资料照片等),您可以通过调用getProviderCredentials()来执行此操作

client.user.getProviderCredentials().then((result) => {
console.log(`Surname: ${result.surname}`);
console.log(`Given Name: ${result.givenName}`);
console.log(`Name: ${result.name}`);
});

注意:由于每个提供者提供的详细信息数量不同(还取决于您在Azure门户中授权的内容),如果您正在寻找某些特定信息,您应该检查结果的claims属性。它是一个字典,包含从Azure返回的所有信息。

如果您想删除缓存的认证信息,应使用

import { MobileServiceUser } from "nativescript-azure-mobile-apps/user";
MobileServiceUser.clearCachedAuthenticationInfo();

推送通知

注意:为了使用推送通知,您还需要安装nativescript-plugin-firebase插件。您可以通过运行以下命令来执行此操作

tns plugin add nativescript-plugin-firebase

当提示时,回答是,以在仅推送设置中使用该插件(如果您不会使用Firebase插件中的任何内容)。您可以在此处了解更多有关如何使用Firebase仅推送设置的信息:这里

注册

您需要在onPushTokenReceivedCallback中调用Azure的推送注册,并通过传递插件返回的注册令牌。

import { messaging } from "nativescript-plugin-firebase/messaging";

messaging.registerForPushNotifications({
onPushTokenReceivedCallback: (token) => {
client.push.register(token)
.then(() => { console.log("Azure Register OK!", client.push.installationId); })
.catch((e) => { console.error(e); });
}
});

使用模板注册

如果您想使用自定义通知模板,可以使用registerWithTemplate方法传递您的模板名称和正文。

import { messaging } from "nativescript-plugin-firebase/messaging";

let pushTemplates = {};
pushTemplates[platform.platformNames.android] = "{\"data\":{\"message\":\"$(param)\"}}";
pushTemplates[platform.platformNames.ios] = "{\"aps\":{\"alert\":\"$(param)\"}}";

messaging.registerForPushNotifications({
onMessageReceivedCallback: (message) => {
console.log(message);
},
onPushTokenReceivedCallback: (token) => {
client.push.registerWithTemplate(token, "MyTemplate", pushTemplates[platform.device.os])
.then(() => { console.log("Azure Register OK!", client.push.installationId); })
.catch((e) => { console.error(e); });
},
});

注销

import { messaging } from "nativescript-plugin-firebase/messaging";

messaging.unregisterForPushNotifications()
.then(() => {
console.log("Device Unregister OK!");
client.push.unregister()
.then(() => console.log("Azure Unregister OK!"))

.catch((e) => console.log(e));
})
.catch((e) => { console.error(e); });

示例

此存储库包含一个普通的NativeScript示例。要运行它,请在您的shell中执行以下操作

$ git clone https://github.com/peterstaev/nativescript-azure-mobile-apps
$ cd nativescript-azure-mobile-apps
$ npm install
$ npm run demo-ios

这将运行iOS上的原生NativeScript示例项目。如果您想在Android上运行,只需使用-android后缀代替-ios后缀即可。

捐赠

Donate

比特币地址:14fjysmpwLvSsAskvLASw6ek5XfhTzskHC

Donate