238
AWS Mobile Hub 开发人员指南 开发人员指南 AWS Mobile Hub 开发人员指南: 开发人员指南 Copyright © 2020 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

AWS Mobile Hub 开发人员指南 - 开发人员指南AWS Mobile Hub 开发人员指南 开发人员指南 Android 和 iOS 3.将后端服务配置文件添加到您的应用程序。

  • Upload
    others

  • View
    33

  • Download
    0

Embed Size (px)

Citation preview

AWS Mobile Hub 开发人员指南开发人员指南

AWS Mobile Hub 开发人员指南: 开发人员指南Copyright © 2020 Amazon Web Services, Inc. and/or its affiliates. All rights reserved.

AWS Mobile Hub 开发人员指南 开发人员指南

Amazon's trademarks and trade dress may not be used in connection with any product or service that is not Amazon's,in any manner that is likely to cause confusion among customers, or in any manner that disparages or discreditsAmazon. All other trademarks not owned by Amazon are the property of their respective owners, who may or may notbe affiliated with, connected to, or sponsored by Amazon.

AWS Mobile Hub 开发人员指南 开发人员指南

Table of Contents移动和 Web 应用程序开发 .................................................................................................................... 1参考 .................................................................................................................................................. 2

开发工具包 API 参考 ................................................................................................................... 2AWS Mobile Hub 参考 ............................................................................................................... 2

Android 和 iOS ................................................................................................................... 2Web .............................................................................................................................. 136React Native .................................................................................................................. 169Mobile Hub 功能 ............................................................................................................. 183IAM 用法 ........................................................................................................................ 205项目服务区域托管 ............................................................................................................ 214项目故障排除 .................................................................................................................. 219导出和导入项目 ............................................................................................................... 223Amazon CloudFront 的安全性 ........................................................................................... 233Amazon S3 安全性 .......................................................................................................... 234

iii

AWS Mobile Hub 开发人员指南 开发人员指南

移动和 Web 应用程序开发Amplify 框架使开发人员可以构建由云提供支持的移动和 Web 应用程序。它包含一组面向客户端应用程序开发的全面开发工具包、库、工具和文档。了解更多或立即开始使用 Amplify 框架。

1

AWS Mobile Hub 开发人员指南 开发人员指南开发工具包 API 参考

AWS Mobile 参考主题

• Android 和 iOS API 参考 (p. 2)• AWS Mobile Hub 参考 (p. 2)

Android 和 iOS API 参考Android

• 适用于 Android 的 AWS Mobile 开发工具包 API 参考• GitHub 上适用于 Android 的 AWS Mobile 开发工具包• 适用于 Android 的 AWS Mobile 开发工具包示例

iOS

• 适用于 iOS 的 AWS Mobile 开发工具包 API 参考• GitHub 上适用于 iOS 的 AWS Mobile 开发工具包• 适用于 iOS 的 AWS Mobile 开发工具包示例

AWS Mobile Hub 参考主题

• 适用于 Android 和 iOS 的 AWS Mobile (p. 2)• 用于 Web 的 AWS Amplify 库 (p. 136)• 适用于 React Native 的 AWS Amplify 库 (p. 169)• AWS Mobile Hub 功能 (p. 183)• 在 AWS Mobile Hub 中使用 AWS Identity and Access Management (p. 205)• Mobile Hub 项目服务区域托管 (p. 214)• Mobile Hub 项目故障排除 (p. 219)• 导出和导入 AWS Mobile Hub 项目 (p. 223)• 针对 Mobile Hub 用户的 Amazon CloudFront 安全注意事项 (p. 233)• 针对 Mobile Hub 用户的 Amazon S3 安全注意事项 (p. 234)

适用于 Android 和 iOS 的 AWS Mobile

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

2

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

利用适用于 Android 和 iOS 的 AWS Mobile 开发工具包,您可以快速轻松地将稳健的云后端集成到您的现有移动应用程序中。

主题• 入门 (p. 3)• AWS Mobile Android 和 iOS 操作方法 (p. 88)

入门

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

AWS Mobile Android 和 iOS 开发工具包可以帮助您轻松快速地构建高品质的移动应用程序。利用这些开发工具包可以轻松访问各种 AWS 服务,包括 Amazon Cognito、AWS Lambda、Amazon S3、AmazonKinesis、Amazon DynamoDB、Amazon Pinpoint 等等。

设置您的后端

1. 注册 AWS 免费套餐。2. 通过登录控制台创建 Mobile Hub 项目。Mobile Hub 控制台提供了用于管理和监控您的应用程序云资源的

单一位置。3. 命名您的项目,选中相应的框以允许 Mobile Hub 为您管理资源,然后选择 Add (添加)。

Android - Java

1. 选择 Android 作为您的平台,然后选择“Next (下一步)”。

2. 选择 Download Cloud Config (下载云配置),然后选择 Next (下一步)。

您下载的 awsconfiguration.json 文件包含您项目中 Mobile Hub 启用的后端资源的配置。默认情况下,您的应用程序已启用分析云服务。

3

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

3. 将后端服务配置文件添加到您的应用程序。

在 项目导航器中,右键单击您的应用程序的 res 文件夹,然后选择 New (新建) > Directory (目录)。键入 raw 以作为目录名称,然后选择 OK (确定)。

从上一步中下载 awsconfiguration.json 配置文件的位置中,将其拖到 res/raw 文件夹中。Android 为放置在该文件夹中的任意文件提供一个资源 ID,从而在应用程序中轻松引用该文件。

请记住 您每次在 Mobile Hub 项目中创建或更新功能时,请下载 awsconfiguration.json 的新版本并将其集成到项目中每个将使用此更新的应用程序中。

现已配置您的后端。使用下一节中的步骤将您的后端连接到您的移动应用程序。Android - Kotlin

1. 选择 Android 作为您的平台,然后选择“Next (下一步)”。

4

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

2. 选择 Download Cloud Config (下载云配置),然后选择 Next (下一步)。

您下载的 awsconfiguration.json 文件包含您项目中 Mobile Hub 启用的后端资源的配置。默认情况下,您的应用程序已启用分析云服务。

3. 将后端服务配置文件添加到您的应用程序。

在 项目导航器中,右键单击您的应用程序的 res 文件夹,然后选择 New (新建) > Directory (目录)。键入 raw 以作为目录名称,然后选择 OK (确定)。

5

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

从上一步中下载 awsconfiguration.json 配置文件的位置中,将其拖到 res/raw 文件夹中。Android 为放置在该文件夹中的任意文件提供一个资源 ID,从而在应用程序中轻松引用该文件。

请记住 您每次在 Mobile Hub 项目中创建或更新功能时,请下载 awsconfiguration.json 的新版本并将其集成到项目中每个将使用此更新的应用程序中。

现已配置您的后端。使用下一节中的步骤将您的后端连接到您的移动应用程序。iOS - Swift

1. 选取 iOS 作为您的平台,然后选择“Next (下一步)”。

2. 选择 Download Cloud Config (下载云配置),然后选择 Next (下一步)。

您下载的 awsconfiguration.json 文件包含您项目中 Mobile Hub 启用的后端资源的配置。默认情况下,您的应用程序已启用分析云服务。

6

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

3. 将后端服务配置文件添加到您的应用程序。

在您下载位置,请将 awsconfiguration.json 放置到您的 Xcode 项目中包含 info.plist 文件的文件夹中。在选项对话框中选择 Copy items if needed (根据需要复制项目) 和 Create groups (创建组)。选择 Next (下一步)。

请记住 您每次在 Mobile Hub 项目中创建或更新功能时,请下载 awsconfiguration.json 的新版本并将其集成到项目中每个将使用此更新的应用程序中。

现已配置您的后端。使用下一节中的步骤将您的后端连接到您的移动应用程序。

连接到您的后端

Android - Java

1. 先决条件• 安装 Android Studio 版本 2.33 或更高版本。• 安装 Android 开发工具包 v7.11 (Nougat),API 级别 25。

2. 您的 AndroidManifest.xml 必须包含:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 将依赖项添加到您的 app/build.gradle,然后在 Android Studio 的右上角选择 Sync Now (立即同步)。这些库启用了基本 AWS 函数,如凭证和分析。

dependencies { implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }}

4. 将以下代码添加到您的主活动或启动活动的 onCreate 方法。AWSMobileClient 是一个建立到AWS 的连接并可作为服务界面的单例。

import com.amazonaws.mobile.client.AWSMobileClient;

7

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

public class YourMainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(AWSStartupResult awsStartupResult) { Log.d("YourMainActivity", "AWSMobileClient is instantiated and you are connected to AWS!"); } }).execute();

// More onCreate code ... } }

这是做什么用的? 在初始化 AWSMobileClient 后,它构造 AWSCredentialsProvider 和AWSConfiguration 对象,将在创建其他开发工具包客户端时使用这些对象。然后,客户端对Amazon Cognito 联合身份进行 Sigv4 签名的网络调用以检索 AWS 凭证,以便为用户提供对您的后端资源的访问。在网络交互成功时,将调用onComplete 的 AWSStartUpHandler 方法。

您的应用程序现已设置完毕,可以与您在 Mobile Hub 项目中配置的 AWS 服务进行交互!

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。在您的Android Logcat 输出中查找 Welcome to AWS!(选择 View > Tool Windows > Logcat (视图 > 工具窗口 > Logcat))。

可选:以下示例说明了如何检索对 AWSCredentialsProvider 和 AWSConfiguration 对象的引用,这些对象可用于实例化其他开发工具包客户端。您可以使用 IdentityManager 直接从 AmazonCognito 中获取用户的 AWS 身份 ID,也可以从本地缓存的身份 ID 值中获取该 ID。

import com.amazonaws.auth.AWSCredentialsProvider;import com.amazonaws.mobile.auth.core.IdentityHandler;import com.amazonaws.mobile.auth.core.IdentityManager;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;import com.amazonaws.mobile.config.AWSConfiguration;

public class YourMainActivity extends Activity {

private AWSCredentialsProvider credentialsProvider; private AWSConfiguration configuration;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(AWSStartupResult awsStartupResult) {

8

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Obtain the reference to the AWSCredentialsProvider and AWSConfiguration objects credentialsProvider = AWSMobileClient.getInstance().getCredentialsProvider(); configuration = AWSMobileClient.getInstance().getConfiguration();

// Use IdentityManager#getUserID to fetch the identity id. IdentityManager.getDefaultIdentityManager().getUserID(new IdentityHandler() { @Override public void onIdentityId(String identityId) { Log.d("YourMainActivity", "Identity ID = " + identityId);

// Use IdentityManager#getCachedUserID to // fetch the locally cached identity id. final String cachedIdentityId = IdentityManager.getDefaultIdentityManager().getCachedUserID(); }

@Override public void handleError(Exception exception) { Log.d("YourMainActivity", "Error in retrieving the identity" + exception); } }); } }).execute();

// .. more code }}

Android - Kotlin

1. 先决条件• 安装 Android Studio 版本 2.33 或更高版本。• 安装 Android 开发工具包 v7.11 (Nougat),API 级别 25。

2. 您的 AndroidManifest.xml 必须包含:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 将依赖项添加到您的 app/build.gradle,然后在 Android Studio 的右上角选择 Sync Now (立即同步)。这些库启用了基本 AWS 函数,如凭证和分析。

dependencies { implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }}

4. 将以下代码添加到您的主活动或启动活动的 onCreate 方法。AWSMobileClient 是一个建立到AWS 的连接并可作为服务界面的单例。

import com.amazonaws.mobile.client.AWSMobileClient;

class YourMainActivity : Activity() { companion object { private val TAG: String = this::class.java.simpleName }

9

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState);

AWSMobileClient.getInstance().initialize(this) { Log.d(TAG, "AWSMobileClient is initialized") }.execute()

// More onCreate code... }}

这是做什么用的? 在初始化 AWSMobileClient 后,它构造 AWSCredentialsProvider 和AWSConfiguration 对象,将在创建其他开发工具包客户端时使用这些对象。然后,客户端对Amazon Cognito 联合身份进行 Sigv4 签名的网络调用以检索 AWS 凭证,以便为用户提供对您的后端资源的访问。当网络交互成功时,将调用回调(从技术上来说,它是 onComplete 的AWSStartUpHandler 方法)。

您的应用程序现已设置完毕,可以与您在 Mobile Hub 项目中配置的 AWS 服务进行交互!

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。在您的Android Logcat 输出中查找 Welcome to AWS!(选择 View > Tool Windows > Logcat (视图 > 工具窗口 > Logcat))。

可选:以下示例说明了如何检索对 AWSCredentialsProvider 和 AWSConfiguration 对象的引用,这些对象可用于实例化其他开发工具包客户端。您可以使用 IdentityManager 直接从 AmazonCognito 中获取用户的 AWS 身份 ID,也可以从本地缓存的身份 ID 值中获取该 ID。

import com.amazonaws.auth.AWSCredentialsProviderimport com.amazonaws.mobile.auth.core.IdentityHandlerimport com.amazonaws.mobile.auth.core.IdentityManagerimport com.amazonaws.mobile.client.AWSMobileClientimport com.amazonaws.mobile.config.AWSConfiguration

class YourMainActivity : Activity() { companion object { private val TAG: String = this::class.java.simpleName }

private var credentialsProvider: AWSCredentialsProvider? = null private var awsConfiguration: AWSConfiguration? = null

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState);

AWSMobileClient.getInstance().initialize(this) { credentialsProvider = AWSMobileClient.getInstance().credentialsProvider awsConfiguration = AWSMobileClient.getInstance().configuration

IdentityManager.getDefaultIdentityManager().getUserID(object : IdentityHandler { override fun handleError(exception: Exception?) { Log.e(TAG, "Retrieving identity: ${exception.message}") }

10

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

override fun onIdentityId(identityId: String?) { Log.d(TAG, "Identity = $identityId") val cachedIdentityId = IdentityManager.getDefaultIdentityManager().cachedUserID // Do something with the identity here } }) }.execute()

// More onCreate code... }}

iOS - Swift

1. 先决条件• 安装 Xcode 版本 8.0 或更高版本。

2. 安装 Cocoapods。在终端窗口中运行以下命令:

sudo gem install cocoapods

3. Create Podfile.在终端窗口中,导航到包含您项目的 .xcodeproj 文件的目录,然后运行:

pod init

4. 将核心 AWS Mobile 开发工具包组件添加到您创建的应用程序。

platform :ios, '9.0'target :'YOUR-APP-NAME' do use_frameworks! pod 'AWSMobileClient', '~> 2.6.13' # other podsend

5. 运行以下命令以安装依赖项:

pod install --repo-update

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

6. pod install 命令创建一个新的工作区文件。关闭您的 Xcode 项目,然后使用 ./YOUR-PROJECT-NAME.xcworkspace 重新打开该项目。

仅使用您的 .xcworkspace 从现在开始,请务必始终使用 ./YOUR-PROJECT-NAME.xcworkspace 打开您的Xcode 项目。

7. 在工作区中重新打开您的应用程序后,重新构建该应用程序以解析在代码中调用的新库中的 API。每次添加 import 语句时,这是一种很好的做法。

8. 将 return true 中的 didFinishLaunching 语句替换为您的 AppDelegate 中的以下代码,以便与 AWS Mobile 建立运行时连接。

import UIKitimport AWSMobileClient

11

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch.

// Create AWSMobileClient to connect with AWS return AWSMobileClient.sharedInstance().interceptApplication( application, didFinishLaunchingWithOptions: launchOptions)

}

这是做什么用的? 在初始化 AWSMobileClient 后,它对Amazon Cognito 联合身份进行 Sigv4 签名的网络调用以检索 AWS 凭证,以便为用户提供对您的后端资源的访问。在网络交互成功时,将调用onComplete 的 AWSStartUpHandler 方法。

您的应用程序现已设置完毕,可以与您在 Mobile Hub 项目中配置的 AWS 服务进行交互!

选择 Xcode 窗口左上角的运行图标 (▶) 或键入 ⌘ 以构建和运行您的应用程序。在日志输出中查找Welcome to AWS!。

可选:如果要确保连接到 AWS,请导入 AWSCore 并将以下代码添加到didFinishLaunchingWithOptions 中,然后再返回 AWSMobileClient。

import AWSCore

//. . .

AWSDDLog.add(AWSDDTTYLogger.sharedInstance)AWSDDLog.sharedInstance.logLevel = .info

可选:以下示例说明了如何检索对 AWSCredentialsProvider 对象的引用,该对象可用于实例化其他开发工具包客户端。您可以使用 AWSIdentityManager 从 Amazon Cognito 中获取用户的AWS 身份 ID。

import UIKitimport AWSMobileClientimport AWSAuthCore

class ViewController: UIViewController {

@IBOutlet weak var textfield: UITextField! override func viewDidLoad() { super.viewDidLoad() textfield.text = "View Controller Loaded"

// Get the AWSCredentialsProvider from the AWSMobileClient let credentialsProvider = AWSMobileClient.sharedInstance().getCredentialsProvider()

// Get the identity Id from the AWSIdentityManager let identityId = AWSIdentityManager.default().identityId

12

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

}}

后续步骤

• 添加分析 (p. 13)• 添加用户登录 (p. 20)• 添加推送通知 (p. 42)• 添加 NoSQL 数据库 (p. 52)• 添加用户文件存储 (p. 64)• 添加云逻辑 (p. 73)• 添加消息收发 (p. 81)• 添加对话机器人 (p. 82)

利用 Amazon Pinpoint 将分析添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

收集数据来帮助您改进应用程序的可用性、盈利能力和用户参与度。Mobile Hub 将在您启用使用 AmazonPinpoint 服务的消息收发与分析 (p. 190)功能时部署您的分析后端。

设置您的后端

1. 在继续操作之前,请完成入门 (p. 3)步骤。2. 当您创建项目时,我们默认在您的后端启用分析。您应该会看到一个绿色复选标记出现在您的后端中的

Analytics (分析) 磁贴上,这表示该功能已启用。如果该复选标记未出现,请选择 Analytics (分析),然后选择 Enable (启用)。

连接到您的后端

可以使用以下步骤将分析添加到您的移动应用程序中,并通过 Amazon Pinpoint 监控结果。

13

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

添加分析

Android - Java

1. 设置 AWS Mobile 开发工具包组件,如下所示。a. 在您的 app/build.gradle 依赖项列表中包含以下库。

dependencies{ implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.7.+' implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true } // other dependencies . . .}

• aws-android-sdk-pinpoint 库允许将分析发送到 Amazon Pinpoint。• aws-android-sdk-mobile-client 库可以访问 AWS 凭证提供商和配置。

b. 将所需的权限添加到您的应用程序清单中。

AWS Mobile 开发工具包需要具有 INTERNET 和 ACCESS_NETWORK_STATE 权限。这些权限是在AndroidManifest.xml 文件中定义的。

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2. 添加调用以捕获会话启动和停止。

检测应用程序会话启动和停止的三个典型位置是:• 在 Application.onCreate() 方法中启动一个会话。• 在应用程序的第一个活动的 onCreate() 方法中启动一个会话。• 在 ActivityLifecycleCallbacks 类中启动和/或停止一个会话。

以下示例说明了如何在 OnCreate 的 MainActivity 事件中启动一个会话。

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;

import com.amazonaws.mobileconnectors.pinpoint.PinpointManager;import com.amazonaws.mobileconnectors.pinpoint.PinpointConfiguration;import com.amazonaws.mobile.client.AWSMobileClient;

public class MainActivity extends AppCompatActivity {

public static PinpointManager pinpointManager;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

// Initialize the AWS Mobile Client AWSMobileClient.getInstance().initialize(this).execute();

PinpointConfiguration config = new PinpointConfiguration( MainActivity.this, AWSMobileClient.getInstance().getCredentialsProvider(), AWSMobileClient.getInstance().getConfiguration() ); pinpointManager = new PinpointManager(config); pinpointManager.getSessionClient().startSession(); pinpointManager.getAnalyticsClient().submitEvents();

14

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

}}

要停止该会话,请在要捕获的会话中的最后一个点处使用 stopSession() 和 submitEvents()。

// . . .

pinpointManager.getSessionClient().stopSession();pinpointManager.getAnalyticsClient().submitEvents();

// . . .

Android - Kotlin

1. 设置 AWS Mobile 开发工具包组件,如下所示。a. 在您的 app/build.gradle 依赖项列表中包含以下库。

dependencies { implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.7.+' implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true } // other dependencies . . .}

• aws-android-sdk-pinpoint 库允许将分析发送到 Amazon Pinpoint。• aws-android-sdk-mobile-client 库可以访问 AWS 凭证提供商和配置。

b. 将所需的权限添加到您的应用程序清单中。

AWS Mobile 开发工具包需要具有 INTERNET 和 ACCESS_NETWORK_STATE 权限。这些权限是在AndroidManifest.xml 文件中定义的。

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2. 添加调用以捕获会话启动和停止。

检测应用程序会话启动和停止的三个典型位置是:• 在 Application.onCreate() 方法中启动一个会话。• 在应用程序的第一个活动的 onCreate() 方法中启动一个会话。• 在 ActivityLifecycleCallbacks 类中启动和/或停止一个会话。

以下示例说明了如何在 OnCreate 的 MainActivity 事件中启动一个会话。

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.amazonaws.mobileconnectors.pinpoint.PinpointManager;import com.amazonaws.mobileconnectors.pinpoint.PinpointConfiguration;import com.amazonaws.mobile.client.AWSMobileClient;

class MainActivity : AppCompatActivity() { companion object { var pinpointManager: PinpointManager? = null }

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

15

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Initialize the AWS Mobile client AWSMobileClient.getInstance().initialize(this).execute()

with (AWSMobileClient.getInstance()) { val config = PinpointConfiguration(this, credentialsProvider, configuration) pinpointManager = PinpointManager(config) }

pinpointManager?.sessionClient?.startSession() pinpointManager?.analyticsClient?.submitEvents() }}

要停止该会话,请在要捕获的会话中的最后一个点处使用 stopSession() 和 submitEvents()。

// . . .

pinpointManager?.sessionClient?.stopSession();pinpointManager?.analyticsClient?.submitEvents();

// . . .

iOS - Swift

1. 设置 AWS Mobile 开发工具包组件,如下所示。2. 您配置为安装 AWS Mobile 开发工具包的 Podfile 必须包含:

platform :ios, '9.0'target :'YourAppName' do use_frameworks!

pod 'AWSPinpoint', '~> 2.6.13'

# other pods

end

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

3. 调用 Amazon Pinpoint API 的类必须使用以下导入语句:

import AWSCoreimport AWSPinpoint

4. 将以下代码插入到您的应用程序的 application(_:didFinishLaunchingWithOptions:) 的AppDelegate.swift 方法中。

class AppDelegate: UIResponder, UIApplicationDelegate {

var pinpoint: AWSPinpoint?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:

16

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

[UIApplicationLaunchOptionsKey: Any]?) -> Bool {

//. . .

// Initialize Pinpoint pinpoint = AWSPinpoint(configuration: AWSPinpointConfiguration.defaultPinpointConfiguration(launchOptions: launchOptions))

//. . . }}

监控分析

构建并运行您的应用程序以在 Amazon Pinpoint 中查看使用情况指标。

1. 要查看来自您的应用程序的分析的可视化结果,请在 Mobile Hub 控制台中打开您的项目。2. 选择右上角的 Analytics (分析) 以打开 Amazon Pinpoint 控制台。

1. 从控制台左侧的图标中选择 Analytics,并查看您的应用程序的使用情况图表。可能需要长达 15 分钟才会显示各项指标。

17

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

了解有关 Amazon Pinpoint 的更多信息。

启用自定义应用程序分析

利用您的代码捕获应用程序使用事件信息,包括您定义的属性。在 Amazon Pinpoint 控制台中使用自定义使用事件数据的图表。可以使用 Amazon Pinpoint 漏斗分析直观地查看您的用户行为与您设计的模型的匹配情况,或使用流式处理数据进行更深入的分析。

使用下列步骤为您的应用程序实现 Amazon Pinpoint 自定义分析。

Android - Java

import com.amazonaws.mobileconnectors.pinpoint.analytics.AnalyticsEvent;

public void logEvent() { final AnalyticsEvent event = pinpointManager.getAnalyticsClient().createEvent("EventName") .withAttribute("DemoAttribute1", "DemoAttributeValue1") .withAttribute("DemoAttribute2", "DemoAttributeValue2") .withMetric("DemoMetric1", Math.random());

pinpointManager.getAnalyticsClient().recordEvent(event); pinpointManager.getAnalyticsClient().submitEvents();}

Android - Kotlin

import com.amazonaws.mobileconnectors.pinpoint.analytics.AnalyticsEvent;

fun logEvent() { pintpointManager?.analyticsClient?.let { val event = it.createEvent("EventName") .withAttribute("DemoAttribute1", "DemoAttributeValue1") .withAttribute("DemoAttribute2", "DemoAttributeValue2") .withMetric("DemoMetric1", Math.random()); it.recordEvent(event) it.submitEvents()}

18

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Swift

func logEvent() {

let pinpointAnalyticsClient = AWSPinpoint(configuration: AWSPinpointConfiguration.defaultPinpointConfiguration(launchOptions: nil)).analyticsClient

let event = pinpointAnalyticsClient.createEvent(withEventType: "EventName") event.addAttribute("DemoAttributeValue1", forKey: "DemoAttribute1") event.addAttribute("DemoAttributeValue2", forKey: "DemoAttribute2") event.addMetric(NSNumber.init(value: arc4random() % 65535), forKey: "EventName") pinpointAnalyticsClient.record(event) pinpointAnalyticsClient.submitEvents()

}

构建、运行和试用您的应用程序,然后在 Amazon Pinpoint 控制台的 Events (事件) 选项卡中查看您的自定义事件(使用您的 Mobile Hub 项目/Analytics (分析) > Amazon Pinpoint console (Amazon Pinpoint 控制台)/Analytics (分析) > Events (事件))。在 Events (事件) 下拉菜单中查找您的事件的名称。

启用收入分析

Amazon Pinpoint 支持收集与盈利能力相关的事件数据。使用以下步骤安排和设计与通过您的应用程序进行的购买有关的分析。

Android - Java

import com.amazonaws.mobileconnectors.pinpoint.analytics.monetization.AmazonMonetizationEventBuilder;

public void logMonetizationEvent() { final AnalyticsEvent event = AmazonMonetizationEventBuilder.create(pinpointManager.getAnalyticsClient()) .withFormattedItemPrice("$10.00") .withProductId("DEMO_PRODUCT_ID") .withQuantity(1.0) .withProductId("DEMO_TRANSACTION_ID").build();

pinpointManager.getAnalyticsClient().recordEvent(event); pinpointManager.getAnalyticsClient().submitEvents();}

Android - Kotlin

import com.amazonaws.mobileconnectors.pinpoint.analytics.monetization.AmazonMonetizationEventBuilder;

public void logMonetizationEvent() { pinpointManager?.analyticsClient?.let { val event = AmazonMonetizationEventBuilder.create(it) .withFormattedItemPrice("$10.00") .withProductId("DEMO_PRODUCT_ID") .withQuantity(1.0) .withProductId("DEMO_TRANSACTION_ID").build(); it.recordEvent(event) it.submitEvents() }}

19

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Swift

func sendMonetizationEvent() { let pinpointClient = AWSPinpoint(configuration: AWSPinpointConfiguration.defaultPinpointConfiguration(launchOptions: nil))

let pinpointAnalyticsClient = pinpointClient.analyticsClient

let event = pinpointAnalyticsClient.createVirtualMonetizationEvent(withProductId: "DEMO_PRODUCT_ID", withItemPrice: 1.00, withQuantity: 1, withCurrency: "USD") pinpointAnalyticsClient.record(event) pinpointAnalyticsClient.submitEvents() }

使用 Amazon Cognito 将用户登录功能添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

使您的用户能够使用来自 Facebook、Google 或您自己的自定义用户目录的凭证进行登录。AWS MobileHub 用户登录 (p. 198)功能由 Amazon Cognito 提供技术支持,并且开发工具包基于您配置的身份提供商提供预构建的可配置登录 UI。

设置您的后端

先决条件 在您继续操作之前,请先完成入门 (p. 3)步骤。

Email & Password

1. 启用 User Sign-in (用户登录):在 Mobile Hub 控制台中打开您的项目,然后选择 User Sign-in (用户登录) 磁贴。

2. 选择 Email and Password sign-in (电子邮件和密码登录)。

• 选择 Create a new user pool (创建新的用户池),选择该功能,然后选择登录设置,其中包括:允许的登录方法、多重身份验证以及密码要求。然后,选择 Create user pool (创建用户池)。

20

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

或者:• 选择 Import an existing user pool (导入现有的用户池),然后从账户中的可用池列表中选择一个用

户池。选择是否需要登录,然后选择 Create user pool (创建用户池)。如果另一个应用程序正在使用您导入的用户池,两个应用程序将共享用户目录,并对一组相同的用户的登录进行身份验证。

3. 在配置完提供商后,选择顶部的蓝色横幅中的 Click here to return to project details page (单击此处以返回到项目详细信息页面)。

4. 在项目详细信息页面中,选择闪烁的 Integrate (集成) 按钮,然后完成指导您连接后端的步骤。

21

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

如果您的项目包含多个平台的应用程序,需要完成这些步骤的任何应用程序也会显示闪烁的Integrate(集成) 按钮。提醒横幅将保持不变,直到您执行相应的步骤以在项目中更新每个应用程序的配置。

5. 按照设置电子邮件和密码登录 (p. 24)步骤,从您的应用程序连接到后端。

Facebook

1. 启用 User Sign-in (用户登录):在 Mobile Hub 控制台中打开您的项目,然后选择 User Sign-in (用户登录) 磁贴。

2. 配置 Facebook 登录:选择该功能,再键入您的 Facebook 应用程序 ID,然后选择 Enable Facebooklogin (启用 Facebook 登录)。要检索或创建您的 Facebook 应用程序 ID,请参阅设置 Facebook 身份验证。

3. 在配置完提供商后,选择顶部的蓝色横幅中的 Click here to return to project details page (单击此处以返回到项目详细信息页面)。

4. 在项目详细信息页面中,选择闪烁的 Integrate (集成) 按钮,然后完成指导您连接后端的步骤。

如果您的项目包含多个平台的应用程序,需要完成这些步骤的任何应用程序也会显示闪烁的Integrate(集成) 按钮。提醒横幅将保持不变,直到您执行相应的步骤以在项目中更新每个应用程序的配置。

22

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

5. 按照设置 Facebook 登录 (p. 29)中的步骤,从您的应用程序连接到后端。

Google

1. 启用 User Sign-in (用户登录):在 Mobile Hub 控制台中打开您的项目,然后选择 User Sign-in (用户登录) 磁贴。

2. 配置 Google 登录:选择该功能,键入您的 Google Web 应用程序客户端 ID以及 Google Android 和/或 iOS 客户端 ID,然后选择“Enable Google Sign-In (启用 Google 登录)”。要检索或创建您的 Google客户端 ID,请参阅设置 Google 身份验证。

3. 在配置完提供商后,选择顶部的蓝色横幅中的 Click here to return to project details page (单击此处以返回到项目详细信息页面)。

4. 在项目详细信息页面中,选择闪烁的 Integrate (集成) 按钮,然后完成指导您连接后端的步骤。

如果您的项目包含多个平台的应用程序,需要完成这些步骤的任何应用程序也会显示闪烁的Integrate(集成) 按钮。提醒横幅将保持不变,直到您执行相应的步骤以在项目中更新每个应用程序的配置。

5. 按照设置 Google 登录 (p. 35)中的步骤,从您的应用程序连接到后端。

23

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

在您的移动应用程序中设置电子邮件和密码登录

选择您的平台:

Android - Java

使用 Android API 级别 23 或更高级别 适用于 Android 登录的 AWS Mobile 开发工具包库 (aws-android-sdk-auth-ui) 提供了活动和视图,以便为您配置的登录提供商显示SignInUI。该库依赖于 Android 开发工具包 API级别 23 或更高级别。

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 将这些权限添加到 AndroidManifest.xml 文件:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 将这些依赖项添加到 app/build.gradle 文件:

dependencies { // Mobile Client for initializing the SDK implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// Cognito UserPools for SignIn implementation 'com.android.support:support-v4:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-userpools:2.7.+@aar') { transitive = true }

// Sign in UI Library implementation 'com.android.support:appcompat-v7:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-ui:2.7.+@aar') { transitive = true }}

4. 创建一个活动以显示您的登录屏幕。

在 Android Studio 中,选择 File (文件) > New (新建) > Activity (活动) > Basic Activity (基本活动),然后键入活动名称,如 AuthenticatorActivity。如果您要使此活动成为您的启动活动,请将包含 .LAUNCHER 的意图筛选条件块移动到您的应用程序的 AndroidManifest.xml 中的AuthenticatorActivity。

<activity android:name=".AuthenticatorActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

5. 更新您的 onCreate 的 AuthenticatorActivity 函数以调用 AWSMobileClient。该组件提供了相应的功能以恢复登录的身份验证会话。它进行网络调用以检索允许用户访问您的 AWS 资源的AWS 凭证,并在事务完成时注册一个回调。

如果用户已登录,该应用程序将转到 NextActivity,否则它会向用户显示 AWS Mobile 现成的可配置登录 UI。用户在成功登录后看到的 NextActivity Activity 类。

24

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import android.app.Activity;import android.os.Bundle;

import com.amazonaws.mobile.auth.ui.SignInUI;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

public class AuthenticatorActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_authenticator);

// Add a call to initialize AWSMobileClient AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(AWSStartupResult awsStartupResult) { SignInUI signin = (SignInUI) AWSMobileClient.getInstance().getClient( AuthenticatorActivity.this, SignInUI.class); signin.login( AuthenticatorActivity.this, NextActivity.class).execute(); } }).execute(); }}

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。您应看到应用程序的现成登录 UI。了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,构造 CredentialsProvider 和AWSConfiguration 对象,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

Android - Kotlin

使用 Android API 级别 23 或更高级别 适用于 Android 登录的 AWS Mobile 开发工具包库 (aws-android-sdk-auth-ui) 提供了活动和视图,以便为您配置的登录提供商显示SignInUI。该库依赖于 Android 开发工具包 API级别 23 或更高级别。

25

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 将这些权限添加到 AndroidManifest.xml 文件:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 将这些依赖项添加到 app/build.gradle 文件:

dependencies { // Mobile Client for initializing the SDK implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// Cognito UserPools for SignIn implementation 'com.android.support:support-v4:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-userpools:2.7.+@aar') { transitive = true }

// Sign in UI Library implementation 'com.android.support:appcompat-v7:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-ui:2.7.+@aar') { transitive = true }}

4. 创建一个活动以显示您的登录屏幕。

在 Android Studio 中,选择 File (文件) > New (新建) > Activity (活动) > Basic Activity (基本活动),然后键入活动名称,如 AuthenticatorActivity。如果您要使此活动成为您的启动活动,请将包含 .LAUNCHER 的意图筛选条件块移动到您的应用程序的 AndroidManifest.xml 中的AuthenticatorActivity。

<activity android:name=".AuthenticatorActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

5. 更新您的 onCreate 的 AuthenticatorActivity 函数以调用 AWSMobileClient。该组件提供了相应的功能以恢复登录的身份验证会话。它进行网络调用以检索允许用户访问您的 AWS 资源的AWS 凭证,并在事务完成时注册一个回调。

如果用户已登录,该应用程序将转到 NextActivity,否则它会向用户显示 AWS Mobile 现成的可配置登录 UI。用户在成功登录后看到的 NextActivity Activity 类。

import android.app.Activity;import android.os.Bundle;

import com.amazonaws.mobile.auth.ui.SignInUI;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

class AuthenticatorActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

AWSMobileClient.getInstance().initialize(this) { val ui = AWSMobileClient.getInstance().getClient( this@AuthenticatorActivity,

26

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

SignInUI::class.java) as SignInUI? ui?.login( this@AuthenticatorActivity, MainActivity::class.java)?.execute() }.execute()}

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。您应看到应用程序的现成登录 UI。查看后续步骤以了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,构造 CredentialsProvider 和AWSConfiguration 对象,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

iOS - Swift

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 在您的项目的 Podfile 中添加以下依赖项。

platform :ios, '9.0'target :'YOUR-APP-NAME' do use_frameworks! pod 'AWSUserPoolsSignIn', '~> 2.6.13' pod 'AWSAuthUI', '~> 2.6.13' pod 'AWSMobileClient', '~> 2.6.13' # other podsend

3. 将开发工具包库提取到您的本地存储库中。

$ pod install --repo-update

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

4. 创建 AWSMobileClient 并初始化开发工具包。

添加代码以在您的 AWSMobileClient 的 application:open url 函数中创建一个AppDelegate.swift 实例,以恢复以前登录的经过身份验证的会话。

然后,在 AWSMobileClient 函数中添加另一个 didFinishLaunching 实例以注册登录提供商,以及获取在用户登录后 AWS 用于授权访问的 Amazon Cognito 凭证。

import UIKit

27

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import AWSMobileClient

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

// Add a AWSMobileClient call in application:open url func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

return AWSMobileClient.sharedInstance().interceptApplication( application, open: url, sourceApplication: sourceApplication, annotation: annotation)

}

// Add a AWSMobileClient call in application:didFinishLaunching func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

return AWSMobileClient.sharedInstance().interceptApplication( application, didFinishLaunchingWithOptions: launchOptions) }

// Other functions in AppDelegate . . .

}

5. 通过调用开发工具包中提供的库来实施登录 UI。

import UIKitimport AWSAuthCoreimport AWSAuthUI

class SampleViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

if !AWSSignInManager.sharedInstance().isLoggedIn { AWSAuthUIViewController .presentViewController(with: self.navigationController!, configuration: nil, completionHandler: { (provider: AWSSignInProvider, error: Error?) in if error != nil { print("Error occurred: \(String(describing: error))") } else { // Sign in successful. } }) } }}

选择 Xcode 窗口左上角的运行图标 (▶) 或键入 ⌘ 以构建和运行您的应用程序。您应看到应用程序的预构建的登录 UI。查看后续步骤以了解如何自定义您的 UI。

28

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

API 参考 • AWSMobileClient该库初始化开发工具包,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

在您的移动应用程序中设置 Facebook 登录

Android - Java

使用 Android API 级别 23 或更高级别 适用于 Android 登录的 AWS Mobile 开发工具包库 (aws-android-sdk-auth-ui) 提供了活动和视图,以便为您配置的登录提供商显示SignInUI。该库依赖于 Android 开发工具包 API级别 23 或更高级别。

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 将以下权限和活动添加到您的 AndroidManifest.xml 文件:

<!-- ... -->

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- ... -->

<activity android:name="com.facebook.FacebookActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/fb_login_protocol_scheme" /> </intent-filter></activity>

<!-- ... -->

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />

<!-- ... -->

3. 将以下依赖项添加到您的 app/build.gradle 文件:

dependencies { // Mobile Client for initializing the SDK

29

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// Facebook SignIn implementation 'com.android.support:support-v4:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-facebook:2.7.+@aar') { transitive = true }

// Sign in UI implementation 'com.android.support:appcompat-v7:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-ui:2.7.+@aar') { transitive = true }}

4. 在 strings.xml 中,添加您的 Facebook 应用程序 ID 和登录协议方案的字符串定义。在两种情况下,该值应包含您的 Facebook 应用程序 ID,并且登录协议值前面始终带有 fb。

<string name="facebook_app_id">1231231231232123123</string><string name="fb_login_protocol_scheme">fb1231231231232123123</string>

5. 创建一个活动以显示您的登录屏幕。

在 Android Studio 中,选择 File (文件) > New (新建) > Activity (活动) > Basic Activity (基本活动),然后键入活动名称,如 AuthenticatorActivity。如果您要使此活动成为您的启动活动,请将包含 .LAUNCHER 的意图筛选条件块移动到您的应用程序的 AndroidManifest.xml 中的AuthenticatorActivity。

<activity android:name=".AuthenticatorActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

6. 更新您的 onCreate 的 AuthenticatorActivity 函数以调用 AWSMobileClient。该组件提供了相应的功能以恢复登录的身份验证会话。它进行网络调用以检索允许用户访问您的 AWS 资源的AWS 凭证,并在事务完成时注册一个回调。

如果用户已登录,该应用程序将转到 NextActivity,否则它会向用户显示 AWS Mobile 现成的可配置登录 UI。用户在成功登录后看到的 NextActivity Activity 类。

import android.app.Activity;import android.os.Bundle;

import com.amazonaws.mobile.auth.ui.SignInUI;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

public class AuthenticatorActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_authenticator);

// Add a call to initialize AWSMobileClient AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(AWSStartupResult awsStartupResult) { SignInUI signin = (SignInUI) AWSMobileClient.getInstance().getClient(AuthenticatorActivity.this, SignInUI.class);

30

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

signin.login(AuthenticatorActivity.this, NextActivity.class).execute(); } }).execute(); }}

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。您应看到应用程序的现成登录 UI。查看后续步骤以了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,构造 CredentialsProvider 和AWSConfiguration 对象,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

Android - Kotlin

使用 Android API 级别 23 或更高级别 适用于 Android 登录的 AWS Mobile 开发工具包库 (aws-android-sdk-auth-ui) 提供了活动和视图,以便为您配置的登录提供商显示SignInUI。该库依赖于 Android 开发工具包 API级别 23 或更高级别。

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 将以下权限和活动添加到您的 AndroidManifest.xml 文件:

<!-- ... -->

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<!-- ... -->

<activity android:name="com.facebook.FacebookActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/fb_login_protocol_scheme" /> </intent-filter></activity>

<!-- ... -->

31

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id" />

<!-- ... -->

3. 将以下依赖项添加到您的 app/build.gradle 文件:

dependencies { // Mobile Client for initializing the SDK implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// Facebook SignIn implementation 'com.android.support:support-v4:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-facebook:2.7.+@aar') { transitive = true }

// Sign in UI implementation 'com.android.support:appcompat-v7:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-ui:2.7.+@aar') { transitive = true }}

4. 在 strings.xml 中,添加您的 Facebook 应用程序 ID 和登录协议方案的字符串定义。在两种情况下,该值应包含您的 Facebook 应用程序 ID,并且登录协议值前面始终带有 fb。

<string name="facebook_app_id">1231231231232123123</string><string name="fb_login_protocol_scheme">fb1231231231232123123</string>

5. 创建一个活动以显示您的登录屏幕。

在 Android Studio 中,选择 File (文件) > New (新建) > Activity (活动) > Basic Activity (基本活动),然后键入活动名称,如 AuthenticatorActivity。如果您要使此活动成为您的启动活动,请将包含 .LAUNCHER 的意图筛选条件块移动到您的应用程序的 AndroidManifest.xml 中的AuthenticatorActivity。

<activity android:name=".AuthenticatorActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

6. 更新您的 onCreate 的 AuthenticatorActivity 函数以调用 AWSMobileClient。该组件提供了相应的功能以恢复登录的身份验证会话。它进行网络调用以检索允许用户访问您的 AWS 资源的AWS 凭证,并在事务完成时注册一个回调。

如果用户已登录,该应用程序将转到 NextActivity,否则它会向用户显示 AWS Mobile 现成的可配置登录 UI。用户在成功登录后看到的 NextActivity Activity 类。

import android.app.Activity;import android.os.Bundle;

import com.amazonaws.mobile.auth.ui.SignInUI;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

class AuthenticatorActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

32

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

AWSMobileClient.getInstance().initialize(this) { val ui = AWSMobileClient.getInstance().getClient( this@AuthenticatorActivity, SignInUI::class.java) as SignInUI? ui?.login( this@AuthenticatorActivity, MainActivity::class.java)?.execute() }.execute() }

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。您应看到应用程序的现成登录 UI。查看后续步骤以了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,构造 CredentialsProvider 和AWSConfiguration 对象,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

iOS - Swift

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 在您的项目的 Podfile 中添加以下依赖项。

platform :ios, '9.0' target :'YOUR-APP-NAME' do use_frameworks! pod 'AWSMobileClient', '~> 2.6.13' pod 'AWSFacebookSignIn', '~> 2.6.13' pod 'AWSAuthUI', '~> 2.6.13' # other pods end

运行 pod install --repo-update.

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

3. 将 Facebook 元数据添加到 Info.plist.

要将您的 Xcode 项目配置为使用 Facebook 登录,请右键选择 Info.plist,然后选择 Open As >Source Code (打开为 > 源代码)。

添加以下条目,并使用您的项目名称、Facebook ID 和登录方案 ID。

<plist version="1.0">

33

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

<!-- ... --><dict><key>FacebookAppID</key><string>0123456789012345</string><key>FacebookDisplayName</key><string>YOUR-PROJECT-NAME</string><key>LSApplicationQueriesSchemes</key><array> <string>fbapi</string> <string>fb-messenger-api</string> <string>fbauth2</string> <string>fbshareextension</string></array><key>CFBundleURLTypes</key><array> <dict> <key>CFBundleURLSchemes</key> <array> <string>fb0123456789012345</string> </array> </dict></array></dict><!-- ... -->

4. 创建 AWSMobileClient 并初始化开发工具包。

添加代码以在您的 AWSMobileClient 的 application:open url 函数中创建一个AppDelegate.swift 实例,以恢复以前登录的经过身份验证的会话。

然后,在 AWSMobileClient 函数中添加另一个 didFinishLaunching 实例以注册登录提供商,以及获取在用户登录后 AWS 用于授权访问的 Amazon Cognito 凭证。

import UIKit

//import AWSMobileClientimport AWSMobileClient

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

// Add a AWSMobileClient call in application:open url func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

return AWSMobileClient.sharedInstance().interceptApplication( application, open: url, sourceApplication: sourceApplication, annotation: annotation)

}

// Add a AWSMobileClient call in application:didFinishLaunching func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

return AWSMobileClient.sharedInstance().interceptApplication( application, didFinishLaunchingWithOptions: launchOptions) }

34

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Other functions in AppDelegate . . .

}

5. 通过调用开发工具包提供的库来实施登录 UI。

import UIKitimport AWSAuthCoreimport AWSAuthUI

class SampleViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

if !AWSSignInManager.sharedInstance().isLoggedIn { AWSAuthUIViewController .presentViewController(with: self.navigationController!, configuration: nil, completionHandler: { (provider: AWSSignInProvider, error: Error?) in if error != nil { print("Error occurred: \(String(describing: error))") } else { // sign in successful. } }) } }}

选择 Xcode 窗口左上角的运行图标 (▶) 或键入 ⌘ 以构建和运行您的应用程序。您应看到应用程序的预构建的登录 UI。查看后续步骤以了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

在您的移动应用程序中设置 Google 登录

Android - Java

使用 Android API 级别 23 或更高级别 适用于 Android 登录的 AWS Mobile 开发工具包库 (aws-android-sdk-auth-ui) 提供了活动和视图,以便为您配置的登录提供商显示SignInUI。该库依赖于 Android 开发工具包 API级别 23 或更高级别。

35

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 将以下权限添加到您的 AndroidManifest.xml 文件:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 将以下依赖项添加到您的 app/build.gradle 文件:

dependencies { // Mobile Client for initializing the SDK implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// Google SignIn implementation 'com.android.support:support-v4:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-google:2.7.+@aar') { transitive = true }

// Sign in UI Library implementation 'com.android.support:appcompat-v7:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-ui:2.7.+@aar') { transitive = true }}

4. 创建一个活动以显示您的登录屏幕。

在 Android Studio 中,选择 File (文件) > New (新建) > Activity (活动) > Basic Activity (基本活动),然后键入活动名称,如 AuthenticatorActivity。如果您要使此活动成为您的启动活动,请将包含 .LAUNCHER 的意图筛选条件块移动到您的应用程序的 AndroidManifest.xml 中的AuthenticatorActivity。

<activity android:name=".AuthenticatorActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

5. 更新您的 onCreate 的 AuthenticatorActivity 函数以调用 AWSMobileClient。该组件提供了相应的功能以恢复登录的身份验证会话。它进行网络调用以检索允许用户访问您的 AWS 资源的AWS 凭证,并在事务完成时注册一个回调。

如果用户已登录,该应用程序将转到 NextActivity,否则它会向用户显示 AWS Mobile 现成的可配置登录 UI。用户在成功登录后看到的 NextActivity Activity 类。

import android.app.Activity;import android.os.Bundle;

import com.amazonaws.mobile.auth.ui.SignInUI;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

public class AuthenticatorActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_authenticator);

// Add a call to initialize AWSMobileClient

36

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(AWSStartupResult awsStartupResult) { SignInUI signin = (SignInUI) AWSMobileClient.getInstance().getClient(AuthenticatorActivity.this, SignInUI.class); signin.login(AuthenticatorActivity.this, MainActivity.class).execute(); } }).execute(); }}

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。您应看到应用程序的现成登录 UI。查看后续步骤以了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,构造 CredentialsProvider 和AWSConfiguration 对象,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

Android - Kotlin

使用 Android API 级别 23 或更高级别 适用于 Android 登录的 AWS Mobile 开发工具包库 (aws-android-sdk-auth-ui) 提供了活动和视图,以便为您配置的登录提供商显示SignInUI。该库依赖于 Android 开发工具包 API级别 23 或更高级别。

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 将以下权限添加到您的 AndroidManifest.xml 文件:

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3. 将以下依赖项添加到您的 app/build.gradle 文件:

dependencies { // Mobile Client for initializing the SDK implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// Google SignIn implementation 'com.android.support:support-v4:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-google:2.7.+@aar') { transitive = true }

37

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Sign in UI Library implementation 'com.android.support:appcompat-v7:24.+' implementation ('com.amazonaws:aws-android-sdk-auth-ui:2.7.+@aar') { transitive = true }}

4. 创建一个活动以显示您的登录屏幕。

在 Android Studio 中,选择 File (文件) > New (新建) > Activity (活动) > Basic Activity (基本活动),然后键入活动名称,如 AuthenticatorActivity。如果您要使此活动成为您的启动活动,请将包含 .LAUNCHER 的意图筛选条件块移动到您的应用程序的 AndroidManifest.xml 中的AuthenticatorActivity。

<activity android:name=".AuthenticatorActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>

5. 更新您的 onCreate 的 AuthenticatorActivity 函数以调用 AWSMobileClient。该组件提供了相应的功能以恢复登录的身份验证会话。它进行网络调用以检索允许用户访问您的 AWS 资源的AWS 凭证,并在事务完成时注册一个回调。

如果用户已登录,该应用程序将转到 NextActivity,否则它会向用户显示 AWS Mobile 现成的可配置登录 UI。用户在成功登录后看到的 NextActivity Activity 类。

import android.app.Activity;import android.os.Bundle;

import com.amazonaws.mobile.auth.ui.SignInUI;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

class AuthenticatorActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

AWSMobileClient.getInstance().initialize(this) { val ui = AWSMobileClient.getInstance().getClient( this@AuthenticatorActivity, SignInUI::class.java) as SignInUI? ui?.login( this@AuthenticatorActivity, MainActivity::class.java)?.execute() }.execute()}

选择 Android Studio 中的运行图标 (▶) 以构建您的应用程序并在您的设备/模拟器上运行它。您应看到应用程序的现成登录 UI。查看后续步骤以了解如何自定义您的 UI。

API 参考 • AWSMobileClient该库初始化开发工具包,构造 CredentialsProvider 和AWSConfiguration 对象,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPools

38

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

Amazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

iOS - Swift

1. 添加或更新您的 AWS 后端配置文件以加入您的新登录。有关详细信息,请参阅入门:设置您的后端 (p. 3)部分中的最后步骤。

2. 在配置文件中添加以下依赖项。

platform :ios, '9.0' target :'YOUR-APP-NAME' do use_frameworks! pod 'AWSMobileClient', '~> 2.6.13' pod 'AWSGoogleSignIn', '~> 2.6.13' pod 'AWSAuthUI', '~> 2.6.13' pod 'GoogleSignIn', '~> 4.0' # other pods end

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

3. 将 Google 元数据添加到 info.plist

要将您的 Xcode 项目配置为使用 Google 登录,请使用以下方式打开其 Info.plist 文件:右键单击 >Open As (打开为) > Source Code (源代码)。 添加以下条目。用您的项目名称替换占位符字符串。

<plist version="1.0"><!-- ... --><key>CFBundleURLTypes</key><array> <dict> <key>CFBundleURLSchemes</key> <array> <string>com.googleusercontent.apps.xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</string> </array> </dict></array><!-- ... -->

4. 创建 AWSMobileClient 并初始化开发工具包。

添加代码以在您的 AWSMobileClient 的 application:open url 函数中创建一个AppDelegate.swift 实例,以恢复以前登录的经过身份验证的会话。

然后,在 AWSMobileClient 函数中添加另一个 didFinishLaunching 实例以注册登录提供商,以及获取在用户登录后 AWS 用于授权访问的 Amazon Cognito 凭证。

import UIKit

39

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

//import AWSMobileClientimport AWSMobileClient

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

// Add a AWSMobileClient call in application:open url func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

return AWSMobileClient.sharedInstance().interceptApplication( application, open: url, sourceApplication: sourceApplication, annotation: annotation)

}

// Add a AWSMobileClient call in application:didFinishLaunching func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

return AWSMobileClient.sharedInstance().interceptApplication( application, didFinishLaunchingWithOptions: launchOptions) }

// Other functions in AppDelegate . . .

}

5. 通过调用开发工具包提供的库来实施登录 UI。

import UIKitimport AWSAuthCoreimport AWSAuthUI

class SampleViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

if !AWSSignInManager.sharedInstance().isLoggedIn { AWSAuthUIViewController .presentViewController(with: self.navigationController!, configuration: nil, completionHandler: { (provider: AWSSignInProvider, error: Error?) in if error != nil { print("Error occurred: \(String(describing: error))") } else { // Sign in successful. } }) } }}

选择 Xcode 窗口左上角的运行图标 (▶) 或键入 ⌘ 以构建和运行您的应用程序。您应看到应用程序的预构建的登录 UI。查看后续步骤以了解如何自定义您的 UI。

40

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

API 参考 • AWSMobileClient该库初始化开发工具包,获取 AWS 凭证以及创建开发工具包SignInUI 客户端实例。

• Auth UserPoolsAmazon Cognito UserPools 的包装程序库,它提供了一个托管电子邮件/密码登录 UI。

• Auth Core该库使用 Amazon Cognito 联合身份缓存和联合登录提供商身份验证令牌,缓存联合 AWS 凭证以及处理登录流。

启用注销

Android - Java

要允许用户注销您的应用程序,请在 SignInStateChangeListener 中添加 IdentityManager 以便为登录事件注册一个回调。侦听器捕获 onUserSignedIn 和 onUserSignedOut 事件。

IdentityManager.getDefaultIdentityManager().addSignInStateChangeListener(new SignInStateChangeListener() { @Override // Sign-in listener public void onUserSignedIn() { Log.d(LOG_TAG, "User Signed In"); }

// Sign-out listener @Override public void onUserSignedOut() {

// return to the sign-in screen upon sign-out showSignIn(); }});

要启动注销,请调用 signOut 的 IdentityManager 方法。

IdentityManager.getDefaultIdentityManager().signOut();

Android - Kotlin

要允许用户注销您的应用程序,请在 SignInStateChangeListener 中添加 IdentityManager 以便为登录事件注册一个回调。侦听器捕获 onUserSignedIn 和 onUserSignedOut 事件。

IdentityManager.getDefaultIdentityManager().addSignInStateChangeListener( object : SignInStateChangeListener() { override fun onUserSignedIn() { Log.d(TAG, "User signed in"); }

override fun onUserSignedOut() { Log.d(TAG, "User signed out"); } });

41

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

要启动注销,请调用 signOut 的 IdentityManager 方法。

IdentityManager.getDefaultIdentityManager().signOut();

iOS - Swift

要启动注销,请添加对 AWSSignInManager.sharedInstance().logout 的调用。

@IBAction func signOutButtonPress(_ sender: Any) {

AWSSignInManager.sharedInstance().logout(completionHandler: {(result: Any?, error: Error?) in self.showSignIn() // print("Sign-out Successful: \(signInProvider.getDisplayName)");

})}

后续步骤

• 自定义 UI• Amazon Cognito 开发人员指南

将推送通知添加到您的移动应用程序与 Amazon Pinpoint

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

Mobile Hub 将在您使用 Amazon Pinpoint 服务启用消息收发与分析 (p. 190)功能时部署您的推送通知后端服务。Amazon Pinpoint 使应用程序能够接收从 Apple (APNs) 和 Google (FCM/GCM) 平台发送的移动推送消息。您还可以创建将用户行为与推送或其他形式的消息收发关联的 Amazon Pinpoint 市场活动。

设置您的后端

1. 在继续操作之前,请完成入门 (p. 3)步骤。2. 选择 Messaging and Analytics (消息收发与分析) 磁贴3. 选择 Mobile push (移动推送)。

对于 Android – Firebase/Google Cloud Messaging (FCM/GCM):选择 Android 并提供您的 Firebase/Google 应用程序 API 密钥和发件人 ID。要检索或创建这些值,请参阅设置 Android 推送通知。

对于 iOS – Apple 推送通知服务 (APN):选择 iOS 并提供您的 Apple 应用程序 P12 证书,并可以选择是否提供证书密码。要检索或创建这些项目,请参阅设置 iOS 推送通知。

4. 操作完成后,将弹出“Your Backend has been updated”(您的后端已更新) 的警报,提示您下载最新的云配置文件的副本。如果您完成配置功能,请选择横幅以返回到项目详细信息页面。

42

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

5. 在项目详细信息页面,每一个需要使用最新的云配置文件更新的应用程序都会有一个闪烁的 Integrate (集成) 按钮。选择此按钮以进入集成向导。

6. 使用最新的云配置文件副本更新您的应用程序。现在您的应用程序参考您的后端的最新版本。选择下一步,并按照以下推送通知文档连接到您的后端。

连接到您的后端

将推送通知添加到您的应用程序

Android - Java

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 将以下内容添加到您的 AndroidManifest.xml。

<uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /><permission android:name="com.mysampleapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /><uses-permission android:name="com.mysampleapp.permission.C2D_MESSAGE" />

<application

<!--Add these to your Application declaration to filter for the notification intent--> <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.mysampleapp" /> </intent-filter> </receiver>

<service android:name=".PushListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service>

</application>

b. 将以下内容添加到您的 app/build.gradle。

dependencies{ implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.7.+' implementation ('com.amazonaws:aws-android-sdk-auth-core:2.7.+@aar') {transitive = true;}

implementation 'com.google.android.gms:play-services-iid:11.6.0' implementation 'com.google.android.gms:play-services-gcm:11.6.0'

43

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

}

c. 将以下内容添加到包含项目的文件夹中的项目级别 build.gradle。

buildscript { dependencies { classpath 'com.google.gms:google-services:3.1.1' }}

allprojects { repositories { maven { url "https://maven.google.com" } }}

2. 在您的推送通知代码的位置中创建 Amazon Pinpoint 客户端。

import com.amazonaws.mobileconnectors.pinpoint.PinpointConfiguration;import com.amazonaws.mobileconnectors.pinpoint.PinpointManager;import com.google.android.gms.gcm.GoogleCloudMessaging;import com.google.android.gms.iid.InstanceID;

public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = MainActivity.class.getSimpleName();

public static PinpointManager pinpointManager;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

if (pinpointManager == null) { PinpointConfiguration pinpointConfig = new PinpointConfiguration( getApplicationContext(), AWSMobileClient.getInstance().getCredentialsProvider(), AWSMobileClient.getInstance().getConfiguration());

pinpointManager = new PinpointManager(pinpointConfig);

new Thread(new Runnable() { @Override public void run() { try { String deviceToken = InstanceID.getInstance(MainActivity.this).getToken( "123456789Your_GCM_Sender_Id", GoogleCloudMessaging.INSTANCE_ID_SCOPE); Log.e("NotError", deviceToken); pinpointManager.getNotificationClient() .registerGCMDeviceToken(deviceToken); } catch (Exception e) { e.printStackTrace(); } } }).start(); } } }

44

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

Android - Kotlin

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 将以下内容添加到您的 AndroidManifest.xml。

<uses-permission android:name="android.permission.WAKE_LOCK"/><uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /><permission android:name="com.mysampleapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /><uses-permission android:name="com.mysampleapp.permission.C2D_MESSAGE" />

<application

<!--Add these to your Application declaration to filter for the notification intent--> <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.mysampleapp" /> </intent-filter> </receiver>

<service android:name=".PushListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service>

</application>

b. 将以下内容添加到您的 app/build.gradle。

dependencies{ implementation 'com.amazonaws:aws-android-sdk-pinpoint:2.7.+' implementation ('com.amazonaws:aws-android-sdk-auth-core:2.7.+@aar') {transitive = true;}

implementation 'com.google.android.gms:play-services-iid:11.6.0' implementation 'com.google.android.gms:play-services-gcm:11.6.0'}

c. 将以下内容添加到包含项目的 build.gradle 文件中。

buildscript { dependencies { classpath 'com.google.gms:google-services:3.1.1' }}

allprojects { repositories { maven { url "https://maven.google.com" } }}

2. 在您的推送通知代码的位置中创建 Amazon Pinpoint 客户端。

45

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import com.amazonaws.mobileconnectors.pinpoint.PinpointConfiguration;import com.amazonaws.mobileconnectors.pinpoint.PinpointManager;import com.google.android.gms.gcm.GoogleCloudMessaging;import com.google.android.gms.iid.InstanceID;

class MainActivity : AppCompatActivity() { companion object { private val LOG_TAG = this::class.java.getSimpleName var pinpointManager: PinpointManager? = null }

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

AWSMobileClient.getInstance().initialize(this).execute() with (AWSMobileClient.getInstance()) { if (pinpointManager == null) { val config = PinpointConfiguration(applicationContext, credentialsProvider, configuration) pinpointManager = PinpointManager(config) } }

thread(start = true) { try { val deviceToken = InstanceID.getInstance(this@MainActivity) .getToken("YOUR-GCM-SENDER-ID", GoogleCloudMessaging.INSTANCE_ID_SCOPE) Log.i(LOG_TAG, "GCM DeviceToken = $deviceToken") pinpointManager?.notificationClient?.registerGCMDeviceToken(deviceToken) } catch (e: Exception) { e.printStackTrace() } } }}

iOS - Swift

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 您配置为安装 AWS Mobile 开发工具包的 Podfile 必须包含:

platform :ios, '9.0'

target :'YOUR-APP-NAME' do use_frameworks!

pod 'AWSPinpoint', '~> 2.6.13' # other pods

end

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

b. 调用 Amazon Pinpoint API 的类必须使用以下导入语句:

46

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import AWSCoreimport AWSPinpoint

2. 通过在您的应用程序的 didFinishLaunchwithOptions 的 AppDelegate.swift 方法中使用以下代码来创建 Amazon Pinpoint 客户端。这还将向 Amazon Pinpoint 注册您的设备令牌。

var pinpoint: AWSPinpoint?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

pinpoint = AWSPinpoint(configuration: AWSPinpointConfiguration.defaultPinpointConfiguration(launchOptions: launchOptions))

return true}

添加 Amazon Pinpoint 定向和市场活动推送消息收发

利用 Amazon Pinpoint 控制台,您可以使用推送消息收发来定向您的应用程序用户。您可以发送单独的消息或配置市场活动 (定向与您定义的配置文件匹配的一组用户)。例如,您可以向 30 天内未使用此应用程序的用户发送电子邮件,或向频繁使用您的应用程序的指定功能的用户发送 SMS。

Android - Java

以下两个步骤演示如何接收您的应用程序的定向推送通知。

1. 将推送侦听器服务添加到您的应用程序。

类的名称必须与应用程序清单中使用的推送侦听器服务名称匹配。pinpointManager 是对静态PinpointManager 变量(在上一步中显示的 MainActivity 中声明)的引用。使用下列步骤在您的应用程序中设置推送通知侦听。a. 以下推送侦听器代码假定应用程序的 MainActivity 是使用上一部分中描述的清单设置配置的。

import android.content.Intent;import android.os.Bundle;import android.support.v4.content.LocalBroadcastManager;import android.util.Log;

import com.amazonaws.mobileconnectors.pinpoint.targeting.notification.NotificationClient;import com.google.android.gms.gcm.GcmListenerService;

public class YOUR-PUSH-LISTENER-SERVICE-NAME extends GcmListenerService { public static final String LOGTAG = PushListenerService.class.getSimpleName();

// Intent action used in local broadcast public static final String ACTION_PUSH_NOTIFICATION = "push-notification"; // Intent keys public static final String INTENT_SNS_NOTIFICATION_FROM = "from"; public static final String INTENT_SNS_NOTIFICATION_DATA = "data";

/** * Helper method to extract push message from bundle. * * @param data bundle

47

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

* @return message string from push notification */ public static String getMessage(Bundle data) { // If a push notification is sent as plain // text, then the message appears in "default". // Otherwise it's in the "message" for JSON format. return data.containsKey("default") ? data.getString("default") : data.getString( "message", ""); }

private void broadcast(final String from, final Bundle data) { Intent intent = new Intent(ACTION_PUSH_NOTIFICATION); intent.putExtra(INTENT_SNS_NOTIFICATION_FROM, from); intent.putExtra(INTENT_SNS_NOTIFICATION_DATA, data); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); }

@Override public void onMessageReceived(final String from, final Bundle data) { Log.d(LOGTAG, "From:" + from); Log.d(LOGTAG, "Data:" + data.toString());

final NotificationClient notificationClient = MainActivity.pinpointManager.getNotificationClient();

NotificationClient.CampaignPushResult pushResult = notificationClient.handleGCMCampaignPush(from, data, this.getClass());

if (!NotificationClient.CampaignPushResult.NOT_HANDLED.equals(pushResult)) { // The push message was due to a Pinpoint campaign. // If the app was in the background, a local notification was added // in the notification center. If the app was in the foreground, an // event was recorded indicating the app was in the foreground, // for the demo, we will broadcast the notification to let the main // activity display it in a dialog. if ( NotificationClient.CampaignPushResult.APP_IN_FOREGROUND.equals(pushResult)) { // Create a message that will display the raw //data of the campaign push in a dialog. data.putString(" message", String.format("Received Campaign Push:\n%s", data.toString())); broadcast(from, data); } return; } }}

b. 添加代码以响应您的推送侦听器服务.

以下代码可放置在您的应用程序将响应传入通知的位置。

import android.app.Activity;import android.app.AlertDialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.support.v4.content.LocalBroadcastManager;

48

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;

public class MainActivity extends AppCompatActivity { public static final String LOG_TAG = MainActivity.class.getSimpleName();

@Override protected void onPause() { super.onPause();

// unregister notification receiver LocalBroadcastManager.getInstance(this).unregisterReceiver(notificationReceiver); }

@Override protected void onResume() { super.onResume();

// register notification receiver LocalBroadcastManager.getInstance(this).registerReceiver(notificationReceiver, new IntentFilter(PushListenerService.ACTION_PUSH_NOTIFICATION)); }

private final BroadcastReceiver notificationReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, "Received notification from local broadcast. Display it in a dialog.");

Bundle data = intent.getBundleExtra(PushListenerService.INTENT_SNS_NOTIFICATION_DATA); String message = PushListenerService.getMessage(data);

new AlertDialog.Builder(MainActivity.this) .setTitle("Push notification") .setMessage(message) .setPositiveButton(android.R.string.ok, null) .show(); } };

}

Android - Kotlin

以下两个步骤演示如何接收您的应用程序的定向推送通知。

1. 将推送侦听器服务添加到您的应用程序。

类的名称必须与应用程序清单中使用的推送侦听器服务名称匹配。pinpointManager 是对静态PinpointManager 变量(在上一步中显示的 MainActivity 中声明)的引用。使用下列步骤在您的应用程序中设置推送通知侦听。a. 以下推送侦听器代码假定应用程序的 MainActivity 是使用上一部分中描述的清单设置配置的。

import android.content.Intent;import android.os.Bundle;import android.support.v4.content.LocalBroadcastManager;import android.util.Log;

49

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import com.amazonaws.mobileconnectors.pinpoint.targeting.notification.NotificationClient;import com.google.android.gms.gcm.GcmListenerService;

class YOUR-PUSH-LISTENER-SERVICE-NAME : GcmListenerService() { companion object { private val LOG_TAG = this::class.java.simpleName const val ACTION_PUSH_NOTIFICATION: String = "push-notification" const val INTENT_SNS_NOTIFICATION_FROM: String = "from" const val INTENT_SNS_NOTIFICATION_DATA: String = "data"

// Helper method to extract push message from bundle. fun getMessage(data: Bundle) = if (data.containsKey("default") data.getString("default") else data.getString("message", "") }

private fun broadcast(from: String, data: Bundle) { val intent = Intent(ACTION_PUSH_NOTIFICATION).apply { putExtra(INTENT_SNS_NOTIFICATION_FROM, from) putExtra(INTENT_SNS_NOTIFICATION_DATA, data) } LocalBroadcastManager.getInstance(this).sendBroadcast(intent) }

override fun onMessageReceived(from: String?, data: Bundle?) { Log.d(LOG_TAG, "From: $from") Log.d(LOG_TAG, "Data: $data")

val notificationClient = MainActivity.pinpointManager!!.notificationClient!! val pushResult = notificationClient.handleGCMCampaignPush(from, data, this::class.java) if (pushResult != NotificationClient.CampaignPushResult.NOT_HANDLED) { // The push message was due to a Pinpoint campaign // If the app was in the background, a local notification was added // in the notification center. If the app was in the foreground, an // event was recorded indicating the app was in the foreground, // for the demo, we will broadcast the notification to let the main // activity display it in a dialog. if (pushResult == NotificationClient.CampaignPushResult.APP_IN_FOREGROUND) { data.putString("message", "Received Campaign Push:\n$data") broadcast(from, data) } return } }}

b. 添加代码以响应您的推送侦听器服务.

以下代码可放置在您的应用程序将响应传入通知的位置。

import android.app.Activity;import android.app.AlertDialog;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.support.v4.content.LocalBroadcastManager;import android.support.v7.app.AppCompatActivity;

50

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import android.os.Bundle;import android.util.Log;

class MainActivity : AppCompatActivity() { companion object { // ...

val notificationReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Log.d(LOG_TAG, "Received notification from local broadcast.")

val data = intent.getBundleExtra(PushListenerService.INTENT_SNS_NOTIFICATION_DATA) val message = PushListenerService.getMessage(data)

// Uses anko library to display an alert dialog alert(message) { title = "Push notification" positiveButton("OK") { /* Do nothing */ } }.show() } } }

override fun onPause() { super.onPause() LocalBroadcastManager.getInstance(this).unregisterReceiver(notificationReceiver) }

override fun onResume() { super.onResume() LoadBroadcastManager.getInstance(this).registerReceiver(notificationReceiver, IntentFilter(PushListenerService.ACTION_PUSH_NOTIFICATION)) }

// ...}

iOS - Swift

1. 在具有 AppDelegate 实例化的 PinpointManager 中,确保以下函数中存在推送侦听代码。

// . . .

func application( _ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

pinpoint!.notificationManager.interceptDidRegisterForRemoteNotifications( withDeviceToken: deviceToken) }

func application( _ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

pinpoint!.notificationManager.interceptDidReceiveRemoteNotification( userInfo, fetchCompletionHandler: completionHandler)

51

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

if (application.applicationState == .active) { let alert = UIAlertController(title: "Notification Received", message: userInfo.description, preferredStyle: .alert) alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))

UIApplication.shared.keyWindow?.rootViewController?.present( alert, animated: true, completion:nil) } }// . . .}

2. 在请求通知权限的 ViewController 中添加以下代码。

var userNotificationTypes : UIUserNotificationTypeuserNotificationTypes = [.alert , .badge , .sound]let notificationSettings = UIUserNotificationSettings.init(types: userNotificationTypes, categories: nil)UIApplication.shared.registerUserNotificationSettings(notificationSettings)UIApplication.shared.registerForRemoteNotifications()

3. 在 Xcode 中,在项目导航器中选择您的应用程序目标,选择 Capabilities (功能),启用 PushNotifications (推送通知)。

4. 使用通过 AWS Mobile Hub 构建示例 iOS 应用程序中的信息构建和运行您的应用程序。

使用 Amazon DynamoDB 将 NoSQL 数据库添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

AWS Mobile Hub nosqldb 功能使用 Amazon DynamoDB,帮助您创建可存储和检索数据的数据库表供应用程序使用。

设置您的后端

1. 在继续操作之前,请完成入门 (p. 3)步骤。如果您已有一个 Amazon DynamoDB 表,请参阅如何集成您的现有 NoSQL 表 (p. 92)。

2. 启用 NoSQL Database (NoSQL 数据库):在 Mobile Hub 中打开您的项目,然后选择 NoSQL Database(NoSQL 数据库) 磁贴启用此功能。

3. 按照控制台工作流程定义您需要的表。查看配置 NoSQL 数据库功能 (p. 187),了解详细信息。

52

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

4. 操作完成后,将弹出“Your Backend has been updated”(您的后端已更新) 的警报,提示您下载最新的云配置文件的副本。如果您已配置好功能,请选择横幅以返回到项目详细信息页面。

5. 在项目详细信息页面,每一个需要使用最新的云配置文件更新的应用程序都会有一个闪烁的 Integrate (集成) 按钮。选择此按钮以进入集成向导。

6. 使用最新的云配置文件副本更新您的应用程序。现在您的应用程序参考您的后端的最新版本。选择“Next”(下一步),并按照以下 NoSQL 数据库文档连接到您的后端。

7. 下载您的应用程序所需的模型。数据模型提供了 DynamoDB 表每个属性的设置和获取方法。

连接到您的后端

将 AWS Mobile NoSQL 数据库添加到您的应用程序

Android - Java

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 将以下内容添加到您的 app/build.gradle。

dependencies{ implementation 'com.amazonaws:aws-android-sdk-ddb-mapper:2.7.+'}

b. 对于您进行调用以执行数据库操作的每个活动,请导入以下 API。

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;

2. 为您的应用程序创建一个 DynamoDBMapper 客户端,如以下示例所示。

import com.amazonaws.auth.AWSCredentialsProvider;import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.config.AWSConfiguration;

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

// Declare a DynamoDBMapper object DynamoDBMapper dynamoDBMapper;

@Override protected void onCreate(Bundle savedInstanceState) {

53

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

// AWSMobileClient enables AWS user credentials to access your table AWSMobileClient.getInstance().initialize(this).execute();

AWSCredentialsProvider credentialsProvider = AWSMobileClient.getInstance().getCredentialsProvider(); AWSConfiguration configuration = AWSMobileClient.getInstance().getConfiguration();

// Add code to instantiate a AmazonDynamoDBClient AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(credentialsProvider);

this.dynamoDBMapper = DynamoDBMapper.builder() .dynamoDBClient(dynamoDBClient) .awsConfiguration(configuration) .build();

// other activity code ... }}

3. 添加您从 Mobile Hub 控制台下载的项目数据模型文件。数据模型提供了其建模的 DynamoDB 表的每个属性的设置和获取方法。a. 将您下载的数据模型文件 ./YOUR-PROJECT-NAME-integration-lib-aws-my-sample-

app-android/src/main/java/com/amazonaws/models/nosqlYOUR-TABLE-NAMEDO.java 复制到包含您的主要活动的 Android Studio 文件夹。

Note

使用对 DynamoDB 的异步调用由于对 DynamoDB 的调用是异步的,因此它们不会出现在您的 UI 线程上。请使用Runnable 包装程序等异步方法在单独的线程中调用 DynamoDBObjectMapper。

Runnable runnable = new Runnable() { public void run() { //DynamoDB calls go here }};Thread mythread = new Thread(runnable);mythread.start();

Android - Kotlin

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 将以下内容添加到您的 app/build.gradle。

dependencies{ implementation 'com.amazonaws:aws-android-sdk-ddb-mapper:2.7.+' }

b. 对于您进行调用以执行数据库操作的每个活动,请导入以下 API。

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;

54

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

2. 为您的应用程序创建一个 DynamoDBMapper 客户端,如以下示例所示。

// import DynamoDBMapper import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;

class MainActivity : AppCompatActivity() { private var dynamoDBMapper: DynamoDBMapper? = null

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

val client = AmazonDynamoDBClient(AWSMobileClient.getInstance().credentialsProvider) dynamoDBMapper = DynamoDBMapper.builder() .dynamoDBClient(client) .awsConfiguration(AWSMobileClient.getInstance().configuration) .build() }}

3. 添加您从 Mobile Hub 控制台下载的项目数据模型文件。数据模型提供了其建模的 DynamoDB 表的每个属性的设置和获取方法。a. 将您下载的数据模型文件 ./YOUR-PROJECT-NAME-integration-lib-aws-my-sample-

app-android/src/main/java/com/amazonaws/models/nosqlYOUR-TABLE-NAMEDO.java 复制到包含您的主要活动的 Android Studio 文件夹。

Note

使用对 DynamoDB 的异步调用由于对 DynamoDB 的调用是异步的,因此它们不会出现在您的 UI 线程上。请使用 thread包装程序等异步方法在单独的线程中调用 DynamoDBObjectMapper。

thread(start = true) { // DynamoDB calls go here}

iOS - Swift

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 您为安装 AWS Mobile 开发工具包而配置的 Podfile 必须包含:

platform :ios, '9.0'

target :'YOUR-APP-NAME' do use_frameworks!

pod 'AWSDynamoDB', '~> 2.6.13' # other podsend

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

55

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

b. 调用 DynamoDB API 的类必须使用以下导入语句:

import AWSCoreimport AWSDynamoDB

2. 从您下载数据模型文件的位置,将形式为 your-table-name.swift 的所有文件拖放到包含您的 AppDelegate.swift 的文件夹中。如果提供了 Copy items if needed (根据需要复制项目) 和Create groups (创建组) 选项,请将其选中。

执行 CRUD 操作

主题• 使用数据模型 (p. 56)• 创建 (保存) 项 (p. 58)• 读取 (加载) 项 (p. 59)• 更新项目 (p. 60)• 删除项目 (p. 61)

使用数据模型

要将您的应用程序连接到您创建的 Amazon DynamoDB 表,请使用 Mobile Hub 生成的数据模型,或使用以下格式创建一个数据模型。例如,以下几节中的片段基于名为 News 的表。该表的分区键 (哈希键) 名称为 userID,排序键 (范围键) 名称为 articleId,并具有其他属性,包括author、title、category、content 和 content。

Android - Java

在以下示例中,NewsDO 类定义 News 表的数据模型。本节中的 CRUD 方法使用此类访问该表及其属性。您在前面的步骤中从 Mobile Hub 中下载的数据模型文件包含一个类似的类,它定义您的表的模型。

请注意,注释了该类以将其映射到 Amazon DynamoDB 表名。注释了该类中的 getter 的属性名称、哈希键和范围键,以将其映射到应用程序使用的本地变量名称以执行数据操作。

package com.amazonaws.models.nosql;

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable;

import java.util.List;import java.util.Map;import java.util.Set;

@DynamoDBTable(tableName = "nosqlnews-mobilehub-1234567890-News")

public class NewsDO { private String _userId; private String _articleId; private String _author; private String _category; private String _content; private Double _creationDate; private String _title;

@DynamoDBHashKey(attributeName = "userId") @DynamoDBAttribute(attributeName = "userId")

56

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

public String getUserId() { return _userId; }

public void setUserId(final String _userId) { this._userId = _userId; } @DynamoDBRangeKey(attributeName = "articleId") @DynamoDBAttribute(attributeName = "articleId") public String getArticleId() { return _articleId; }

public void setArticleId(final String _articleId) { this._articleId = _articleId; } @DynamoDBAttribute(attributeName = "author") public String getAuthor() { return _author; }

public void setAuthor(final String _author) { this._author = _author; }

// setters and getters for other attributes ...

}

Android - Kotlin

在以下示例中,NewsDO 类定义 News 表的数据模型。本节中的 CRUD 方法使用此类访问该表及其属性。您在前面的步骤中从 Mobile Hub 中下载的数据模型文件包含一个类似的类,它定义您的表的模型。

请注意,注释了该类以将其映射到 Amazon DynamoDB 表名。注释了该类中的 getter 的属性名称、哈希键和范围键,以将其映射到应用程序使用的本地变量名称以执行数据操作。

package com.amazonaws.models.nosql;

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable;

import java.util.List;import java.util.Map;import java.util.Set;

@DynamoDBTable(tableName = "nosqlnews-mobilehub-1234567890-News")

data class NewsDO { @DynamoDBHashKey(attributeName = "userId" ) @DynamoDBAttribute(attributeName = "userId") var userId: String?

@DynamoDBRangeKey(attributeName = "articleId") @DynamoDBAttribute(attributeName = "articleId") var articleId: String?

@DynamoDBAttribute(attributeName = "author") var author: String?

57

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// setters and getters for other attributes ...}

如果您下载了由 Mobile Hub 生成的 Android 模型文件,该文件将以 Java 形式提供并且可以在 Kotlin 项目中使用而无需修改。

iOS - Swift

在以下示例中,News 类定义 News 表的数据模型。本节中的 CRUD 方法使用此类访问该表及其属性。您在前面的步骤中从 Mobile Hub 中下载的数据模型文件包含一个类似的类,它定义您的表的模型。

请注意,模型类的函数返回在应用程序执行数据操作时使用的 Amazon DynamoDB 表、哈希键属性以及范围键属性名称。例如,dynamoDBTableName() 在 AWS 中返回表对象的名称。本地变量名称映射到表的属性名称。例如,userId 是本地变量和 Amazon DynamoDB 表属性的名称。

该示例比 Mobile Hub 生成的数据模型稍微简单一些,但功能是相同的。

// News.swift

import Foundationimport UIKitimport AWSDynamoDB

class News: AWSDynamoDBObjectModel, AWSDynamoDBModeling {

@objc var userId: String? @objc var articleId: String? @objc var author: String? @objc var category: String? @objc var content: String? @objc var creationDate: NSNumber? @objc var title: String?

class func dynamoDBTableName() -> String {

return "nosqlnews-mobilehub-1200412570-News" }

class func hashKeyAttribute() -> String {

return "userId" }

class func rangeKeyAttribute() -> String {

return "articleId" }

}

创建 (保存) 项

使用以下代码可在您的 NoSQL 数据库表中创建项。

Android - Java

public void createNews() { final NewsDO newsItem = new NewsDO();

newsItem.setUserId(unique-user-id);

newsItem.setArticleId("Article1");

58

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

newsItem.setContent("This is the article content");

new Thread(new Runnable() { @Override public void run() { dynamoDBMapper.save(newsItem); // Item saved } }).start();}

Android - Kotlin

fun createNews() { val NewsDO newsItem = NewsDO() newsItem.userId = "unique-user-id" newsItem.articleId = UUID.randomUUID().toString() newsItem.author = "Your Name" newsItem.content = "This is the article content"

thread(start = true) { dynamoDBMapper.save(newsItem) } }

iOS - Swift

func createNews() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

// Create data object using data models you downloaded from Mobile Hub let newsItem: News = News()

newsItem.userId = AWSIdentityManager.default().identityId

newsItem.articleId = "YourArticleId" newsItem.title = "YourTitlestring" newsItem.author = "YourAuthor" newsItem.creationDate = NSDate().timeIntervalSince1970 as NSNumber

//Save a new item dynamoDbObjectMapper.save(newsItem, completionHandler: { (error: Error?) -> Void in

if let error = error { print("Amazon DynamoDB Save Error: \(error)") return } print("An item was saved.") })}

读取 (加载) 项

使用以下代码可在您的 NoSQL 数据库表中读取建项。

Android - Java

public void readNews() { new Thread(new Runnable() { @Override public void run() {

59

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

NewsDO newsItem = dynamoDBMapper.load( NewsDO.class, unique-user-id, "Article1");

// Item read // Log.d("News Item:", newsItem.toString()); } }).start();}

Android - Kotlin

fun readNews(userId: String, articleId: String, callback: (NewsDO?) -> Unit) { thread(start = true) { var newsItem = dynamoDBMapper.load(NewsDO::class.java, userId, articleId) runOnUiThread { callback(newsItem) } } }

iOS - Swift

func readNews() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

// Create data object using data models you downloaded from Mobile Hub let newsItem: News = News(); newsItem.userId = AWSIdentityManager.default().identityId

dynamoDbObjectMapper.load( News.self, hashKey: newsItem.userId, rangeKey: "YourArticleId", completionHandler: { (objectModel: AWSDynamoDBObjectModel?, error: Error?) -> Void in if let error = error { print("Amazon DynamoDB Read Error: \(error)") return } print("An item was read.") }) }

更新项目

使用以下代码可在您的 NoSQL 数据库表中更新项。

Android - Java

public void updateNews() { final NewsDO newsItem = new NewsDO();

newsItem.setUserId(unique-user-id);

newsItem.setArticleId("Article1"); newsItem.setContent("This is the updated content.");

new Thread(new Runnable() { @Override public void run() {

60

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

dynamoDBMapper.save(newsItem);

// Item updated } }).start();}

Android - Kotlin

fun updateNews(updatedNews: NewsDO) { thread(start = true) { dynamoDBMapper.save(updatedNews) } }

iOS - Swift

func updateNews() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

let newsItem: News = News();

newsItem.userId = "unique-user-id"

newsItem.articleId = "YourArticleId" newsItem.title = "This is the Title" newsItem.author = "B Smith" newsItem.creationDate = NSDate().timeIntervalSince1970 as NSNumber newsItem.category = "Local News"

dynamoDbObjectMapper.save(newsItem, completionHandler: {(error: Error?) -> Void in if let error = error { print(" Amazon DynamoDB Save Error: \(error)") return } print("An item was updated.") })}

删除项目

使用以下代码可在您的 NoSQL 数据库表中删除项。

Android - Java

public void deleteNews() { new Thread(new Runnable() { @Override public void run() {

NewsDO newsItem = new NewsDO();

newsItem.setUserId(unique-user-id); //partition key

newsItem.setArticleId("Article1"); //range (sort) key

dynamoDBMapper.delete(newsItem);

// Item deleted } }).start();

61

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

}

Android - Kotlin

public void deleteNews(userId: String, articleId: String) { thread(start = true) { val item = NewsDO() item.userId = userId item.articleId = articleId

dynamoDBMapper.delete(item) } }

iOS - Swift

func deleteNews() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

let itemToDelete = News() itemToDelete?.userId = "unique-user-id" itemToDelete?.articleId = "YourArticleId"

dynamoDbObjectMapper.remove(itemToDelete!, completionHandler: {(error: Error?) -> Void in if let error = error { print(" Amazon DynamoDB Save Error: \(error)") return } print("An item was deleted.") })}

执行查询

查询操作使您能够在表中查找项。您必须同时使用表的哈希键 (分区键) 和范围键 (排序键) 属性来定义查询。您可以通过指定要查找的属性来筛选结果。

以下示例代码显示了查询使用 userId (哈希键) 提交的新闻和以 Trial (范围键) 开头的文章 ID 的过程。

Android - Java

public void queryNews() {

new Thread(new Runnable() { @Override public void run() { NewsDO news = new NewsDO(); news.setUserId(unique-user-id); news.setArticleId("Article1");

Condition rangeKeyCondition = new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList(new AttributeValue().withS("Trial"));

DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression() .withHashKeyValues(note) .withRangeKeyCondition("articleId", rangeKeyCondition) .withConsistentRead(false);

PaginatedList<NewsDO> result = dynamoDBMapper.query(NewsDO.class, queryExpression);

62

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

Gson gson = new Gson(); StringBuilder stringBuilder = new StringBuilder();

// Loop through query results for (int i = 0; i < result.size(); i++) { String jsonFormOfItem = gson.toJson(result.get(i)); stringBuilder.append(jsonFormOfItem + "\n\n"); }

// Add your code here to deal with the data result Log.d("Query result: ", stringBuilder.toString());

if (result.isEmpty()) { // There were no items matching your query. } } }).start();}

Android - Kotlin

public void queryNews(userId: String, articleId: String, callback: (List<NewsDO>?) -> Unit) { thread(start = true) { val item = NewsDO() item.userId = userId item.articleId = articleId

val rangeKeyCondition = Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList(AttributeValue().withS("Trial")) val queryExpression = DynamoDBQueryExpression() .withHashKeyValues(item) .withRangeKeyCondition("articleId", rangeKeyCondition) .withConsistentRead(false); val result = dynamoDBMapper.query(NewsDO::class.java, queryExpression) runOnUiThread { callback(result) } }}

iOS - Swift

func queryNote() { // 1) Configure the query let queryExpression = AWSDynamoDBQueryExpression() queryExpression.keyConditionExpression = "#articleId >= :articleId AND #userId = :userId"

queryExpression.expressionAttributeNames = [ "#userId": "userId", "#articleId": "articleId" ] queryExpression.expressionAttributeValues = [ ":articleId": "SomeArticleId", ":userId": "unique-user-id" ]

// 2) Make the query

let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

dynamoDbObjectMapper.query(News.self, expression: queryExpression) { (output: AWSDynamoDBPaginatedOutput?, error: Error?) in

63

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

if error != nil { print("The request failed. Error: \(String(describing: error))") } if output != nil { for news in output!.items { let newsItem = news as? News print("\(newsItem!.title!)") } } }}

使用 Amazon S3 将用户文件存储添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

使您的应用程序能够使用适合您需求的权限模型存储和检索云存储中的用户文件。Mobile Hub 用户文件存储 (p. 203)使用 Amazon Simple Storage Service (Amazon S3) 部署和配置云存储存储桶。

设置您的后端

1. 在继续操作之前,请完成入门 (p. 3)步骤。2. 启用 User File Storage (用户文件存储):在 Mobile Hub 中打开您的项目,然后选择 User File Storage (用

户文件存储) 磁贴以启用该功能。3. 操作完成后,将弹出“Your Backend has been updated”(您的后端已更新) 的警报,提示您下载最新的云配

置文件的副本。如果您已配置好功能,请选择横幅以返回到项目详细信息页面。

4. 在项目详细信息页面,每一个需要使用最新的云配置文件更新的应用程序都会有一个闪烁的 Integrate (集成) 按钮。选择此按钮以进入集成向导。

5. 使用最新的云配置文件副本更新您的应用程序。现在您的应用程序参考您的后端的最新版本。选择 Next(下一步),然后按照下面的用户文件存储文档连接到您的后端。

连接到您的后端

确保完成 add-aws-mobile-user-sign-in-backend-setup 步骤,然后再使用此页面上的集成步骤。

将用户文件存储添加到您的应用程序

64

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

Android - Java

设置 AWS Mobile 开发工具包组件,如下所示:

1. 将以下内容添加到 app/build.gradle (Module:app):

dependencies { implementation 'com.amazonaws:aws-android-sdk-s3:2.7.+' implementation 'com.amazonaws:aws-android-sdk-cognito:2.7.+'}

执行 Gradle Sync 以将 AWS Mobile 开发工具包组件下载到您的应用程序中2. 将以下内容添加到 AndroidManifest.xml 中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application ... >

<!- Other manifest / application items . . . ->

<service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService" android:enabled="true" />

</application>

3. 对于进行调用以执行用户文件存储操作的每个活动,请导入以下程序包。

import com.amazonaws.mobileconnectors.s3.transferutility.*;

Android - Kotlin

设置 AWS Mobile 开发工具包组件,如下所示:

1. 将以下内容添加到 app/build.gradle 中:

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

dependencies { implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.amazonaws:aws-android-sdk-s3:2.7.+' implementation 'com.amazonaws:aws-android-sdk-cognito:2.7.+'}

执行 Gradle Sync 以将 AWS Mobile 开发工具包组件下载到您的应用程序中2. 将以下内容添加到 AndroidManifest.xml 中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<application ... >

<!- Other manifest / application items . . . ->

<service android:name="com.amazonaws.mobileconnectors.s3.transferutility.TransferService" android:enabled="true" />

65

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

</application>

3. 对于进行调用以执行用户文件存储操作的每个活动,请导入以下程序包。

import com.amazonaws.mobileconnectors.s3.transferutility.*;

iOS - Swift

设置 AWS Mobile 开发工具包组件,如下所示:

1. 将以下内容添加到您配置的 Podfile 以便安装 AWS Mobile 开发工具包:

platform :ios, '9.0'

target :'YOUR-APP-NAME' do use_frameworks!

pod 'AWSS3', '~> 2.6.13' # For file transfers pod 'AWSCognito', '~> 2.6.13' #For data sync

# other pods . . .

end

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

2. 将以下 import 语句添加到执行用户文件存储操作的类中:

import AWSCoreimport AWSS3

3. 将以下代码添加到您的 AppDelegate 以便与 AWS Mobile 建立运行时连接。

import UIKitimport AWSMobileClient

@UIApplicationMainclass AppDelegate: UIResponder, UIApplicationDelegate {

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { return AWSMobileClient.sharedInstance().interceptApplication(application, didFinishLaunchingWithOptions: launchOptions) }}

上传文件

Android - Java

要将文件上传到 Amazon S3 存储桶,请使用 AWSMobileClient 获取 AWSConfiguration 和AWSCredentialsProvider,然后创建 TransferUtility 对象。AWSMobileClient 需要使用活动上下文以恢复经过身份验证的会话和创建凭证提供商。

66

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

以下示例说明了如何在活动上下文中使用 TransferUtility。如果从应用程序上下文中创建TransferUtility,您可以构造 AWSCredentialsProvider 并将其传递给 TransferUtility 以在组成 AWSConfiguration 对象时使用。TransferUtility 将检查上传的文件大小,并在文件大小超过 5 MB 时自动切换为使用分段上传。

import android.app.Activity; import android.util.Log;

import com.amazonaws.mobile.client.AWSMobileClient; import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility; import com.amazonaws.mobileconnectors.s3.transferutility.TransferState; import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver; import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener; import com.amazonaws.services.s3.AmazonS3Client;

import java.io.File;

public class YourActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { AWSMobileClient.getInstance().initialize(this).execute(); uploadWithTransferUtility(); }

public void uploadWithTransferUtility() {

TransferUtility transferUtility = TransferUtility.builder() .context(getApplicationContext()) .awsConfiguration(AWSMobileClient.getInstance().getConfiguration()) .s3Client(new AmazonS3Client(AWSMobileClient.getInstance().getCredentialsProvider())) .build();

TransferObserver uploadObserver = transferUtility.upload( "s3Folder/s3Key.txt", new File("/path/to/file/localFile.txt"));

// Attach a listener to the observer to get state update and progress notifications uploadObserver.setTransferListener(new TransferListener() {

@Override public void onStateChanged(int id, TransferState state) { if (TransferState.COMPLETED == state) { // Handle a completed upload. } }

@Override public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { float percentDonef = ((float) bytesCurrent / (float) bytesTotal) * 100; int percentDone = (int)percentDonef;

Log.d("YourActivity", "ID:" + id + " bytesCurrent: " + bytesCurrent + " bytesTotal: " + bytesTotal + " " + percentDone + "%"); }

@Override public void onError(int id, Exception ex) { // Handle errors

67

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

}

});

// If you prefer to poll for the data, instead of attaching a // listener, check for the state and progress in the observer. if (TransferState.COMPLETED == uploadObserver.getState()) { // Handle a completed upload. }

Log.d("YourActivity", "Bytes Transferrred: " + uploadObserver.getBytesTransferred()); Log.d("YourActivity", "Bytes Total: " + uploadObserver.getBytesTotal()); }}

Android - Kotlin

要将文件上传到 Amazon S3 存储桶,请使用 AWSMobileClient 获取 AWSConfiguration 和AWSCredentialsProvider,然后创建 TransferUtility 对象。AWSMobileClient 需要使用活动上下文以恢复经过身份验证的会话和创建凭证提供商。

以下示例说明了如何在活动上下文中使用 TransferUtility。

如果从应用程序上下文中创建 TransferUtility,您可以构造 AWSCredentialsProvider 并将其传递给 TransferUtility 以在组成 AWSConfiguration 对象时使用。TransferUtility 将检查上传的文件大小,并在文件大小超过 5 MB 时自动切换为使用分段上传。

import android.os.Bundleimport android.support.v7.app.AppCompatActivityimport android.util.Logimport com.amazonaws.AmazonServiceExceptionimport com.amazonaws.mobile.client.AWSMobileClientimport com.amazonaws.mobileconnectors.s3.transferutility.TransferListenerimport com.amazonaws.mobileconnectors.s3.transferutility.TransferStateimport com.amazonaws.mobileconnectors.s3.transferutility.TransferUtilityimport com.amazonaws.services.s3.AmazonS3Clientimport kotlinx.android.synthetic.main.activity_main.*import java.io.File;

class YourActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState)

AWSMobileClient.getInstance().initialize(this).execute() uploadWithTransferUtility() }

fun uploadWithTransferUtility() { val transferUtility = TransferUtility.builder() .context(this.applicationContext) .awsConfiguration(AWSMobileClient.getInstance().configuration) .s3Client(AmazonS3Client(AWSMobileClient.getInstance().credentialsProvider)) .build()

val uploadObserver = transferUtility.upload("s3folder/s3key.txt", File("/path/to/localfile.txt"))

// Attach a listener to the observer uploadObserver.setTransferListener(object : TransferListener { override fun onStateChanged(id: Int, state: TransferState) { if (state == TransferState.COMPLETED) {

68

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Handle a completed upload } }

override fun onProgressChanged(id: Int, current: Long, total: Long) { val done = (((current.toDouble() / total) * 100.0).toInt()) Log.d(LOG_TAG, "UPLOAD - - ID: $id, percent done = $done") }

override fun onError(id: Int, ex: Exception) { Log.d(LOG_TAG, "UPLOAD ERROR - - ID: $id - - EX: ${ex.message.toString()}") } })

// If you prefer to long-poll for updates if (uploadObserver.state == TransferState.COMPLETED) { /* Handle completion */ }

val bytesTransferred = uploadObserver.bytesTransferred }}

iOS - Swift

以下示例说明了如何将文件上传到 Amazon S3 存储桶。

func uploadData() {

let data: Data = Data() // Data to be uploaded

let expression = AWSS3TransferUtilityUploadExpression() expression.progressBlock = {(task, progress) in DispatchQueue.main.async(execute: { // Do something e.g. Update a progress bar. }) }

var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock? completionHandler = { (task, error) -> Void in DispatchQueue.main.async(execute: { // Do something e.g. Alert a user for transfer completion. // On failed uploads, `error` contains the error object. }) }

let transferUtility = AWSS3TransferUtility.default()

transferUtility.uploadData(data, bucket: "YourBucket", key: "YourFileName", contentType: "text/plain", expression: expression, completionHandler: completionHandler).continueWith { (task) -> AnyObject! in if let error = task.error { print("Error: \(error.localizedDescription)") }

if let _ = task.result { // Do something with uploadTask. } return nil; }

69

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

}

下载文件

Android - Java

要从 Amazon S3 存储桶中下载文件,请使用 AWSMobileClient 获取 AWSConfiguration 和AWSCredentialsProvider 以创建 TransferUtility 对象。AWSMobileClient 需要使用活动上下文以恢复经过身份验证的会话和创建 AWSCredentialsProvider。

以下示例说明了如何在活动上下文中使用 TransferUtility。如果从应用程序上下文中创建TransferUtility,您可以构造 AWSCredentialsProvider 并将其传递给 TransferUtility 以在组成 AWSConfiguration 对象时使用。

import android.app.Activity;import android.util.Log;

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility;import com.amazonaws.mobileconnectors.s3.transferutility.TransferState;import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver;import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener;import com.amazonaws.services.s3.AmazonS3Client;

import java.io.File;

public class YourActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { AWSMobileClient.getInstance().initialize(this).execute(); downloadWithTransferUtility(); }

private void downloadWithTransferUtility() {

TransferUtility transferUtility = TransferUtility.builder() .context(getApplicationContext()) .awsConfiguration(AWSMobileClient.getInstance().getConfiguration()) .s3Client(new AmazonS3Client(AWSMobileClient.getInstance().getCredentialsProvider())) .build();

TransferObserver downloadObserver = transferUtility.download( "s3Folder/s3Key.txt", new File("/path/to/file/localFile.txt"));

// Attach a listener to the observer to get state update and progress notifications downloadObserver.setTransferListener(new TransferListener() {

@Override public void onStateChanged(int id, TransferState state) { if (TransferState.COMPLETED == state) { // Handle a completed upload. } }

@Override public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { float percentDonef = ((float)bytesCurrent/(float)bytesTotal) * 100;

70

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

int percentDone = (int)percentDonef;

Log.d(LOG_TAG, " ID:" + id + " bytesCurrent: " + bytesCurrent + " bytesTotal: " + bytesTotal + " " + percentDone + "%"); }

@Override public void onError(int id, Exception ex) { // Handle errors }

});

// If you prefer to poll for the data, instead of attaching a // listener, check for the state and progress in the observer. if (TransferState.COMPLETED == downloadObserver.getState()) { // Handle a completed upload. }

Log.d(LOG_TAG, "Bytes Transferrred: " + downloadObserver.getBytesTransferred()); Log.d(LOG_TAG, "Bytes Total: " + downloadObserver.getBytesTotal()); }}

Android - Kotlin

要从 Amazon S3 存储桶中下载文件,请使用 AWSMobileClient 获取 AWSConfiguration 和AWSCredentialsProvider 以创建 TransferUtility 对象。AWSMobileClient 需要使用活动上下文以恢复经过身份验证的会话和创建 AWSCredentialsProvider。

以下示例说明了如何在活动上下文中使用 TransferUtility。如果从应用程序上下文中创建TransferUtility,您可以构造 AWSCredentialsProvider 并将其传递给 TransferUtility 以在组成 AWSConfiguration 对象时使用。

import android.app.Activity;import android.util.Log;

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobileconnectors.s3.transferutility.TransferUtility;import com.amazonaws.mobileconnectors.s3.transferutility.TransferState;import com.amazonaws.mobileconnectors.s3.transferutility.TransferObserver;import com.amazonaws.mobileconnectors.s3.transferutility.TransferListener;import com.amazonaws.services.s3.AmazonS3Client;

import java.io.File;

class YourActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_your)

AWSMobileClient.getInstance().initialize(this).execute() donwloadWithTransferUtility() }

private fun downloadWithTransferUtility() { val transferUtility = TransferUtility.builder() .context(applicationContext) .awsConfiguration(AWSMobileClient.getInstance().configuration) .s3Client(AmazonS3Client(AWSMobileClient.getInstance().credentialsProvider)) .build()

71

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

val downloadObserver = transferUtility.download( "s3folder/s3key.txt", File("/path/to/file/localfile.txt"))

// Attach a listener to get state updates downloadObserver.setTransferListener(object : TransferListener { override fun onStateChanged(id: Int, state: TransferState) { if (state == TransferState.COMPLETED) { // Handle a completed upload. } }

override fun onProgressChanged(id: Int, current: Long, total: Long) { try { val done = (((current.toDouble() / total) * 100.0).toInt()) //as Int Log.d(LOG_TAG, "DOWNLOAD - - ID: $id, percent done = $done") } catch (e: Exception) { Log.e(LOG_TAG, "Trouble calculating progress percent", e) } }

override fun onError(id: Int, ex: Exception) { Log.d(LOG_TAG, "DOWNLOAD ERROR - - ID: $id - - EX: ${ex.message.toString()}") } })

// If you prefer to poll for the data, instead of attaching a // listener, check for the state and progress in the observer. if (downloadObserver.state == TransferState.COMPLETED) { // Handle a completed upload. }

Log.d(LOG_TAG, "Bytes Transferrred: ${downloadObserver.bytesTransferred}"); }}

iOS - Swift

以下示例说明了如何从 Amazon S3 存储桶下载文件。

func downloadData() { let expression = AWSS3TransferUtilityDownloadExpression() expression.progressBlock = {(task, progress) in DispatchQueue.main.async(execute: { // Do something e.g. Update a progress bar. }) }

var completionHandler: AWSS3TransferUtilityDownloadCompletionHandlerBlock? completionHandler = { (task, URL, data, error) -> Void in DispatchQueue.main.async(execute: { // Do something e.g. Alert a user for transfer completion. // On failed downloads, `error` contains the error object. }) }

let transferUtility = AWSS3TransferUtility.default() transferUtility.downloadData( fromBucket: "YourBucket", key: "YourFileName", expression: expression, completionHandler: completionHandler ).continueWith {

72

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

(task) -> AnyObject! in if let error = task.error { print("Error: \(error.localizedDescription)") }

if let _ = task.result { // Do something with downloadTask.

} return nil; }}

后续步骤

• 有关展示 TransferUtility 能力的应用程序示例,请参阅 Android S3 TransferUtility 示例和 iOS S3TransferUtility 示例。

• 正在查找 Amazon Cognito Sync? 如果您是新用户,请改用 AWS AppSync。AppSync 是一种在设备之间同步应用程序数据的新服务。与 Cognito Sync 类似,AppSync 允许同步用户自己的数据,例如,游戏状态或应用程序首选项。AppSync 允许多个用户实时同步和协作处理共享的数据 (如虚拟会议空间或聊天室),从而扩展了这些功能。立即开始使用 AWS AppSync 构建

利用 Amazon API GateWay 和 AWS Lambda 将云 API 添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

云逻辑概述

添加由您的无服务器 Lambda 函数处理的 RESTful API 以将您的移动应用程序扩展到 AWS 服务的范围以及更大的范围。在 Mobile Hub 中,启用云逻辑 (p. 183)功能需使用 Amazon API Gateway 和 AWS Lambda服务,以便提供这些功能。

设置您的后端

1. 在继续操作之前,请完成入门 (p. 3)步骤。2. 启用 Cloud Logic (云逻辑):在 Mobile Hub 中打开您的项目,然后选择 Cloud Logic (云逻辑) 磁贴启用此

功能。3. 创建一个新 API,或导入一个您在 API Gateway 控制台中创建的 API。

a. 要创建新 API,请选择 Create an API (创建 API)。b. 键入 API Name (API 名称) 和 Description (描述)。c. 配置您的 Paths (路径)。路径是处理对您的 API 的请求的无服务器 AWS Lambda 函数的位置。

选择 Create API (创建 API) 以部署一个默认 API 及其关联的处理程序函数。默认处理程序是一个Node.js 函数,该函数将回显它收到的 JSON 输入。有关更多信息,请参阅将 AWS Lambda 与Amazon API Gateway 结合使用。

在 Mobile Hub 项目中配置的 API 和路径的定义将在 AWS CloudFormation 模板中捕获。包含模板的请求的正文限制为 51200 字节,请参阅 AWS CloudFormation 限制了解详细信息。如果您的 API 定义因过大而不适应此大小,您可以使用 AWS API Gateway 控制台创建 API 并将其导入到 Mobile Hub 项目。

4. 在配置完功能并完成最后一个操作后,在左上角选择您的项目名称以转到项目详细信息页面。显示的横幅也会链接到该位置。

73

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

5. 在应用程序选项卡上选择 Integrate (集成)。

如果为多个平台创建了应用程序,受您的项目更改影响的每个应用程序的 Integrate (集成) 按钮将闪烁,这表明每个版本具有更新的配置文件。

6. 选择 Download Cloud Config (下载云配置),并将旧版本的 awsconfiguration.json 替换为新下载的文件。Android - Java

在 项目导航器中,右键单击您的应用程序的 res 文件夹,然后选择 New (新建) > Directory (目录)。键入 raw 以作为目录名称,然后选择 OK (确定)。

从上一步中下载 awsconfiguration.json 配置文件的位置中,将其拖到 res/raw 文件夹中。Android 为放置在该文件夹中的任意文件提供一个资源 ID,从而在应用程序中轻松引用该文件。

请记住 您每次在 Mobile Hub 项目中创建或更新功能时,请下载 awsconfiguration.json 的新版本并将其集成到项目中每个将使用此更新的应用程序中。

Android - Kotlin

在 项目导航器中,右键单击您的应用程序的 res 文件夹,然后选择 New (新建) > Directory (目录)。键入 raw 以作为目录名称,然后选择 OK (确定)。

74

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

从上一步中下载 awsconfiguration.json 配置文件的位置中,将其拖到 res/raw 文件夹中。Android 为放置在该文件夹中的任意文件提供一个资源 ID,从而在应用程序中轻松引用该文件。

iOS - Swift

在您下载位置,请将 awsconfiguration.json 放置到您的 Xcode 项目中包含 info.plist 文件的文件夹中。在选项对话框中选择 Copy items if needed (根据需要复制项目) 和 Create groups (创建组)。选择 Next。

现在您的应用程序参考您的后端的最新版本。7. 选择 Swift Models (Swift 模型) 以下载为您的应用程序生成的 API 模型。这些文件可以访问刚创建的 API

Gateway API 的请求接口。选择 Next (下一步),然后按照下面的云 API 文档连接到您的后端。

连接到您的后端

使用以下步骤将 AWS 云逻辑添加到您的应用程序。

Android - Java

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 将以下内容添加到您的 app/build.gradle:

dependencies{

// other dependencies . . .

implementation 'com.amazonaws:aws-android-sdk-apigateway-core:2.7.+'

}

b. 对于您调用 API 网关 的每个活动,请声明以下导入。替换第一个声明中的此部分(此处表示为idABCD012345.NAME-OF-YOUR-API-MODEL-CLASS),替换为您从 Mobile Hub 项目中下载的类 ID 和 API 模型名称。

您可以在下载的 ./src/main/java/com/amazonaws/mobile/api/API-CLASS-ID/TestMobileHubClient.java 文件顶部查找这些值。

// This statement imports the model class you download from |AMH|.import com.amazonaws.mobile.api.idABCD012345.NAME-OF-YOUR-API-MODEL-CLASSMobileHubClient;

75

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import com.amazonaws.mobile.auth.core.IdentityManager;import com.amazonaws.mobile.config.AWSConfiguration;import com.amazonaws.mobileconnectors.apigateway.ApiClientFactory;import com.amazonaws.mobileconnectors.apigateway.ApiRequest;import com.amazonaws.mobileconnectors.apigateway.ApiResponse;import com.amazonaws.util.IOUtils;import com.amazonaws.util.StringUtils;import java.io.InputStream;

c. 您将 API 模型文件下载到的位置包含您在 Mobile Hub 项目中为每个云逻辑 API 创建的文件夹。这些文件夹是以 API 网关 分配到 API 的类 ID 命名的。对于每个文件夹:i. 在文本编辑器中,打开 ./src/main/java/com/amazonaws/mobile/api/YOUR-API-

CLASS-ID/YOUR-API-CLASS-NAMEMobileHubClient.java。ii. 复制位于文件顶部的形式为 com.amazonaws.mobile.api.{api-class-id} 的程序包名

称。iii. 在 Android Studio 中,右键单击选择 app/java,然后选择 New > Package (新建 > 程序包)。iv. 粘贴您在上一步中复制的程序包名称并选择 OK (确定)。v. 将 API 类文件夹的内容拖放到新创建的程序包中。内容包括 YOUR-API-CLASS-

NAMEMobileHubClient.java 和 model 文件夹。2. 调用云逻辑 API.

以下代码显示了如何使用您的 API 的客户端类、模型和资源路径来调用云逻辑。

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import com.amazonaws.http.HttpMethodName;import java.io.InputStream;import java.util.HashMap;

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobileconnectors.api.YOUR-API-CLASS-ID.YOUR-API-CLASS-NAMEMobilehubClient;import com.amazonaws.mobileconnectors.apigateway.ApiClientFactory;import com.amazonaws.mobileconnectors.apigateway.ApiRequest;import com.amazonaws.mobileconnectors.apigateway.ApiResponse;import com.amazonaws.util.StringUtils;

public class MainActivity extends AppCompatActivity { private static final String LOG_TAG = MainActivity.class.getSimpleName();

private YOUR-API-CLASS-NAMEMobileHubClient apiClient;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

// Create the client apiClient = new ApiClientFactory() .credentialsProvider(AWSMobileClient.getInstance().getCredentialsProvider()) .build(YOUR-API-CLASS-NAMEMobileHubClient.class); }

public callCloudLogic() { // Create components of api request final String method = "GET";

final String path = "/items";

76

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

final String body = ""; final byte[] content = body.getBytes(StringUtils.UTF8);

final Map parameters = new HashMap<>(); parameters.put("lang", "en_US");

final Map headers = new HashMap<>();

// Use components to create the api request ApiRequest localRequest = new ApiRequest(apiClient.getClass().getSimpleName()) .withPath(path) .withHttpMethod(HttpMethodName.valueOf(method)) .withHeaders(headers) .addHeader("Content-Type", "application/json") .withParameters(parameters);

// Only set body if it has content. if (body.length() > 0) { localRequest = localRequest .addHeader("Content-Length", String.valueOf(content.length)) .withBody(content); }

final ApiRequest request = localRequest;

// Make network call on background thread new Thread(new Runnable() { @Override public void run() { try { Log.d(LOG_TAG, "Invoking API w/ Request : " + request.getHttpMethod() + ":" + request.getPath());

final ApiResponse response = apiClient.execute(request);

final InputStream responseContentStream = response.getContent();

if (responseContentStream != null) { final String responseData = IOUtils.toString(responseContentStream); Log.d(LOG_TAG, "Response : " + responseData); }

Log.d(LOG_TAG, response.getStatusCode() + " " + response.getStatusText());

} catch (final Exception exception) { Log.e(LOG_TAG, exception.getMessage(), exception); exception.printStackTrace(); } } }).start(); }}

Android - Kotlin

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 将以下内容添加到您的 app/build.gradle:

77

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

dependencies{

// other dependencies . . .

implementation 'com.amazonaws:aws-android-sdk-apigateway-core:2.7.+'

}

b. 对于您调用 API 网关 的每个活动,请声明以下导入。替换第一个声明中的此部分(此处表示为idABCD012345.NAME-OF-YOUR-API-MODEL-CLASS),替换为您从 Mobile Hub 项目中下载的类 ID 和 API 模型名称。

您可以在下载的 ./src/main/java/com/amazonaws/mobile/api/API-CLASS-ID/TestMobileHubClient.java 文件顶部查找这些值。

// This statement imports the model class you download from |AMH|.import com.amazonaws.mobile.api.idABCD012345.NAME-OF-YOUR-API-MODEL-CLASSMobileHubClient;

import com.amazonaws.mobile.auth.core.IdentityManager;import com.amazonaws.mobile.config.AWSConfiguration;import com.amazonaws.mobileconnectors.apigateway.ApiClientFactory;import com.amazonaws.mobileconnectors.apigateway.ApiRequest;import com.amazonaws.mobileconnectors.apigateway.ApiResponse;import com.amazonaws.util.IOUtils;import com.amazonaws.util.StringUtils;import java.io.InputStream;

c. 您将 API 模型文件下载到的位置包含您在 Mobile Hub 项目中为每个云逻辑 API 创建的文件夹。这些文件夹是以 API 网关 分配到 API 的类 ID 命名的。对于每个文件夹:i. 在文本编辑器中,打开 ./src/main/java/com/amazonaws/mobile/api/YOUR-API-

CLASS-ID/YOUR-API-CLASS-NAMEMobileHubClient.java。ii. 复制位于文件顶部的形式为 com.amazonaws.mobile.api.{api-class-id} 的程序包名

称。iii. 在 Android Studio 中,右键单击选择 app/java,然后选择 New > Package (新建 > 程序包)。iv. 粘贴您在上一步中复制的程序包名称并选择 OK (确定)。v. 将 API 类文件夹的内容拖放到新创建的程序包中。内容包括 YOUR-API-CLASS-

NAMEMobileHubClient.java 和 model 文件夹。2. 调用云逻辑 API.

以下代码显示了如何使用您的 API 的客户端类、模型和资源路径来调用云逻辑。

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import com.amazonaws.http.HttpMethodName;import java.io.InputStream;import java.util.HashMap;

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobileconnectors.api.YOUR-API-CLASS-ID.YOUR-API-CLASS-NAMEMobilehubClient;import com.amazonaws.mobileconnectors.apigateway.ApiClientFactory;import com.amazonaws.mobileconnectors.apigateway.ApiRequest;import com.amazonaws.mobileconnectors.apigateway.ApiResponse;import com.amazonaws.util.StringUtils;

class MainActivity : AppCompatActivity() { companion object {

78

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

private val TAG = this::class.java.simpleName }

private var apiClient: YOUR-API-CLASS-NAMEMobileHubClient? = null

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

apiClient = ApiClientFactory() .credentialsProvider(AWSMobileClient.getInstance().credentialsProvider) .build(YOUR-API-CLASS-NAMEMobileHubClinet::class.java) }

fun callCloudLogic(body: String) { val parameters = mapOf("lang" to "en_US") val headers = mapOf("Content-Type" to "application/json")

val request = ApiRequest(apiClient::class.java.simpleName) .withPath("/items") .withHttpMethod(HttpMethod.GET) .withHeaders(headers) .withParameters(parameters) if (body.isNotEmpty()) { val content = body.getBytes(StringUtils.UTF8) request .addHeader("Content-Length", String.valueOf(content.length)) .withBody(content) }

thread(start = true) { try { Log.d(TAG, "Invoking API") val response = apiClient.execute(request) val responseContentStream = response.getContent() if (responseContentStream != null) { val responseData = IOUtils.toString(responseContentStream) // Do something with the response data here } } catch (ex: Exception) { Log.e(TAG, "Error invoking API") } } }}

iOS - Swift

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 您为安装 AWS Mobile 开发工具包而配置的 Podfile 必须包含:

platform :ios, '9.0'

target :'YOUR-APP-NAME' do use_frameworks!

pod 'AWSAuthCore', '~> 2.6.13' pod 'AWSAPIGateway', '~> 2.6.13' # other pods

end

79

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

b. 调用 API 网关 API 的类必须使用以下导入语句:

import AWSAuthCoreimport AWSCoreimport AWSAPIGateway

c. 添加后端服务配置和您从 Mobile Hub 控制台下载的 API 模型文件,API 模型文件提供其建模的每个 API 网关 API 的 API 调用表面。i. 从您下载数据模型文件的位置,将 ./AmazonAws/API 文件夹拖放到包含

AppDelegate.swift 的 Xcode 项目文件夹中。

如果提供了 Copy items if needed (根据需要复制项目) 和 Create groups (创建组) 选项,请将其选中。

如果您的 Xcode 项目已包含 Bridging_Header.h 文件,则打开 ./AmazonAws/Bridging_Header.h,复制其包含的导入语句,然后将其粘贴到您的版本的文件中。

如果您的 Xcode 项目不包含 Bridging_Header.h 文件,则:A. 将 ./AmazonAws/Bridging_Header.h 拖放到包含 AppDelegate.swift 的 Xcode 项

目文件夹中。B. 在 Xcode 中选择您的项目根,选择 Build Settings (构建设置),然后搜索“bridging headers”C. 选择 Objective-C Bridging Header (Objective-C 桥接标头),按 return 键,然后在您的 Xcode

项目中键入路径:

your-project-name/.../Bridging_Header.h

2. 调用云逻辑 API.

要调用云逻辑 API,请按以下形式创建代码并替换您的 API 的客户端类、模型和资源路径。

import UIKitimport AWSAuthCoreimport AWSCoreimport AWSAPIGatewayimport AWSMobileClient

// ViewController or application context . . .

func doInvokeAPI() { // change the method name, or path or the query string parameters here as desired let httpMethodName = "POST" // change to any valid path you configured in the API let URLString = "/items" let queryStringParameters = ["key1":"{value1}"] let headerParameters = [ "Content-Type": "application/json", "Accept": "application/json" ]

let httpBody = "{ \n " + "\"key1\":\"value1\", \n " + "\"key2\":\"value2\", \n " + "\"key3\":\"value3\"\n}"

80

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Construct the request object let apiRequest = AWSAPIGatewayRequest(httpMethod: httpMethodName, urlString: URLString, queryParameters: queryStringParameters, headerParameters: headerParameters, httpBody: httpBody)

// Create a service configuration object for the region your AWS API was created in let serviceConfiguration = AWSServiceConfiguration( region: AWSRegionType.USEast1, credentialsProvider: AWSMobileClient.sharedInstance().getCredentialsProvider())

YOUR-API-CLASS-NAMEMobileHubClient.register(with: serviceConfiguration!, forKey: "CloudLogicAPIKey")

// Fetch the Cloud Logic client to be used for invocation let invocationClient = YOUR-API-CLASS-NAMEMobileHubClient(forKey: "CloudLogicAPIKey")

invocationClient.invoke(apiRequest).continueWith { ( task: AWSTask) -> Any? in

if let error = task.error { print("Error occurred: \(error)") // Handle error here return nil }

// Handle successful result here let result = task.result! let responseString = String(data: result.responseData!, encoding: .utf8)

print(responseString) print(result.statusCode)

return nil } }

利用 Amazon Pinpoint 将消息收发添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

通过将用户的应用程序使用行为与消息收发市场活动关联来更深度地吸引用户。

当您启用 AWS Mobile Hub 消息收发与分析 (p. 190)功能时,您的应用程序将注册到 Amazon Pinpoint 服务。您可以通过 Amazon Pinpoint 控制台定义用户分段并将电子邮件、SMS 和推送通知 (p. 42)消息发送到这些收件人。

Amazon Pinpoint 还使您能够收集和可视化您的应用程序的分析 (p. 13)。您收集的指标可以是会话启动和停止数据这样简单的内容,或者您也可以自定义这些指标以显示实际行为与您的预测模型的匹配程度之类的内容。

81

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

然后,您可以通过算法将消息收发市场活动与用户行为进行关联。例如,将折扣邮件发送给常见用户,或为已选择应用程序中某项功能中的特定类别的用户发送启动数据同步的推送通知。

设置您的后端

要设置电子邮件或 SMS 作为 Amazon Pinpoint 市场活动的一部分,请执行以下步骤。

要设置您的应用程序以从 Amazon Pinpoint 接收推送通知,请参阅利用 Amazon Pinpoint 将推送通知添加到您的移动应用程序 (p. 42)

1. 在继续操作之前,请完成入门 (p. 3)步骤。2. 对于电子邮件:选择 Messaging and Analytics (消息收发与分析) 磁贴以启用此

功能。a. 选择 Email (电子邮件),然后选择 Enable (启用)。b. 选择左侧描述性文本底部的 Amazon Pinpoint console (Amazon Pinpoint 控制台) 链接。c. 在 Amazon Pinpoint 控制台的 Channels (通道) 选项卡中选择 Email (电子邮件)。d. 选择 Email address (电子邮件地址),键入您的消息应来自的地址,然后选择输入字段末尾的 verify

(验证)。

您输入的电子邮件账户将收到一封电子邮件,请求您批准 Amazon Pinpoint 使用该账户作为系统发送的电子邮件的发件人地址。控制台输入字段中将显示 Pending Verification (等待验证) 状态,直至 Amazon Pinpoint 处理您的审批。

e. 选择 Email domain (电子邮件域),键入您的消息应来自的域,然后选择输入字段末尾的 verify (验证)。

将显示一个对话框,其中提供您必须添加到域设置的 TXT 记录的名称和值。输入字段中将显示Pending Verification 状态,直至控制台处理您的审批。

将默认用户名添加到 Default from address (默认发件人地址)。f. 选择 Save。g. 有关从 Amazon Pinpoint 发送邮件的信息,请参阅发送电子邮件。

a. 对于 SMS:选择 Messaging and Analytics (消息收发与分析) 磁贴以启用此功能。i. 选择 SMS,然后选择 Enable (启用)。ii. 选择左侧描述性文本底部的 Amazon Pinpoint console (Amazon Pinpoint 控制台) 链接。iii. 在 Amazon Pinpoint 控制台的 Channels (通道) 选项卡中选择 SMS。iv. 调整 Default message type (默认消息类型)、Account spend limit (账户支出限额) 和 Default sender

ID (默认发件人 ID) 的选项。有关这些选项的更多信息,请参阅更新 SMS 设置。v. 有关从 Amazon Pinpoint 发送 SMS 消息的信息,请参阅发送 SMS 消息。

连接到您的后端

从 Amazon Pinpoint 接收电子邮件或 SMS 消息无需 AWS Mobile 开发工具包。

利用 Amazon Lex 将对话机器人添加到您的移动应用程序

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

82

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

概述

将支持 Amazon Alexa 的自然语言理解添加到您的移动应用程序。AWS Mobile Hub 对话机器人 (p. 196)功能通过使用 Amazon Lex 服务提供现成的机器人模板。

设置您的后端

1. 在继续操作之前,请完成入门 (p. 3)步骤。2. 启用 Conversational Bots (对话机器人):打开您在 Mobile Hub 中的项目,然后选择 Conversational Bots

(对话机器人) 磁贴启用此功能。a. 选择一个示例机器人或导入您在 Amazon Lex 控制台中创建的一个机器人。

3. 操作完成后,将弹出“Your Backend has been updated”(您的后端已更新) 的警报,提示您下载最新的云配置文件的副本。如果您已配置好功能,请选择横幅以返回到项目详细信息页面。

4. 在项目详细信息页面,每一个需要使用最新的云配置文件更新的应用程序都会有一个闪烁的 Integrate (集成) 按钮。选择此按钮以进入集成向导。

5. 使用最新的云配置文件副本更新您的应用程序。现在您的应用程序参考您的后端的最新版本。选择“Next”(下一步),并按照以下 Cloud API 文档连接到您的后端。

连接到您的后端

将 AWS Mobile 对话机器人添加到您的应用程序

Android - Java

设置后端 (p. 3)步骤。

1. 为您的 AndroidManifest.xml 添加以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2. 将以下内容添加到您的 app/build.gradle:

dependencies{ implementation ('com.amazonaws:aws-android-sdk-lex:2.7.+@aar') {transitive = true;}}

3. 对于您调用 Amazon Lex 的每个活动,请导入以下 API。

import com.amazonaws.mobileconnectors.lex.interactionkit.Response;import com.amazonaws.mobileconnectors.lex.interactionkit.config.InteractionConfig;

83

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import com.amazonaws.mobileconnectors.lex.interactionkit.ui.InteractiveVoiceView;

1. 向活动或片段布局添加语音按钮a. 将 voice_component 添加到您的布局文件。

<com.amazonaws.mobileconnectors.lex.interactionkit.ui.InteractiveVoiceViewandroid:id="@+id/voiceInterface"layout="@layout/voice_component"android:layout_width="200dp"android:layout_height="200dp"/>

b. 在 strings.xml 文件中,为您的机器人添加区域。注意:当前仅在美国弗吉尼亚东部 (us-east-1)区域中支持机器人。

<string name="aws_region">us-east-1</string>

c. 初始化语音按钮

将以下 init() 函数添加到将使用机器人的活动的 onCreate() 中。

在调用 AWSMobileClient 之前初始化 init(),因为函数中的 InteractiveVoiceView 使用AWSMobileClient 创建的凭证提供商对象连接到 Amazon Lex。

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;import com.amazonaws.mobileconnectors.lex.interactionkit.Response;import com.amazonaws.mobileconnectors.lex.interactionkit.config.InteractionConfig;import com.amazonaws.mobileconnectors.lex.interactionkit.ui.InteractiveVoiceView;

public class MainActivity extends AppCompatActivity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(AWSStartupResult awsStartupResult) { Log.d("YourMainActivity", "AWSMobileClient is instantiated and you are connected to AWS!"); } }).execute();

init();

}

public void init(){ InteractiveVoiceView voiceView = (InteractiveVoiceView) findViewById(R.id.voiceInterface);

voiceView.setInteractiveVoiceListener( new InteractiveVoiceView.InteractiveVoiceListener() {

@Override public void dialogReadyForFulfillment(Map slots, String intent) { Log.d(LOG_TAG, String.format( Locale.US,

84

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

"Dialog ready for fulfillment:\n\tIntent: %s\n\tSlots: %s", intent, slots.toString())); }

@Override public void onResponse(Response response) { Log.d(LOG_TAG, "Bot response: " + response.getTextResponse()); }

@Override public void onError(String responseText, Exception e) { Log.e(LOG_TAG, "Error: " + responseText, e); } });

voiceView.getViewAdapter().setCredentialProvider(AWSMobileClient.getInstance().getCredentialsProvider());

//replace parameters with your botname, bot-alias voiceView.getViewAdapter() .setInteractionConfig( new InteractionConfig("YOUR-BOT-NAME","$LATEST"));

voiceView.getViewAdapter() .setAwsRegion(getApplicationContext() .getString(R.string.aws_region)); }}

Android - Kotlin

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 为您的 AndroidManifest.xml 添加以下权限:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

b. 将以下内容添加到您的 app/build.gradle:

dependencies{ implementation ('com.amazonaws:aws-android-sdk-lex:2.7.+@aar') {transitive = true;} }

c. 对于您调用 Amazon Lex 的每个活动,请导入以下 API。

import com.amazonaws.mobileconnectors.lex.interactionkit.Response; import com.amazonaws.mobileconnectors.lex.interactionkit.config.InteractionConfig; import com.amazonaws.mobileconnectors.lex.interactionkit.ui.InteractiveVoiceView;

2. 向活动或片段布局添加语音按钮a. 将 voice_component 添加到您的布局文件。

<com.amazonaws.mobileconnectors.lex.interactionkit.ui.InteractiveVoiceView android:id="@+id/voiceInterface" layout="@layout/voice_component" android:layout_width="200dp"

85

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

android:layout_height="200dp"/>

b. 在 strings.xml 文件中,为您的机器人添加区域。注意:当前仅在美国弗吉尼亚东部 (us-east-1)区域中支持机器人。

<string name="aws_region">us-east-1</string>

c. 初始化语音按钮

在将使用您的机器人的活动的 onCreate() 中,调用 init()。

fun init() { voiceInterface.interactiveVoiceListener = object : InteractiveVoiceView.InteractiveVoiceListener() { override fun dialogReadyFOrFulfillment(slots: Map, intent: String) { Log.d(TAG, "Dialog ready for fulfillment:\n\tIntent: $intent") }

override fun onResponse(response: Response) { Log.d(TAG, "Bot response: ${response.textResponse}") }

override fun onError(responseText: String, e: Exception) { Log.e(TAG, "Error: ${e.message}") } }

with (voiceInterface.viewAdapter) { credentialsProvider = AWSMobileClient.getInstance().credentialsProvider interactionConfig = InteractionConfig("YOUR-BOT-NAME","$LATEST") awsRegion = applicationContext.getString(R.string.aws_region) } }

iOS - Swift

1. 使用以下步骤设置 AWS Mobile 开发工具包组件。a. 您为安装 AWS Mobile 开发工具包而配置的 Podfile 必须包含:

platform :ios, '9.0'

target :'YOUR-APP-NAME`' do use_frameworks!

pod 'AWSLex', '~> 2.6.13' # other pods

end

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

b. 调用 Amazon Lex API 的类必须使用以下导入语句:

import AWSCoreimport AWSLex

86

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

2. 向您的 info.plist 添加权限以允许应用程序使用设备的麦克风。

<plist version = "1.0"></plist> <dict> <!-- . . . --> <key>NSMicrophoneUsageDescription</key> <string>For demonstration of conversational bots</string> <!-- . . . --> </dict>

3. 将您的后端服务配置添加到应用程序。

从之前的步骤中下载 Mobile Hub 配置文件的位置,将 awsconfiguration.json 拖入包含您的Xcode 项目中的 info.plist 文件的文件夹。

如果提供了 Copy items if needed (根据需要复制项目) 和 Create groups (创建组) 选项,请将其选中。

4. 添加语音按钮 UI 元素,该元素让您的用户可以与 Amazon Lex 交谈来调用活动。a. 在故事情节或 UIView 文件中创建 xib。b. 将 UIView 映射至 AWS Mobile 开发工具包的 AWSLexVoiceButton 类。c. 将 UIView 链接到您的 ViewController。

5. 注册语音按钮.

以下代码显示如何使用视图控制器的 viewDidLoad 方法启用语音按钮以响应 Amazon Lex 成功和错误消息。该代码使类符合 AWSLexVoiceButtonDelegate。它通过将语音按钮绑定到您在 MobileHub 项目中配置的机器人来将其初始化,然后将该按钮注册为您的 Amazon Lex 语音交互客户端的AWSLexVoiceButtonKey。

import UIKitimport AWSLeximport AWSAuthCore

class VoiceChatViewController: UIViewController, AWSLexVoiceButtonDelegate { override func viewDidLoad() {

// Set the bot configuration details // You can use the configuration constants defined in AWSConfiguration.swift file

87

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

let botName = "YOUR-BOT-NAME" let botRegion: AWSRegionType = "YOUR-BOT-REGION" let botAlias = "$LATEST"

// set up the configuration for AWS Voice Button let configuration = AWSServiceConfiguration(region: botRegion, credentialsProvider: AWSMobileClient.sharedInstance().getCredentialsProvider()) let botConfig = AWSLexInteractionKitConfig.defaultInteractionKitConfig(withBotName: YOUR-BOT-NAME, botAlias: :YOUR-BOT-ALIAS)

// register the interaction kit client for the voice button using the AWSLexVoiceButtonKey constant defined in SDK AWSLexInteractionKit.register(with: configuration!, interactionKitConfiguration: botConfig, forKey: AWSLexVoiceButtonKey) super.viewDidLoad() (self.voiceButton as AWSLexVoiceButton).delegate = self }}

6. 通过在视图控制器中为语音按钮添加以下委托方法,处理 Amazon Lex 成功和错误消息。

func voiceButton(_ button: AWSLexVoiceButton, on response: AWSLexVoiceButtonResponse) { // handle response from the voice button here print("on text output \(response.outputText)")}

func voiceButton(_ button: AWSLexVoiceButton, onError error: Error) { // handle error response from the voice button here print("error \(error)")}

AWS Mobile Android 和 iOS 操作方法

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

本部分提供了有关实现特定任务 (将 AWS Mobile 功能集成到 Android 和 iOS 应用程序) 步骤的信息。

主题• 操作方法:在 Amazon Cognito 上使用用户登录 (p. 88)• 操作方法:NoSQL 数据库与 Amazon DynamoDB (p. 92)• 操作方法:无服务器代码与 AWS Lambda (p. 120)• 如何使用 Amazon Machine Learning 添加 Machine Learning (p. 131)

操作方法:在 Amazon Cognito 上使用用户登录

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

本节提供了将用户登录功能集成到 Android 和 iOS 应用程序中的过程。

88

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

主题• 自定义开发工具包登录 UI (p. 89)

自定义开发工具包登录 UI

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

默认情况下,开发工具包为每一个在您 Mobile Hub 项目中启用的登录提供商 (电子邮件和密码、Facebook、Google) 显示登录用户界面 (默认的外观和感觉)。它可以通过读取与您的应用程序集成的awsconfiguration.json 文件来了解您选择了哪个提供商。

要覆盖默认值,并修改登录用户界面的行为、外观和感觉,请创建一个 AuthUIConfiguration 对象并设置适当的属性。

Android - Java

创建并配置 AuthUIConfiguration 对象并设置其属性。

• 要显示电子邮件和密码用户 SignInUI,请将 userPools 设置为 true。• 要显示 Facebook 或 Google 用户 SignInUI,请添加 signInButton(FacebookButton.class)

或 signInButton(GoogleButton.class)。• 要更改徽标,请使用 logoResId。• 要更改背景颜色,请使用 backgroundColor。• 要取消登录流程,请设置 .canCancel(true)。• 要更改登录视图中的字体,请使用 fontFamily 方法并传入代表字体系列的字符串。• 要绘制 backgroundColor 全屏,请使用 fullScreenBackgroundColor。

import android.app.Activity;import android.graphics.Color;import android.os.Bundle;

import com.amazonaws.mobile.auth.facebook.FacebookButton;import com.amazonaws.mobile.auth.google.GoogleButton;import com.amazonaws.mobile.auth.ui.AuthUIConfiguration;import com.amazonaws.mobile.auth.ui.SignInUI;

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

public class YourMainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() { @Override public void onComplete(final AWSStartupResult awsStartupResult) { AuthUIConfiguration config = new AuthUIConfiguration.Builder() .userPools(true) // true? show the Email and Password UI .signInButton(FacebookButton.class) // Show Facebook button

89

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

.signInButton(GoogleButton.class) // Show Google button .logoResId(R.drawable.mylogo) // Change the logo .backgroundColor(Color.BLUE) // Change the backgroundColor .isBackgroundColorFullScreen(true) // Full screen backgroundColor the backgroundColor full screenff .fontFamily("sans-serif-light") // Apply sans-serif-light as the global font .canCancel(true) .build(); SignInUI signinUI = (SignInUI) AWSMobileClient.getInstance().getClient(YourMainActivity.this, SignInUI.class); signinUI.login(YourMainActivity.this, YourNextActivity.class).authUIConfiguration(config).execute(); } }).execute(); }}

Android - Kotlin

创建并配置 AuthUIConfiguration 对象并设置其属性。

• 要显示电子邮件和密码用户 SignInUI,请将 userPools 设置为 true。• 要显示 Facebook 或 Google 用户 SignInUI,请添加 signInButton(FacebookButton.class)

或 signInButton(GoogleButton.class)。• 要更改徽标,请使用 logoResId。• 要更改背景颜色,请使用 backgroundColor。• 要取消登录流程,请设置 .canCancel(true)。• 要更改登录视图中的字体,请使用 fontFamily 方法并传入代表字体系列的字符串。• 要绘制 backgroundColor 全屏,请使用 fullScreenBackgroundColor。

import android.app.Activity;import android.graphics.Color;import android.os.Bundle;

import com.amazonaws.mobile.auth.facebook.FacebookButton;import com.amazonaws.mobile.auth.google.GoogleButton;import com.amazonaws.mobile.auth.ui.AuthUIConfiguration;import com.amazonaws.mobile.auth.ui.SignInUI;

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState : Bundle?) { super.onCreate() AWSMobileClient.getInstance().initialize(this) { val config = AuthUIConfiguration.Builder() .userPools(true) // show the Email and Password UI .signInButton(FacebookButton.class) // Show Facebook .signInButton(GoogleButton.class) // Show Google .logoResId(R.drawable.mylogo) // Change the logo .backgroundColor(Color.BLUE) // Change the background color .isBackgroundColorFullScreen(true) // Full screen background color .fontFamily("sans-serif-light") // font .canCancel(true) // Add a cancel/back button .build() val signInUI = AWSMobileClient.getInstance().getClient(this@MainActivity, SignInUI::class.java) as SignInUI

90

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

signInUI.login(this@MainActivity, NextActivity::class.java).authUIConfiguration(config).execute() }.execute() }}

iOS - Swift

创建并配置 AWSAuthUIConfiguration 对象并设置其属性。

创建并配置 AuthUIConfiguration 对象。

• 要显示电子邮件和密码用户 SignInUI,请将 enableUserPoolsUI 设置为 true。• 要显示 Facebook 或 Google 用户 SignInUI,请添加 .addSignInButtonView(class:AWSFacebookSignInButton.self) 或 .addSignInButtonView(class:AWSFacebookSignInButton.self)。

• 要更改徽标,请使用 logoImage。• 要更改背景颜色,请使用 backgroundColor。• 要取消登录流程,请使用 canCancel。• 要更改登录视图中的字体,请使用 font 属性并传入代表字体系列的 UIFont 对象。• 要绘制 backgroundColor 全屏,请使用 fullScreenBackgroundColor。

import UIKitimport AWSAuthUIimport AWSMobileClientimport AWSUserPoolsSignInimport AWSFacebookSignInimport AWSGoogleSignIn

class SampleViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() if !AWSSignInManager.sharedInstance().isLoggedIn { presentAuthUIViewController() } }

func presentAuthUIViewController() { let config = AWSAuthUIConfiguration() config.enableUserPoolsUI = true config.addSignInButtonView(class: AWSFacebookSignInButton.self) config.addSignInButtonView(class: AWSGoogleSignInButton.self) config.backgroundColor = UIColor.blue config.font = UIFont (name: "Helvetica Neue", size: 20) config.isBackgroundColorFullScreen = true config.canCancel = true

AWSAuthUIViewController.presentViewController( with: self.navigationController!, configuration: config, completionHandler: { (provider: AWSSignInProvider, error: Error?) in if error == nil { // SignIn succeeded. } else { // end user faced error while loggin in, take any required action here. } }) }}

91

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

操作方法:NoSQL 数据库与 Amazon DynamoDB

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

本节提供了将 Amazon DynamoDB 集成到 Android 和 iOS 应用程序中的过程。

主题• 集成您的现有 NoSQL 表 (p. 92)• iOS:Amazon DynamoDB Object Mapper API (p. 108)• iOS:Amazon DynamoDB 低级别客户端 (p. 116)

集成您的现有 NoSQL 表

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

以下步骤和示例基于一个简单书店应用程序。该应用程序使用 Amazon DynamoDB 表跟踪书店中在售的图书。

设置您的后端

要手动配置一个集成到您的移动应用程序的 Amazon DynamoDB 表,请使用以下步骤。

主题• 创建新的表和索引 (p. 92)• 设置身份池 (p. 93)• 设置权限 (p. 93)• 应用权限 (p. 93)

创建新的表和索引

• 如果您已具有一个 Amazon DynamoDB 表并知道其区域,您可以跳到设置身份池 (p. 93)。

要创建图书表,请执行以下操作:

1. 登录 Amazon DynamoDB 控制台。2. 选择 Create Table (创建表)。3. 键入Books 作为表名。4. 在 Primary key (主键) 的 Partition key (分区键) 字段中输入 ISBN,选择 String (字符串) 作为类型。5. 选中 Add sort key (添加排序键) 框,然后在提供的字段中键入 Category 并选择 String (字符串) 以作为

类型。6. 清除 Use default settings (使用默认设置) 复选框,然后选择 + Add Index (+ 添加索引)。7. 在 Add Index (添加索引) 对话框中键入 Author,选择 String (字符串) 作为类型。8. 选中 Add sort key (添加排序键) 复选框,并输入 Title 作为排序键值,选择 String (字符串) 作为类型。9. 将其他值保留为默认值。选择 Add index (添加索引) 以添加 Author-Title-index 索引。

92

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

10.将读取的 Minimum provisioned capacity (最小预配置容量) 设置为 10,并将写入的最小预配置容量设置为5。

11.选择 Create (创建),Amazon DynamoDB 将创建您的数据库。12.刷新控制台并从表的列表中选择您的图书表。13.打开 Overview (概述) 选项卡,复制或记下 Amazon 资源名称 (ARN)。在下一个步骤中,您需要用到此名

称。

设置身份池

要为您的用户授予权限以访问您的表,您需要使用 Amazon Cognito 中的身份池。该池具有两个默认 IAM 角色,一个角色用于访客 (未经身份验证),另一个角色用于登录的用户 (经过身份验证)。您设计并附加到 IAM角色的策略决定了每种类型的用户可以或无法执行的操作。

为您的应用程序导入现有池。

设置权限

将以下 IAM 策略附加到您的身份池的未经身份验证的角色。它允许用户对使用您的 Amazon DynamoDB 表的 ARN 标识的两个资源(表和索引)执行操作。

{ "Statement": [{ "Effect": "Allow", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Scan", "dynamodb:Query", "dynamodb:UpdateItem", "dynamodb:BatchWriteItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:123456789012:table/Books", "arn:aws:dynamodb:us-west-2:123456789012:table/Books/index/*" ] }]}

应用权限

将此策略应用到分配给您的 Amazon Cognito 身份池的未经身份验证的角色,将 Resource (资源) 值替换为Amazon DynamoDB 表的正确 ARN:

1. 登录 IAM 控制台。2. 选择 Roles (角色),然后选择 Amazon Cognito 为您创建的“Unauth”角色。3. 选择 Attach Role Policy (附加角色策略)。4. 选择 Custom Policy (自定义策略),然后选择 Select (选择)。5. 为您的策略键入名称并粘贴到上面所示的策略文档中,将 Resource (资源) 值替换为您的表和索引的

ARN。(您可以从数据库的 Details (详细信息) 选项卡中检索表 ARN;然后附加 /index/* 以获取索引ARN 的值。)

6. 选择 Apply Policy。

连接到您的后端

主题

93

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

• 创建您的 AWS 配置文件 (p. 94)• 添加 AWS Config 文件 (p. 95)• 将开发工具包添加到您的应用程序 (p. 96)• 将数据模型添加到应用程序 (p. 99)

创建您的 AWS 配置文件

您的应用程序使用 awsconfiguration.json 文件连接到您的 AWS 资源,该文件包含您使用的服务的终端节点。

1. 使用以下内容创建名为 awsconfiguration.json 的文件:

{ "Version": "1.0", "CredentialsProvider": { "CognitoIdentity": { "Default": { "PoolId": "COGNITO-IDENTITY-POOL-ID", "Region": "COGNITO-IDENTITY-POOL-REGION" } } }, "IdentityManager": { "Default": {} }, "DynamoDBObjectMapper": { "Default": { "Region": "DYNAMODB-REGION" } }}

2. 对配置文件进行以下修改。• 将 DYNAMODB-REGION 替换为在其中创建表的区域。

需要查找您的表的区域? 转到 Amazon DynamoDB 控制台。然后选择Overview (概述) 选项卡。Amazon 资源名称(ARN) 项显示该表的 ID,其中包含其区域。

例如,如果您的池 ID 为arn:aws:dynamodb:us-east-1:012345678901:table/nosqltest-mobilehub-012345678-Books,则您的表的区域值应为 us-east-1。

所需的配置文件值采用以下格式:"Region":"REGION-OF-YOU-DYNAMODB-ARN"。对于这个示例:

"Region": "us-east-1"

• 使用身份池 ID 替换 COGNITO-IDENTITY-POOL-ID。• 使用创建身份池的区域替换 COGNITO-IDENTITY-POOL-REGION。

需要查找您的池的 ID 和区域? 转到 Amazon Cognito 控制台,然后依次选择Manage Federated Identities (管理联合身份)、

94

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

您的池和 Edit identity pool (编辑身份池)。复制Identity pool ID (身份池 ID) 值。

将该区域值插入到以下表单以创建该集成所需的值。

"Region": "REGION-PREFIX-OF-YOUR-POOL-ID".

例如,如果您的池 ID 为 us-east-1:01234567-yyyy-0123-xxxx-012345678901,则您的集成区域值应为:

"Region": "us-east-1"

添加 AWS Config 文件

要在您的应用程序和您的后端服务之间建立连接,请添加配置文件。

Android - Java

在 Android Studio 项目导航器中,右键单击您的应用程序的 res 文件夹,然后选择 New (新建) >Directory (目录)。键入 raw 以作为目录名称,然后选择 OK (确定)。

将您创建的 awsconfiguration.json 拖到 res/raw 文件夹中。Android 为放置在该文件夹中的任意文件提供一个资源 ID,从而在应用程序中轻松引用该文件。

Android - Kotlin

在 Android Studio 项目导航器中,右键单击您的应用程序的 res 文件夹,然后选择 New (新建) >Directory (目录)。键入 raw 以作为目录名称,然后选择 OK (确定)。

95

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

将您创建的 awsconfiguration.json 拖到 res/raw 文件夹中。Android 为放置在该文件夹中的任意文件提供一个资源 ID,从而在应用程序中轻松引用该文件。

iOS - Swift

将 awsconfiguration.json 拖到您的 Xcode 项目中包含 Info.plist 文件的文件夹中。在选项对话框中选择 Copy items (复制项目) 和 Create groups (创建组)。

将开发工具包添加到您的应用程序

使用以下步骤将 AWS Mobile NoSQL 数据库添加到您的应用程序中。

Android - Java

1. 按照以下设置您的后端 (p. 3)步骤设置 AWS 移动软件开发工具包组件。a. app/build.gradle 必须包含:

dependencies{

// Amazon Cognito dependencies for user access to AWS resources implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// AmazonDynamoDB dependencies for NoSQL Database implementation 'com.amazonaws:aws-android-sdk-ddb-mapper:2.7.+'

// other dependencies . . .}

b. 将以下权限添加到 AndroidManifest.xml 中。

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2. 在您的调用的回调中创建一个 AWSDynamoDBMapper 客户端以实例化 AWSMobileClient。这可确保连接到 Amazon DynamoDB 所需的 AWS 凭证可用,并且通常位于您的启动活动的 onCreate 函数中。

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

96

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;

public class MainActivity extends AppCompatActivity {

// Declare a DynamoDBMapper object DynamoDBMapper dynamoDBMapper;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

// AWSMobileClient enables AWS user credentials to access your table AWSMobileClient.getInstance().initialize(this, new AWSStartupHandler() {

@Override public void onComplete(AWSStartupResult awsStartupResult) {

// Add code to instantiate a AmazonDynamoDBClient AmazonDynamoDBClient dynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.getInstance().getCredentialsProvider()); this.dynamoDBMapper = DynamoDBMapper.builder() .dynamoDBClient(dynamoDBClient) .awsConfiguration( AWSMobileClient.getInstance().getConfiguration()) .build();

} }).execute();

// Other functions in onCreate . . . }}

重要提示 使用对 DynamoDB 的异步调用

由于对 DynamoDB 的调用是异步的,因此它们不会出现在您的 UI 线程上。请使用 Runnable包装程序等异步方法在单独的线程中调用DynamoDBObjectMapper。

Runnable runnable = new Runnable() { public void run() { //DynamoDB calls go here }};Thread mythread = new Thread(runnable);mythread.start();

Android - Kotlin

1. 按照以下设置您的后端 (p. 3)步骤设置 AWS 移动软件开发工具包组件。a. app/build.gradle 必须包含:

dependencies{

// Amazon Cognito dependencies for user access to AWS resources

97

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

implementation ('com.amazonaws:aws-android-sdk-mobile-client:2.7.+@aar') { transitive = true }

// AmazonDynamoDB dependencies for NoSQL Database implementation 'com.amazonaws:aws-android-sdk-ddb-mapper:2.7.+'

// other dependencies . . .}

b. 将以下权限添加到 AndroidManifest.xml 中。

<uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

2. 在您的调用的回调中创建一个 AWSDynamoDBMapper 客户端以实例化 AWSMobileClient。这可确保连接到 Amazon DynamoDB 所需的 AWS 凭证可用,并且通常位于您的启动活动的 onCreate 函数中。

import com.amazonaws.mobile.client.AWSMobileClient;import com.amazonaws.mobile.client.AWSStartupHandler;import com.amazonaws.mobile.client.AWSStartupResult;

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper;import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;

class MainActivity : AppCompatActivity() { var ddbMapper: DynamoDBMapper? = null

override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

AWSMobileClient.getInstance().initialize(this, object : AWSStartupHandler() { override fun onComplete(awsStartupResult: AWSStartupResult) { val ddbClient = AmazonDynamoDBClient(AWSMobileClient.getInstance().credentialsProvider) ddbMapper = DynamoDBMapper.builder() .dynamoDBClient(ddbClient) .awsConfiguration(AWSMobileClient.getInstance().configuration) .build() } }).execute()

// other setup within onCreate() ... }}

重要提示 使用对 DynamoDB 的异步调用

由于对 DynamoDB 的调用是异步的,因此它们不会出现在您的 UI 线程上。请使用 thread包装程序等异步方法在单独的线程中调用DynamoDBObjectMapper。

thread(start = true ) { // DynamoDB calls go here}

98

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Swift

1. 按照以下设置您的后端 (p. 3)步骤设置 AWS 移动软件开发工具包组件。a. 将 AWSDynamoDB pod 添加到您的 Podfile 以安装 AWS Mobile 开发工具包。

platform :ios, '9.0'

target :'YOUR-APP-NAME' do use_frameworks!

# Enable AWS user credentials pod 'AWSMobileClient', '~> 2.6.13'

# Connect to NoSQL database tables pod 'AWSDynamoDB', '~> 2.6.13'

# other pods . . .end

在继续操作之前运行 pod install --repo-update。

如果您遇到以“[!] Failed to connect to GitHub to update the CocoaPods/Specs . . .”开头的错误消息,并且您的 Internet 连接正常工作,您可能需要更新 openssl 和Ruby。

b. 调用 DynamoDB API 的类必须使用以下导入语句:

import AWSCoreimport AWSDynamoDB

将数据模型添加到应用程序

要将您的应用程序连接到您的表,请使用以下格式创建一个数据模型对象。在该示例中,模型基于您在上一步中创建的 Books 表。分区键 (哈希键) 名称为 ISBN,排序键 (范围键) 名称为 Category。

Android - Java

在 Android Studio 项目资源管理器中,右键单击包含您的主活动的文件夹,然后选择 New (新建) > JavaClass (Java 类)。键入用于引用您的数据模型的 Name (名称)。在该示例中,名称应为 BooksDO。请使用以下格式添加代码。

package com.amazonaws.models.nosql;

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable;

import java.util.List;import java.util.Map;import java.util.Set;

@DynamoDBTable(tableName = "Books")

public class BooksDO { private String _isbn; private String _category; private String _title; private String _author;

99

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

@DynamoDBHashKey(attributeName = "ISBN") @DynamoDBAttribute(attributeName = "ISBN") public String getIsbn() { return _isbn; }

public void setIsbn(final String _isbn) { this._isbn = _isbn; }

@DynamoDBRangeKey (attributeName = "Category") @DynamoDBAttribute(attributeName = "Category") public String getCategory() { return _category; }

public void setCategory(final String _category) { this._category= _category; }

@DynamoDBIndexHashKey(attributeName = "Author", globalSecondaryIndexName = "Author") public String getAuthor() { return _author; }

public void setAuthor(final String _author) { this._author = _author; }

@DynamoDBIndexRangeKey(attributeName = "Title", globalSecondaryIndexName = "Title") public String getTitle() { return _title; }

public void setTitle(final String _title) { this._title = _title; }

}

Android - Kotlin

在 Android Studio 项目资源管理器中,右键单击包含您的主活动的文件夹,然后选择 New (新建) > JavaClass (Java 类)。键入用于引用您的数据模型的 Name (名称)。在该示例中,名称应为 BooksDO。请使用以下格式添加代码。您还可以在 Kotlin 项目中使用 Java 形式的数据模型。

package com.amazonaws.models.nosql;

import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBAttribute;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexHashKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBIndexRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBRangeKey;import com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBTable;

import java.util.List;import java.util.Map;import java.util.Set;

@DynamoDBTable(tableName = "Books")class BooksDO { @DynamoDBHashKey(attributeName = "ISBN")

100

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

@DynamoDBAttribute(attributeName = "ISBN") var isbn: String? = null

@DynamoDBRangeKey (attributeName = "Category") @DynamoDBAttribute(attributeName = "Category") var category: String? = null

@DynamoDBIndexHashKey(attributeName = "Author", globalSecondaryIndexName = "Author") var author: String? = null

@DynamoDBIndexRangeKey(attributeName = "Title", globalSecondaryIndexName = "Title") var title: String? = null}

iOS - Swift

在 Xcode 项目资源管理器中,右键单击包含您的应用程序委托的文件夹,然后选择 New File (新建文件)> Swift File (Swift 文件) > Next (下一步)。键入用于引用您的数据模型的名称以作为文件名。在该示例中,名称应为 Books。请使用以下格式添加代码。

import Foundation import UIKit import AWSDynamoDB

class Books: AWSDynamoDBObjectModel, AWSDynamoDBModeling {

@objc var _isbn: String? @objc var _category: String? @objc var _author: String? @objc var _title: String?

class func dynamoDBTableName() -> String { return "Books" }

class func hashKeyAttribute() -> String { return "_isbn" }

class func rangeKeyAttribute() -> String { return "_category" }

override class func jsonKeyPathsByPropertyKey() -> [AnyHashable: Any] { return [ "_isbn" : "ISBN", "_category" : "Category", "_author" : "Author", "_title" : "Title", ] }}

执行 CRUD 操作

下面的片段使用在上一步中创建的 BooksDO 数据模型类。

主题• 创建 (保存) 项 (p. 102)• 读取 (加载) 项 (p. 103)

101

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

• 更新项目 (p. 104)• 删除项目 (p. 105)

创建 (保存) 项

使用以下代码可在您的 NoSQL 数据库表中创建项。

Android - Java

public void createBooks() { final com.amazonaws.models.nosql.BooksDO booksItem = new com.amazonaws.models.nosql.BooksDO();

booksItem.setIsbn("ISBN1"); booksItem.setAuthor("Frederick Douglas"); booksItem.setTitle("Escape from Slavery"); booksItem.setCategory("History");

new Thread(new Runnable() { @Override public void run() { dynamoDBMapper.save(booksItem); // Item saved } }).start();}

Android - Kotlin

fun createBooks() { val booksItem = BooksDO().apply { isbn = "ISBN1" author = "Frederick Douglas" title = "Escape from Slavery" category = "History" }

thread(start = true) { ddbMapper.save(booksItem) }}

iOS - Swift

func createBooks() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

let booksItem: Books = Books()

booksItem._isbn = "1234" booksItem._category = "History" booksItem._author = "Harriet Tubman" booksItem._title = "My Life"

//Save a new item dynamoDbObjectMapper.save(booksItem, completionHandler: { (error: Error?) -> Void in

if let error = error { print("Amazon DynamoDB Save Error: \(error)") return

102

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

} print("An item was saved.") })}

读取 (加载) 项

使用以下代码可在您的 NoSQL 数据库表中读取建项。

Android - Java

public void readBooks() { new Thread(new Runnable() { @Override public void run() {

com.amazonaws.models.nosql.BooksDO booksItem = dynamoDBMapper.load( com.amazonaws.models.nosql.BooksDO.class, "ISBN1", // Partition key (hash key) "History"); // Sort key (range key)

// Item read Log.d(LOG_TAG, String.format("Books Item: %s", booksItem.toString())); } }).start();}

Android - Kotlin

fun readBooks() { thread(start = true) { val booksItem = ddbMapper.load(BooksDO::class.java, "ISBN1", // Partition Key (hash key) "History") // Sort key (range key)

Log.d(LOG_TAG, "Books Item: $booksItem") }}

iOS - Swift

func readBooks() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

// Create data object using data model you created let booksItem: Books = Books();

dynamoDbObjectMapper.load( Books.self, hashKey: "1234", rangeKey: "Harriet Tubman", completionHandler: { (objectModel: AWSDynamoDBObjectModel?, error: Error?) -> Void in if let error = error { print("Amazon DynamoDB Read Error: \(error)") return } print("An item was read.") })}

103

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

更新项目

使用以下代码可在您的 NoSQL 数据库表中更新项。

Android - Java

public void updateBooks() { final com.amazonaws.models.nosql.BooksDO booksItem = new com.amazonaws.models.nosql.BooksDO();

booksItem.setIsbn("ISBN1"); booksItem.setCategory("History"); booksItem.setAuthor("Frederick M. Douglas"); // booksItem.setTitle("Escape from Slavery");

new Thread(new Runnable() { @Override public void run() {

// Using .save(bookItem) with no Title value makes that attribute value equal null // The .Savebehavior shown here leaves the existing value as is dynamoDBMapper.save(booksItem, new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES));

// Item updated } }).start();}

Android - Kotlin

fun updateBooks() { val booksItem = BooksDO().apply { isbn = "ISBN1" category = "History" author = "Frederick M. Douglas" // Do not set title - it will be removed from the item in DynamoDB }

thread(start = true) { ddbMapper.save(booksItem, DynamoDBMapperConfig(DynamoDBMappConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTERIBUTES)) }}

iOS - Swift

func updateBooks() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

let booksItem: Books = Books()

booksItem._isbn = "1234" booksItem._category = "History" booksItem._author = "Harriet Tubman" booksItem._title = "The Underground Railroad"

dynamoDbObjectMapper.save(booksItem, completionHandler: {(error: Error?) -> Void in if let error = error {

104

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

print(" Amazon DynamoDB Save Error: \(error)") return } print("An item was updated.") })}

删除项目

使用以下代码可在您的 NoSQL 数据库表中删除项。

Android - Java

public void deleteBooks() { new Thread(new Runnable() { @Override public void run() {

com.amazonaws.models.nosql.BooksDO booksItem = new com.amazonaws.models.nosql.BooksDO(); booksItem.setIsbn("ISBN1"); //partition key booksItem.setCategory("History"); //range key

dynamoDBMapper.delete(booksItem);

// Item deleted } }).start();}

Android - Kotlin

fun deleteBook() { thread(start = true) { val booksItem = BooksDO().apply { isbn = "ISBN1" // Partition key category = "History" // Range key } ddbMapper.delete(booksItem) }}

iOS - Swift

func deleteBooks() { let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

let itemToDelete = Books() itemToDelete?._isbn = "1234" itemToDelete?._category = "History"

dynamoDbObjectMapper.remove(itemToDelete!, completionHandler: {(error: Error?) -> Void in if let error = error { print(" Amazon DynamoDB Save Error: \(error)") return } print("An item was deleted.") })}

105

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

执行查询

查询操作使您能够在表中查找项。您必须同时使用表的哈希键 (分区键) 和范围键 (排序键) 属性来定义查询。您可以通过指定要查找的属性来筛选结果。有关 DynamoDBQueryExpression 的更多信息,请参阅适用于Android 的 AWS Mobile 开发工具包 API 参考。

以下示例代码说明了使用分区键 (哈希键) ISBN 和以 History 开头的排序键 (范围键) Category 查询书籍的过程。

Android - Java

public void queryBook() {

new Thread(new Runnable() { @Override public int hashCode() { return super.hashCode(); }

@Override public void run() { com.amazonaws.models.nosql.BooksDO book = new com.amazonaws.models.nosql.BooksDO(); book.setIsbn("ISBN1"); //partition key book.setCategory("History"); //range key

Condition rangeKeyCondition = new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList(new AttributeValue().withS("History")); DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression() .withHashKeyValues(book) .withRangeKeyCondition("Category", rangeKeyCondition) .withConsistentRead(false);

PaginatedList<BooksDO> result = dynamoDBMapper.query(com.amazonaws.models.nosql.BooksDO.class, queryExpression);

Gson gson = new Gson(); StringBuilder stringBuilder = new StringBuilder();

// Loop through query results for (int i = 0; i < result.size(); i++) { String jsonFormOfItem = gson.toJson(result.get(i)); stringBuilder.append(jsonFormOfItem + "\n\n"); }

// Add your code here to deal with the data result Log.d("Query results: ", stringBuilder.toString());

if (result.isEmpty()) { // There were no items matching your query. } } }).start(); }

Android - Kotlin

fun queryBooks() { thread(start = true) { val book = BooksDO().apply { isbn = "ISBN1" // Partition key

106

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

category = "History" // Range key }

val rangeKeyCondition = Condition() .withComparisonOperator(ComparisionOperator.BEGINS_WITH) .withAttrbiuteValueList(AttributeValue().withS("History")) val queryExpression = DynamoDBQUeryExpression() .withHashKeyValues(book) .withRangeKeyCondition("Category", rangeKeyCondition) .withConsistentRead(false)

val result = ddbMapper.query(BooksDO::class.java, queryExpression) as PaginatedList<BooksDO> if (result.isEmpty()) { // There were no items matching your query } else { // loop through the result list and process the response } }}

iOS - Swift

func queryBooks() {

// 1) Configure the query let queryExpression = AWSDynamoDBQueryExpression() queryExpression.keyConditionExpression = "#isbn = :ISBN AND #category = :Category"

queryExpression.expressionAttributeNames = [ "#isbn": "ISBN", "#category": "Category" ]

queryExpression.expressionAttributeValues = [ ":ISBN" : "1234", ":Category" : "History" ]

// 2) Make the query let dynamoDbObjectMapper = AWSDynamoDBObjectMapper.default()

dynamoDbObjectMapper.query(Books.self, expression: queryExpression) { (output: AWSDynamoDBPaginatedOutput?, error: Error?) in if error != nil { print("The request failed. Error: \(String(describing: error))") } if output != nil { for books in output!.items { let booksItem = books as? Books print("\(booksItem!._title!)") } } }}

后续步骤

• 要了解有关 IAM 策略的更多信息,请参阅使用 IAM。• 要了解有关为 Amazon DynamoDB 创建精细访问策略的更多信息,请参阅移动应用上的 DynamoDB – 第

5 部分:精细访问控制。

107

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS:Amazon DynamoDB Object Mapper API

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

主题• 概述 (p. 13)• 设置 (p. 108)• 实例化 Object Mapper API (p. 108)• CRUD 操作 (p. 110)• 执行扫描 (p. 113)• 执行查询 (p. 115)• 其他资源 (p. 116)

概述

Amazon DynamoDB 是一项快速、高度可扩展、高度可用且经济实惠的非关系数据库服务。AmazonDynamoDB 消除了过去数据存储的可扩展性限制,同时保留了低延迟和可预测的性能。

适用于 iOS 的 AWS Mobile 开发工具包提供了低级和高级库,这两种库均可与 Amazon DynamoDB 一起使用。

本部分中介绍的高级库提供了 Amazon DynamoDB 对象映射器,可让您将客户端类映射到表。在您的客户端上定义的数据模型内工作,您可以编写简单的可读代码,将对象存储在云中并在云中进行检索。

dynamodb-low-level-client 提供了有用的方法来执行条件写入和批处理等操作。

设置

要设置您的项目以使用适用于 iOS dynamoDBObjectMapper 的 AWS 开发工具包,请执行以下步骤。

设置开发工具包、凭证和服务

要将 dynamoDBObjectMapper 集成到新应用程序中,请按照入门中所述的步骤安装适用于 iOS 的 AWS 移动开发工具包。

实例化 Object Mapper API

本节内容:

主题• 导入 AWSDynamoDB API (p. 108)• 创建 Amazon DynamoDB 对象映射器客户端 (p. 109)• 定义映射类 (p. 109)

导入 AWSDynamoDB API

将以下导入语句添加至您的项目。

iOS - Swift

import AWSDynamoDB

108

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Objective-C

#import <AWSDynamoDB/AWSDynamoDB.h>

创建 Amazon DynamoDB 对象映射器客户端

使用 AWSDynamoDBObjectMapper 将客户端类映射到您的数据库。该对象映射器支持创建、获取、查询、更新和删除记录等高级别操作。按如下所示创建对象映射器。

iOS - Swift

dynamoDBObjectMapper = AWSDynamoDBObjectMapper.default()

iOS - Objective-C

AWSDynamoDBObjectMapper *dynamoDBObjectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];

对象映射器方法会返回 AWSTask 对象。有关更多信息,请参阅“使用异步任务”。

定义映射类

Amazon DynamoDB 数据库是表的集合,而表可以描述为:

• 表是项目的集合。• 每个项目都是属性的集合。• 每个属性都有各自的名称和值。

对于书店应用程序,表中的每个项目代表一本图书,而且每个项目都有四个属性:标题、作者、价格和ISBN。

表中的每个项目(图书)都有一个主键,在此示例中,主键为 ISBN。

要通过数据库项目的对象代表直接处理数据库项目,请在客户端代码中将图书表中的每个项目映射到 Book对象,如以下代码所示。属性名称区分大小写。

iOS - Swift

import AWSDynamoDB

class Book : AWSDynamoDBObjectModel, AWSDynamoDBModeling { @objc var Title:String? @objc var Author:String? @objc var Price:String? @objc var ISBN:String?

class func dynamoDBTableName() -> String { return "Books" }

class func hashKeyAttribute() -> String { return "ISBN" }}

109

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Objective-C

#import <AWSDynamoDB/AWSDynamoDB.h>#import "Book.h"

@interface Book : AWSDynamoDBObjectModel <AWSDynamoDBModeling>

@property (nonatomic, strong) NSString *Title;@property (nonatomic, strong) NSString *Author;@property (nonatomic, strong) NSNumber *Price;@property (nonatomic, strong) NSString *ISBN;

@end

@implementation Book

+ (NSString *)dynamoDBTableName { return @"Books";}

+ (NSString *)hashKeyAttribute { return @"ISBN";}

@end

Note

从开发工具包版本 2.0.16 起,AWSDynamoDBModel 映射类已被弃用,替换为AWSDynamoDBObjectModel。有关如何迁移旧版代码的信息,请参阅 awsdynamodb-model。

为了符合 AWSDynamoDBModeling 协议,请实施 dynamoDBTableName (这将返回表的名称) 和 hashKeyAttribute (这将返回主键的名称)。如果表有范围键,请实施 + (NSString*)rangeKeyAttribute。

CRUD 操作

主题• 保存项目 (p. 110)• 检索项目 (p. 112)• 更新项目 (p. 112)• 删除项目 (p. 112)

借助 Amazon DynamoDB 表、映射类和对象映射器客户端,您的应用程序可与云中的对象交互。

保存项目

save: 方法利用默认配置将对象保存到 Amazon DynamoDB。save: 采用继承自AWSDynamoDBObjectModel 的对象作为参数,并且符合 AWSDynamoDBModeling 协议的要求。此对象的属性会映射到 Amazon DynamoDB 表中的属性。

要创建要保存的对象,请执行以下步骤。

1. 定义对象及其属性以匹配您的表模型。iOS - Swift

let myBook = Book()

110

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

myBook?.ISBN = "3456789012"myBook?.Title = "The Scarlet Letter"myBook?.Author = "Nathaniel Hawthorne"myBook?.Price = 899 as NSNumber?

iOS - Objective-C

Book *myBook = [Book new];myBook.ISBN = @"3456789012";myBook.Title = @"The Scarlet Letter";myBook.Author = @"Nathaniel Hawthorne";myBook.Price = [NSNumber numberWithInt:899];

2. 将对象传递到 save: 方法。iOS - Swift

dynamoDBObjectMapper.save(myBook).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") } else { // Do something with task.result or perform other operations. } })

iOS - Objective-C

[[dynamoDBObjectMapper save:myBook]continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { //Do something with task.result or perform other operations. } return nil; }];

保存行为选项

适用于 iOS 的 AWS Mobile 开发工具包支持以下保存行为选项:

• AWSDynamoDBObjectMapperSaveBehaviorUpdate

此选项在执行保存操作时不会影响未建模的属性。传递已建模属性的 nil 值会删除 Amazon DynamoDB 中对应项目的属性。默认情况下,对象映射器会使用此行为。

• AWSDynamoDBObjectMapperSaveBehaviorUpdateSkipNullAttributes

此选项类似于默认更新行为,只是它忽略了所有空值属性,不会将这些属性从 Amazon DynamoDB 中的项目中删除。

• AWSDynamoDBObjectMapperSaveBehaviorAppendSet

此选项对标量属性 (字符串、数字、二进制) 的处理方式与AWSDynamoDBObjectMapperSaveBehaviorUpdateSkipNullAttributes 选项相同。但是,对于集合属性,此选项会附加到现有属性值而不是覆盖它。调用方必须确保已建模的属性类型与现有集合类型匹配,否则会出现服务异常。

• AWSDynamoDBObjectMapperSaveBehaviorClobber

此选项会在执行保存操作时清除并替换所有属性,包括未建模的属性。受版本控制的字段约束将被忽略。

111

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

以下代码提供了在对象映射器上设置默认保存行为的示例。

iOS - Swift

let updateMapperConfig = AWSDynamoDBObjectMapperConfiguration()updateMapperConfig.saveBehavior = .updateSkipNullAttributes

iOS - Objective-C

AWSDynamoDBObjectMapperConfiguration *updateMapperConfig = [AWSDynamoDBObjectMapperConfiguration new];updateMapperConfig.saveBehavior = AWSDynamoDBObjectMapperSaveBehaviorUpdateSkipNullAttributes;

在调用 save:configuration: 时使用 updateMapperConfig 作为参数。

检索项目

利用对象的主键 (在本示例中为 ISBN),我们可以从数据库加载对应项目。以下代码将返回 ISBN 为6543210987 的图书项目。

iOS - Swift

dynamoDBObjectMapper.load(Book.self, hashKey: "6543210987" rangeKey:nil).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") } else if let resultBook = task.result as? Book { // Do something with task.result. } return nil })

iOS - Objective-C

[[dynamoDBObjectMapper load:[Book class] hashKey:@"6543210987" rangeKey:nil]continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { //Do something with task.result. } return nil;}];

对象映射器会在从数据库返回的 Book 项目和客户端上的 Book 对象之间创建一个映射 (此处为resultBook)。在 resultBook.Title 访问标题。

由于图书数据库没有范围键,所以 nil 传递到了 rangeKey 参数。

更新项目

要更新数据库中的项目,只需设置新属性并保存对象。现有项目的主键 (在 myBook.ISBN 对象映射器示例中为 Book) 不能更改。如果您保存具有新主键的现有对象,将会创建具有相同属性和新主键的新项目。

删除项目

要删除表中的行,请使用 remove: 方法。

112

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Swift

let bookToDelete = Book() bookToDelete?.ISBN = "4456789012";

dynamoDBObjectMapper.remove(bookToDelete).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") } else { // Item deleted. } })

iOS - Objective-C

Book *bookToDelete = [Book new];bookToDelete.ISBN = @"4456789012";

[[dynamoDBObjectMapper remove:bookToDelete] continueWithBlock:^id(AWSTask *task) {

if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { //Item deleted. } return nil; }];

执行扫描

扫描操作以不确定的顺序进行检索。

scan:expression: 方法采用两个参数:生成的对象的类和 AWSDynamoDBScanExpression 的实例,这为筛选结果提供了选项。

以下示例说明了如何创建 AWSDynamoDBScanExpression 对象、设置其 limit 属性,然后将 Book 类和表达式对象传递到 scan:expression:。

iOS - Swift

let scanExpression = AWSDynamoDBScanExpression() scanExpression.limit = 20

dynamoDBObjectMapper.scan(Book.self, expression: scanExpression).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") } else if let paginatedOutput = task.result { for book in paginatedOutput.items as! Book { // Do something with book. } } })

iOS - Objective-C

AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];scanExpression.limit = @10;

113

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

[[dynamoDBObjectMapper scan:[Book class] expression:scanExpression]continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { AWSDynamoDBPaginatedOutput *paginatedOutput = task.result; for (Book *book in paginatedOutput.items) { //Do something with book. } } return nil;}];

筛选扫描

扫描的输出作为 AWSDynamoDBPaginatedOutput 对象返回。返回项目的数组位于 items 属性中。

scanExpression 方法提供了多个可选参数。使用 filterExpression 和expressionAttributeValues 可指定您定义的属性名称和条件的扫描结果。有关参数和 API 的更多信息,请参阅 AWSDynamoDBScanExpression。

以下代码将扫描图书表,查找价格低于 50 的图书。

iOS - Swift

let scanExpression = AWSDynamoDBScanExpression() scanExpression.limit = 10 scanExpression.filterExpression = "Price < :val" scanExpression.expressionAttributeValues = [":val": 50]

dynamoDBObjectMapper.scan(Book.self, expression: scanExpression).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") } else if let paginatedOutput = task.result { for book in paginatedOutput.items as! Book { // Do something with book. } } })

iOS - Objective-C

AWSDynamoDBScanExpression *scanExpression = [AWSDynamoDBScanExpression new];scanExpression.limit = @10;scanExpression.filterExpression = @"Price < :val";scanExpression.expressionAttributeValues = @{@":val":@50};

[[dynamoDBObjectMapper scan:[Book class] expression:scanExpression]continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { AWSDynamoDBPaginatedOutput *paginatedOutput = task.result; for (Book *book in paginatedOutput.items) { //Do something with book. } } return nil; }];

114

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

您还可以使用 projectionExpression` property to specify the attributes to retrievefrom the ``Books 表。例如,在之前的代码段中添加 scanExpression.projectionExpression =@"ISBN, Title, Price"; 将只检索图书对象中的这三个属性。图书对象中的 Author 属性始终为 nil。

执行查询

利用查询 API,您可以查询表或二级索引。query:expression: 方法采用两个参数:生成的对象的类和AWSDynamoDBQueryExpression 的实例。

要查询索引,您还必须指定 indexName。如果您查询具有不同 hashKeyAttribute 的全局二级索引,则必须指定 hashKey。如果表或索引具有范围键,则可以根据需要,通过提供范围键值和条件来优化结果。

以下示例介绍了如何查询 Books 索引表来查找作者为“John Smith”且价格低于 50 的所有图书。

iOS - Swift

let queryExpression = AWSDynamoDBQueryExpression() queryExpression.indexName = "Author-Price-index"

queryExpression.keyConditionExpression = @"Author = :authorName AND Price < :val"; queryExpression.expressionAttributeValues = @{@":authorName": @"John Smith", @":val": @50};

dynamoDBObjectMapper.query(Book.self, expression: queryExpression).continueWith(block: { (task:AWSTask<AnyObject>!) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") } else if let paginatedOutput = task.result { for book in paginateOutput.items as! Book { // Do something with book. } } return nil })

iOS - Objective-C

AWSDynamoDBQueryExpression *queryExpression = [AWSDynamoDBQueryExpression new];

queryExpression.indexName = @"Author-Price-index";

queryExpression.keyConditionExpression = @"Author = :authorName AND Price < :val";

queryExpression.expressionAttributeValues = @{@":authorName": @"John Smith", @":val":@50};

[[dynamoDBObjectMapper query:[Book class] expression:queryExpression]continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { AWSDynamoDBPaginatedOutput *paginatedOutput = task.result; for (Book *book in paginatedOutput.items) { //Do something with book. } } return nil; }];

前面的示例指定了 indexName 来演示如何查询索引。利用 keyConditionExpression 指定查询表达式,利用 expressionAttributeValues 指定表达式中使用的值。

115

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

您也可以在 filterExpression 中提供 projectionExpression 和AWSDynamoDBQueryExpression。此语法与扫描操作中使用的语法相同。

有关更多信息,请参阅 AWSDynamoDBQueryExpression。

将 AWSDynamoDBModel 迁移到 AWSDynamoDBObjectModel

从开发工具包版本 2.0.16 起,AWSDynamoDBModel 映射类已被弃用,替换为AWSDynamoDBObjectModel。弃用的 AWSDynamoDBModel 使用 NSArray 来表示多值类型(String Set、Number Set 和 Binary Set);它不支持 Boolean、Map 或 List 类型。新的AWSDynamoDBObjectModel 使用 NSSet 用于多值类型,并且支持 Boolean、Map 和 List。对于Boolean 类型,您可以使用 NSNumber 或使用快捷键 [NSNumber numberWithBool:YES] 和 @YES 来创建 @NO。对于 Map 类型,使用 NSDictionary 创建。对于 List 类型,使用 NSArray 创建。

其他资源

• Amazon DynamoDB 开发人员指南• Amazon DynamoDB API 参考

iOS:Amazon DynamoDB 低级别客户端

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

主题• 概述 (p. 13)• 设置 (p. 108)• 使用低级别客户端进行有条件写入 (p. 117)• 使用低级别客户端的批量操作 (p. 118)• 其他资源 (p. 116)

概述

Amazon DynamoDB 是一项快速、高度可扩展、高度可用且经济实惠的非关系数据库服务。AmazonDynamoDB 消除了过去数据存储的可扩展性限制,同时保留了低延迟和可预测的性能。

适用于 iOS 的 AWS Mobile 开发工具包提供了低级别和高级别库,这两种库均可与 Amazon DynamoDB 一起使用。

本部分中介绍的低级别客户端允许对 Amazon DynamoDB 表进行直接访问,这对 NoSQL 和其他非关系数据设计很有用。低级别客户端还支持有条件数据写入,以缓解同步写入冲突和批量数据写入。

高级别库包含 dynamodb-object-mapper,可让您映射客户端类,以访问和操作 Amazon Dynamo 表。

设置

要设置您的项目以使用适用于 iOS TransferUtility 的 AWS 开发工具包,请执行以下步骤。

1.设置开发工具包、凭证和服务

要在新应用程序中使用低级别 DynamoDB 移动客户端,请按照入门 (p. 3)中所述的步骤安装适用于 iOS的 AWS Mobile 开发工具包。

2.创建或使用现有 Amazon DynamoDB 表

按照 <dynamodb-setup-for-ios-legacy> 上的步骤创建表。

116

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

3.导入 AWSDynamoDB API

将以下导入语句添加至您的项目。

iOS - Swift

import AWSDynamoDB

iOS - Objective-C

#import <AWSDynamoDB/AWSDynamoDB.h>

使用低级别客户端进行有条件写入

在多用户环境中,多个客户端可以访问同一项目,并尝试同时修改其属性值。为帮助客户端协调对数据项目的写入,Amazon DynamoDB 低级别客户端支持 PutItem、DeleteItem 和 UpdateItem 操作的有条件写入。使用有条件写入,仅当项目属性满足一个或多个预期条件时,操作才会成功;否则会返回错误。

在以下示例中,如果项目的 Books 属性的值为 Price,我们会更新 999 表中该项目的价格。

iOS - Swift

Amazon DynamoDB = AWSDynamoDB.default() let updateInput = AWSDynamoDBUpdateItemInput()

let hashKeyValue = AWSDynamoDBAttributeValue() hashKeyValue?.s = "4567890123"

updateInput?.tableName = "Books" updateInput?.key = ["ISBN": hashKeyValue!]

let oldPrice = AWSDynamoDBAttributeValue() oldPrice?.n = "999"

let expectedValue = AWSDynamoDBExpectedAttributeValue() expectedValue?.value = oldPrice

let newPrice = AWSDynamoDBAttributeValue() newPrice?.n = "1199"

let valueUpdate = AWSDynamoDBAttributeValueUpdate() valueUpdate?.value = newPrice valueUpdate?.action = .put

updateInput?.attributeUpdates = ["Price": valueUpdate!] updateInput?.expected = ["Price": expectedValue!] updateInput?.returnValues = .updatedNew

Amazon DynamoDB.updateItem(updateInput!).continueWith { (task:AWSTask<AWSDynamoDBUpdateItemOutput>) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") return nil }

// Do something with task.result

return nil }

117

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

iOS - Objective-C

AWSDynamoDB *dynamoDB = [AWSDynamoDB defaultDynamoDB];AWSDynamoDBUpdateItemInput *updateInput = [AWSDynamoDBUpdateItemInput new];

AWSDynamoDBAttributeValue *hashKeyValue = [AWSDynamoDBAttributeValue new];hashKeyValue.S = @"4567890123";

updateInput.tableName = @"Books";updateInput.key = @{ @"ISBN" : hashKeyValue };

AWSDynamoDBAttributeValue *oldPrice = [AWSDynamoDBAttributeValue new];oldPrice.N = @"999";

AWSDynamoDBExpectedAttributeValue *expectedValue = [AWSDynamoDBExpectedAttributeValue new];expectedValue.value = oldPrice;

AWSDynamoDBAttributeValue *newPrice = [AWSDynamoDBAttributeValue new];newPrice.N = @"1199";

AWSDynamoDBAttributeValueUpdate *valueUpdate = [AWSDynamoDBAttributeValueUpdate new];valueUpdate.value = newPrice;valueUpdate.action = AWSDynamoDBAttributeActionPut;

updateInput.attributeUpdates = @{@"Price": valueUpdate};updateInput.expected = @{@"Price": expectedValue};updateInput.returnValues = AWSDynamoDBReturnValueUpdatedNew;

[[dynamoDB updateItem:updateInput] continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error); } else { //Do something with task.result. } return nil; }];

有条件写入是幂等 的。换句话说,如果多次请求有条件写入,将仅在第一个实例中执行更新,除非请求内容更改。在前面的示例中,再次发送同一请求会导致 ConditionalCheckFailedException,因为在第一次更新后不满足预期条件。

使用低级别客户端的批量操作

Amazon DynamoDB 低级别客户端提供了批量写入操作,可以将项目放入数据库中以及从数据库中删除项目。您也可以使用批量获取操作从一个或多个表中返回一个或多个项目的属性。

批量写入操作的示例如下。

iOS - Swift

Amazon DynamoDB = AWSDynamoDB.default()

//Write Request 1 let hashValue1 = AWSDynamoDBAttributeValue() hashValue1?.s = "3210987654" let otherValue1 = AWSDynamoDBAttributeValue() otherValue1?.s = "Some Title"

let writeRequest = AWSDynamoDBWriteRequest() writeRequest?.putRequest = AWSDynamoDBPutRequest()

118

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

writeRequest?.putRequest?.item = ["ISBN": hashValue1!, "Title": otherValue1!]

//Write Request 2 let hashValue2 = AWSDynamoDBAttributeValue() hashValue2?.s = "8901234567" let otherValue2 = AWSDynamoDBAttributeValue() otherValue2?.s = "Another Title"

let writeRequest2 = AWSDynamoDBWriteRequest() writeRequest2?.putRequest = AWSDynamoDBPutRequest() writeRequest2?.putRequest?.item = ["ISBN": hashValue2!, "Title": otherValue2!]

let batchWriteItemInput = AWSDynamoDBBatchWriteItemInput() batchWriteItemInput?.requestItems = ["Books": [writeRequest!, writeRequest2!]]

Amazon DynamoDB.batchWriteItem(batchWriteItemInput!).continueWith { (task:AWSTask<AWSDynamoDBBatchWriteItemOutput>) -> Any? in if let error = task.error as? NSError { print("The request failed. Error: \(error)") return nil }

// Do something with task.result

return nil }

iOS - Objective-C

AWSDynamoDB *dynamoDB = [AWSDynamoDB defaultDynamoDB];

//Write Request 1AWSDynamoDBAttributeValue *hashValue1 = [AWSDynamoDBAttributeValue new];hashValue1.S = @"3210987654";AWSDynamoDBAttributeValue *otherValue1 = [AWSDynamoDBAttributeValue new];otherValue1.S = @"Some Title";

AWSDynamoDBWriteRequest *writeRequest = [AWSDynamoDBWriteRequest new];writeRequest.putRequest = [AWSDynamoDBPutRequest new];writeRequest.putRequest.item = @{ @"ISBN" : hashValue1, @"Title" : otherValue1 };

//Write Request 2AWSDynamoDBAttributeValue *hashValue2 = [AWSDynamoDBAttributeValue new];hashValue2.S = @"8901234567";AWSDynamoDBAttributeValue *otherValue2 = [AWSDynamoDBAttributeValue new];otherValue2.S = @"Another Title";

AWSDynamoDBWriteRequest *writeRequest2 = [AWSDynamoDBWriteRequest new];writeRequest2.putRequest = [AWSDynamoDBPutRequest new];writeRequest2.putRequest.item = @{ @"ISBN" : hashValue2, @"Title" : otherValue2 };

AWSDynamoDBBatchWriteItemInput *batchWriteItemInput = [AWSDynamoDBBatchWriteItemInput new];batchWriteItemInput.requestItems = @{@"Books": @[writeRequest,writeRequest2]};

[[dynamoDB batchWriteItem:batchWriteItemInput] continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"The request failed. Error: [%@]", task.error);

119

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

} else { //Do something with task.result. } return nil;}];

其他资源

• Amazon DynamoDB 开发人员指南• Amazon DynamoDB API 参考

操作方法:无服务器代码与 AWS Lambda

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

本节提供了将 AWS Lambda 函数集成到 Android 和 iOS 应用程序中的过程。

主题• Android:利用 AWS Lambda 按需执行代码 (p. 120)• iOS:利用 AWS Lambda 按需执行代码 (p. 125)

Android:利用 AWS Lambda 按需执行代码

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

概述

AWS Lambda 是一个计算服务,它运行您的代码来响应事件,并且自动为您管理计算资源,使构建快速响应新信息的应用程序变得容易。适用于 Android 的 AWS Mobile 开发工具包可让您从 Android 移动应用程序调用 Lambda 函数。

下面的教程将说明如何将 AWS Lambda 与您的应用程序集成。

设置

先决条件

在开始本教程前,请将适用于 Android 的 AWS 移动开发工具包添加到您应用程序。

在 AWS 控制台中创建 Lambda 函数

在本教程中,我们将使用简单的“echo”函数,该函数可返回输入。按照 AWS Lambda 入门中所述的步骤进行操作,从而将函数代码替换为以下代码:

exports.handler = function(event, context) { console.log("Received event"); context.succeed("Hello "+ event.firstName + "using " + context.clientContext.deviceManufacturer); }

120

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

设置 IAM 权限

默认 IAM 角色策略会为您的用户授予访问 Amazon Mobile Analytics 和 Amazon Cognito Sync 的权限。要在应用程序中使用 AWS Lambda,您必须配置 IAM 角色策略,以便它允许您的应用程序和用户访问 AWSLambda。在以下步骤中的 IAM 策略允许用户对给定 AWS Lambda 函数 (由其 Amazon 资源名称 (ARN) 标识) 执行本教程中所示的操作。要查找 ARN,请转到 Lambda 控制台,然后单击 Function name (函数名称)。

为 AWS Lambda 设置 IAM 权限:

1. 导航到 IAM 控制台并单击左侧窗格中的 Roles (角色)。2. 在搜索框中键入您的身份池名称。将列出两个角色:一个用于未经身份验证的用户,另一个用于经过身份

验证的用户。3. 单击用于未经过身份验证的用户的角色 (身份池名称后附加有 unauth)。4. 单击 Create Role Policy (创建角色策略) 按钮,选择 Custom Policy (自定义策略),然后单击 Select (选择)

按钮。5. 为您的策略输入一个名称并粘贴以下策略文档,从而将“echo”函数的 Resource 值替换为您的函数的

ARN(在 AWS Lambda 控制台中单击您的函数的 Function name (函数名称) 可查看其 ARN)。

{ "Statement": [{ "Effect": "Allow", "Action": [ "lambda:invokefunction" ], "Resource": [ ”arn:aws:lambda:us-west-2:012345678901:function:yourFunctionName” ] }]}

1. 单击 Add Statement (添加语句) 按钮,然后单击 Next Step (下一步) 按钮。向导将向您显示生成的配置。2. 单击 Apply Policy (应用策略) 按钮。

要了解有关 IAM 策略的更多信息,请参阅 IAM 文档。

在您的 Android 清单文件中设置权限

在您的 AndroidManifest.xml 中,添加以下权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

初始化 LambdaInvokerFactory

Android - Java

将您的已初始化的 Amazon Cognito 凭证提供商传递给 LambdaInvokerFactory 构造函数:

LambdaInvokerFactory factory = new LambdaInvokerFactory( myActivity.getApplicationContext(), REGION, credentialsProvider);

Android - Kotlin

将您的已初始化的 Amazon Cognito 凭证提供商传递给 LambdaInvokerFactory 构造函数:

121

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

val factory = LambdaInvokerFactory(applicationContext, REGION, credentialsProvider)

声明数据类型

Android - Java

声明 Java 类以保存传递到 Lambda 函数的数据。以下类定义了包含人员的名字和姓氏的 NameInfo类:

package com.amazonaws.demo.lambdainvoker;

/** * A simple POJO */public class NameInfo { private String firstName; private String lastName;

public NameInfo() {}

public NameInfo(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; }

public String getFirstName() { return firstName; }

public void setFirstName(String firstName) { this.firstName = firstName; }

public String getLastName() { return lastName; }

public void setLastName(String lastName) { this.lastName = lastName; }}

Android - Kotlin

声明 Kotlin 数据类以保存传递到 Lambda 函数的数据。以下类定义了包含人员的名字和姓氏的NameInfo 类:

package com.amazonaws.demo.lambdainvoker;

data class NameInfo(var firstName: String, var lastName: String)

创建 Lambda 代理

为每个 Lambda 函数调用声明一个包含一个方法的接口。该接口中的每个方法都必须用“@LambdaFunction”注释进行修饰。LambdaFunction 属性可采用 3 个可选参数:

• functionName 可让您指定要在执行方法后调用的 Lambda 函数的名称,默认情况下使用方法的名称。

122

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

• 仅当 invocationType 设置为“Event”时,logType 才有效。如果这样设置,AWS Lambda 将返回由您的Lambda 函数在 x-amz-log-results 标头中生成的最后 4 KB 的日志数据。

• invocationType 可指定如何调用 Lambda 函数。可以是以下任一值:• Event:异步调用 Lambda 函数• RequestResponse:同步调用 Lambda 函数• DryRun:允许您验证对 Lambda 函数的访问权限而无需执行该函数

以下代码显示了如何创建一个 Lambda 代理:

Android - Java

package com.amazonaws.demo.lambdainvoker;

import com.amazonaws.mobileconnectors.lambdainvoker.LambdaFunction;

public interface MyInterface { /** * Invoke lambda function "echo". The function name is the method name */ @LambdaFunction String echo(NameInfo nameInfo)

/** * Invoke lambda function "echo". The functionName in the annotation * overrides the default which is the method name */ @LambdaFunction(functionName = "echo") void noEcho(NameInfo nameInfo)}

Android - Kotlin

package com.amazonaws.demo.lambdainvoker;

import com.amazonaws.mobileconnectors.lambdainvoker.LambdaFunction;

interface MyInterface { /** * Invoke lambda function "echo". The function name is the method name */ @LambdaFunction fun echo(nameInfo: NameInfo): String

/** * Invoke lambda function "echo". The functionName in the annotation * overrides the default which is the method name */ @LambdaFunction(functionName = "echo") fun noEcho(nameInfo: NameInfo): Unit}

调用 Lambda 函数Note

请勿从主线程调用 Lambda 函数,因为它将导致网络调用。

以下代码显示了如何初始化 Cognito 缓存凭证提供商并调用 Lambda 函数。IDENTITY_POOL_ID 的值将特定于您的账户。请确保区域与您要尝试调用的 Lambda 函数的相同。

123

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

Android - Java

// Create an instance of CognitoCachingCredentialsProviderCognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider( myActivity.getApplicationContext(), IDENTITY_POOL_ID, Regions.YOUR_REGION);

// Create a LambdaInvokerFactory, to be used to instantiate the Lambda proxyLambdaInvokerFactory factory = new LambdaInvokerFactory( myActivity.getApplicationContext(), REGION, credentialsProvider);

// Create the Lambda proxy object with default Json data binder.// You can provide your own data binder by implementing// LambdaDataBinderMyInterface myInterface = factory.build(MyInterface.class);

// Create an instance of the POJO to transfer dataNameInfo nameInfo = new NameInfo("John", "Doe");

// The Lambda function invocation results in a network call// Make sure it is not called from the main threadnew AsyncTask<NameInfo, Void, String>() { @Override protected String doInBackground(NameInfo... params) { // invoke "echo" method. In case it fails, it will throw a // LambdaFunctionException. try { return myInterface.echo(params[0]); } catch (LambdaFunctionException lfe) { Log.e(TAG, "Failed to invoke echo", lfe); return null; } }

@Override protected void onPostExecute(String result) { if (result == null) { return; }

// Do a toast Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show(); }}.execute(nameInfo);

Android - Kotlin

// Create an instance of CognitoCachingCredentialsProviderval credentialsProvider = CognitoCachingCredentialsProvider( [email protected], IDENTITY_POOL_ID, Regions.IDENTITY_POOL_REGION)

// Create a LambdaInvokerFactory, to be used to instantiate the Lambda proxyval factory = LambdaInvokerFactory( [email protected], LAMBDA_REGION, credentialsProvider)

// Create the Lambda proxy object with default Json data binder.

124

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// You can provide your own data binder by implementing// LambdaDataBinderval myInterface = factory.build(MyInterface::class.java);

// Create an instance of the POJO to transfer dataval nameInfo = NameInfo("John", "Doe");

// The Lambda function invocation results in a network call// Make sure it is not called from the main threadthread(start = true) { // Invoke "echo" method. In case it fails, it will throw an exception try { val response: String = myInterface.echo(nameInfo) runOnUiThread { Toast.makeText(this@MainActivity, result, Toast.LENGTH_LONG).show() } } catch (ex: LambdaFunctionException) { Log.e(TAG, "Lambda execution failed") }}

现在,每当调用 Lambda 函数时,您应该就会看到一个包含文本“Hello John using <device>”的应用程序toast。

要开始使用用于设置和使用 Lambda 函数来处理云 API 调用的简化步骤,请参阅添加 AWS Mobile 云逻辑 (p. 73)。

iOS:利用 AWS Lambda 按需执行代码

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

主题• 概述 (p. 13)• 设置 (p. 108)• 调用 AWS Lambda 函数 (p. 126)• 客户端上下文 (p. 129)• 身份上下文 (p. 130)

概述

AWS Lambda 服务能让您为移动应用程序轻松创建安全、可扩展且高度可用的后端,并且无需预配置或管理基础设施。

您可以在云中创建可通过 iOS 应用程序直接调用的安全逻辑函数。您采用 C#、Node.js、Python 或 Java 编写的 AWS Lambda 代码可实施独立的逻辑,将您的应用程序扩展到一系列 AWS 服务和/或连接到 AWS 以外的服务和应用程序。

AWS Lambda 函数的可用性和成本会根据接收的流量数自动扩展。也可以通过 Amazon API Gateway 从iOS 应用程序访问函数,提供全局配置、访问的企业级监控、限制和控制等功能。

设置

本部分提供有关如何借助适用于 iOS 的 AWS Mobile 开发工具包来开始使用 AWS Lambda 的分步指南。

125

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

1. 安装开发工具包

将适用于 iOS 的 AWS 开发工具包添加到您的项目并导入所需的 API。2. 配置凭证

要使用 Amazon Cognito 创建 AWS 身份和凭证,以便用户能够访问您的应用程序的 AWS 资源,请按照添加用户登录 (p. 88) 中介绍的步骤操作。

3. 创建和配置 Lambda 函数a. 登录 AWS Lambda 控制台。b. 选择 Create a Lambda function (创建 Lambda 函数)。c. 选择 Blank Function (空白函数) 模板。

请注意,有很多连接到其他 AWS 服务的函数模板可用。d. 选择 Next (下一步)。

请注意,您可以通过控制台为其他 AWS 服务配置函数的触发器,而本演练将不使用这些触发器。e. 在 Name (名称) 中键入名称,然后选择 Node.js 作为 Runtime (运行时) 语言。f. 在 Lambda function handler and role (Lambda 函数处理程序和角色) 下,选择 Create new role

from template(s) (从模板创建新角色)。在 Role name (角色名称) 中键入角色名称。选择名为 SimpleMicroservice permissions (简单微服务权限) 的 Policy template (策略模板)。

g. 选择 Next (下一步)。h. 选择 Create function。

调用 AWS Lambda 函数

该开发工具包可让您使用 AWSLambdaInvoker 类通过 iOS 移动应用程序调用 AWS Lambda 函数。经过此开发工具包调用后,AWS Lambda 函数可以通过客户端和身份上下文对象接收有关设备和最终用户身份的数据。有关使用这些上下文来打造丰富、个性化的应用程序体验的更多信息,请参阅客户端上下文 (p. 129)和身份上下文 (p. 130)。

导入 AWS Lambda API

要使用 lambdainvoker API,请使用以下导入语句:

iOS - Swift

import AWSLambda

Objective C

#import <AWSLambda/AWSLambda.h>

调用 lambdaInvoker

AWSLambdaInvoker 可以为 AWS Lambda 提供高级别抽象。调用 invokeFunction JSONObject 时,会将 JSON 对象序列化为 JSON 数据,然后发送给 AWS Lambda 服务。AWS Lambda 会返回一个可反序列化为 JSON 对象的 JSON 编码的响应。

有效的 JSON 对象必须具有以下属性:

• 所有对象均为字符串、数字、阵列、词典或空对象实例。• 所有词典键均为字符串对象实例。• 数字既不是 NaN,也不是 infinity。

126

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

下面是一个有效请求的示例。

iOS - Swift

let lambdaInvoker = AWSLambdaInvoker.default()let jsonObject: [String: Any] = ["key1" : "value1", "key2" : 2 , "key3" : [1, 2], "isError" : false]

lambdaInvoker.invokeFunction("myFunction", jsonObject: jsonObject) .continueWith(block: {(task:AWSTask<AnyObject>) -> Any? in if( task.error != nil) { print("Error: \(task.error!)") return nil }

// Handle response in task.result return nil})

Objective C

AWSLambdaInvoker *lambdaInvoker = [AWSLambdaInvoker defaultLambdaInvoker];

[[lambdaInvoker invokeFunction:@"myFunction" JSONObject:@{@"key1" : @"value1", @"key2" : @2, @"key3" : [NSNull null], @"key4" : @[@1, @"2"], @"isError" : @NO}] continueWithBlock:^id(AWSTask *task) { // Handle response return nil;}];

使用函数返回

如果执行成功,task.result 会包含一个 JSON 对象。例如,如果 myFunctions 返回一个词典,您可以按如下所示将该结果转换为一个词典对象。

iOS - Swift

if let JSONDictionary = task.result as? NSDictionary { print("Result: \(JSONDictionary)") print("resultKey: \(JSONDictionary["resultKey"])")}

Objective C

if (task.result) { NSLog(@"Result: %@", task.result); NSDictionary *JSONObject = task.result; NSLog(@"result: %@", JSONObject[@"resultKey"]);}

处理服务执行错误

如果 AWS Lambda 服务执行失败,task.error 可能包含一个带 AWSLambdaErrorDomain 域和以下错误代码的 NSError。

127

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

• AWSLambdaErrorUnknown• AWSLambdaErrorService• AWSLambdaErrorResourceNotFound• AWSLambdaErrorInvalidParameterValue

如果函数执行失败,task.error 可能包含一个带 AWSLambdaInvokerErrorDomain 域和以下错误代码的NSError:

• AWSLambdaInvokerErrorTypeUnknown• AWSLambdaInvokerErrorTypeFunctionError

返回 AWSLambdaInvokerErrorTypeFunctionError 错误代码时,error.userInfo 可能包含带AWSLambdaInvokerFunctionErrorKey 键的 AWS Lambda 函数的函数错误。

以下代码显示了错误处理。

iOS - Swift

if let error = task.error as? NSError { if (error.domain == AWSLambdaInvokerErrorDomain) && (AWSLambdaInvokerErrorType.functionError == AWSLambdaInvokerErrorType(rawValue: error.code)) { print("Function error: \(error.userInfo[AWSLambdaInvokerFunctionErrorKey])") } else { print("Error: \(error)") } return nil}

Objective C

if (task.error) { NSLog(@"Error: %@", task.error); if ([task.error.domain isEqualToString:AWSLambdaInvokerErrorDomain] && task.error.code == AWSLambdaInvokerErrorTypeFunctionError) { NSLog(@"Function error: %@", task.error.userInfo[AWSLambdaInvokerFunctionErrorKey]); }}

综合示例

以下代码综合介绍了如何调用 AWS Lambda 调用,以及如何处理返回和错误。

iOS - Swift

let lambdaInvoker = AWSLambdaInvoker.default()

let jsonObject: [String: Any] = ["key1" : "value1", "key2" : 2, "key3" : [1, 2], "isError" : false]

lambdaInvoker.invokeFunction("myFunction", jsonObject: jsonObject).continueWith(block: {(task:AWSTask<AnyObject>) -> Any? in if let error = task.error as? NSError {

128

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

if (error.domain == AWSLambdaInvokerErrorDomain) && (AWSLambdaInvokerErrorType.functionError == AWSLambdaInvokerErrorType(rawValue: error.code) { print("Function error: \(error.userInfo[AWSLambdaInvokerFunctionErrorKey])") } else { print("Error: \(error)") } return nil }

// Handle response in task.result if let JSONDictionary = task.result as? NSDictionary { print("Result: \(JSONDictionary)") print("resultKey: \(JSONDictionary["resultKey"])") } return nil})

Objective C

AWSLambdaInvoker *lambdaInvoker = [AWSLambdaInvoker defaultLambdaInvoker];

[[lambdaInvoker invokeFunction:@"myFunction" JSONObject:@{@"key1" : @"value1", @"key2" : @2, @"key3" : [NSNull null], @"key4" : @[@1, @"2"], @"isError" : @NO}] continueWithBlock:^id(AWSTask *task) { if (task.error) { NSLog(@"Error: %@", task.error); if ([task.error.domain isEqualToString:AWSLambdaInvokerErrorDomain] && task.error.code == AWSLambdaInvokerErrorTypeFunctionError) { NSLog(@"Function error: %@", task.error.userInfo[AWSLambdaInvokerFunctionErrorKey]); } } if (task.result) { NSLog(@"Result: %@", task.result); NSDictionary *JSONObject = task.result; NSLog(@"result: %@", JSONObject[@"resultKey"]); } return nil;}];

客户端上下文

使用此开发工具包调用 AWS Lambda,可为您的函数提供关于使用 ClientContext 类调用设备和应用程序的相关数据。

您可以按如下方式访问 lambda 函数中的客户端上下文。

JavaScript

exports.handler = function(event, context) { console.log("installation_id = " + context.clientContext.client.installation_id); console.log("app_version_code = " + context.clientContext.client.app_version_code); console.log("app_version_name = " + context.clientContext.client.app_version_name); console.log("app_package_name = " + context.clientContext.client.app_package_name); console.log("app_title = " + context.clientContext.client.app_title); console.log("platform_version = " + context.clientContext.env.platform_version); console.log("platform = " + context.clientContext.env.platform);

129

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

console.log("make = " + context.clientContext.env.make); console.log("model = " + context.clientContext.env.model); console.log("locale = " + context.clientContext.env.locale);

context.succeed("Your platform is " + context.clientContext.env.platform;}

ClientContext 具有以下字段:

client.installation_id

自动生成的 UUID,首次启动应用程序时创建。它存储在设备上的密钥链中。如果该密钥链被擦除,系统会生成一个新的安装 ID。

client.app_version_code

CFBundleShortVersionStringclient.app_version_name

CFBundleVersionclient.app_package_name

CFBundleIdentifierclient.app_title

CFBundleDisplayNameenv.platform_version

systemVersionenv.platform

systemNameenv.make

硬编码为“apple”env.model

设备模型env.locale

autoupdatingCurrentLocale 的 localeIdentifier

身份上下文

此开发工具包的 IdentityContext 类可传递 Amazon Cognito 凭证,使最终用户的 AWS 身份对于您的函数可用。您可以按如下所示访问身份 ID。

JavaScript

exports.handler = function(event, context) { console.log("clientID = " + context.identity);

context.succeed("Your client ID is " + context.identity);}

130

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

如何使用 Amazon Machine Learning 添加 Machine Learning

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

本节提供了将 Amazon Machine Learning 集成到 Android 和 iOS 应用程序中的过程。

主题• Android:Amazon Machine Learning (p. 131)• iOS:Amazon Machine Learning (p. 133)

Android:Amazon Machine Learning

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

Amazon Machine Learning (ML) 是一种可使各种技能水平的开发人员都能轻松使用机器学习技术的服务。适用于 Android 的开发工具包可提供简单的高级客户端,旨在帮助您使用 Amazon Machine Learning 服务。通过该客户端,您可以调用 Amazon ML 的实时 API 从模型中检索预测,还可以构建移动应用程序,以请求预测并采取行动。客户端还可让您检索适用于您的 ML 模型的实时预测终端节点 URL。

设置

先决条件

在开始本教程前,必须先完成设置适用于 Android 的开发工具包页面上的说明中的所有步骤。

授予访问 Amazon Machine Learning 资源的权限

要在应用程序中使用 Amazon Machine Learning,您必须设置适当的权限。以下 IAM 策略允许用户对 ARN标识的两个操作执行本教程中所示的操作。

{ "Statement": [{ "Effect": "Allow", "Action": [ "machinelearning:GetMLModel", "machinelearning:Predict" ], "Resource": "arn:aws:machinelearning:use-east-1:11122233444:mlmodel/example-model-id" }]}

应将此策略应用于分配给 Amazon Cognito 身份池的角色,但您需要将 Resource 值替换为正确的账户 ID 和ML 模型 ID。您可以在 IAM 控制台中应用策略。要了解有关 IAM 策略的更多信息,请参阅 IAM 简介。

添加导入语句

将以下 import 语句添加到您的应用程序的主活动:

import com.amazonaws.services.machinelearning.*;

131

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

初始化 AmazonMachineLearningClient

将您的已初始化的 Amazon Cognito 凭证提供商传递给 AmazonMachineLearningClient 构造函数:

Android - Java

AmazonMachineLearningClient client = new AmazonMachineLearningClient(credentialsProvider);

Android - Kotlin

val client = AmazonMachineLearningClient(credentialsProvider)

创建 Amazon Machine Learning 客户端

发出预测请求

在调用 Predict 之前,确保您不仅具有完整的 ML 型号 ID,还为该 ML 模型 ID 创建了实时终端节点。此操作无法通过移动开发工具包完成;您必须使用 Machine Learning 控制台或其他开发工具包。验证该 ML 是否可用于实时预测:

Android - Java

// Use a created model that has a created real-time endpoint String mlModelId = "example-model-id";

// Call GetMLModel to get the realtime endpoint URL GetMLModelRequest getMLModelRequest = new GetMLModelRequest(); getMLModelRequest.setMLModelId(mlModelId); GetMLModelResult mlModelResult = client.getMLModel(getMLModelRequest);

// Validate that the ML model is completed if (!mlModelResult.getStatus().equals(EntityStatus.COMPLETED.toString())) { System.out.println("ML Model is not completed: " + mlModelResult.getStatus()"); return; }

// Validate that the realtime endpoint is ready if (!mlModelResult.getEndpointInfo().getEndpointStatus().equals(RealtimeEndpointStatus.READY.toString())){ System.out.println("Realtime endpoint is not ready: " + mlModelResult.getEndpointInfo().getEndpointStatus()); return; }

Android - Kotlin

// Call GetMLModel to get the realtime endpoint URLval modelRequest = new GetMLModelRequest()modelRequest.mLModelID = "example-model-id"val modelResult = client.getMLModel(modelRequest);

// Validate that the ML model is completedif (modelResult.status != EntityStatus.COMPLETED.toString()) { Log.d(TAG, "ML Model is not completed: ${modelResult.status}"); return;}

132

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

// Validate that the realtime endpoint is readyif (modelResult.endpointInfo.endpointStatus != RealtimeEndpointStatus.READY.toString()) { Log.d(TAG, "Realtime endpoint is not ready: ${modelResult.endpointInfo.endpointStatus}"); return;}

实时终端节点就绪后,我们便可以开始调用 Predict。注意,您必须通过 PredictRequest 传递实时终端节点。

Android - Java

// Create a Predict request with your ML model ID and the appropriate Record mappingPredictRequest predictRequest predictRequest = new PredictRequest();predictRequest.setMLModelId(mlModelId);

HashMap<String, String> record = new HashMap<String, String>();record.put("example attribute", "example value");

predictRequest.setRecord(record);predictRequest.setPredictEndpoint(mlModelResult.getEndpointInfo().getEndpointUrl());

// Call Predict and print out your predictionPredictResult predictResult = client.predict(predictRequest);Log.d(LOG_TAG. predictResult.getPrediction());

// Do something with the prediction// ...

Android - Kotlin

// Create a Predict request with your ML model ID and the appropriate Record mappingval predictRequest predictRequest = PredictRequest().apply { mLModelID = "example-model-id" record = mapOf("example attribute" to "example value") predictEndpoint = modelResult.endpointInfo.getEndpointUrl }

val predictResult = client.predict(predictRequest) Log.d(LOG_TAG, predictResult.prediction)

// Do something with the prediction // ...

其他资源

• 开发人员指南• 服务 API 参考

iOS:Amazon Machine Learning

以下参考内容仅适用于使用适用于 iOS 和 Android 的 AWS 移动开发工具包生成的现有应用程序。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改为访问 Amplify 框架网站。适用于 iOS 和 Android 的 AWS 移动开发工具包现在是 Amplify 框架的一部分。

133

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

Amazon Machine Learning (ML) 是一种可使各种技能水平的开发人员都能轻松使用机器学习技术的服务。适用于 iOS 的开发工具包可提供简单的高级客户端,旨在帮助您使用 Amazon Machine Learning 服务。通过该客户端,您可以调用 Amazon ML 的实时 API 从模型中检索预测,还可以构建移动应用程序,以请求预测并采取行动。客户端还可让您检索适用于您的 ML 模型的实时预测终端节点 URL。

集成 Amazon Machine Learning

要使用 Amazon Machine Learning 移动客户端,您需要将适用于 iOS 的开发工具包集成到应用程序并导入必要的库。为此,请按照以下步骤操作:

1. 按照设置适用于 iOS 的开发工具包中的说明下载开发工具包并解压。2. 说明将引导您导入您将要使用的服务的标头。对于 Amazon Machine Learning,您需要进行以下导入。

iOS - Swift

import AWSMachineLearning

iOS - Objective C

#import <AWSMachineLearning/AWSMachineLearning.h>

配置凭证

您可以使用 Amazon Cognito 向应用程序提供临时的 AWS 凭证。这些凭证使得应用程序能够访问您的 AWS资源。要创建凭证提供商,请按照提供 AWS 凭证上的说明操作。

要在应用程序中使用 Amazon Machine Learning,您必须设置适当的权限。以下 IAM 策略允许用户对 ARN标识的两个操作执行本教程中所示的操作。

{ "Statement": [{ "Effect": "Allow", "Action": [ "machinelearning:GetMLModel", "machinelearning:Predict" ], "Resource": "arn:aws:machinelearning:use-east-1:11122233444:mlmodel/example-model-id" }]}

应将此策略应用于分配给 Amazon Cognito 身份池的角色,但您需要将 Resource 值替换为正确的账户 ID 和ML 模型 ID。您可以在 IAM 控制台中应用策略。要了解有关 IAM 策略的更多信息,请参阅 IAM 简介。

创建 Amazon Machine Learning 客户端

导入必要的库并获得凭证对象后,您就可以实例化 AWSMachineLearningGetMLModelInput 了。

iOS - Swift

let getMlModelInput = AWSMachineLearningGetMLModelInput()

Objective C

AWSMachineLearningGetMLModelInput *getMLModelInput = [AWSMachineLearningGetMLModelInput new];

134

AWS Mobile Hub 开发人员指南 开发人员指南Android 和 iOS

发出预测请求

在调用 Predict 之前,确保您不仅具有完整的 ML 型号 ID,还为该 ML 模型 ID 创建了实时终端节点。此操作无法通过移动开发工具包完成;您必须使用 Machine Learning 控制台或其他的开发工具包。验证该 ML 是否可用于实时预测。

iOS - Swift

// Use a created model that has a created real-time endpointlet mlModelId = "example-model-id";// Call GetMLModel to get the realtime endpoint URLlet getMlModelInput = AWSMachineLearningGetMLModelInput()getMlModelInput!.mlModelId = mlModelId;

machineLearning.getMLModel(getMlModelInput!).continueOnSuccessWith { (task) -> Any? in if let getMLModelOutput = task.result {

if (getMLModelOutput.status != AWSMachineLearningEntityStatus.completed) { print("ML Model is not completed"); return nil; }

// Validate that the realtime endpoint is ready if (getMLModelOutput.endpointInfo!.endpointStatus != AWSMachineLearningRealtimeEndpointStatus.ready) { print("Realtime endpoint is not ready"); return nil; } }

return nil}

Objective C

AWSMachineLearning *MachineLearning = [AWSMachineLearning defaultMachineLearning];

// Use a created model that has a created real-time endpointNSString *MLModelId = @"example-model-id";

// Call GetMLModel to get the realtime endpoint URLAWSMachineLearningGetMLModelInput *getMLModelInput = [AWSMachineLearningGetMLModelInput new];getMLModelInput.MLModelId = MLModelId;

[[[MachineLearning getMLModel:getMLModelInput] continueWithSuccessBlock:^id(AWSTask *task) { AWSMachineLearningGetMLModelOutput *getMLModelOutput = task.result;

// Validate that the ML model is completed if (getMLModelOutput.status != AWSMachineLearningEntityStatusCompleted) { NSLog(@"ML Model is not completed"); return nil; }

// Validate that the realtime endpoint is ready if (getMLModelOutput.endpointInfo.endpointStatus != AWSMachineLearningRealtimeEndpointStatusReady) { NSLog(@"Realtime endpoint is not ready"); return nil; }}

135

AWS Mobile Hub 开发人员指南 开发人员指南Web

实时终端节点就绪后,我们便可以开始调用 Predict。注意,您必须通过 PredictRequest 传递实时终端节点。

iOS - Swift

// Create a Predict request with your ML Model id and the appropriatelet predictInput = AWSMachineLearningPredictInput()predictInput!.predictEndpoint = getMLModelOutput.endpointInfo!.endpointUrl;predictInput!.mlModelId = mlModelId;predictInput!.record = record

return machineLearning.predict(predictInput!)

Objective C

// Create a Predict request with your ML Model id and the appropriate Record mapping.AWSMachineLearningPredictInput *predictInput = [AWSMachineLearningPredictInput new];predictInput.predictEndpoint = getMLModelOutput.endpointInfo.endpointUrl;predictInput.MLModelId = MLModelId;predictInput.record = @{};

// Call and return predictionreturn [MachineLearning predict:predictInput];

其他资源

• 开发人员指南• API 参考

用于 Web 的 AWS Amplify 库Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

AWS Amplify 是一个开源 JavaScript 库,可供前端和移动开发人员构建支持云的应用程序。该库是一个各种不同操作类别间的声明性接口,旨在使常见任务更加简便地添加到您的应用程序。默认实施需要与 AmazonWeb Services (AWS) 资源结合使用,但是采用开放和可插拔式设计,旨在结合使用其他希望提供实施或自定义后端的云服务。

AWS Mobile CLI (在 AWS Mobile Hub 构建) 可为前端 JavaScript 开发人员提供命令行界面,用来在其应用程序中无缝启用和配置 AWS 服务。仅需最低的配置,您就可以从您喜爱的终端应用程序开始使用 AWSMobile Hub 提供的所有功能。

主题• 入门 (p. 136)• AWS Mobile Hub 功能 (p. 156)

入门Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 Amplify

136

AWS Mobile Hub 开发人员指南 开发人员指南Web

CLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

概述

AWS Mobile CLI 提供的命令行体验可以使前端 JavaScript 开发人员快速创建并将 AWS 后端资源集成到他们的移动应用程序。

先决条件

1. 注册 AWS 免费套餐。2. 使用 NPM 安装 Node.js。3. 安装 AWS Mobile CLI

npm install -g awsmobile-cli

4. 使用您的 AWS 凭证配置 CLI

要设置 CLI 使用的工具链权限,请运行:

awsmobile configure

如果系统提示您提供凭证,请按照 CLI 提供的步骤进行。有关更多信息,请参阅为 AWS Mobile CLI 提供IAM 凭证 (p. 165)。

设置您的后端

需要创建快速示例 React 应用程序? 请参阅 创建 React 应用程序。

为您的应用程序配置后端功能

1. 在您的应用程序根文件夹中,运行:

awsmobile init

该 init 命令可为您的应用程序创建后端项目。默认情况下,您的后端已启用分析和 Web 托管,并且当您初始化时这项配置会自动推送至您的应用程序。

2. 系统提示时,请为您的项目提供源目录。CLI 将在此位置生成 aws-exports.js。此文件包含用于将您的前端连接到后端服务的配置和终端节点元数据。

? Where is your project's source directory: src

3. 使用以下值响应进一步提示。

? Where is your project's distribution directory to store build artifacts: build? What is your project's build command: npm run-script build? What is your project's start command for local test run: npm run-script start? What awsmobile project name would you like to use: YOUR-APP-NAME-2017-11-10-15-17-48

创建项目之后,您将收到一条成功消息,其中包含复制 aws-exports.js 的路径的详细信息。

137

AWS Mobile Hub 开发人员指南 开发人员指南Web

awsmobile project's details logged at: awsmobilejs/#current-backend-info/backend-details.jsonawsmobile project's access information logged at: awsmobilejs/#current-backend-info/aws-exports.jsawsmobile project's access information copied to: src/aws-exports.jsawsmobile project's specifications logged at: awsmobilejs/#current-backend-info/mobile-hub-project.ymlcontents in #current-backend-info/ is synchronized with the latest information in the aws cloud

现在您的项目已经初始化。

Note

您可以使用 awsmobile init YOUR_MOBILE_HUB_PROJECT_ID 将您为此项目创建的 AWS 后端资源添加到另一个现有应用程序。要查找项目 ID,请通过运行 awsmobile console 在 MobileHub 控制台中打开您的 Mobile Hub 项目。项目 ID 是控制台地址(格式为 XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)的 GUID 部分。

连接到您的后端

AWS Mobile 使用开源 AWS Amplify 库将您的代码连接到为您的应用程序配置的 AWS 功能。

指南的此部分展示了使用 create-react-app 或类似工具的此类输出响应应用程序的示例。

将应用程序连接到您配置的 AWS 功能

在 index.js (或在启动时运行的其他代码) 中,添加以下 import 语句。

import Amplify from 'aws-amplify';import awsmobile from './YOUR-PATH-TO/aws-exports';

然后添加以下代码。

Amplify.configure(awsmobile);

在本地运行您的应用程序

您的应用程序现已准备就绪,可以启动和使用默认的、AWS Mobile 配置的功能。

在本地的浏览器中启动您的应用程序

在您的应用程序根文件夹中,运行:

awsmobile run

在后台,此命令将运行 npm install 以便安装 Amplify 库,同时推送任何 AWS Mobile 的后端配置更改。要在本地运行您的应用程序而不推送后端更改,您可以选择运行 npm install,然后运行 npm start。

每次启动您的应用程序,都会收集应用程序分析,并且可在 AWS 控制台 (p. 141)中进行查看。

AWS 免费套餐 如果您将应用程序初始化或通过 CLI 添加功能,那么系统将代表您对 AWS 服务进行配置。AWSMobile 服务定价可帮助您使用 AWS 免费套餐花很少的费用或者免费学习和制作原型。

138

AWS Mobile Hub 开发人员指南 开发人员指南Web

后续步骤

主题• 将您的应用程序部署到云 (p. 139)• 在我们的移动设备上测试您的应用程序 (p. 139)• 添加功能 (p. 140)• 了解更多 (p. 141)

将您的应用程序部署到云

使用简单的命令,您可以发布您的应用程序前端,将其托管在强大的内容分配网络 (CDN) 并在浏览器中查看。

将您的应用程序部署到云,并在浏览器中启动此应用程序

在您的应用程序根文件夹中,运行:

awsmobile publish

要将任何后端配置更改推送至 AWS 并在本地查看内容,请运行 awsmobile run。在这两种情况下,您对后端配置所做的任何待处理更改都将实施到您的后端资源中。

默认情况下,CLI 会配置 AWS Mobile 托管和流式处理 (p. 192)功能,此功能会将您的应用程序托管到Amazon CloudFront CDN 终端节点。这些位置使您的应用程序在 Internet 上对公众高度可用,并支持媒体文件流式处理。

您也可以给在托管位置使用自定义域 (p. 154)。

在我们的移动设备上测试您的应用程序

调用针对各种现实设备的应用程序的免费远程测试,并查看结果,包括屏幕截图。

调用针对您应用程序的远程测试

在您的应用程序根文件夹中,运行:

awsmobile publish --test

CLI 将会在 Mobile Hub 控制台中打开您应用程序的报告页面,以显示从测试设备中收集的指标。运行您调用的远程测试的设备位于 AWS Device Farm,其可以提供灵活的测试和报告配置。

139

AWS Mobile Hub 开发人员指南 开发人员指南Web

添加功能

使用 CLI 将以下 AWS Mobile 功能添加到您的移动应用程序。

• 分析 (p. 141)• 用户登录 (p. 142)• NoSQL 数据库 (p. 143)• 用户文件存储 (p. 148)• 云逻辑 (p. 150)

140

AWS Mobile Hub 开发人员指南 开发人员指南Web

了解更多

有关此命令和使用 AWS Mobile CLI 的详细信息,请参阅 AWS Mobile CLI 参考 (p. 157)。

了解 AWS Mobile Amplify。

添加分析Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

您的应用程序已启用基本分析后端

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 136)步骤。

您完成 AWS Mobile CLI 设置和启动您的应用程序后,匿名会话和设备背景统计数据将流入 AWS 分析后端。

向 AWS 发送基本应用程序使用情况分析

运行以下功能在本地启动您的应用程序:

npm start

您使用您的应用程序 Amazon Pinpoint 服务收集分析数据并使之可视化时。

使用 Amazon Pinpoint 控制台查看分析

1. 至少运行一次 npm start、awsmobile run 或 awsmobile publish --test。2. 在 AWS Mobile Hub 控制台中打开您的项目。

awsmobile console

3. 选择左侧 Analytics (分析) 图标,以导航到您在 Amazon Pinpoint 控制台中的项目。4. 选择左侧的 Analytics (分析)。

您应该可以在多个图表中看到小幅上升。

将自定义分析添加到您的应用程序

您可以配置您的应用程序,以便 Amazon Pinpoint 为您在代码流中注册的自定义事件收集数据。

检测您的应用程序中的自定义分析

在包含您想要跟踪的事件的文件中,添加以下 import 语句:

import { Analytics } from 'aws-amplify';

141

AWS Mobile Hub 开发人员指南 开发人员指南Web

添加一个如下所示的调用到您的 JavaScript 中的 Spot,此时跟踪的事件应被触发:

componentDidMount() { Analytics.record('FIRST-EVENT-NAME');}

或者到相关页面元素:

handleClick = () => { Analytics.record('SECOND-EVENT-NAME');}

<button onClick={this.handleClick}>Call request</button>

测试 :

1. 请保存更改并运行 npm start、awsmobile run 或 awsmobile publish --test 启动您的应用程序。使用您的应用程序,以便触发跟踪事件。

2. 在 Amazon Pinpoint 控制台,选择顶部附近的 Events (事件)。3. 在左侧 Event (事件) 下拉菜单中选择一个事件。

自定义事件数据可能需要几分钟才能显示在控制台中。

后续步骤

了解有关 AWS Mobile 中的分析(作为消息收发与分析 (p. 190)功能的一部分)的更多信息。此功能会使用Amazon Pinpoint。

了解 AWS Mobile CLI (p. 157)。

了解 AWS Mobile Amplify。

添加身份验证/用户登录Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 136)步骤。

用于用户身份验证的 AWS Mobile CLI 组件包含内容丰富的可配置的用户界面,用于注册和登录。

启用身份验证功能

在您的应用程序根文件夹中,运行:

awsmobile user-signin enable

142

AWS Mobile Hub 开发人员指南 开发人员指南Web

awsmobile push

连接到您的后端

AWS Mobile CLI 可让您从命令行集成现成的注册/登录/注销用户界面。

将用户身份验证用户界面添加到您的应用程序

1. 安装 AWS Amplify for React 库。

npm install --save aws-amplify-react

2. 在 App.js (或在应用程序启动时运行的其他文件) 中添加以下 import 语句:

import { withAuthenticator } from 'aws-amplify-react';

3. 然后将 export default App; 更改为以下值。

export default withAuthenticator(App);

要测试,请运行 npm start、awsmobile run 或 awsmobile publish --test。

后续步骤

了解有关使用 Amazon Cognito 的 AWS Mobile 用户登录 (p. 198)功能的更多信息。

了解 AWS Mobile CLI (p. 157)。

了解 AWS Mobile Amplify。

访问您的数据库Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

利用 AWS Mobile CLI 和 Amplify 库,您可以轻松地通过 JavaScript 应用程序中的简单 API 调用对存储在云中的数据执行创建、读取、更新和删除 (“CRUD”) 操作。

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 136)步骤。

创建数据库

1. 启用 NoSQL 数据库功能并配置您的表。

在您的应用程序根文件夹中,运行:

143

AWS Mobile Hub 开发人员指南 开发人员指南Web

awsmobile database enable --prompt

2. 选择 Open 以使此表中的数据可供应用程序的所有用户查看。

? Should the data of this table be open or restricted by user?# Open Restricted

3. 在本例中,键入 todos 作为您的 Table name。

? Table name: todos

添加列和查询

您要在 NoSQL 数据库中创建一个表并添加一组初始列,每个列都有一个名称和一个数据类型。利用NoSQL,每当您存储包含一个新列的数据时,您就会添加一个列。NoSQL 表必须有一个定义为主键的列,主键是每个行的唯一标识符。

1. 在本例中,按照提示添加三个列:team (字符串)、todoId (数字) 和 text (字符串)。

? What would you like to name this column: team? Choose the data type: string

2. 当系统提示 ? Add another column 时,键入 Y,然后选择 Enter。重复上述步骤以创建 todoId 和text 列。

3. 选择 team 作为主键。

? Select primary key# team todoId text

4. 选择 (todoId) 作为排序键,然后选择 no 不再添加索引,以保持示例的简单性。

排序键和索引 要优化性能,您可以定义一个列作为排序键。如果某个列会频繁与主键结合使用来查询您的表,请选择该列作为排序键。您还可以创建二级索引以让更多列作为排序键。

? Select sort key# todoId text (No Sort Key)

? Add index (Y/n): nTable todos saved.

现在已创建 todos 表。

使用云 API 执行 CRUD 操作

为了访问您的 NoSQL 数据库,您将创建一个可通过您的应用程序调用的 API 来执行 CRUD 操作。

144

AWS Mobile Hub 开发人员指南 开发人员指南Web

为何创建 API? 使用 API 访问您的数据库可在前端提供简单的编码接口,在后端可提供稳健的灵活性。在后台,对云中的 Amazon API Gateway API 终端节点的调用将由无服务器 Lambda 函数处理。

创建 CRUD API

1. 启用和配置云逻辑功能**

awsmobile cloud-api enable --prompt

2. 为现有 Amazon DynamoDB 表选择 Create CRUD API for an existing Amazon DynamoDBtable API,然后选择 Enter。

? Select from one of the choices below. (Use arrow keys) Create a new API# Create CRUD API for an existing Amazon DynamoDB table

3. 选择在先前步骤中创建的 todos 表,然后选择 Enter。

? Select Amazon DynamoDB table to connect to a CRUD API# todos

4. 将您的配置推送到云。如果不执行此步骤,您的数据库和 API 的配置现在只部署到您的本地计算机上。

awsmobile push

现在将创建所需的 DynamoDB 表、API Gateway 终端节点和 Lambda 函数。

创建您的第一个 TODO

利用 AWS Mobile CLI,您能够通过命令行测试 API。

运行以下命令以创建您的第一个 todo。

awsmobile cloud-api invoke todosCRUD POST /todos '{"body": {"team": "React", "todoId": 1, "text": "Learn more Amplify"}}'

连接到您的后端

本部分中的示例为您演示如何使用 React 集成 AWS Amplify 库调用(要使用其他风格的 Javascript,请参阅AWS Amplify 文档)。

以下组件是您可能添加到 create-react-app 项目的简单 Todo 列表。Todos 组件当前在内存阵列中添加和显示 todos。

// To Do app example

import React from 'react';

class Todos extends React.Component { state = { team: "React", todos: [] };

145

AWS Mobile Hub 开发人员指南 开发人员指南Web

render() { let todoItems = this.state.todos.map(({todoId, text}) => { return <li key={todoId}>{text}</li>; });

return ( <div style={styles}> <h1>{this.state.team} Todos</h1> <ul> {todoItems} </ul>

<form> <input ref="newTodo" type="text" placeholder="What do you want to do?" /> <input type="submit" value="Save" /> </form> </div> ); }}

let styles = { margin: "0 auto", width: "25%"};

export default Todos;

通过云显示 todos

AWS Amplify 中的 API 模块允许您通过 API 网关 终端节点连接到 DynamoDB。

在数据库中检索和显示项目

1. 在 Todos 组件文件的顶部导入 API 中的 aws-amplify 模块。

import { API } from 'aws-amplify';

2. 将以下 componentDidMount 添加到 Todos 组件以提取所有 todos。

async componentDidMount() { let todos = await API.get('todosCRUD', `/todos/${this.state.team}`); this.setState({ todos });}

当 Todos 组件附加时,它将提取存储在数据库中的所有 todos 并显示它们。

将 todos 保存到云

以下代码段显示了用于 ToDo 应用程序的 saveTodo 函数。

async saveTodo(event) { event.preventDefault();

const { team, todos } = this.state; const todoId = todos.length + 1; const text = this.refs.newTodo.value;

const newTodo = {team, todoId, text};

146

AWS Mobile Hub 开发人员指南 开发人员指南Web

await API.post('todosCRUD', '/todos', { body: newTodo }); todos.push(newTodo); this.refs.newTodo.value = ''; this.setState({ todos, team });}

更新组件的渲染函数中的 form 元素以在提交窗体时调用 saveTodo 函数。

<form onSubmit={this.saveTodo.bind(this)}>

您的整个组件应该类似以下内容:

// To Do app example

import React from 'react';import { API } from 'aws-amplify';

class Todos extends React.Component { state = { team: "React", todos: [] };

async componentDidMount() { const todos = await API.get('todosCRUD', `/todos/${this.state.team}`) this.setState({ todos }); }

async saveTodo(event) { event.preventDefault();

const { team, todos } = this.state; const todoId = todos.length + 1; const text = this.refs.newTodo.value;

const newTodo = {team, todoId, text}; await API.post('todosCRUD', '/todos', { body: newTodo }); todos.push(newTodo); this.refs.newTodo.value = ''; this.setState({ todos, team }); }

render() { let todoItems = this.state.todos.map(({todoId, text}) => { return <li key={todoId}>{text}</li>; });

return ( <div style={styles}> <h1>{this.state.team} Todos</h1> <ul> {todoItems} </ul>

<form onSubmit={this.saveTodo.bind(this)}> <input ref="newTodo" type="text" placeholder="What do you want to do?" /> <input type="submit" value="Save" /> </form> </div> ); }}

let styles = { margin: "0 auto",

147

AWS Mobile Hub 开发人员指南 开发人员指南Web

width: "25%"}

export default Todos;

后续步骤

• 了解如何使用 AWS Amplify 中的 API 模块检索特定项目等。• 了解如何使用 AWS Mobile CLI 为应用程序启用更多功能。

添加存储Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置后端

AWS Mobile CLI 和 AWS Amplify 库让您可以轻松地在云中存储和管理您 JavaScript 应用程序的文件。

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 136)步骤。

在您的应用程序根文件夹中运行以下命令,以启用用户文件存储功能。

awsmobile user-files enable

awsmobile push

连接到后端

本部分中的示例为您演示如何使用 React 集成 AWS Amplify 库调用(要使用其他风格的 Javascript,请参阅AWS Amplify 文档)。

以下简单的组件可以添加到 create-react-app 项目,以便展示上传镜像并下载镜像以供显示的接口。

// Image upload and download for display example component// src/ImageViewer.js

import React, { Component } from 'react';

class ImageViewer extends Component { render() { return ( <div> <p>Pick a file</p> <input type="file" /> </div> ); }

148

AWS Mobile Hub 开发人员指南 开发人员指南Web

}

export default ImageViewer;

上传文件

该 Storage 模块可帮助您把文件上传到云中。默认情况下,所有上传文件均支持公开查看。

在您的组件文件中导入 Storage 模块。

// ./src/ImageViewer.js

import { Storage } from 'aws-amplify';

添加以下函数,以便使用 put 模块上的 Storage 函数,将文件上传到云,并将您组件的状态设置为文件名称。

uploadFile(event) { const file = event.target.files[0]; const name = file.name;

Storage.put(key, file).then(() => { this.setState({ file: name }); });}

在组件的渲染函数 uploadFile 元素的 input 函数中创建一个调用,在用户选择文件时开始上传。

render() { return ( <div> <p>Pick a file</p> <input type="file" onChange={this.uploadFile.bind(this)} /> </div> );}

显示镜像

要显示镜像,此示例显示了将 AWS Amplify 的 S3Image 组件用于 React 库的方法。

1. 利用终端,在您应用程序的根文件夹中运行以下命令。

npm install --save aws-amplify-react

2. 在您的组件中导入 S3Image 模块。

import { S3Image } from 'aws-amplify-react';

在渲染函数中使用 S3Image 组件。将您的渲染函数更新为如下格式:

render() { return ( <div>

149

AWS Mobile Hub 开发人员指南 开发人员指南Web

<p>Pick a file</p> <input type="file" onChange={this.handleUpload.bind(this)} /> { this.state && <S3Image path={this.state.path} /> } </div> );}

放在一起,整个组件应该是如下格式:

// Image upload and download for display example component

import React, { Component } from 'react';import { Storage } from 'aws-amplify';import { S3Image } from 'aws-amplify-react';

class ImageViewer extends Component {

handleUpload(event) { const file = event.target.files[0]; const path = file.name; Storage.put(path, file).then(() => this.setState({ path }) ); }

render() { return ( <div> <p>Pick a file</p> <input type="file" onChange={this.handleUpload.bind(this)} /> { this.state && <S3Image path={this.state.path} /> } </div> ); }}

export default ImageViewer;

后续步骤

• 了解如何使用 AWS Amplify 中的存储模块进行私有文件存储和更多其他操作。• 了解如何使用 AWS Mobile CLI 为应用程序启用更多功能。• 了解如何借助 AWS Amplify 库使用应用程序中的那些功能。• 了解有关用户文件存储功能分析的更多信息。• 了解更多关于如何在 Amazon Simple Storage Service 中存储文件的信息。

访问您的 APIImportant

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

AWS Mobile CLI 和 Amplify 库使您可以通过 JavaScript 轻松地创建和调用云 API 及其处理程序逻辑。

150

AWS Mobile Hub 开发人员指南 开发人员指南Web

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 136)步骤。

创建您的 API

在以下示例中,您将创建一个 API,它是支持云的猜数应用程序的一部分。CLI 将在后台为该 API 创建一个无服务器处理程序。

启用并配置一个 API

1. 在您的应用程序根文件夹中,运行:

awsmobile cloud-api enable --prompt

2. 系统提示时,将该 API 命名为 Guesses。

? API name: Guesses

3. 将一个 HTTP 路径命名为 /number。这将映射到 API 处理程序中的方法调用。

? HTTP path name (/items): /number

4. 将您的 Lambda API 处理程序函数命名为 guesses。

? Lambda function name (This will be created if it does not already exists): guesses

5. 当系统提示添加另一个 HTTP 路径时,请键入 N。

? Add another HTTP path (y/N): N

6. 您的 Guesses API 的配置现在已在本地保存。将您的配置推送到云。

awsmobile push

测试您的 API 和处理程序

在命令行处,运行:

awsmobile cloud-api invoke Guesses GET /number

现在已创建 Guesses API 的云逻辑 API 终端节点。

自定义您的 API 处理程序逻辑

AWS Mobile CLI 已生成一个 Lambda 函数来处理对 Guesses API 的调用。该函数本地保存在 YOUR-APP-ROOT-FOLDER/awsmobilejs/backend/cloud-api/guesses 中。该目录中的 app.js 文件包含为您的 API 处理的所有路径的定义和功能代码。

自定义您的 API 处理程序

1. 在 /number 路径上查找 POST 请求的处理程序。该行以 app.post('number', 开头。将回调函数的正文替换为以下内容:

# awsmobilejs/backend/cloud-api/guesses/app.jsapp.post('/number', function(req, res) {

151

AWS Mobile Hub 开发人员指南 开发人员指南Web

const correct = 12; let guess = req.body.guess let result = ""

if (guess === correct) { result = "correct"; } else if (guess > correct) { result = "high"; } else if (guess < correct) { result = "low"; }

res.json({ result })});

2. 将您的更改推送到云。

awsmobile push

实现您的新猜数功能的 GuessesAPI 处理程序现已部署到云中。

连接到您的后端

本部分中的示例为您演示如何使用 React 集成 AWS Amplify 库调用(要使用其他风格的 Javascript,请参阅AWS Amplify 文档)。

可将以下简单组件添加到 create-react-app 项目以呈现猜数游戏。

// Number guessing game app example

# src/GuessNumber.js

class GuessNumber extends React.Component { state = { answer: null };

render() { let prompt = "" const answer = this.state.answer

switch (answer) { case "lower": prompt = "Incorrect. Guess a lower number." case "higher": prompt = "Incorrect. Guess a higher number." case "correct": prompt = `Correct! The number is ${this.refs.guess.value}!` default: prompt = "Guess a number between 1 and 100." }

return ( <div style={styles}> <h1>Guess The Number</h1> <p>{ prompt }</p>

<input ref="guess" type="text" /> <button type="submit">Guess</button> </div> )

}

152

AWS Mobile Hub 开发人员指南 开发人员指南Web

}

let styles = { margin: "0 auto", width: "30%"};

export default GuessNumber;

进行猜测

AWS Amplify 中的 API 模块可让您直接通过 JavaScript 应用程序将请求发送到云逻辑 API。

进行 RESTful API 调用

1. 在 API 组件文件中导入 aws-amplify 中的 GuessNumber 模块。

import { API } from 'aws-amplify';

2. 添加 makeGuess 函数。此函数使用 API 模块的 post 函数将猜测提交给云逻辑 API。

async makeGuess() { const guess = parseInt(this.refs.guess.value); const body = { guess } const { result } = await API.post('Guesses', '/number', { body }); this.setState({ guess: result });}

3. 更改组件的 render 函数中的 Guess 按钮以在选择此按钮时调用 makeGuess 函数。

<button type="submit" onClick={this.makeGuess.bind(this)}>Guess</button>

在本地打开您的应用程序并通过运行 awsmobile run 测试猜数。

您的整个组件应该类似以下内容:

// Number guessing game app example

import React from 'react';import { API } from 'aws-amplify';

class GuessNumber extends React.Component { state = { guess: null };

async makeGuess() { const guess = parseInt(this.refs.guess.value, 10); const body = { guess } const { result } = await API.post('Guesses', '/number', { body }); this.setState({ guess: result }); }

render() { let prompt = ""

153

AWS Mobile Hub 开发人员指南 开发人员指南Web

switch (this.state.guess) { case "high": prompt = "Incorrect. Guess a lower number."; break; case "low": prompt = "Incorrect. Guess a higher number."; break; case "correct": prompt = `Correct! The number is ${this.refs.guess.value}!`; break; default: prompt = "Guess a number between 1 and 100."; }

return ( <div style={styles}> <h1>Guess The Number</h1> <p>{ prompt }</p>

<input ref="guess" type="text" /> <button type="submit" onClick={this.makeGuess.bind(this)}>Guess</button> </div> )

}}

let styles = { margin: "0 auto", width: "30%"};

export default GuessNumber;

后续步骤

• 了解如何使用 AWS Amplify 中的 API 模块检索特定项目等。• 了解如何使用 AWS Mobile CLI 为应用程序启用更多功能。• 了解有关后台发生的情况的更多信息,请参阅设置 Lambda 和 API Gateway。

托管您的 Web 应用程序Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

主题• 关于托管和流式处理 (p. 154)• 管理您的应用程序资产 (p. 155)• 为您的 Web 应用程序配置自定义域 (p. 156)

关于托管和流式处理

当您首次将 Web 应用程序推送到云时,托管和流式处理功能将被启用,以便在 Web 上以静态方式托管您的应用。使用 AWS Mobile CLI 后,您首次运行以下代码时将发生这种情况:

154

AWS Mobile Hub 开发人员指南 开发人员指南Web

$ awsmobile publish

将使用 Amazon S3 存储桶创建您的内容的容器。内容在 Internet 上公开提供,您可以使用测试 URL 直接预览内容。

放在您的存储桶中的内容将自动分发到全球内容分发网络 (CDN)。Amazon CloudFront 将实施 CDN,CDN可在靠近全球每个用户的终端节点上托管您的应用程序。这些终端节点也可以流式传输媒体内容。要了解更多信息,请参阅 CloudFront 流式处理教程。

默认情况下,托管和流式传输会部署访问您的 AWS 服务的简单示例 Web 应用程序。

管理您的应用程序资产

您可使用 AWS Mobile CLI 或 Amazon S3 控制台管理存储桶的内容。

使用 AWS CLI 管理存储桶内容

通过 AWS CLI,您可以使用命令行查看、上传、移动或删除您存储在存储桶中的文件。要安装和配置 AWSCLI 客户端,请参阅使用 AWS 命令行界面进行设置。

例如,sync 命令支持在您的本地文件夹 (source) 和存储桶 (destination) 之间来回传输文件。

$ aws s3 sync {source destination} [--options]

以下命令会将您当前的本地文件夹中的所有文件同步到由 path 定义的 Web 应用程序的存储桶中的文件夹。

$ aws s3 sync . s3://my-web-app-bucket/path

要了解有关使用 AWS CLI 管理 Amazon S3 的更多信息,请参阅结合使用 Amazon S3 与 AWS 命令行界面

使用 Amazon S3 控制台管理存储桶

要使用 Amazon S3 控制台查看、上传、移动或删除存储在存储桶中的文件,请执行以下步骤。

1. 在项目的根目录中,运行:

awsmobile console

2. 选择带有项目名称的磁贴,然后选择“Hosting and Streaming (托管和流式处理)”磁贴。3. 选择标有 Manage files (管理文件) 的链接以在 Amazon S3 控制台中显示存储桶的内容。

AWS Mobile Hub 控制台中的其他有用函数

Mobile Hub 控制台还提供了浏览到 Web 内容,返回到此页面上的 AWS CLI 内容以及执行其他相关任务的便捷方法。包括:

155

AWS Mobile Hub 开发人员指南 开发人员指南Web

• View from S3 (从 S3 查看) 链接可浏览到存储桶的 Web 内容。启用托管和流式处理后,将用立即可供查看的默认 Web 应用程序文件的文件填充存储桶。

• View from CloudFront (从 CloudFront 查看) 将浏览到从您的存储桶传播到 CDN 的 Web 内容。终端节点传播依赖于网络状况。您可以预计内容将在一小时内分发和可供查看。

• Sync files with the command line (使用命令行来同步文件) 链接可让您转到此页面上的内容,该内容描述了如何使用命令行来管理 Web 应用程序和流式处理存储桶中的媒体文件。

为您的 Web 应用程序配置自定义域

要使用您的自定义域链接到 Web 应用程序,请使用 Route 53 服务配置 DNS 路由。

有关在一个位置托管的 Web 应用程序,请参阅将流量路由到在 Amazon S3 存储桶中托管的网站。

有关通过全球 CDN 分配的 Web 应用程序,请参阅使用域名将流量路由到 Amazon CloudFront Web 分配

AWS Mobile Hub 功能Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

以下页面包含用于 Web (JavaScript) 的 AWS Mobile CLI 参考资料。

主题• AWS Mobile CLI 参考 (p. 157)• AWS Mobile CLI 用户凭证 (p. 165)

156

AWS Mobile Hub 开发人员指南 开发人员指南Web

• 使用 AWS CloudTrail 记录 AWS Mobile CLI API 调用 (p. 167)

AWS Mobile CLI 参考Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

AWS Mobile CLI 还为前端 JavaScript 开发人员提供了一个命令行界面,用来无缝启用 AWS 服务和在其应用程序中配置这些服务。仅需最低的配置,您就可以从您喜爱的终端程序开始使用 AWS Mobile Hub 提供的所有功能。

安装和用法

本部分详细说明了适用于 JavaScript 的 awsmobile CLI 的用法和核心命令。

安装 AWS Mobile CLI

1. 注册 AWS 免费套餐。2. 使用 NPM 安装 Node.js。3. 安装 AWS Mobile CLI

npm install -g awsmobile-cli

4. 使用您的 AWS 凭证配置 CLI

要设置 CLI 使用的工具链权限,请运行:

awsmobile configure

如果系统提示您提供凭证,请按照 CLI 提供的步骤进行。有关更多信息,请参阅为 AWS Mobile CLI 提供IAM 凭证 (p. 165)。

用量

AWS Mobile CLI 用法与其他行业标准命令行界面相似。

awsmobile <command> [options]

help 和 version 选项对所有命令都是通用的。相关部分中详细说明了部分命令的其他特殊选项。

-V, --version output the version number-h, --help output usage information

例如:

awsmobile -helporawsmobile init --help

157

AWS Mobile Hub 开发人员指南 开发人员指南Web

CLI 命令汇总

下方列出了 awsmobile CLI 支持的最新命令集。

awsmobile init (p. 158) 初始化新的 Mobile Hub 项目、检查是否有 IAM 密钥并拉取 aws-exports.js 文件

awsmobile configure (p. 159) 显示现有密钥并允许更改它们 (如果已设置)。如果未设置密钥,请将用户深层链接到 IAM 控制台以创建密钥,然后提示提供访问密钥和私有密钥。此命令帮助编辑 AWS 账户或项目的配置设置。

awsmobile pull (p. 160) 从 Mobile Hub 项目下载最新的 aws-exports.js、YAML 或任何其他相关相关详细信息

awsmobile push (p. 160) 将本地元数据、Lambda 代码、DynamoDB 定义或任何其他相关项目详细信息上传到 Mobile Hub

awsmobile publish (p. 160) 执行 awsmobile push,然后构建客户端应用程序并将其发布到 S3 和 Cloud Front

awsmobile run (p. 161) 执行 awsmobile push,然后执行项目的开始命令以测试运行客户端应用程序

awsmobile console (p. 161) 在默认浏览器中打开 awsmobile Mobile Hub 项目的Web 控制台

awsmobile features (p. 161) 显示可用且已启用的功能。切换为选择或取消选择功能。

awsmobile <feature-name> enable [--prompt] (p. 162)

使用默认值 (和更改提示) 启用功能

awsmobile <feature-name> disable (p. 163) 禁用功能

awsmobile <feature-name> configure (p. 163) 包含特定于功能的子命令 (如 add-table、add-api等)。

awsmobile cloud-api invoke <apiname> <method><path> [init] (p. 165)

调用 API 以进行本地测试。这有助于在您的本地环境中快速测试未签名的 API。

awsmobile delete (p. 165) 删除 Mobile Hub 项目。

awsmobile help [cmd] (p. 165) 显示 [cmd] 的帮助。

init

awsmobile init 命令可初始化新的 Mobile Hub 项目、检查 IAM 密钥和拉取 aws-exports.js 文件。

awsmobile init 命令有两种用途

1. 使用 awsmobilejs 功能初始化当前项目

awsmobile init

当系统提示时,请设置以下项目配置:

Please tell us about your project:

158

AWS Mobile Hub 开发人员指南 开发人员指南Web

? Where is your project's source directory: src? Where is your project's distribution directory that stores build artifacts: build? What is your project's build command: npm run-script build? What is your project's start command for local test run: npm run-script start

? What awsmobile project name would you like to use: my-mobile-project

源目录是 AWS Mobile CLI 复制最新 aws-exports.js 以方便您的前端代码使用的位置。每当添加或删除功能时,此文件都会自动更新。指定错误/不可用的文件夹将不会复制该文件。

Distribution 目录实际上是项目的构建目录。这将在 awsmobile publish 过程中使用。

项目的构建和开始值将分别在 awsmobile publish 和 awsmobile run 命令过程中使用。

awsmobile 项目名称是在 Mobile Hub 中创建的后端项目的名称。

您可以使用 awsmobile configure project (p. 159) 命令更改有关您的项目的设置。2. 初始化并链接到作为后端的现有 awsmobile 项目

awsmobile init <awsmobile-project-id>

awsmobile-project-id 是现有后端项目在 Mobile Hub 中的 ID。此命令帮助将现有后端项目附加到您的应用程序。

3. 从后端删除附加的 awsmobile 项目。

awsmobile init --remove

此命令将删除与您的应用程序关联的已附加后端项目并清理关联的文件。除了删除后端项目本身,这将不会以任何方式改变您的应用程序。

configure

awsmobile configure 将显示现有密钥并允许更改它们 (如果已设置)。如果未设置密钥,请将用户深层链接到 IAM 控制台以创建密钥,然后提示提供访问密钥和私有密钥。此命令有两种可能的用途。根据选中的参数,此命令可以用于设定或更改 AWS 账户设置或项目设置。

awsmobile configure [aws|project]

1. 使用 aws 参数配置 AWS 账户设置。这是此命令的默认参数

awsmobile configureorawsmobile configure aws

系统将以问题的形式提示您设置 AWS 账户凭证,如下所示

configure aws? accessKeyId: <ACCESS-KEY-ID>? secretAccessKey: <SECRET-ACCESS-KEY>? region: <SELECT-REGION-FROM-THE-LIST>

2. 使用 project 参数配置项目设置

awsmobile configure project

159

AWS Mobile Hub 开发人员指南 开发人员指南Web

系统将以问题的形式提示您配置项目,如下详述

? Where is your project's source directory: src? Where is your project's distribution directory to store build artifacts: dist? What is your project's build command: npm run-script build? What is your project's start command for local test run: npm run-script start

3. 使用 --list 选项检索并显示 AWS 凭证

awsmobile configure --list

pull

awsmobile pull 命令可将 Mobile Hub 项目中的最新 aws-exports.js、YAML 和任何相关的云/后端项下载到本地开发环境。如果您修改了 Mobile Hub 上的项目并且想要在本地环境中获取最新项目,请使用此命令。

awsmobile pull

push

awsmobile push 会将本地元数据、Lambda 代码、Dynamo 定义和任何相关项上传到 Mobile Hub。当您在本地环境中启用、禁用或配置功能并且希望使用相关更新来更新 Mobile Hub 上的后端项目时,请使用此命令。

awsmobile push

在使用 awsmobile push、awsmobile features、awsmobile <feature> enable 或 awsmobile<feature> disable 对后端项目进行相应更新之后,请使用 awsmobile <feature> configure。此命令可在上述各个命令执行后或在本地进行所有更改后使用。

publish

awsmobile publish 命令首先执行 awsmobile push 命令,然后构建客户端代码并将其发布到 AmazonS3 托管存储桶。此命令将客户端应用程序发布到 S3 存储桶以供托管,然后打开浏览器以显示索引页面。如果在部署前有必要,它将检查时间戳以自动构建应用程序。它将检查客户端是否已在其后端项目功能中选定托管,如果未选定,它将提示客户端使用托管功能更新后端。

awsmobile publish

发布命令有许多选项可使用。

1. 刷新 Cloud Front 分配

awsmobile publish -c orawsmobile publish --cloud-front

2. 在 AWS Device Farm 上测试应用程序

awsmobile publish -torawsmobile publish --test

160

AWS Mobile Hub 开发人员指南 开发人员指南Web

3. 在 AWS Device Farm 上禁止测试

awsmobile publish -n

4. 仅在未更新后端的情况下发布前端

awsmobile publish -forawsmobile publish --frontend-only

run

awsmobile run 命令首先执行 awsmobile push 命令,然后执行您在项目配置中设置的启动命令 (如npm run start 或 npm run ios)。这可以用于使用发布到云的最新后端开发方便地在本地测试运行您的应用程序。

awsmobile run

控制台

awsmobile console 命令将在默认浏览器中打开 awsmobile Mobile Hub 项目的 Web 控制台

awsmobile console

features

awsmobile features 命令将显示所有可用 awsmobile 功能,并允许您在本地分别启用/禁用它们。使用箭头键可向上和向下滚动,使用空格键可启用/禁用每个功能。请注意,更改仅在本地进行,执行 awsmobilepush 可在云中更新 awsmobile 项目。

awsmobile features

AWS Mobile CLI 支持的功能包括:

• user-signin (Amazon Cognito)• user-files (Amazon S3)• cloud-api (Lambda / API 网关)• database (DynamoDB)• analytics (Amazon Pinpoint)• hosting(Amazon S3 和 CloudFront)

? select features: (Press <space> to select, <a> to toggle all, <i> to inverse selection)## user-signin # user-files # cloud-api # database # analytics # hosting

禁用某个功能时请小心谨慎。禁用该功能将删除所有相关对象 (API、Lambda 函数、表等)。这些项无法在本地恢复,即使您重新启用该功能也是如此。

161

AWS Mobile Hub 开发人员指南 开发人员指南Web

在使用 awsmobile push 以借助选定的功能更新 AWS Mobile Hub 项目上的后端项目之后,请使用awsmobile <feature> disable。

启用

awsmobile <feature> enable 将使用默认设置启用指定功能。请注意,更改仅在本地进行,执行awsmobile push 可在云中更新 AWS Mobile 项目。

awsmobile <feature> enable

AWS Mobile CLI 支持的功能包括:

• user-signin (Amazon Cognito)• user-files (Amazon S3)• cloud-api (Lambda / API 网关)• database (DynamoDB)• analytics (Amazon Pinpoint)• hosting(Amazon S3 和 CloudFront)

awsmobile <feature> enable --prompt 子命令允许用户指定要启用的 Mobile Hub 功能的详细信息,而不是使用默认设置。它将提示用户回答一系列问题来详细指定功能。

awsmobile <feature> enable -- prompt

启用 user-signin 功能将提示您更改它的启用方式,配置高级设置或禁用项目的登录功能。选择所需选项可能会提示您回答更多问题。

awsmobile user-signin enable --prompt

? Sign-in is currently disabled, what do you want to do next (Use arrow keys)# Enable sign-in with default settings Go to advance settings

使用 user-files 选项启用 --prompt 功能将提示您确认对用户文件使用 S3。

awsmobile user-files enable --prompt

? This feature is for storing user files in the cloud, would you like to enable it? Yes

使用 cloud-api 启用 --prompt 功能将提示您创建、删除或编辑与项目有关的 API。选择所需选项可能会提示您回答更多问题。

awsmobile cloud-api enable --prompt

? Select from one of the choices below. (Use arrow keys) # Create a new API

使用 database 启用 --prompt 功能将提示您回答初始问题来指定与项目有关的数据库表详细信息。选择所需选项可能会提示您回答更多问题。

awsmobile database enable --prompt

162

AWS Mobile Hub 开发人员指南 开发人员指南Web

? Should the data of this table be open or restricted by user? (Use arrow keys)# Open Restricted

使用 analytics 选项启用 --prompt 功能将提示您确认使用 Pinpoint Analytics。

awsmobile analytics enable --prompt

? Do you want to enable Amazon Pinpoint analytics? (y/N)

使用 hosting 启用 --prompt 功能将提示您确认托管和流式处理 CloudFront 分配。

awsmobile hosting enable --prompt

? Do you want to host your web app including a global CDN? (y/N)

在使用 awsmobile <feature> enable 更新云中的 awsmobile 项目后,请执行 awsmobile push。

disable

awsmobile <feature> disable 将在其后端项目中禁用此功能。禁用某个功能时请小心谨慎。禁用该功能将删除所有相关对象 (API、Lambda 函数、表等)。这些项无法在本地恢复,即使您重新启用该功能也是如此。

awsmobile <feature> disable

AWS Mobile CLI 支持的功能包括:

• user-signin (Amazon Cognito)• user-files (Amazon S3)• cloud-api (Lambda / API 网关)• database (DynamoDB)• analytics (Amazon Pinpoint)• hosting `

在使用 awsmobile push 以借助禁用的功能更新 AWS Mobile Hub 项目上的后端项目之后,请使用awsmobile <feature> disable。

configure

awsmobile <feature> configure 将配置选定功能中的对象。此配置可能意味着添加、删除或更新特定项。仅当启用了特定功能时可使用此命令。

awsmobile <feature> configure

AWS Mobile CLI 支持的功能包括:

• user-signin (Amazon Cognito)• user-files (Amazon S3)• cloud-api (Lambda / API 网关)

163

AWS Mobile Hub 开发人员指南 开发人员指南Web

• database (DynamoDB)• analytics (Amazon Pinpoint)• hosting(Amazon S3 和 CloudFront)

配置 user-signin 功能将提示您更改它的启用方式,配置高级设置或禁用项目的登录功能。选择所需选项可能会提示您回答更多问题。

awsmobile user-signin configure

? Sign-in is currently enabled, what do you want to do next (Use arrow keys)# Configure Sign-in to be required (Currently set to optional) Go to advance settings Disable sign-in

配置 user-files 功能将提示您确认对用户文件使用 S3。

awsmobile user-files configure

? This feature is for storing user files in the cloud, would you like to enable it? (Y/n)

配置 cloud-api 功能将提示您创建、删除或编辑与项目有关的 API。选择所需选项可能会提示您回答更多问题。

awsmobile cloud-api configure

? Select from one of the choices below. (Use arrow keys)# Create a new API Remove an API from the project Edit an API from the project

配置 database 功能将提示您创建、删除或编辑与项目有关的表。选择所需选项可能会提示您回答更多问题。

awsmobile database configure

? Select from one of the choices below. (Use arrow keys) # Create a new table Remove table from the project Edit table from the project

配置 analytics 功能将提示您确认使用 Pinpoint Analytics。

awsmobile analytics configure

? Do you want to enable Amazon Pinpoint analytics? Yes

配置 hosting 功能将提示您确认托管和流式处理 CloudFront 分配。

awsmobile hosting configure

? Do you want to host your web app including a global CDN? Yes

在使用 awsmobile push 以借助配置的功能更新 AWS Mobile Hub 项目上的后端项目后,请使用awsmobile <feature> configure。

164

AWS Mobile Hub 开发人员指南 开发人员指南Web

调用

awsmobile cloud-api invoke 将调用 API 以进行本地测试。此命令有助于通过传递相应的参数在本地测试未签名的 API。它适合用于开发环境或用于调试您的 API/Lambda 函数。

awsmobile cloud-api invoke <apiname> <method> <path> [init]

例如,您可以按下面所示调用 sampleCloudApi post 方法

awsmobile cloud-api invoke sampleCloudApi post /items '{"body":{"test-key":"test-value"}}'

上面的测试将返回一个值,该值看上去类似于

{ success: 'post call succeed!', url: '/items', body: { 'test-key': 'test-value' } }

同样,您可以按下面所示调用 sampleCloudApi get 方法

awsmobile cloud-api invoke sampleCloudApi get /items

上面的测试将返回一个值,该值看上去类似于

{ success: 'get call succeed!', url: '/items' }

删除

awsmobile delete 命令将删除云中的 Mobile Hub 项目。当您决定执行此命令时,请格外小心谨慎,因为它可能对团队的工作带来不可挽回的影响,一旦执行了此命令,Mobile Hub 项目将被删除且无法恢复。

awsmobile delete

帮助

awsmobile help 命令可以用作独立命令,或者也可以将您需要帮助了解的命令的名称作为参数传递。这将提供该命令 (包括可与它一起使用的任何选项) 的使用信息。

例如:

awsmobile helporawsmobile help init

本页开头详述的 --help 选项以及 awsmobile help 命令提供了相同程度的细节。它们的差别在于用途。

AWS Mobile CLI 用户凭证Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

165

AWS Mobile Hub 开发人员指南 开发人员指南Web

概述

第一次设置 CLI 时,系统会提示您提供 AWS 用户凭证。这些凭证为 CLI 提供代表您管理 AWS 服务的权限。它们必须属于使用 CLI 的账户中具有管理员权限的 AWS IAM 用户。

权限

AWS 账户管理员授予管理员权限。如果没有管理员权限,您需要让 AWS 账户管理员授予这些权限。

如果您是账户所有者并使用账户的根凭证登录,则您具有管理员权限,也可以使用AdministratorAccess 托管策略为自己授予管理员权限。最佳实践是在您的账户中创建新的 IAM 用户以访问 AWS 服务,而不是使用根凭证。

有关更多信息,请参阅控制对 Mobile Hub 项目的访问 (p. 207)。

获取账户用户凭证

如果您具有管理员权限,您需要为 CLI 提供的值是您的 IAM 用户的访问密钥 ID 和私有访问密钥。如果没有,您需要从管理员获取该 ID 和密钥。

要为 AWS CLI 提供 ID 和密钥,请按照 CLI 提示登录到 AWS,并提供一个用户名和 AWS 区域。CLI 将打开AWS IAM console (AWS IAM 控制台) 的 Add user (添加用户) 对话框,附加 AdministratorAccess 策略并默认选择 Programmatic access (编程访问) 选项。

主题• 获取新用户的凭证 (p. 166)• 获取现有用户的凭证 (p. 167)

获取新用户的凭证

1. 选择 Next: Permissions (下一步: 权限),然后选择 Create user (创建用户)。

或者,您也可以将用户添加到附加了 AdministratorAccess 的组中。

2. 选择 Create user。

166

AWS Mobile Hub 开发人员指南 开发人员指南Web

3. 从显示的表中复制这些值,或选择 Download .csv (下载 .csv) 以在本地保存这些值,然后在提示框中键入这些值。

有关更详细的步骤,请参阅添加具有管理员权限的新账户用户 (p. 208)。

获取现有用户的凭证

1. 选择 cancel (取消)。2. 在左侧,选择 Users (用户),然后从列表中选择该用户。选择 Security credentials (安全凭证),然后选择

Create access key (创建访问密钥)。

使用 AWS CloudTrail 记录 AWS Mobile CLI API 调用Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

AWS Mobile CLI 与 AWS CloudTrail 集成,后者一项服务,用于记录 CLI 中的用户、角色或 AWS 服务所执行的操作。CloudTrail 将对 CLI 的所有 API 调用作为事件捕获,包括来自对 CLI API 的代码调用的调用。如果您创建了跟踪,则可以使 CloudTrail 事件持续传送到 Amazon S3 存储桶(包括 CLI 的事件)。如果您不配置跟踪,则仍可在 CloudTrail 控制台的 Event history (事件历史记录) 中查看最新事件。通过使用CloudTrail 收集的信息,您可以确定向 CLI 发出了什么请求、发出请求的 IP 地址、请求的发出方、请求的发出时间以及其他详细信息。

要了解有关 CloudTrail的更多信息,请参阅 AWS CloudTrail 用户指南。

CloudTrail 中的 AWS Mobile CLI 信息

在您创建 AWS 账户时,即针对该账户启用了 CloudTrail。当 AWS Mobile CLI 中发生活动时,该活动将记录在 CloudTrail 事件中,并与其他 AWS 服务事件一同保存在 Event history (事件历史记录) 中。您可以在AWS 账户中查看、搜索和下载最新事件。有关更多信息,请参阅使用 CloudTrail 事件历史记录查看事件。

167

AWS Mobile Hub 开发人员指南 开发人员指南Web

要持续记录 AWS 账户中的事件(包括 AWS Mobile CLI 的事件),请创建跟踪。通过跟踪,CloudTrail 可将日志文件传送至 Amazon S3 存储桶。默认情况下,在控制台中创建跟踪时,此跟踪应用于所有区域。此跟踪在 AWS 分区中记录所有区域中的事件,并将日志文件传送至您指定的 Amazon S3 存储桶。此外,您可以配置其他 AWS 服务,进一步分析在 CloudTrail 日志中收集的事件数据并采取操作。有关更多信息,请参阅:

• 创建跟踪概述• CloudTrail 支持的服务和集成• 为 CloudTrail 配置 Amazon SNS 通知• 从多个区域接收 CloudTrail 日志文件和从多个账户接收 CloudTrail 日志文件

所有 AWS Mobile CLI 操作均由 CloudTrail 记录并记载到 AWS Mobile CLI API 参考 (p. 157)中。例如,对 awsmobile init、awsmobile pull 和 awsmobile push 的调用会在 CloudTrail 日志文件中生成条目。

每个事件或日志条目都包含有关生成请求的人员的信息。身份信息帮助您确定以下内容:

• 请求是使用根用户凭证还是 AWS Identity and Access Management (IAM) 用户凭证发出的。• 请求是使用角色还是联合身份用户的临时安全凭证发出的。• 是否由其他 AWS 服务发出请求。

有关更多信息,请参阅 CloudTrail userIdentity 元素。

了解 AWS Mobile CLI 日志文件条目

跟踪是一种配置,可用于将事件作为日志文件传送到您指定的 Amazon S3 存储桶。CloudTrail 日志文件包含一个或多个日志条目。一个事件表示来自任何源的一个请求,包括有关所请求的操作、操作的日期和时间、请求参数等方面的信息。CloudTrail 日志文件不是公用 API 调用的有序堆栈跟踪,因此它们不会以任何特定顺序显示。

下面的示例显示了一个 CloudTrail 日志条目,该条目说明了 ListProjects 操作。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "ABCDEFGHIJK0123456789", "arn": "arn:aws:iam::012345678901:user/Administrator", "accountId": "012345678901", "accessKeyId": "ABCDEFGHIJK0123456789", "userName": "YOUR_ADMIN_USER_NAME" }, "eventTime": "2017-12-18T23:10:13Z", "eventSource": "mobilehub.amazonaws.com", "eventName": "ListProjects", "awsRegion": "us-west-2", "sourceIPAddress": "111.111.111.111", "userAgent": "aws-cli/1.11.140 Python/2.7.13 Darwin/15.6.0 botocore/1.6.7 ", "requestParameters": { "maxResults": 0 }, "responseElements": { "projects": [{ "name": "YOUR_PROJECT_NAME-0123456789012", "projectId": "abcd0123-0123-0123-0123-abcdef012345" }] }, "requestID": "abcd0123-0123-0123-0123-abcdef012345",

168

AWS Mobile Hub 开发人员指南 开发人员指南React Native

"eventID": "abcd0123-0123-0123-0123-abcdef012345", "eventType": "AwsApiCall", "recipientAccountId": "012345678901"}

适用于 React Native 的 AWS Amplify 库Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

AWS Amplify 是一个开源 JavaScript 库,可供前端和移动开发人员构建支持云的应用程序。该库是一个各种不同操作类别间的声明性接口,旨在使常见任务更加简便地添加到您的应用程序。默认实施需要与 AmazonWeb Services (AWS) 资源结合使用,但是采用开放和可插拔式设计,旨在结合使用其他希望提供实施或自定义后端的云服务。

AWS Mobile CLI (在 AWS Mobile Hub 构建) 可为前端 JavaScript 开发人员提供命令行界面,用来在其应用程序中无缝启用和配置 AWS 服务。仅需最低的配置,您就可以从您喜爱的终端应用程序开始使用 AWSMobile Hub 提供的所有功能。

主题• 入门 (p. 169)• AWS Mobile Hub 功能 (p. 182)

入门Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

概述

AWS Mobile CLI 提供的命令行体验可以使前端 JavaScript 开发人员快速创建并将 AWS 后端资源集成到他们的移动应用程序。

先决条件

1. 注册 AWS 免费套餐,花很少的费用或者免费学习和制作原型。2. 使用 NPM 安装 Node.js。3. 安装 AWS Mobile CLI

npm install --global awsmobile-cli

4. 使用您的 AWS 凭证配置 CLI

要设置 CLI 使用的工具链权限,请运行:

awsmobile configure

169

AWS Mobile Hub 开发人员指南 开发人员指南React Native

如果系统提示您提供凭证,请按照 CLI 提供的步骤进行。有关更多信息,请参阅为 AWS Mobile CLI 提供IAM 凭证 (p. 165)。

设置您的后端

需要创建快速示例 React Native 应用程序? 请参阅创建 React Native 应用程序。

为您的应用程序配置后端功能

1. 在您的应用程序根文件夹中,运行:

awsmobile init

该 init 命令可为您的应用程序创建后端项目。默认情况下,您的后端已启用分析和 Web 托管,并且当您初始化时这项配置会自动推送至您的应用程序。

2. 系统提示时,请为您的项目提供源目录。CLI 将在此位置生成 aws-exports.js。此文件包含用于将您的前端连接到后端服务的配置和终端节点元数据。

? Where is your project's source directory: /

然后使用以下值响应进一步提示。

Please tell us about your project:? Where is your project's source directory: /? Where is your project's distribution directory that stores build artifacts: build? What is your project's build command: npm run-script build? What is your project's start command for local test run: npm run-script start

连接到您的后端AWS Mobile 使用开源 AWS Amplify 库将您的代码连接到为您的应用程序配置的 AWS 功能。

将应用程序连接到您配置的 AWS 服务

1. 为 React Native 库安装 AWS Amplify。

npm install --save aws-amplify

2. 在 App.js (或在启动时运行的其他代码) 中,添加以下 import 语句。

import Amplify from 'aws-amplify';

import aws_exports from './YOUR-PATH-TO/aws-exports';

3. 然后添加以下代码。

Amplify.configure(aws_exports);

在本地运行您的应用程序

您的应用程序现已准备就绪,可以启动和使用默认的、AWS Mobile 配置的服务。

170

AWS Mobile Hub 开发人员指南 开发人员指南React Native

在本地启动您的应用程序

在您使用的 React Native 工具中使用 native 命令。例如,如果您的应用程序使用 create-react-native-app,那么请运行:

npm run android

# OR

npm run ios

每次启动您的应用程序,都会收集应用程序使用率分析数据,并且可在 AWS 控制台 (p. 171)中进行查看。

AWS 免费套餐 如果您将应用程序初始化或通过 CLI 添加功能,那么系统将代表您对 AWS 服务进行配置。AWSMobile 服务定价可帮助您使用 AWS 免费套餐花很少的费用或者免费学习和制作原型。

后续步骤

添加功能

使用 CLI 将以下 AWS Mobile 功能添加到您的移动应用程序。

• 分析 (p. 171)• 用户登录 (p. 173)• NoSQL 数据库 (p. 174)• 用户文件存储 (p. 178)• 云逻辑 (p. 180)

了解更多

有关此命令和使用 AWS Mobile CLI 的详细信息,请参阅 AWS Mobile CLI 参考 (p. 157)。

了解 AWS Mobile Amplify。

添加分析Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

您的应用程序已启用基本分析后端

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 169)步骤。

您完成 AWS Mobile CLI 设置和启动您的应用程序后,匿名会话和设备背景统计数据将流入 AWS 分析后端。

171

AWS Mobile Hub 开发人员指南 开发人员指南React Native

向 AWS 发送基本应用程序使用情况分析

在本地启动您的应用程序,例如,如果您使用 create-react-native-app 创建您的应用程序,通过运行:

npm run android

# Or

npm run ios

您使用您的应用程序 Amazon Pinpoint 服务收集分析数据并使之可视化时。

使用 Amazon Pinpoint 控制台查看分析

1. 至少启动您的应用程序一次。2. 在 AWS Mobile Hub 控制台中打开您的项目。

awsmobile console

3. 选择左侧 Analytics (分析) 图标,以导航到您在 Amazon Pinpoint 控制台中的项目。4. 选择左侧的 Analytics (分析)。

您应该可以在多个图表中看到小幅上升。

将自定义分析添加到您的应用程序

您可以配置您的应用程序,以便 Amazon Pinpoint 为您在代码流中注册的自定义事件收集数据。

检测您的应用程序中的自定义分析

在包含您想要跟踪的事件的文件中,添加以下 import 语句:

import { Analytics } from 'aws-amplify';

添加一个如下所示的调用到您的 JavaScript 中的 Spot,此时跟踪的事件应被触发:

componentDidMount() { Analytics.record('FIRST-EVENT-NAME');}

或者到相关页面元素:

handleClick = () => { Analytics.record('SECOND-EVENT-NAME');}

<Button title="Record event" onPress={this.handleClick}/>

测试 :

1. 保存更改并启动您的应用程序。使用您的应用程序,以便触发跟踪事件。2. 在 Amazon Pinpoint 控制台,选择顶部附近的 Events (事件)。3. 在左侧 Event (事件) 下拉菜单中选择一个事件。

自定义事件数据可能需要几分钟才能显示在控制台中。

172

AWS Mobile Hub 开发人员指南 开发人员指南React Native

后续步骤

了解有关 AWS Mobile 中的分析(作为消息收发与分析 (p. 190)功能的一部分)的更多信息。此功能会使用Amazon Pinpoint。

了解 AWS Mobile CLI (p. 157)。

了解适用于 React Native 的 AWS Amplify 库。

添加身份验证/用户登录Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 169)步骤。

用于用户身份验证的 AWS Mobile CLI 组件包含内容丰富的可配置的用户界面,用于注册和登录。

启用身份验证功能

在您的应用程序根文件夹中,运行:

awsmobile user-signin enable

awsmobile push

连接到您的后端

AWS Mobile CLI 可让您从命令行集成现成的注册/登录/注销用户界面。

将用户身份验证用户界面添加到您的应用程序

1. 为 React Native 库安装 AWS Amplify。

npm install --save aws-amplifynpm install --save aws-amplify-react-native

注意 如果您的 react-native 应用程序不是使用 create-react-native-app 创建的,或者是使用低于v25.0.0 的 Expo 版本(create-react-native-app 后台的引擎)创建的,则您需要在项目中链接适用于 React Native 上的 Auth 模块 amazon-cognito-identity-js 的库。

要链接到该模块,您必须首先弹出项目:

npm run eject

173

AWS Mobile Hub 开发人员指南 开发人员指南React Native

react-native link amazon-cognito-identity-js

1. 在 App.js (或在应用程序启动时运行的其他文件) 中添加以下 import 语句:

import { withAuthenticator } from 'aws-amplify-react-native';

2. 然后将 export default App; 更改为以下值。

export default withAuthenticator(App);

要测试,请运行 npm start 或 awsmobile run。

后续步骤

了解有关使用 Amazon Cognito 的 AWS Mobile 用户登录 (p. 198)功能的更多信息。

了解 AWS Mobile CLI (p. 157)。

了解 AWS Mobile Amplify。

访问您的数据库Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 169)步骤。

AWS Mobile database 功能可帮助您根据需求创建自定义表。CLI 将指导您创建自定义 API 来访问您的数据库。

创建表

指定和创建表

1. 在您的应用程序根文件夹中,运行:

awsmobile database enable --prompt

2. CLI 提示时,设计您的表。

CLI 将提示您提供表和其他表配置,例如列。

Welcome to NoSQL database wizardYou will be asked a series of questions to help determine how to best construct your NoSQL database table.

174

AWS Mobile Hub 开发人员指南 开发人员指南React Native

? Should the data of this table be open or restricted by user? Open? Table name Notes

You can now add columns to the table.

? What would you like to name this column NoteId? Choose the data type string? Would you like to add another column Yes? What would you like to name this column NoteTitle? Choose the data type string? Would you like to add another column Yes? What would you like to name this column NoteContent? Choose the data type string? Would you like to add another column No

选择能标识各项目的唯一主键。(可选) 如果您经常将某列的值与主键结合使用,已进行排序和搜索数据,可选择该列作为排序键。您可以为想要进行排序的各列添加二级索引,以便额外对键进行排序。

Before you create the database, you must specify how items in your table are uniquely organized. This is done by specifying a Primary key. The primary key uniquely identifies each item in the table, so that no two items can have the same key.This could be and individual column or a combination that has "primary key" and a "sort key".To learn more about primary key:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

? Select primary key NoteId? Select sort key (No Sort Key)

You can optionally add global secondary indexes for this table. These are useful when running queries defined by a different column than the primary key.

To learn more about indexes:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.SecondaryIndexes

? Add index NoTable Notes added

创建一个 CRUD API

AWS Mobile 将为您的应用程序创建自定义 API,以便对您的数据库执行创建、读取、更新和删除 (CRUD)操作。

为您的表创建 CRUD API

1. 在您的应用程序根文件夹中,运行:

awsmobile cloud-api enable --prompt

2. 在系统提示时,请选择 Create CRUD API for existing Dynamo table,选择上述步骤中的表名称,然后选择表的访问权限。使用上一部分中的示例表:

? Select from one of the choices below. Create a new API# Create CRUD API for an existing Amazon DynamoDB table

175

AWS Mobile Hub 开发人员指南 开发人员指南React Native

提示响应为:

Path to be used on API for get and remove an object should be like:/Notes/object/:NoteId

Path to be used on API for list objects on get method should be like:/Notes/:NoteId

JSON to be used as data on put request should be like:{ "NoteTitle": "INSERT VALUE HERE", "NoteContent": "INSERT VALUE HERE", "NoteId": "INSERT VALUE HERE"}To test the api from the command line (after awsmobile push) use this commandsawsmobile cloud-api invoke NotesCRUD <method> <path> [init]Api NotesCRUD saved

复制并保留 API 和 JSON 的路径,用于您的应用程序代码。

此功能将利用 Amazon API Gateway 和 AWS Lambda 创建一个 API。您可以选择让 Lambda 函数对Amazon DynamoDB 表执行 CRUD 操作。

3. 更新您的后端。

要创建您已经配置的 API,请运行:

awsmobile push

API 到云的部署完成之前,CLI 会显示消息:cloud-api update status:CREATE_IN_PROGRESS。部署完成后会显示成功创建消息 cloud-api update status:CREATE_COMPLETE。

您可以运行 awmobile console,然后选择 Mobile Hub 控制台中的 Cloud Logic (云逻辑) 来查看 CLI 创建的 API。

连接到您的后端

主题• 保存项目 (创建或更新) (p. 177)• 获取特定项目 (p. 177)• 删除项目 (p. 112)• 执行 CRUD 调用的 UI (p. 178)

从您的应用程序访问数据库表

1. 在 App.js 中,导入以下内容。

import Amplify, { API } from 'aws-amplify';import aws_exports from 'path_to_your_aws-exports';Amplify.configure(aws_exports);

2. 将以下 state 添加到您的组件。

state = { apiResponse: null,

176

AWS Mobile Hub 开发人员指南 开发人员指南React Native

noteId: '' };

handleChangeNoteId = (event) => { this.setState({noteId: event});}

保存项目 (创建或更新)

保存项目

在您应用程序中访问数据库的部分 (例如 React 组件的事件处理程序),调用 put 方法。使用您之前从 CLI 提示响应中复制的 JSON 和 API 根路径 (/Notes)。

// Create a new Note according to the columns we defined earlier async saveNote() { let newNote = { body: { "NoteTitle": "My first note!", "NoteContent": "This is so cool!", "NoteId": this.state.noteId } } const path = "/Notes";

// Use the API module to save the note to the database try { const apiResponse = await API.put("NotesCRUD", path, newNote) console.log("response from saving note: " + apiResponse); this.setState({apiResponse}); } catch (e) { console.log(e); } }

要使用命令行查看您在数据库中保存的项目,请运行:

awsmobile cloud-api invoke NotesCRUD GET /Notes/object/${noteId}

获取特定项目

查询特定项目

使用您要查询的项目的 API 路径 (之前复制) 调用 get 方法。

// noteId is the primary key of the particular record you want to fetch async getNote() { const path = "/Notes/object/" + this.state.noteId; try { const apiResponse = await API.get("NotesCRUD", path); console.log("response from getting note: " + apiResponse); this.setState({apiResponse}); } catch (e) { console.log(e); } }

删除项目

如何删除项目

177

AWS Mobile Hub 开发人员指南 开发人员指南React Native

将此方法添加到您的组件。使用您的 API 路径 (之前复制)。

// noteId is the NoteId of the particular record you want to delete async deleteNote() { const path = "/Notes/object/" + this.state.noteId; try { const apiResponse = await API.del("NotesCRUD", path); console.log("response from deleting note: " + apiResponse); this.setState({apiResponse}); } catch (e) { console.log(e); } }

执行 CRUD 调用的 UI

以下是构建 UI 以执行操作的方式示例。

<View style={styles.container}> <Text>Response: {this.state.apiResponse && JSON.stringify(this.state.apiResponse)}</Text> <Button title="Save Note" onPress={this.saveNote.bind(this)} /> <Button title="Get Note" onPress={this.getNote.bind(this)} /> <Button title="Delete Note" onPress={this.deleteNote.bind(this)} /> <TextInput style={styles.textInput} autoCapitalize='none' onChangeText={this.handleChangeNoteId}/></View>

const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center', }, textInput: { margin: 15, height: 30, width: 200, borderWidth: 1, color: 'green', fontSize: 20, backgroundColor: 'black' }});

后续步骤

了解有关使用 Amazon DynamoDB 的 AWS Mobile NoSQL 数据库 (p. 185)功能的更多信息。

了解 AWS Mobile CLI (p. 157)。

了解 AWS Mobile Amplify。

添加存储Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 Amplify

178

AWS Mobile Hub 开发人员指南 开发人员指南React Native

CLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

应用程序可以使用 AWS Mobile CLI 用户文件存储 (p. 203)功能在云中存储用户文件。

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 169)步骤。

配置您的应用程序的云存储位置

在您的应用程序根文件夹中,运行:

awsmobile user-files enable

awsmobile push

连接到您的后端

将用户文件存储添加到您的应用程序

在要在其中传输文件的组件中:

从 aws-amplify 导入 Storage 模块并将其配置为与您的后端通信。

import { Storage } from 'aws-amplify';

既然存储模块已被导入并已准备好与您的后端通信,请使用以下代码实施常用文件传输操作。

上传文件

将文件上传到存储

将以下方法添加到您在其中处理文件上传的组件。

async uploadFile() { let file = 'My upload text'; let name = 'myFile.txt'; const access = { level: "public" }; // note the access path Storage.put(name, file, access);}

获取特定文件

从云存储下载文件

将以下代码添加到您在其中显示文件的组件。

async getFile() { let name = 'myFile.txt'; const access = { level: "public" }; let fileUrl = await Storage.get(name, access); // use fileUrl to get the file

179

AWS Mobile Hub 开发人员指南 开发人员指南React Native

}

列出所有文件

为您的应用程序列出存储在云中的文件

将以下代码添加到您在其中列出文件集合的组件。

async componentDidMount() { const path = this.props.path; const access = { level: "public" }; let files = await Storage.list(path, access); // use file list to get single files}

使用以下代码提取文件属性,例如大小或上次文件更改的时间。

file.Size; // file sizefile.LastModified.toLocaleDateString(); // last modified datefile.LastModified.toLocaleTimeString(); // last modified time

删除文件

将以下状态添加到您用于处理文件传输的元素。

async deleteFile(key) { const access = { level: "public" }; Storage.remove(key, access);}

后续步骤

了解 AWS Mobile 中的分析(作为用户文件存储 (p. 203)功能的一部分)的更多信息。此功能使用了Amazon Simple Storage Service (S3)。

了解 AWS Mobile CLI (p. 157)。

了解 AWS Mobile Amplify。

访问您的 APIImportant

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

设置您的后端

开始前的准备工作 采取此页面中的步骤前需要先完成入门 (p. 169)步骤。

AWS Mobile 云逻辑 (p. 183)功能可让您在云中调用 API。API 调用由您的无服务器 Lambda 函数处理。

180

AWS Mobile Hub 开发人员指南 开发人员指南React Native

在您的应用程序中启用云 API

awsmobile cloud-api enable

awsmobile push

在应用程序中启用云逻辑会将示例 API sampleCloudApi 添加到可用于测试的项目。

您可以在应用程序根文件夹中运行 awsmobile console,然后在 Mobile Hub 项目中选择 Cloud Logic (云逻辑) 功能,从而为 API 查找示例处理程序函数。

在 CLI 中快速测试您的 API

sampleCloudApi 及其处理程序函数支持您执行端到端 API 调用。

在开发环境中对您的未签名 API 进行测试调用

awsmobile cloud-api invoke <apiname> <method> <path> [init]

对于 sampleCloudApi,您可以使用以下示例来测试 post 方法

awsmobile cloud-api invoke sampleCloudApi post /items '{"body": {"testKey":"testValue"}}'

此调用将返回与下面类似的响应。

{ success: 'post call succeed!',url: '/items',body: { testKey: 'testValue' } }

测试 :get 方法

awsmobile cloud-api invoke sampleCloudApi get /items

这将返回下面所示的响应。

181

AWS Mobile Hub 开发人员指南 开发人员指南React Native

{ success: 'get call succeed!', url: '/items' }

连接到您的后端

创建您自己的云逻辑 (p. 183) API 和 Lambda 函数后,您可以从您的应用程序调用它们。

从您的应用程序调用 API

在 App.js (或在应用程序启动时运行的其他文件) 中添加以下 import 语句。

import Amplify, { API } from 'aws-amplify';import aws_exports from './aws-exports';Amplify.configure(aws_exports);

然后,将此内容添加到调用您的 API 的组件。

state = { apiResponse: null };

async getSample() { const path = "/items"; // you can specify the path const apiResponse = await API.get("sampleCloudApi" , path); //replace the API name console.log('response:' + apiResponse); this.setState({ apiResponse });}

要从 UI 元素调用您的 API,请在您的组件的 render() 方法中添加 API 调用。

<View> <Button title="Send Request" onPress={this.getSample.bind(this)} /> <Text>Response: {this.state.apiResponse && JSON.stringify(this.state.apiResponse)}</Text></View>

要进行测试,请保存更改,运行 npm run android 或 npm run ios` 以启动您的应用程序。然后对调用您的 API 的 UI 元素进行尝试。

后续步骤

了解有关使用 Amazon API Gateway 和 AWS Lambda 的 AWS Mobile 云逻辑 (p. 183)功能的更多信息。

要在指导下逐步完成 API 及其处理程序的创建,请运行 awsmobile console 以在 Mobile Hub 控制台中打开您的应用程序,然后选择 Cloud Logic (云逻辑)。

了解 AWS Mobile CLI (p. 157)。

了解 AWS Mobile Amplify。

AWS Mobile Hub 功能Important

如果您已使用 AWS Mobile CLI 配置后端,则以下内容将适用。如果您正在构建新的移动或 Web 应用程序,或者您正在向现有应用程序添加云功能,请改用新的 AWS Amplify CLI。利用新的 AmplifyCLI,您可以使用宣布推出 AWS Amplify CLI 工具链中描述的所有功能,包括提供其他工作流程的AWS CloudFormation 功能。

以下页面包含用于 Web (JavaScript) 的 AWS Mobile CLI 参考资料。

182

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

• AWS Mobile CLI 参考 (p. 157)• AWS Mobile CLI 凭证 (p. 165)

AWS Mobile Hub 功能

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

AWS Mobile Hub 是一项服务,可以让用户 (即使是新手) 使用一系列功能强大的 AWS 服务轻松部署和配置移动应用程序后端功能。

您可以创建一个免费项目,然后使用一个指点控制台选择并配置移动应用程序功能。Mobile Hub 在后台执行复杂处理,然后为您提供分步的集成说明。

主题• 云逻辑 (p. 183)• NoSQL 数据库 (p. 185)• 消息收发与分析 (p. 190)• 托管和流式处理 (p. 192)• 对话机器人 (p. 196)• 用户登录 (p. 198)• 用户文件存储 (p. 203)

云逻辑

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

选择 AWS Mobile Hub 云逻辑移动后端服务功能:

• 在云中添加业务逻辑函数,而不会产生服务器设置或维护成本• 将应用程序扩展到 AWS 内外的其他服务

创建免费的 Mobile Hub 项目并添加云逻辑功能。

功能详细信息

下图显示了使用 Amazon API Gateway 和 AWS Lambda 的组合实施无服务器业务逻辑和到其他服务的扩展的云逻辑。

183

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

云逻辑功能可让您使用 AWS Lambda 函数构建后端服务,您可以从移动应用程序调用这些函数。使用云逻辑,您可以在云中运行代码,以处理您的应用程序的业务逻辑并对 iOS 和 Android 应用程序共享相同代码。云逻辑功能由 AWS Lambda 函数提供支持,利用这些函数,您编写代码时无需担心管理框架和扩展后端基础设施。您可以利用 JavaScript、Java 或 Python 编写函数。

Amazon API Gateway 将您创建的 Lambda 函数作为 REST API 对您的应用程序公开,它还提供了一个具有灵活的流量监控和限制功能的安全终端节点。

云逻辑概览

配置的 AWS 服务和资源 • Amazon API Gateway(请参阅 Amazon APIGateway 开发人员指南)

概念 | 控制台 | 定价• AWS Lambda(请参阅 AWS Lambda 开发人员

指南)

概念 | 控制台 | 定价• Amazon Virtual Private Cloud(请参阅 Amazon

VPC 用户指南)

概念 | 控制台 | 定价• AWS CloudFormation(请参阅 AWS

CloudFormation 用户指南)

概念 | 控制台 | 定价

支持 Mobile Hub 的功能使用 Amazon Cognito 进行身份验证,并使用 IAM 进行授权。有关更多信息,请参阅用户登录 (p. 198)。有关更多信息,请参阅查看为此功能预配置的 AWS 资源 (p. 185)。

配置选项 此功能将启用下列移动后端功能:

• 提供了一个默认的 Hello World Lambda 函数,该函数接受应用程序用户输入的参数值,并将其返回到应用程序。

184

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

• 您可以从提供的列表中选择现有函数或使用 AWSLambda 控制台创建新函数。

快速启动应用程序演示 此功能向 Mobile Hub 生成的快速启动应用程序添加以下功能:

• 用户可以按名称指定 AWS Lambda 函数,提供参数和调用函数,以及查看函数返回的值

查看为此功能预配置的 AWS 资源下图显示了 Mobile HubResources (资源) 窗格,其中显示通常为云逻辑功能预配置的元素。

快速启动应用程序详细信息您的快速启动应用程序包括使用 AWS Lambda API 来调用您在您的项目中选择的任意函数的代码。通过将云逻辑添加至您的快速启动应用程序,提供了一个 Hello World 默认 Lambda 函数。您也可以从 AWS 账户中选择一个现有 Lambda 函数,或者创建一个新的函数。如果选择编辑按钮,您将进入 AWS Lambda 控制台中的函数编辑器。从 Lambda 控制台中,您可以直接编辑代码或以 .zip 文件格式上传打包的源和库。

在云逻辑快速启动应用程序的演示屏幕中,您可以输入您想调用的 Lambda 函数的名称和输入参数。然后快速启动应用程序将调用您的 Lambda 函数并显示其返回的结果。

NoSQL 数据库

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

185

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

选择 Mobile Hub NoSQL 数据库移动后端功能以:

• 添加具有可扩展的性能和成本的易于开发的数据库功能

在几分钟内创建免费的 Mobile Hub 项目并添加 NoSQL 数据库功能。

功能详细信息

下图显示了移动应用程序和 Amazon DynamoDB 之间 NoSQL 模式的典型连接。

NoSQL 数据库功能使用 Amazon DynamoDB,使您能够创建可存储和检索数据的数据库表来供应用程序使用。

NoSQL 数据库被公认为是许多移动后端解决方案的首选方法,因为它们易于开发、具备可扩展的性能、高可用性以及恢复能力。有关更多信息,请参阅 Amazon DynamoDB 开发人员指南中的从 SQL 到 NoSQL。

NoSQL 数据库概览

配置的 AWS 服务和资源 • Amazon DynamoDB 表(请参阅 使用DynamoDB)

概念 | 控制台 | 定价

支持 Mobile Hub 的功能使用 Amazon Cognito 进行身份验证,并使用 IAM 进行授权。有关更多信息,请参阅用户登录 (p. 198)。有关更多信息,请参阅查看为此功能预配置的 AWS 资源 (p. 190)。

配置选项 此功能启用以下移动应用程序后端功能:

配置表 (p. 188) - 基于提供的示例架构,或通过可在创建表时提供选项指导的向导使用自定义架构。

数据权限 (p. 188) - 您的应用程序数据的访问权限可以是:

186

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

• Public (公有)(支持任何移动应用程序用户在表中读取或写入任何项目)。

• Protected (受保护)(支持任何移动应用程序用户在表中读取任何项目,但仅项目的所有者才可更新或删除项目)。

• Private (私有)(只支持项目的所有者读取和写入表)。有关更多信息,请参阅 配置 NoSQL 数据库功能 (p. 187)。

有关更多信息,请参阅配置 NoSQL 数据库功能 (p. 187)。

快速启动应用程序演示 此功能向 Mobile Hub 生成的快速启动应用程序添加以下内容:

• 基于您在控制台中指定的架构插入和删除示例数据。

• 在表上执行并查看 NoSQL 操作 (包括Get、Scan) 的结果,以及控制台在您进行设计选择时显示的所有示例查询。

配置 NoSQL 数据库功能

此部分描述了在 Mobile Hub 中配置 NoSQL 数据库功能的步骤和选项。

将 NoSQL 数据库功能添加到您的 |AMH| 项目

1. 选择 Enable NoSQL (启用 NoSQL)。2. 选择 Add a new table (添加新表)。3. 选择表的初始架构。您可以使用提供的示例架构,或者通过向导生成一个架构。

示例表架构

AWS Mobile Hub 为典型的移动应用程序提供一组示例表架构。如果您使用示例架构模板创建了表,该表最初将具有特定于每个示例的一组属性。您可以选择一个模板,作为您的表的起始架构:

• News (新闻) - 存储新文章的作者、标题、文章内容、关键字和其他属性。• Locations (位置) - 存储地理位置的名称、经度和纬度。• Notes (备注) - 存储每个用户的私有备注。• Ratings (评级) - 存储项目目录的用户评级。• Graffiti Wall (涂鸦墙) - 存储共享绘图项目。

使用您的 |AMH| 项目中的一个示例架构模板添加表

1. 选择示例模板,作为表的初始架构。2. 在 Table name (表名称) 中键入一个新名称以重命名表(如果您愿意)。每个模板将为表提供一个与模板

名称匹配的默认名称。3. 选择 Public (公有)、Protected (受保护) 或 Private (私有) 权限以向移动应用程序用户授予表的权限。有关

更多信息,请参阅数据权限 (p. 188)。4. (可选)在 What attributes do you want on this table? (您希望此表中包含哪些属性) 下,您可以添加、重

命名或删除表属性。

187

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

5. (可选)选择 Add index (添加索引) 为您的表的二级索引添加 name (名称)、partition key (分区键) 和(可选)sort key (排序键)。

6. 选择 Create Table。

配置表此部分描述为您的应用程序配置 DynamoDB NoSQL 表的选项。

主题• NoSQL 表术语 (p. 188)• 数据权限 (p. 188)

NoSQL 表术语

DynamoDB 与其他数据库管理系统相似,将数据存储在表中。表是包含下列元素的数据的集合。

项目

• 每个表包含多个项目。项目 是一组属性,具有不同于所有其他项目的唯一标识。项目类似于关系数据库系统中的行、记录或元组。

属性

• 属性是 DynamoDB 表中的列。表的行是您根据需要为应用程序添加、更新、读取或删除的单个记录。

表架构基于每个示例的需求提供一组初始属性。您可以通过选择 Remove (删除) 来删除任意属性。如果您删除分区键属性,则必须指定其他属性作为表的主索引的分区键。

您可以选择 Add attribute (添加属性),将空属性添加到表中。为属性提供一个名称,选择它将存储的数据的类型,然后选择新属性是分区键还是排序键。

索引

• 每个表都具有一个内置主索引,主索引具有分区键,而且可能具有排序键。此索引允许特定类型的查询。您可以通过展开 Queries this table can perform (此表可执行的查询) 部分来查看表可执行的查询的类型。要启用使用其他属性的查询,请创建额外的二级索引。利用二级索引,您可使用与主索引上的分区键和可选排序键不同的分区键和可选排序键来访问数据。

数据权限

数据安全的最佳实践是,对您的表的访问权限只需为足以支持您的应用程序设计的最低权限。Mobile Hub 提供两种方法来保护您的数据:使用用户登录 (p. 198)功能的用户身份验证;以及 NoSQL 数据库数据表用户权限。

注意:启用 NoSQL 数据库之后,您的应用程序将直接与 DynamoDB 服务通信。如果您未将用户登录 (p. 198)功能设置为 Required (必需),则在不受表用户权限阻止的情况下,未验证身份用户将具有读取和/或写入数据的权限。

仅向已验证身份用户授予权限

除非尚未登录的用户需要在您的应用程序中读取或写入表中的数据,否则应通过在允许用户使用执行数据库操作的应用程序功能之前要求用户登录 (身份验证) 来收紧访问权限。AWS Mobile Hub用户登录 (p. 198)功能将提供一系列方法来验证用户的身份,其中包括:使用登录提供商(如Facebook、Google、Active Directory 或您的现有自定义服务)的联合身份验证。只需几次单击,您还可创建 AWS 服务支持的您自己的登录提供商。

188

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

要将用户登录添加到您的应用程序,请使用功能配置页面上的 Configure more features (配置更多功能) 按钮或左侧的 Configure (配置) 图标。然后选择并启用 User Sign-in (用户登录)。

按用户授予对表数据项目的权限

当您在 NoSQL 数据库中新建表时,可选择 Public (公有)、Private (私有) 或 Protected (受保护) 选项以确定哪些应用程序用户可读取或写入表的数据。Mobile Hub 将向表附加精细访问控制策略,该策略可基于用户是否是所访问数据的创建者来限制用户可用的操作。

Public

• 公共权限允许所有用户读取或更新表中的所有项目 (数据行)。

Protected

• 受保护的权限允许所有用户读取表中的所有项目,但只有项目的所有者才可更新或删除项目。

私密

• 私有权限仅允许项目的所有者读/写项目。

Note

用户将拥有数据项目,前提是其 Amazon Cognito 身份 ID 与项目的主键匹配。如果您选择表的 Protected (受保护) 或 Private (私有) 权限,则表的分区键必须为 userId,并且必须为 string 类型。受保护或私有表的二级索引将与主索引遵循相同的模式。当用户在受保护的表或私有表中创建项目时,AWS 将使用用户的 Amazon Cognito 身份 ID 填充项目的主键值。将在受保护的项目或私有项目上尝试数据操作时执行。IAM 将检查项目的 userId 是否与当前用户的 Amazon Cognito 身份 ID 匹配,并基于附加到表的策略允许或阻止操作。当您选择表的 Public (公有) 权限时,将没有所有权执行。公共表的主键和二级索引主键的名称或数据类型没有限制。

为多个写入器管理受限项目的权限

在 Mobile Hub 使用 Protected (受保护) 或 Private (私有) 权限为您的表预配置访问权限之后,IAM 将确保只有其操作将在表中创建项目的移动应用程序用户才能够写入项目的属性值。要为多个用户需要将数据写入现有项目的情况设计架构,一种策略是通过用户将写入不同表的方式来构造您的架构。在此设计中,应用程序将查询两个表以联接数据。

例如,客户可在 orders 表中创建订单,交付服务驱动程序可能将交付跟踪信息写入 deliveries 表,这种情况下两个表都具有允许基于 orderId 或 customerId 快速查找的二级索引。

检索数据您可用于从 NoSQL 数据库检索数据的操作包括:

• Get - 基于是否与主键匹配从表中检索单个项目。• Query - 仅使用主键属性值查找表或二级索引中的项目。• Scan - 读取表或二级索引中的每个项目。默认情况下,Scan 操作返回表或索引中每个项目的全部数据属

性。您可以使用 Scan 以仅返回一些属性而不是所有属性。• Query with Filter`s, which performs a :code:`Query 但返回基于您创建的筛选表达式筛选

的结果。• Scan with Filters - 执行 Scan,但返回基于您创建的筛选表达式筛选的结果。

有关更多信息,请参阅 DynamoDB 中的查询和扫描操作。

189

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

查看为此功能预配置的 AWS 资源

下图显示了 Mobile HubResources (资源) 窗格,其中显示了通常为 NoSQL 数据库功能预配置的 AWS 元素:

快速启动应用程序详细信息

在 Mobile Hub 快速启动应用程序中,NoSQL 数据库演示将显示在应用程序配置期间创建的所有表的列表。选择某个表时,将基于有关表的主索引、二级索引和排序键的选择,显示此表可用的所有查询的列表。您使用示例模板制作的表将使应用程序用户能够在应用程序内插入和删除示例数据。

消息收发与分析

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

选择 AWS Mobile Hub 消息收发与分析功能可:

• 收集数据以了解您的应用程序用户的行为• 使用该信息添加市场活动以通过推送通知、电子邮件和 SMS 与您的用户沟通

创建免费的 Mobile Hub 项目并添加消息收发与分析功能。

190

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

功能详细信息

AWS Mobile Hub 消息收发与分析 (以前称为“用户沟通”) 功能可帮助您了解您的用户如何使用应用程序。它使您能够通过推送通知、电子邮件或 SMS 与用户沟通。您可以将分析绑定到消息收发,使您沟通的内容从用户的行为流动。

下图显示了使用 Amazon Pinpoint 收集来自移动应用程序的使用率数据的消息收发与分析功能。AmazonPinpoint 随后基于为该应用程序设计的市场活动逻辑将消息发送到选定的应用程序用户。

您可以分别配置消息收发功能和分析功能或将两者结合使用以开展市场活动,从而基于用户的应用程序使用情况与用户进行互动。您可以配置哪些用户接收市场活动的消息以及用于发送消息的条件和计划逻辑。您可以将通知配置为传送文本或导致编程操作,例如,打开应用程序或将自定义 JSON 传递到您的客户端。

当您选择 Analytics (分析) 时,Amazon Pinpoint 会对应用程序使用情况和市场活动数据执行捕获、可视化和分析:

• 默认情况下,Amazon Pinpoint 会收集应用程序使用情况会话数据。• 如果您配置了一个市场活动,则会包含该市场活动的相关指标。• 如果将自定义分析添加到您的应用程序,您可以将 Amazon Pinpoint 配置为可视化这些指标并使用该数据

作为您的市场活动行为中的一个因素。要了解有关集成自定义分析的更多信息,请参阅 Amazon Pinpoint用户指南 中的将 Amazon Pinpoint 与您的应用程序集成。

• 利用 Amazon Pinpoint,您可以构建漏斗分析,该分析将可视化以下数据:您希望多少个用户完成您让用户在您的应用程序中执行的一系列步骤中的每个步骤。

• 要执行更复杂的分析任务 (如合并来自多个应用程序的数据或进行灵活的查询),您可以将 AmazonPinpoint 配置为将您的数据流式传输到 Kinesis。要了解有关将 Amazon Pinpoint 与 Kinesis 结合使用的更多信息,请参阅将 Amazon Pinpoint 事件流式传输到 Amazon Kinesis。

当您选择 Messaging (消息收发) 时,可以将您的项目配置为启用 Amazon Pinpoint 以发送:

• 通过 Firebase/Google Cloud Messaging 或 iOS (借助 APN) 向您的 Android 用户发送推送通知• 使用您选择的发件人 ID 和域向您的应用程序用户发送电子邮件• SMS 消息

191

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

在您的 Mobile Hub 项目中启用了“消息收发与分析”选项后,请使用 Amazon Pinpoint 控制台查看您的分析的可视化效果或配置您的用户分段和市场活动。您也可以将用户分段数据导入 Amazon Pinpoint 以针对任何用户组使用市场活动。

消息收发与分析概览

配置的 AWS 服务和资源 • Amazon Pinpoint(请参阅 Amazon Pinpoint 开发人员指南)

概念 | 控制台

支持 Mobile Hub 的功能使用 Amazon Cognito 进行身份验证,并使用 IAM 进行授权。有关更多信息,请参阅用户登录 (p. 198)。

配置选项 此功能将启用下列移动后端功能:

• 收集并可视化您的应用程序用户的行为的分析。• 将 Amazon Pinpoint 用户沟通市场活动集成到

您的移动应用程序中。• 通过 APN、GCM 和 FCM 使用推送通知传达给

应用程序用户。• 通过 Firebase or Google Cloud Messaging

(FCM/GCM)(请参阅设置 Android 推送通知)

• 通过 Apple Push Notification service (APNs)(Apple 推送通知服务 (APN))(请参阅设置iOS 推送通知)

有关更多信息,请参阅配置推送通知。• 通过电子邮件传达给应用程序用户。• 通过 SMS 传达给应用程序用户。

快速启动应用程序演示 此功能将向由 Mobile Hub 生成的快速启动应用程序添加 User Engagement (用户管理) 功能:

• 展示如何使应用程序用户能够接收市场活动通知。该应用程序用户可导致生成会话数据、自定义数据、市场活动数据和购买数据的事件。这些事件的分析可在 Amazon Pinpoint 控制台中近乎实时地提供。

• 展示如何为应用程序用户在其手机上呈现Amazon Pinpoint 数据可视化效果。

托管和流式处理选择 AWS Mobile Hub 托管和流式处理以:

• 托管您的移动 Web 应用程序、本机移动应用程序或混合应用程序的内容• 通过全球内容分发网络 (CDN) 分发内容• 流式处理您的媒体

创建一个免费的带有托管和流式处理的 Mobile Hub 项目。获取自定义示例应用程序和开发工具包。

192

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

功能详细信息

托管和流式处理功能通过使用 Amazon Simple Storage Service (Amazon S3) 和 Amazon CloudFront 终端节点的全球网络分发内容。

下图显示如何将网站资产和流媒体分发到移动 Web 应用程序或浏览器。图中 Web 应用程序正在请求 AWS凭证并通过适用于 JavaScript 的 AWS 开发工具包访问 AWS 服务。

下图显示一个本机或混合移动应用程序正在请求 AWS 凭证以从 CDN 边缘站点访问内容。

利用托管和流式处理功能,您能够在云中托管网站和应用程序资产,如 HTML、JavaScript、图像或媒体文件。Mobile Hub 通过使用 Amazon S3 存储桶创建内容源存储位置(源)。借助 Amazon S3 功能,该存储桶可通过 Internet 访问以静态托管 Web 内容,而无需 Web 服务器。

通过将您的源内容缓在存边缘站点的全球网络上,可向所有区域的用户提供对您的内容的低延迟访问。此内容分发网络 (CDN) 通过同样支持媒体文件流式处理(请参阅 Amazon CloudFront 流式处理)的 AmazonCloudFront 分发进行提供。

193

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

托管和流式处理概览

配置的 AWS 服务和资源 • Amazon CloudFront - 内容分发网络(请参阅Amazon CloudFront)

概念 | 控制台 | 定价• Amazon S3 Bucket (Amazon S3 存储

桶)(请参阅 Amazon S3 入门指南 <https://aws.amazon.com/cloudfront/pricing/>`__)

概念 | 控制台 | 定价

支持 Mobile Hub 的功能使用 Amazon Cognito 进行身份验证,并使用 IAM 进行授权。有关更多信息,请参阅用户登录 (p. 198)。

有关更多信息,请参阅查看为此功能预配置的 AWS资源 (p. 196)。

配置选项 此功能将启用下列移动后端功能:

• Web 应用程序内容托管(通过 Internet 访问您的内容,无需 Web 服务器)

• 适用于 JavaScript 的 AWS 开发工具包(通过标准脚本调用 AWS 服务)

• 全球 CDN(全球内容分配和媒体流)CloudFront提供了区域范围和分配成本的多种选项。有关更多信息,请查阅配置托管和流式处理功能 (p. 195)。

Web 应用程序演示 示例

• 向您的存储桶预配置适用于 JavaScript 的 AWS开发工具包和自定义生成的配置文件。

有关更多信息,请参阅 Web 应用程序支持 (p. 194)。

快速启动本机应用程序演示 此功能向 Mobile Hub 生成的快速启动应用程序添加以下内容:

• 查看 AWS 存储中的文件列表,下载并查看文件,然后管理其本地缓存。

Web 应用程序支持

当启用托管和流式处理时,Mobile Hub 会在您的存储桶的根目录中预配置适用于 JavaScript 的 AWS 开发工具包的本地副本。

Mobile Hub 还会生成项目配置文件 aws-config.js 和 aws-exports.js,这些文件包含为您的项目配置的每个 AWS 服务 Mobile Hub 的终端节点常量。提供了 aws-exports.js 以便与兼容 ES6 的脚本语言(如 Node.js)集成。使用这些值可从您托管的 Web 应用程序对您的服务进行开发工具包调用。

194

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

Note

最佳安全实践是尽可能减少对应用程序的资源的访问。这些配置文件可公开访问并包含您的应用程序的所有 AWS 资源的标识符。如果这适合您的设计,则建议您通过仅允许已验证身份用户访问您的资源来进行保护。您可以利用 Require sign-in (需要登录) 选项启用 Mobile Hub 用户登录 (p. 198)来在此项目中执行该操作。

此外,您还可以将相应的配置文件复制到您的混合本机/Web 移动应用程序中,使得能够使用 JavaScript 从您的应用程序调用 AWS 服务。

配置托管和流式处理功能

主题• 浏览您的内容 (p. 195)• 管理您的应用程序资产 (p. 195)• 为您的 Web 应用程序使用自定义域 (p. 196)

浏览您的内容

启用托管和流式处理后,您有以下几个选项:

• Launch from Amazon S3 (从 Amazon S3 启动):此选项用于浏览到您的源存储桶的根目录中的 un-cachedindex.html。

• Launch from Amazon CloudFront (从 Amazon CloudFront 启动):此选项用于浏览到在 CDN 边缘服务器上缓存的 index.html。

Note

为分发预配置边缘站点可能需要长达 1 小时。在分发在网络中完成传播之前,此链接将不会解析。

• Manage files (管理文件):此选项用于打开 Amazon S3 控制台以查看和管理您的源存储桶的内容。您还可以通过在 Mobile Hub 中打开项目,然后选择左侧的 Resources (资源) 图标来在 Amazon S3 控制台中找到您的存储桶。为托管和流式处理配置的存储桶的名称包含字符串 hosting。

管理您的应用程序资产

您可以通过使用 Amazon S3 控制台、AWS 命令行界面 (CLI) 或众多可用的第三方应用程序,选择多种方法来管理您的 Web 应用程序资产。

使用 Amazon S3 控制台

要使用 Amazon S3 控制台查看、上传、移动或删除您存储在存储桶中的文件,请导航到 Amazon S3 控制台,然后选择其名称包含您的项目名称的存储桶。您的 Web 应用程序内容将驻留在根文件夹中。

使用 AWS CLI

通过 AWS CLI,您可以使用命令行查看、上传、移动或删除您存储在存储桶中的文件。

要安装和配置 AWS CLI 客户端,请参阅使用 AWS 命令行界面进行设置。

例如,sync 命令支持在您的本地文件夹 (source) 和存储桶 (destination) 之间来回传输文件。

$ aws s3 sync {source destination} [--options]

以下命令会将您当前的本地文件夹中的所有文件同步到由 path 定义的 Web 应用程序的存储桶中的文件夹。

195

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

$ aws s3 sync . s3://my-web-app-bucket/path

要了解有关使用 AWS CLI 管理 Amazon S3 的更多信息,请参阅结合使用 Amazon S3 与 AWS 命令行界面

为您的 Web 应用程序使用自定义域

要将您的托管和流式处理 CDN 配置为自定义域的目标,请参阅使用域名将流量路由到 Amazon CloudFrontWeb 分配。

查看为此功能预配置的 AWS 资源

下图显示 Mobile HubResources (资源) 窗格,其中显示了通常为托管和流式处理功能预配置的元素。

快速启动应用程序详细信息

在 Mobile Hub 快速启动应用程序中,托管和流式处理演示列出了一组图像文件,这些文件可从本地下载和缓存并显示在设备上。用户还可以删除这些图像文件的本地副本。

对话机器人选择 AWS Mobile Hub 对话机器人移动后端服务功能可以:

• 将语音和文本自然语言理解接口添加到您的应用程序• 使用自然语言语音和文本在云中与您的业务逻辑交互

创建免费的 Mobile Hub 项目并添加对话机器人功能。

功能详细信息

下图显示对话机器人使用 Amazon Lex 将自然语言添加到移动应用程序接口并作为其他服务的集成点。

196

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

AWS Mobile Hub 对话机器人为您的移动应用程序带来支持 Amazon Alexa 和 Amazon Shopping 语音和文本对话体验的相同自然语言理解和业务逻辑集成。

Mobile Hub 对话机器人使用的是 Amazon Lex,这是一项用于将语音和文本对话接口构建到应用程序中的AWS 服务。Amazon Lex 具有与 Lambda 的内置集成。

借助对话机器人和 Amazon Lex,无需任何深度学习专业知识。在 Amazon Lex 控制台中指定基本对话流程以创建机器人。该服务管理对话并在对话中动态调整响应。通过使用 Mobile Hub 对话机器人,您可以基于演示模板或已在 Amazon Lex 控制台中创建的机器人来配置和测试机器人。Mobile Hub 提供了集成说明以及用于重复使用我们在您自己的应用程序中生成的示例应用程序代码的自定义组件。

对话机器人概览

配置的 AWS 服务和资源 • Amazon Lex(请参阅 Amazon Lex 开发人员指南)

概念 | 控制台

支持 Mobile Hub 的功能使用 Amazon Cognito 进行身份验证,并使用 IAM 进行授权。有关更多信息,请参阅用户登录 (p. 198)。

配置选项 此功能将启用下列移动后端功能:

• 基于提供的演示模板或通过使用 Amazon Lex 控制台将您的自定义文本和/或语音交互添加到您的应用程序,在 Amazon Lex 服务中创建和配置对话机器人。

• 通过下载并重复使用该快速启动应用程序的代码、原生 iOS 和 Android 开发工具包以及帮助程序代码和在线指南的包 (所有内容将动态生成以与您的 Mobile Hub 项目匹配) 来集成您的应用程序。

快速启动应用程序演示 此功能向 Mobile Hub 生成的快速启动应用程序添加以下功能:

• 使用户能够与可与 Amazon Lex 交互的对话机器人进行交互。

197

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

用户登录

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

选择 AWS Mobile Hub 用户登录移动后端功能可达到以下目的:

• 向您的移动应用程序添加 AWS 用户身份验证和安全身份权限管理。

注意:所有 Mobile Hub 项目均可安全、不经身份验证访问 AWS 资源,无论其是否具有用户登录功能。

• 使您的用户能够登录以使用来自身份提供商 (如 Facebook、Google 和 Microsoft Active Directory 联合身份验证服务) 或您自己的自定义用户目录的现有凭证访问 AWS 资源。

创建免费的 Mobile Hub 项目并添加用户登录功能。

功能详细信息

下图显示了对未经身份验证的用户实施的资源访问策略。

下图显示了对经过身份验证的用户实施的资源访问策略。

198

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

此功能使您能够配置用户获取对您的应用程序使用的 AWS 资源和服务的访问权限的方式 - 不经过登录过程或通过由一个或多个身份提供商提供的身份验证。两种情况下,AWS 身份创建和凭证均由 Amazon CognitoIdentity 提供,访问授权由 AWS Identity and Access Management (IAM) 提供。

当您创建项目时,Mobile Hub 会预配置允许所有用户访问不受限制的资源所需的 AWS 身份、用户角色和访问策略配置。当您向应用程序添加用户登录功能时,您能够将访问限制为仅允许使用由身份提供商验证的凭证登录的用户使用受保护的资源。通过 Amazon Cognito 身份,您的应用程序用户可获取 AWS 凭证以直接访问您为 Mobile Hub 项目启用和配置的 AWS 服务。经过身份验证的用户和未经身份验证的用户将获得具有相同的安全执行级别的临时、受限的权限凭证。

Amazon Cognito 可将来自多个身份提供商的已验证用户身份联合到单个 AWS 身份。Mobile Hub 可帮助您将身份提供商集成到您的移动应用程序中,以便用户使用来自 Facebook、Google 和您自己的身份系统的现有凭证进行登录。您还可以使用 Amazon Cognito 您的用户池创建和配置基于电子邮件和基于密码的用户目录。

用户登录功能概览

配置的 AWS 服务和资源 • Amazon Cognito

概念 | 控制台 | 定价• Amazon Cognito 身份池

(请参阅使用联合身份)• Amazon Cognito 您的用户池

(请参阅创建和管理用户池)• Amazon Cognito SAML 身份联合

(请参阅配置基于 SAML 2.0 的联合身份验证的概述)

• IAM 角色和安全策略(请参阅控制对 Mobile Hub项目的访问权限 (p. 207))

概念 | 控制台 | 定价

199

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

有关更多信息,请参阅查看为此功能预配置的 AWS资源 (p. 202)。

配置选项 此功能将启用下列移动后端功能:

登录提供商(用户在登录时获得更大的访问权限)

• 通过 Google 身份验证(请参阅设置您的后端 (p. 20))

• 通过 Facebook 身份验证(请参阅 mobile-auth-setup)

• 通过 Email and Password (电子邮件和密码) 身份验证(请参阅用户登录提供商 (p. 200))

• 通过 SAML Federation (SAML 身份联合) 身份验证(请参阅用户登录提供商 (p. 200))

Required Sign-in (必需登录)(经过身份验证的访问)

Optional Sign-in (可选登录) 可让用户在登录后获得更多权限。有关更多信息,请参阅配置用户登录 (p. 200)

快速启动演示功能 此功能向 Mobile Hub 生成的快速启动应用程序添加以下内容:

• 经过身份验证的访问 (如果您的应用程序的配置允许),显示 AWS 分配给应用程序实例的设备的ID。

• 使用所选方法:Facebook、Google 或 Email andPassword (您自己的用户池) 对用户进行身份验证的登录屏幕。

• 利用 Optional Sign-in (可选登录) 和 RequireSign-in (必需登录),该应用程序展示了未经身份验证的用户访问受保护的文件夹的障碍。

配置用户登录

以下选项可用于配置您的用户的登录体验。

用户登录提供商

Facebook

• 要启用 Facebook 用户身份验证,请将您的应用程序注册到 Facebook。

如果您已经有已注册的 Facebook 应用程序,请从 Facebook 开发人员 App Dashboard 中复制 App ID。将 ID 粘贴到 Facebook App ID 字段中并选择 Save Changes。

如果您还没有 Facebook 应用程序 ID,则需要创建一个,然后才能在您的移动应用程序中集成Facebook。Facebook 开发人员门户将指导您完成设置 Facebook 应用程序的过程。

有关将您的应用程序与 Facebook 集成的完整说明,请参阅设置 Facebook 身份验证。

Google

200

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

• 要通过 Google 验证用户身份,请将示例应用程序与 Google+ Sign-in 完全集成。

如果您已设置带有 Google+ API 的已注册 Google Console 项目、Web 应用程序 OAuthClient 和您选择的平台的客户端 ID,则将 Google Web 应用程序客户端 ID 和 Google Developers 控制台中的客户端 ID 复制并粘贴到这些字段中,然后选择 Save Changes (保存更改)。

无论您选择哪个平台 (Android 或 iOS),您都至少需要创建以下项。• 启用了 Google+ API 的 Google Console 项目 (用于 Google 登录)• Web 应用程序 OAuth 客户端 ID• iOS 和/或 Android 客户端 ID,具体取决于您要支持的平台

有关将您的应用程序与 Google+ 集成的完整说明,请参阅:设置 Google 身份验证。

Email and Password

• 在您想为应用程序用户创建自己的 AWS 托管用户目录和登录过程时选择“Email and Password”登录。通过以下方式配置其登录体验的特征:• 选择用户登录选项(电子邮件、用户名和/或电话号码)• 启用多重身份验证(无、必需、可选),这将会通过短信将输入密码发送到用户手机上并提示用户输入

该密码以及其他登录信息来登录• 选择密码字符要求(允许的最小长度、大/小写、数字或特殊字符)。

SAML 身份联合

• SAML 身份联合使具有您的现有身份存储中的凭证的用户能够使用其熟悉的用户名和密码登录到您的移动应用程序。某个用户登录到您的配置为返回正在验证的 SAML 断言的身份提供商 (IdP)。您的应用程序随后将使用 Amazon Cognito 联合身份,用 SAML 断言换取用于访问您的 AWS 后端服务的典型临时受限权限凭证。

SAML 2.0 (安全断言标记语言 2.0) 是许多 IdP (包括 Microsoft Active Directory 联合身份验证服务和Shibboleth) 使用的开放标准。您的 IdP 必须兼容 SAML 2.0 才能使用此 Mobile Hub 选项。要在 AWS和您的 IdP 之间建立联合,这两个系统必须交换 SAML 身份联合元数据。AWS 联合元数据可在 https://signin.aws.amazon.com/static/saml-metadata.xml 上找到。此 xml 文件展示了您的 IdP 的元数据应采用的格式。有关您的 IdP 的 SAML 身份联合元数据的更多信息,请参阅将第三方 SAML 解决方案提供商与AWS 集成。

要实施该交换,请执行以下操作:1. 查看您的 IdP 的文档,以了解如何使用 AWS 联合元数据文件将 AWS 注册为服务提供商。2. 确保您的 Mobile Hub 项目配置为使用电子邮件和密码登录以创建 Amazon Cognito 用户池。3. 使用为您的用户池创建 SAML 身份提供商中的步骤,将您的 IdP 配置为您的用户池的身份提供商。

要了解有关 AWS 如何支持 SAML 身份联合的更多信息,请参阅配置基于 SAML 2.0 的联合身份验证的概述。

用户登录要求

登录为可选项

• 用户可以选择使用您选择的登录身份提供商进行登录 (经过身份验证),也可以跳过登录 (未经身份验证)。您的应用程序将作为经过身份验证的用户或未经身份验证的来宾用户从 Amazon Cognito Identity 接收临时、受限的权限访问凭证,从而可以安全地访问 AWS 服务。

登录为必选项

201

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

• 用户需要使用您选择的其中一个登录提供商进行登录。您的应用程序将作为经过身份验证的用户从Amazon Cognito Identity 接受临时、受限的权限访问凭证,从而可以安全地访问 AWS 服务。

Note

如果不需要用户登录,则未经身份验证的用户可以访问您的数据库表中的数据和存储桶中的文件,除非通过其他机制明确限制了这些资源。

用户登录和 AWS Identity and Access Management (IAM)

当保存您的移动应用程序时,Mobile Hub 将创建一个 Amazon Cognito 身份池和一个新的 IAM 角色。它们是用于生成供快速启动应用程序用户访问您的 AWS 资源的临时 AWS 凭证。AWS IAM 角色安全策略基于启用的登录功能来更新。

此时,您的移动项目已设置完毕,可供用户登录。每个选定的身份提供商均已添加到快速启动应用程序的登录屏幕。

有关更多信息,请参阅控制对 Mobile Hub 项目的访问 (p. 207)。

查看为此功能预配置的 AWS 资源

下图显示了 Mobile Hub Resources (资源) 窗格,其中显示通常为用户登录功能设置的元素。

快速启动应用程序详细信息

在 Mobile Hub 快速启动应用程序中,用户登录演示使用户能够使用在不经过身份验证的情况下访问 AWS 资源的功能,或使用通过身份提供商 (包括 Facebook、Google、SAML 身份联合或电子邮件和密码) 登录应用程序来访问 AWS 资源的功能。

当您使用 Optional Sign-in (可选登录) 选项将用户登录添加到项目时,选择应用程序的快速启动登录演示将返回并显示用户的 Amazon Cognito 身份池 ID。此标识符与应用程序实例的当前正在访问 AWS 资源的设备关联。

202

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

当您使用 Required Sign-in (必需登录) 将用户登录添加项目时,选择应用程序的快速启动登录演示将显示与项目中配置的身份提供商匹配的登录体验。登录到演示将验证所选身份提供商服务中用户的身份,同时返回并显示用户的 Amazon Cognito 身份池 ID 标识符。

用户文件存储

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

选择 AWS Mobile Hub 用户文件存储以执行以下操作:

• 将包含用户文件、配置文件数据和应用程序状态的云存储添加到您的移动应用程序• 实施 4 种常见权限策略模式,实现对文件和数据的精细访问控制

正在查找 Amazon Cognito Sync? Amazon Cognito Sync 已弃用。有关设备之间的实时数据同步以及内置离线功能,请参阅 AWSAppSync。

创建免费的 Mobile Hub 项目并添加用户文件存储功能。

功能详细信息

Mobile Hub 用户文件存储功能在属于应用程序的 Amazon Simple Storage Service (Amazon S3) 存储桶中为每个用户创建并配置 4 个文件夹。

应用程序安全的最佳实践是,对您的存储桶的访问权限只需为足以支持您的应用程序设计的最低权限。预配置的四个文件夹每个都附加了阐释不同权限选项的策略。此外,Mobile Hub 使用用户登录 (p. 198)功能提供了仅限已验证身份的用户访问您应用程序的选项。

注意:如果您未将用户登录 (p. 198)功能设置为 Required (必需),那么在不受文件夹或存储桶访问策略阻止的情况下,未验证身份的用户将具有读取和/或写入数据的访问权限。

下表显示了为每种文件夹类型预配置的权限策略的详细信息。

文件夹名称 拥有者权限 所有其他人权限

Public 读写 读写

私密 读写 无

Protected 读写 只读

Uploads 只写 只写

下图显示了用来控制 Protected 文件夹中的文件访问权限的 IAM 策略。该策略为创建文件夹的用户授予读/写权限,为所有其他人授予只读权限。

203

AWS Mobile Hub 开发人员指南 开发人员指南Mobile Hub 功能

通过使用用户文件存储功能,您可以将用户文件 (如照片或文档) 存储在云中,以及将用户配置文件数据 (如应用程序设置或游戏状态) 保存在键/值对中。选择此功能后,将创建 Amazon S3 存储桶作为您的应用程序存储用户文件的位置。

用户文件存储概览

配置的 AWS 服务和资源 • Amazon S3 存储桶(请参阅 Amazon S3 入门指南)

概念 | 控制台 | 定价

支持 Mobile Hub 的功能使用 Amazon Cognito 进行身份验证,并使用 IAM 进行授权。有关更多信息,请参阅用户登录 (p. 198)。有关更多信息,请参阅查看为此功能预配置的 AWS 资源 (p. 205)。

配置选项 此功能将实现下列配置选项移动后端功能:

• 使用 Amazon S3 存储用户文件和应用程序数据。在启用用户文件存储时,将预配置 4 个文件夹,每个文件夹具有不同的访问策略配置:• private - 每个移动应用程序用户都可在此文

件夹中创建、读取、更新和删除自己的文件。其他应用程序用户不能访问此文件夹。

• protected - 每个移动应用程序用户都可在此文件夹中创建、读取、更新和删除自己的文件。此外,任何应用程序用户都可读取此文件夹中任何其他应用程序用户的文件。

• public? 任何应用程序用户都可在此文件夹中创建、读取、更新和删除文件。

快速启动演示功能 此功能向 Mobile Hub 生成的快速启动应用程序添加以下内容:

• 该应用程序的 S3 存储桶的文件资源管理器,允许用户:• 在任何 Public 文件夹中上传和查看文件。• 在用户创建的 Private 文件夹中查看和下载文

件。

204

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

• 在任何人创建的 Protected 文件夹中查看和下载文件,将文件上传到用户创建的 Protected 文件夹。

• 将文件上传到任何 Uploads 文件夹。颜色主题选项的用户设置可以保存到云中并从云中检索。

查看为此功能预配置的 AWS 资源下图显示了 Mobile Hub Resources (资源) 窗格,其中显示通常为用户文件存储功能预配置的元素。

在 AWS Mobile Hub 中使用 AWS Identity and AccessManagement正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

Note

无需深入了解 AWS IAM、身份验证和访问控制即可使用 Mobile Hub 为您的移动应用程序配置后端。

• 控制对 Mobile Hub 项目的访问 (p. 207) – 了解如何授予权限以配置您的 Mobile Hub 项目。

205

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

• Mobile Hub 项目权限模型 (p. 206) – 了解您为 Mobile Hub 授予的配置 AWS 资源和服务的权限的更多信息。

• 适用于 Mobile Hub 的 IAM 身份验证和访问控制 (p. 210) – 了解 IAM 和 AWS 身份验证和访问控制的详细信息。

Mobile Hub 项目权限模型

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

重要提示

要在账户中修改 Mobile Hub 项目,账户管理员必须为用户授予管理权限 (p. 208)。请参阅本节以了解更多信息。

如果您是需要额外项目权限的用户,请与 AWS 账户管理员联系。要获得与新权限模型相关的任何问题的帮助,请通过 [email protected] 进行联系。

主题• Mobile Hub 权限模型 (p. 206)• 如果我当前使用 MobileHub_Service_Role 授予 Mobile Hub 权限,该怎么办? (p. 206)• 为什么权限模型发生变化? (p. 207)

Mobile Hub 权限模型目前,在用户在 Mobile Hub 控制台或命令行界面中执行操作时,Mobile Hub 的权限模型直接使用用户的权限。在该模型中,账户管理员可以对其用户在账户中执行的操作进行精细访问控制,而无论他们使用 MobileHub 还是使用控制台或命令行界面直接与服务交互。

要修改项目,用户需要具有使用 Mobile Hub 的权限 (由 AWSMobileHubFullAccess IAM 策略授予),并且他们必须有权执行 Mobile Hub 代表他们执行的任何操作。在几乎所有情况下,这意味着账户管理员必须为用户授予 AdministratorAccess 策略 (p. 208),才能提供对 Mobile Hub 修改的 AWS 资源的访问。这是因为,在修改项目设置时,Mobile Hub 将修改用于启用受这些设置影响的功能的 IAM 角色和策略。通过更改IAM 角色和策略,用户可以控制对账户中的资源的访问,因此,他们必须具有管理权限。

如果管理员不希望为完全账户授予管理权限,他们可以选择使用 AWS Organizations (p. 209) 为每个用户或团队提供自己的子账户。在其子账户中,用户将具有完全管理权限。子账户所有者仅限于其管理员制订的策略可以执行的操作,并将账单汇总到父账户。

如果我当前使用 MobileHub_Service_Role 授予 Mobile Hub 权限,该怎么办?以前,Mobile Hub 代入一个名为 MobileHub_Service_Role 的服务角色,以便使用以下托管策略代表您修改服务配置:

https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/service-role/AWSMobileHub_ServiceUseOnly

在该旧模型中,要修改 Mobile Hub 项目,只需具有通过控制台或命令行调用 Mobile Hub API 的权限。管理员可以将 AWSMobileHub_FullAccess 策略附加到 AWS IAM 用户、组或角色以委托这些权限。

如果您的 Mobile Hub 项目账户依赖于旧模型,对未授予 AdministratorAccess 权限的用户的影响如下所示。

206

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

• 具有 AWSMobileHub_FullAccess 策略的 IAM 用户、组和角色没有足够的权限,无法再通过控制台或awsmobile 命令行界面 (CLI) 在 Mobile Hub 中执行任何更改操作。

• 要使 IAM 用户、组或角色能够使用 Mobile Hub 执行更改操作,他们必须具有相应的权限。管理员可以通过两种方法为用户授予权限 (p. 207),以便在 Mobile Hub 中调用所有可用的操作:将AdministratorAccess 策略附加到用户、他们附加到的角色或他们所属的组;或者使用 AWSOrganizations 管理权限。

为什么权限模型发生变化?AWS Mobile Hub 创建 IAM 角色并为其分配权限,以便允许在移动应用程序中使用 AWS 资源。此类操作被视为管理操作,因为它们包括启用权限以对账户中的资源执行操作。以前,Mobile Hub 的服务角色为授予了AWSMobileHub_FullAccess 权限的用户提供了一条途径,以提升其自己的权限以对资源执行操作,可能采用其管理员不希望允许的方式。如果删除服务角色,则会删除提升权限的途径,并直接由 Mobile Hub 项目管理员控制用户权限。

控制对 Mobile Hub 项目的访问权限

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

概述本节介绍了两种控制对您的 Mobile Hub 项目进行访问的不同方法:

• 为用户授予管理账户权限 (p. 208)

对于各个开发人员或要求简单细分对其 Mobile Hub 项目的访问的组,可以将AdministratorAccess (p. 209) 或 AWSMobileHub_ReadOnly (p. 210) AWS 托管策略附加到用户、他们附加到的角色或他们所属的组以授予权限。

或者:

• 使用 AWS Organizations 管理权限 (p. 209)

对于需要对其 Mobile Hub 项目进行精细访问控制和成本跟踪的组织,AWS 账户管理员可以提供子账户并确定适用于其用户的策略。

要了解 Mobile Hub 如何使用附加到用户的 IAM 策略以代表用户创建和修改服务,请参阅 Mobile Hub 项目权限模型 (p. 206)。

要更详细地了解 AWS Identity and Access Management (IAM),请参阅适用于 Mobile Hub 的 IAM 身份验证和访问控制 (p. 210)和适用于 Mobile Hub 的 IAM 身份验证和访问控制 (p. 210)。

最佳实践:创建 IAM 用户以访问 AWS为提高安全性,建议您不要使用您的 AWS 根账户访问 Mobile Hub。应在您的 AWS 账户中创建一个 AWSIdentity and Access Management (IAM) 用户或使用现有的 IAM 用户,然后使用该用户访问 Mobile Hub。有关更多信息,请参阅《AWS 一般参考》中的 AWS 安全凭证。

207

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

您可以使用 IAM 控制台为自己创建 IAM 用户或委托用户。首先,创建一个 IAM 管理员组,然后为该组创建和分配新的 IAM 用户。

Note

具有账户管理权限的用户必须先导航到 Mobile Hub 控制台并创建初始项目,然后账户内的任何 IAM用户才能创建 Mobile Hub 项目。此步骤确认 Mobile Hub 可以代表您管理 AWS 服务。要了解更多关于向 IAM 用户或用户组分配访问权限的信息,请参阅适用于 Mobile Hub 的 IAM 身份验证和访问控制 (p. 210)。

为用户授予 Mobile Hub 项目权限

主题• 在您的账户中创建新的 IAM 用户并授予 Mobile Hub 权限 (p. 208)• 创建 IAM 组 (p. 208)• 为现有账户用户授予 Mobile Hub 权限 (p. 209)

可以使用以下步骤创建组和/或用户,并为用户授予您的 Mobile Hub 项目的访问权限。

要为角色授予权限,请参阅 AWS IAM 用户指南 中的添加权限。

在您的账户中创建新的 IAM 用户并授予 Mobile Hub 权限

1. 打开 IAM 控制台。在左侧,选择 Users (用户),然后选择 Add User (添加用户)。2. 键入一个用户名,选中 Programmatic access (编程访问) 和 AWS Management Console access (AWS 管

理控制台访问) 复选框。3. 选择所需的密码策略。然后选择 Next: Permissions。4. 在 Add user to group (将用户添加到组) 选项卡中,为用户选择 Administrators (管理员) 或 Read_Only (只

读) 组,然后选择 Next, Review (下一步:审核)。

在该过程中,您将会看到用于执行以下操作的选项:自定义用户的密码、通过电子邮件提醒其新账户以及下载其访问密钥 ID、密钥值和密码。

5. 选择 Create user。6. 要应用策略,请执行以下操作:

• 如果您已创建一个组以管理项目权限,请依次选择 Add user to group (将用户添加到组)、该组、Next:Review (下一步:审核) 和 Create User (创建用户)。

或者:• 如果要管理每个用户的项目权限,请依次选择 Attach existing policies directly (直接附加现有策略)、要

附加的策略、AdministratorAccess 或 AWSMobileHub_ReadOnly 和 Create user (创建用户)。

创建 IAM 组

1. 登录到 AWS 管理控制台然后打开 IAM 控制台,网址为 http://console.aws.amazon.com/iam/。2. 在导航窗格中,选择 Groups (组),然后选择 Create New Group (创建新组)。3. 对于 Group Name (组名),请键入您的组的名称(如 Administrators 或 Read_Only),然后选择

Next Step (下一步)。4. 在策略列表中,选中 AdministratorAccess 策略旁边的复选框以便为组授予完全权限,或选中

AWSMobileHub_ReadOnly 策略旁边的复选框以授予只读权限。您可以使用 Filter (筛选) 菜单和 Search(搜索) 框来筛选策略列表。

5. 选择 Next Step (下一步),然后选择 Create Group (创建组)。您的新组列在 Group Name 下方。

208

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

为现有账户用户授予 Mobile Hub 权限

1. 在左侧,选择 Policies (策略)。2. 选择要附加的托管策略 AdministratorAccess 或 AWSMobileHub_ReadOnly 的链接。3. 选择 Attached Entities (附加的实体)。4. 选择 Attach (附加)。5. 选择您要授予权限的用户、角色或组。6. 选择 Attach Policy。

使用 AWS Organizations 管理权限可以使用 AWS Organizations 管理需要细分对其 Mobile Hub 项目的访问的组的权限。例如,管理员可以为团队中的每个开发人员提供一个账户。在其自己的账户中,每个用户应具有管理员授予的权限。实现该目标的步骤为:

1. 如果您没有 AWS 账户,请注册 AWS 免费套餐。2. 在 AWS Organizations 控制台中创建一个组织。3. 为组织中的每个用户创建或添加现有的账户。4. 邀请用户。5. 为开发人员创建一个组织部门。6. 为部门的成员启用并附加一个策略。

您附加的策略在用户的 AWS 账户范围内适用。您可能需要限制访问使用 Mobile Hub 不需要的服务和功能。例如,以下策略授予在 FullAWSAccess 托管策略中定义的所有权限,但不包括 Amazon EC2 服务的访问权限。

"Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" }, { "Effect": “Deny”, "Action": “ec2:*”, "Resource": "*" }]

有关分步说明,请参阅创建和管理 AWS 组织中的教程。

适用于 Mobile Hub 项目访问的 AWS 托管 (预定义) 策略AWS Identity and Access Management 服务控制 AWS 服务和资源的用户权限。需要特定权限才能使用AWS Mobile Hub 查看和修改任何项目的配置。这些权限已分组为以下您可附加到 IAM 用户、角色或组的托管策略。

• AdministratorAccess

该策略可以无限制地访问账户中的 AWS 服务。该策略包括 AWS Mobile Hub 项目的读写访问权限。其IAM 用户、角色或组附加了此策略的用户将可以创建新项目、修改现有项目的配置以及删除项目和资源。此策略还包括 AWSMobileHub_ReadOnly 托管策略下允许的所有权限。登录 Mobile Hub 控制台并创建项目之后,您可以使用以下链接查看此策略和附加到此策略的 IAM 身份。• https://console.aws.amazon.com/iam/home?region=us-east-1#/policies/arn:aws:iam::aws:policy/

AdministratorAccess$jsonEditor

209

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

• AWSMobileHub_ReadOnly

此策略提供对 AWS Mobile Hub 项目的只读访问权限。其 IAM 用户、角色或组附加了此策略的用户可以查看项目配置并生成可在开发人员的桌面上 (例如,在 Android Studio 或 Xcode 中) 下载和构建的示例快速启动应用程序项目。此策略不允许修改 Mobile Hub 项目配置,并且它不允许用户在尚未启用 AWS MobileHub 的账户中启用对后者的使用。登录 Mobile Hub 控制台并创建项目之后,您可以使用以下链接查看此策略和附加到此策略的 IAM 身份。• http://console.aws.amazon.com/iam/home?region=us-east-1#policies/arn:aws:iam::aws:policy/

AWSMobileHub_ReadOnly

如果您的 IAM 用户、角色或组具有在 AWS Mobile Hub 项目中使用的只读权限,则您在控制台中看到的项目信息将不会反映在 Mobile Hub 之外所做的任何更改。例如,如果您在 API 网关 中删除某个云逻辑 API,则此 API 可能仍存在于您的 Mobile Hub 项目的云逻辑函数列表中,直至具有mobilehub:SynchronizeProject 权限的用户访问控制台。通过 AdminstratorAccess 策略授予控制台访问权限的用户具有这些权限。如果您需要在 Mobile Hub 中使用其他权限,请与您的管理员联系并请求AdminstratorAccess 策略。

Mobile Hub 的 IAM 身份验证和访问控制

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

Note

无需深入了解 AWS IAM、身份验证和访问控制即可使用 Mobile Hub 为您的移动应用程序配置后端。

Mobile Hub 使用 AWS 凭证和权限策略,以允许用户查看和/或创建和配置用户为其移动应用程序选择的后端功能。

以下各部分提供有关 IAM 如何工作、您如何使用 IAM 来安全地控制对您的项目的访问以及 Mobile Hub 代表您配置什么 IAM 角色和策略的详细信息。

主题• 身份验证 (p. 210)• 访问控制 (p. 211)

身份验证

AWS 资源和服务只能通过使用 AWS 凭证的正确身份验证进行查看、创建或修改(还必须授予对这些资源和服务的访问权限 (p. 212))。您可以下面任一类型的身份访问 AWS:

• AWS 账户根用户

注册 AWS 时,您需要提供与您的 AWS 账户关联的电子邮件地址和密码。这些是您的根凭证,它们提供对您所有 AWS 资源的完全访问权限。

210

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

Important

出于安全考虑,我们建议您仅使用根凭证创建管理员用户,此类用户是对您的 AWS 账户具有完全访问权限的 IAM 用户。然后,您可以使用该管理员用户创建具有有限权限的其他 IAM 用户和角色。有关更多信息,请参阅 IAM 用户指南 中的 IAM 最佳实践和创建管理员用户和组。

• IAM 用户

IAM 用户就是您的 AWS 账户中的一种身份,它具有特定的自定义权限(例如,用于访问您的 Mobile Hub项目的只读权限)。您可以使用 IAM 用户名和密码登录安全 AWS 网页,例如 AWS 管理控制台、AWS 开发论坛或 AWS 支持中心。

除了用户名和密码之外,您还可以为每个用户生成访问密钥。在通过多个开发工具包之一或使用 AWS 命令行界面 (CLI) 以编程方式访问 AWS 服务时,可以使用这些密钥。SDK 和 CLI 工具使用访问密钥对您的请求进行加密签名。如果您不使用 AWS 工具,则必须自行对请求签名。

• IAM 角色

IAM 角色是可在账户中创建的另一种具有特定权限的 IAM 身份。它类似于 IAM 用户,但未与特定人员关联。利用 IAM 角色,您可以获得可用于访问 AWS 服务和资源的临时访问密钥。具有临时凭证的 IAM 角色在以下情况下很有用:• 联合身份用户访问

您也可以不创建 IAM 用户,而是使用来自您的企业用户目录或 Web 身份提供商的既有用户身份。他们被称为联合身份用户。在通过身份提供商请求访问权限时,AWS 将为联合身份用户分配角色。有关联合身份用户的更多信息,请参阅 IAM 用户指南 中的联合身份用户和角色。

• 跨账户访问

您可以使用您账户中的 IAM 角色向另一个 AWS 账户授予对您账户的资源的访问权限。有关示例,请参阅 IAM 用户指南 中的教程:使用 IAM 角色委托跨 AWS 账户的访问权限。

• AWS 服务访问

您可以使用您的账户中的 IAM 角色向 AWS 服务授予对您账户中资源的访问权限。例如,您可以创建一个角色,此角色允许 Amazon Redshift 代表您访问 Amazon S3 存储桶,然后将存储在该存储桶中的数据加载到 Amazon Redshift 集群中。有关更多信息,请参阅 IAM 用户指南中的创建向 AWS 服务委托权限的角色。

• 在 Amazon EC2 上运行的应用程序

您不用将访问密钥存储在 EC2 实例中以供在实例上运行的应用程序使用并发出 AWS API 请求,而是可以使用 IAM 角色来管理这些应用程序的临时凭证。要将 AWS 角色分配给 EC2 实例并使其对该实例的所有应用程序可用,您可以创建一个附加到实例的实例配置文件。实例配置文件包含角色,并使 EC2 实例上运行的程序能够获得临时凭证。有关更多信息,请参阅 IAM 用户指南 中的对 Amazon EC2 上的应用程序使用角色。

访问控制

您可以使用有效的凭证来对自己的请求进行身份验证,但您还必须拥有权限才能访问或修改 Mobile Hub 项目。这在 Mobile Hub 创建和配置您为项目配置的服务和资源时同样适用于它。

以下各部分描述如何管理权限以及了解 Mobile Hub 代表您管理的权限。

• 控制对 Mobile Hub 项目的访问权限 (p. 207)

211

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

Mobile Hub 项目的访问权限管理概述

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

Note

无需深入了解 AWS IAM、身份验证和访问控制即可使用 Mobile Hub 为您的移动应用程序配置后端。

每个 AWS 资源归一个 AWS 账户所有。查看、创建和/或访问资源的权限 (p. 207)受策略限制。

账户管理员可以向 IAM 身份(即:用户、组和角色)附加权限策略,某些服务(如 AWS Lambda)也支持向资源附加权限策略。

Note

账户管理员(或管理员用户)是具有管理员权限的用户。有关更多信息,请参阅 IAM 用户指南 中的IAM 最佳实践。在授予权限时,您要决定谁获得权限,获得对哪些资源的权限,以及您允许对这些资源执行的具体操作。

主题• 了解 AWS Mobile Hub 的资源所有权 (p. 212)• 管理对资源的访问 (p. 212)• 指定策略元素:操作、效果、资源和委托人 (p. 213)

了解 AWS Mobile Hub 的资源所有权

Mobile Hub 项目的主要资源是项目本身。在第一次使用 Mobile Hub 控制台时,允许 Mobile Hub 为您管理权限和访问项目资源。资源所有者 是创建资源的 AWS 账户。也就是说,资源所有者是委托人实体(根账户、IAM 用户或 IAM 角色)的 AWS 账户。以下示例说明了它的工作原理:

• 如果您使用您的 AWS 账户的根账户凭证创建 AWS Mobile Hub 项目,则您的 AWS 账户是与该项目关联的资源的所有者。

• 如果您在您的 AWS 账户中创建 IAM 用户并向该用户授予创建 Mobile Hub 项目的权限,则该用户还可以创建项目。但是,该用户所属的 AWS 账户拥有与项目关联的资源。

• 如果您在您的 AWS 账户中创建有权创建 AWS Mobile Hub 项目的 IAM 角色,则可代入该角色的任何人都可以创建、编辑或删除项目。该角色所属的 AWS 账户拥有与项目关联的资源。

管理对资源的访问

权限策略 规定谁可以访问哪些内容。下一节介绍创建权限策略时的可用选项。

Note

本节讨论如何在 AWS Mobile Hub 范围内使用 IAM。它不提供有关 IAM 服务的详细信息。有关完整的 IAM 文档,请参阅 IAM 用户指南 中的什么是 IAM?。有关 IAM 策略语法和说明的信息,请参阅IAM 用户指南 中的 AWS Identity and Access Management 策略参考。

212

AWS Mobile Hub 开发人员指南 开发人员指南IAM 用法

附加到 IAM 身份的策略称作基于身份的策略(IAM 策略),附加到资源的策略称作基于资源的策略。

主题• 基于身份的策略(IAM 策略) (p. 213)• 基于资源的策略 (p. 213)

基于身份的策略(IAM 策略)

您可以向 IAM 身份挂载策略。例如,您可以执行以下操作:

• 将权限策略附加到账户中的用户或组? 账户管理员可以使用与特定用户关联的权限策略来授予该用户查看或修改 AWS Mobile Hub 项目的权限。

• 将权限策略附加到角色(授予跨账户权限)? 您可以将基于身份的权限策略附加到 IAM角色以授予跨账户权限。例如,当您首先进入 Mobile Hub 并作为账户委托人同意向其授予您的项目的预配置和配置权限,则您将向 AWS 托管 MobileHub_Service_Role 角色授予跨账户的权限。AWS 托管策略AWSMobileHub_ServiceUseOnly 将附加到您的 Mobile Hub 项目上下文中的该角色。该角色具有允许Mobile Hub 充当账户委托人的信任策略,账户委托人能够授予您的项目所使用的服务和资源的权限。

有关使用 IAM 委托权限的更多信息,请参阅 IAM 用户指南 中的访问管理。

在使用基于身份的策略示例中,以下策略为用户授予创建 Amazon S3 存储桶的权限。具有这些权限的用户可使用 Amazon S3 服务创建存储位置。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":"s3:CreateBucket*", "Resource":"*" } ] }

有关在 Mobile Hub 中使用基于身份的策略的更多信息,请参阅 :ref: reference-mobile-hub-project-permissions-model`。

有关用户、组、角色和权限的更多信息,请参阅 IAM 用户指南 中的身份(用户、组和角色)。

基于资源的策略

其他服务(如 Amazon S3)也支持基于资源的权限策略。例如,您可以将策略附加到 Amazon S3 存储桶以管理对该存储桶的访问权限。

指定策略元素:操作、效果、资源和委托人通过 Mobile Hub 配置的每个服务都定义一组 API 操作。要向 Mobile Hub 授予这些 API 操作的权限,AWS托管策略中指定了一组操作。执行一个 API 操作可能需要多个操作的权限。

以下是基本的策略元素:

• Resource (资源) - 在策略中,您可以使用 Amazon 资源名称 (ARN) 标识策略应用到的资源。• Action (操作) - 您可以使用操作关键字标识要允许或拒绝的资源操作。例如,s3:Createbucket 权限允

许 Mobile Hub 执行 Amazon S3CreateBucket 操作。• Effect (效果) - 您可以指定当用户请求特定操作(可以是允许或拒绝)时的效果。如果没有显式授予 (允许)

对资源的访问权限,则隐式拒绝访问。您也可显式拒绝对资源的访问,这样可确保用户无法访问该资源,即使有其他策略授予了访问权限的情况下也是如此。

213

AWS Mobile Hub 开发人员指南 开发人员指南项目服务区域托管

• Principal (委托人) - 在基于身份的策略(IAM 策略)中,附加了策略的用户是隐式委托人。对于基于资源的策略,您可以指定要接收权限的用户、账户、服务或其他实体 (仅适用于基于资源的策略)。

Mobile Hub 项目服务区域托管

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

您的 Mobile Hub 项目的配置设置存储在 AWS 美国东部 (弗吉尼亚) 区域中。

您配置的 AWS 服务托管在您为项目选择的区域中 (如果这些服务在该区域中可用)。如果服务在该区域中不可用,则 Mobile hub 将在其他区域中托管这些服务。

有关区域终端节点的更多详细信息,请参阅 AWS 区域和终端节点。

要了解您的项目的服务将托管在什么位置,请在下表中查找项目的区域。

选择您的项目的区域:• 美国东部 (弗吉尼亚) (p. 214)• 美国东部 (俄亥俄) (p. 215)• 美国西部 (加利福尼亚) (p. 215)• 美国西部 (俄勒冈) (p. 215)• 欧洲西部(爱尔兰) (p. 216)• 欧洲西部 (伦敦) (p. 216)• 欧洲 (法兰克福) (p. 216)• 亚太地区 (东京) (p. 217)• 亚太区域 (首尔) (p. 217)• 亚太地区(孟买) (p. 217)• 亚太区域(新加坡) (p. 218)• 亚太区域(悉尼) (p. 218)• 南美洲(圣保罗) (p. 218)

美国东部 (弗吉尼亚)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 美国东部 (弗吉尼亚)

Amazon Cognito(用户登录/用户文件存储) 美国东部 (弗吉尼亚)

Amazon DynamoDB(NoSQL 数据库) 美国东部 (弗吉尼亚)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 美国东部 (弗吉尼亚)

214

AWS Mobile Hub 开发人员指南 开发人员指南项目服务区域托管

面向这些服务的托管: 位于:

AWS Lambda(云逻辑) 美国东部 (弗吉尼亚)

美国东部 (俄亥俄)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 美国东部 (俄亥俄)

Amazon Cognito(用户登录/用户文件存储) 美国东部 (俄亥俄)

Amazon DynamoDB(NoSQL 数据库) 美国东部 (俄亥俄)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 美国东部 (俄亥俄)

AWS Lambda(云逻辑) 美国东部 (俄亥俄)

美国西部 (加利福尼亚)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 美国西部 (加利福尼亚)

Amazon Cognito(用户登录/用户文件存储) 美国西部 (俄勒冈)

Amazon DynamoDB(NoSQL 数据库) 美国西部 (加利福尼亚)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 美国西部 (加利福尼亚)

AWS Lambda(云逻辑) 美国西部 (加利福尼亚)

美国西部 (俄勒冈)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 美国西部 (俄勒冈)

Amazon Cognito(用户登录/用户文件存储) 美国西部 (俄勒冈)

Amazon DynamoDB(NoSQL 数据库) 美国西部 (俄勒冈)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

215

AWS Mobile Hub 开发人员指南 开发人员指南项目服务区域托管

面向这些服务的托管: 位于:

Amazon S3(用户文件存储/消息收发和托管) 美国西部 (俄勒冈)

AWS Lambda(云逻辑) 美国西部 (俄勒冈)

欧洲西部(爱尔兰)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 欧洲西部(爱尔兰)

Amazon Cognito(用户登录/用户文件存储) 欧洲西部(爱尔兰)

Amazon DynamoDB(NoSQL 数据库) 欧洲西部(爱尔兰)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 欧洲西部(爱尔兰)

AWS Lambda(云逻辑) 欧洲西部(爱尔兰)

欧洲西部 (伦敦)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 欧洲西部 (伦敦)

Amazon Cognito(用户登录/用户文件存储) 欧洲西部 (伦敦)

Amazon DynamoDB(NoSQL 数据库) 欧洲西部 (伦敦)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 欧洲西部 (伦敦)

AWS Lambda(云逻辑) 欧洲西部 (伦敦)

欧洲 (法兰克福)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 欧洲 (法兰克福)

Amazon Cognito(用户登录/用户文件存储) 欧洲 (法兰克福)

Amazon DynamoDB(NoSQL 数据库) 欧洲 (法兰克福)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

216

AWS Mobile Hub 开发人员指南 开发人员指南项目服务区域托管

面向这些服务的托管: 位于:

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 欧洲 (法兰克福)

AWS Lambda(云逻辑) 欧洲(法兰克福)

亚太地区 (东京)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 亚太地区 (东京)

Amazon Cognito(用户登录/用户文件存储) 亚太地区 (东京)

Amazon DynamoDB(NoSQL 数据库) 亚太地区 (东京)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 亚太地区 (东京)

AWS Lambda(云逻辑) 亚太区域(东京)

亚太区域 (首尔)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 亚太地区 (首尔)

Amazon Cognito(用户登录/用户文件存储) 亚太地区 (首尔)

Amazon DynamoDB(NoSQL 数据库) 亚太地区 (首尔)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 亚太地区 (首尔)

AWS Lambda(云逻辑) 亚太区域(首尔)

亚太地区(孟买)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 亚太地区 (孟买)

Amazon Cognito(用户登录/用户文件存储) 亚太地区 (孟买)

Amazon DynamoDB(NoSQL 数据库) 亚太地区 (孟买)

217

AWS Mobile Hub 开发人员指南 开发人员指南项目服务区域托管

面向这些服务的托管: 位于:

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 亚太地区 (孟买)

AWS Lambda(云逻辑) 亚太地区(孟买)

亚太区域(新加坡)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 亚太地区 (新加坡)

Amazon Cognito(用户登录/用户文件存储) 亚太地区 (新加坡)

Amazon DynamoDB(NoSQL 数据库) 亚太地区 (新加坡)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 亚太地区 (新加坡)

AWS Lambda(云逻辑) 亚太区域(新加坡)

亚太区域(悉尼)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 亚太地区 (悉尼)

Amazon Cognito(用户登录/用户文件存储) 亚太地区 (悉尼)

Amazon DynamoDB(NoSQL 数据库) 亚太地区 (悉尼)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 亚太地区 (悉尼)

AWS Lambda(云逻辑) 亚太地区 (悉尼)

南美洲(圣保罗)

面向这些服务的托管: 位于:

Amazon API Gateway(云逻辑) 南美洲(圣保罗)

Amazon Cognito(用户登录/用户文件存储) 美国东部 (弗吉尼亚)

218

AWS Mobile Hub 开发人员指南 开发人员指南项目故障排除

面向这些服务的托管: 位于:

Amazon DynamoDB(NoSQL 数据库) 南美洲(圣保罗)

Amazon Lex(对话机器人) 美国东部 (弗吉尼亚)

Amazon Pinpoint(消息收发与分析) 美国东部 (弗吉尼亚)

Amazon S3(用户文件存储/消息收发和托管) 美国东部 (弗吉尼亚)

AWS Lambda(云逻辑) 南美洲(圣保罗)

Mobile Hub 项目故障排除

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

以下几节介绍了在设置、导入或导出 Mobile Hub 项目时可能遇到的问题及其补救措施。

主题• 无法导入 API (p. 219)• 无法导入 NoSQL 表 (p. 220)• 无法导入多个 NoSQL 表 (p. 220)• 无法导入推送凭证 (p. 220)• 无法找到构建项 (p. 221)• 在导入期间无法配置 S3 存储桶 (p. 221)• 在设置期间出现“需要管理员”错误 (p. 222)• 未完成账户设置 (p. 222)• 文件过大,无法导入 (p. 222)

无法导入 API错误消息

• Project owner does not own existing API : arn:aws:execute-api:us-east-1:012345678901:abcdefghij.

(其中 API 标识符 arn:aws:execute-api:us-east-1:012345678901:abcdefghij 是要导入项目的特定标识符)

描述

• 此消息意味着,具有所示 ID 的 API 无法导入,因为它在当前 AWS 账户中不存在。当原始项目中的 API是在 Mobile Hub 云逻辑功能之外创建然后导入时,将会出现这种情况。

补救措施

219

AWS Mobile Hub 开发人员指南 开发人员指南项目故障排除

• 要补救这种情况,请执行以下步骤。1. 修改您将导入的项目定义的 YAML,删除 features:components 节点下的以下部分:以导入到原始

项目云逻辑功能中的 API 的名称开头的部分。2. 保存并导入项目定义。3. 在您的已导入项目中启用 Mobile Hub 云逻辑功能并重新创建 API 及其处理程序。

无法导入 NoSQL 表错误消息

• 您的账户中已存在名为“someprojectname-mobilehub-012345678-TableName”的现有 DynamoDB 表。请选择其他名称或删除现有表,然后重试您的请求。

(其中表名称 someprojectname-mobilehub-012345678-TableName 是要导入项目的特定表的名称)

描述

• 当您导入包含 NoSQL 数据库功能的项目时,将会出现此消息。它指示项目配置中的 Amazon DynamoDB表已存在。当编辑项目定义文件中的 YAML 表名称值并且多次尝试将其导入同一账户时,可能会出现这种情况。

补救措施

• 要补救此情况,请执行以下步骤1. 修改任何表名称值以解决冲突。2. 保存并导入项目定义。3. 调整已导入应用程序中引用旧表名称值的代码。

无法导入多个 NoSQL 表错误消息

• 项目文件无法解码。它们可能包含由其他账户加密的数据。无法解码推送功能。无法解码凭证属性。

描述

• 当您导入与您的 AWS 账户无关联的功能的推送通知消息收发服务凭证或 Amazon SNS 主题标识符时,将会出现此消息。

补救措施

• 要补救此情况,请执行以下步骤1. 通过删除表定义部分来修改要导入的项目定义的 YAML。2. 保存并导入项目定义。3. 使用删除的表定义通过 Mobile Hub NoSQL 数据库功能手动创建这些表。

无法导入推送凭证错误消息

220

AWS Mobile Hub 开发人员指南 开发人员指南项目故障排除

• 项目文件无法解码。它们可能包含由其他账户加密的数据。无法解码推送功能。无法解码凭证属性。

描述

• 当您导入与您的 AWS 账户无关联的功能的推送通知消息收发服务凭证或 Amazon SNS 主题标识符时,将会出现此消息。

补救措施

• 要补救此情况,请执行以下步骤1. 通过删除 push: node 来修改要导入的项目定义的 YAML。2. 保存并导入项目定义。3. 使用您自己的消息收发服务凭证和主题启用 Mobile Hub 推送通知或用户参与功能。

无法找到构建项错误消息

• 在 project-name 的 Amazon S3 存储桶 archive-deployments-mobilehub-0123456789 中找不到构建项uploads/exported-project-definition.zip。

(其中 exported-project-definition,Amazon S3 存储桶标识符的数字部分和 project-name 是要导入项目的特定内容)

描述

• 由于 Mobile Hub 无法找到在 .yml 项目定义文件中指定的云逻辑 API 处理程序函数 (Lambda) 文件,而导致项目导入失败时,将会出现此消息。

补救措施

• 要补救此情况,请执行以下步骤

此情况的补救措施是,使 Lambda 文件的位置与项目定义 YAML 中指定的路径匹配。

无论出于何种原因,如果 YAML 的 codeFilename 键中描述的路径与 Lambda 函数文件的实际位置 (相对于...-deployments-... Mobile Hub 在启用云逻辑时部署的 Amazon S3 存储桶的根) 不匹配,则将出现此错误。

在导入期间无法配置 S3 存储桶错误消息

• 似乎在创建或配置您的 S3 存储桶时出现问题。

描述

• 在 Mobile Hub 项目导入期间,Mobile Hub 无法为您的项目的部署项创建 S3 存储桶。

补救措施

• 要补救这种情况,请尝试执行以下步骤

221

AWS Mobile Hub 开发人员指南 开发人员指南项目故障排除

使用 Amazon S3 控制台检查以确保未达到最大存储桶容量。

在设置期间出现“需要管理员”错误错误消息

• 似乎您没有执行该操作的权限。

描述

• 在 Mobile Hub 项目配置期间,用户无权创建所需的 Mobile Hub 服务角色。

补救措施

• 要补救这种情况,请尝试执行以下步骤

与您的 AWS 账户管理员联系,并让他们在以下位置创建该服务角色:https://console.aws.amazon.com/mobilehub/home#/activaterole/。

未完成账户设置错误消息

• 似乎未完全设置您的 AWS 账户。

描述

• 在 Mobile Hub 项目配置期间,可能会由于各种原因而出现该错误。

补救措施

• 要补救这种情况,请尝试执行以下步骤• 注销 AWS 控制台并关闭所有浏览器窗口。然后,尝试登录到

<problematic>`AWS Mobile console <>`__</problematic>,并尝试执行最初导致该错误的操作。

• 如果问题仍然存在,请将其发布到<problematic>`AWS Mobile Development forum<https://forums.aws.amazon.com/forum.jspa?forumID=88>`__</problematic>以获得支持。

文件过大,无法导入错误消息

• 项目文件过大。最大文件大小为 10 MB。

描述

• 当您尝试导入超过 10MB 的项目定义文件时,将会出现此消息。

222

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

补救措施

• 减小项目导出文件的大小。项目导出者可能需要在项目定义文件之外交付大型文件负载,同时为导入者提供有关如何使用 AWS 控制台合并这些随附文件的说明。

导出和导入 AWS Mobile Hub 项目

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

概述Mobile Hub 提供了导出和导入 YAML 文件的功能,这些文件用于描述 Mobile Hub 项目的配置。具有 AWS账户的任何人都可导入已导出的项目配置文件来部署新项目 (使用与导入的配置匹配的新 AWS 资源)。

利用此功能,您可复制已导出项目的 AWS 服务配置。虽然项目表中的数据不会导出,但可以将存储或托管存储桶中的文件和 API 处理程序函数代码手动添加到您的导出项目定义中。要了解更多信息,请参阅 import-export-manual。

导出项目配置文件

1. 导航到 Mobile Hub 控制台中的项目列表。2. 将鼠标悬停在项目卡右上角的省略号 (三个点) 上。3. 对于您要导出的项目,选择此卡右上角的 Export (file)。4. 保存您的项目导出文件。

要了解更多有关导出项目配置文件的信息,请参阅项目导出 .yml 文件的结构 (p. 227)。

导入项目

1. 导航到 Mobile Hub 控制台中的项目列表。2. 选择页面左上角的 Import your project。3. 浏览或将项目定义文件拖入 Import project configuration 对话框。4. 选择 Import project。

223

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

使用“部署到 AWS Mobile Hub”链接共享您的项目配置在任何公有 GitHub 存储库中,您都可以提供一个链接,此链接通过在链接的查询字符串中导入已导出的项目配置文件定义,立即启动新 Mobile Hub 项目的创建。此链接的格式应为:

https://console.aws.amazon.com/mobilehub/home?#/?config=YOUR-MOBILE-HUB-PROJECT-CONFIGURATION-LOCATION

例如,以下 HTML 将创建一个链接,为应用程序的 AWS 后端服务提供即时配置(基于 react-sample.zip 中定义的 Mobile Hub 功能)。要查看此代码的实际操作,请参阅 AWS Mobile 响应示例的README.md。

<p align="center"> <a target="_blank" href="https://console.aws.amazon.com/mobilehub/home?#/?config=https://github.com/awslabs/aws-mobile-react-sample/blob/master/backend/import_mobilehub/react-sample.zip"> <span> <img height="100%" src="https://s3.amazonaws.com/deploytomh/button-deploy-aws-mh.png"/> </span> </a></p>

此链接的查询字符串部分可指向 Mobile Hub 项目配置 mobile-hub-project.yml 文件或项目导出 .zip文件(包含 mobile-hub-project.yml 文件)的位置。

Important

如果您使用的是 .zip 文件,它必须符合 Mobile Hub 项目配置导入所需的结构和内容。有关详细信息,请参阅项目导出 .zip 文件的结构 (p. 226)。

导入项目的限制主题

• 最大项目定义文件大小为 10MB (p. 224)• 需要手动导出的项目组件 (p. 224)• 跨账户凭证 (p. 225)• 未导出的项目组件 (p. 225)

最大项目定义文件大小为 10MB

不支持导入超过 10MB 的 Mobile Hub 项目 .zip 或 .yml 文件。

需要手动导出的项目组件

要启用下列项目配置项的导入,您必须手动修改项目的已导出 .zip 文件:

• 数据用户存储内容

要导入在您的原始项目的用户文件存储 Amazon S3 存储桶中存储的文件,请参阅导入用户文件存储内容 (p. 229)。

• 托管和流式处理内容

要导入您的原始项目的托管和流式处理存储桶中托管的文件,请参阅导入托管和流式处理内容 (p. 230)。• SAML 身份联合

224

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

要从您的原始项目导入用户登录 SAML 联合身份验证配置,请参阅导入 SAML 联合身份用户登录 (p. 230)。

• 云逻辑 API 处理程序

要从您的原始项目导入云逻辑 API 处理程序代码和配置,请参阅为云逻辑 API 导入 API 处理程序 (p. 230)。

Note

从浏览器调用云逻辑 API 需要为每个 API 路径配置跨源资源共享 (CORS)。要在项目导入后启用CORS 配置的信息,请参阅导入跨源资源共享 (CORS) 配置 (p. 233)。

跨账户凭证

某些功能需要在其中配置它们的 AWS 账户关联到的凭证和资产。包含此类功能的 Mobile Hub 项目只能导入到导出它们的账户中。具有此限制的功能包含在要导出的 Mobile Hub 项目之外创建的云逻辑 API、推送通知的消息传递提供商凭证以及 Amazon SNS 主题。

Mobile Hub 功能 能否从一个 AWS 账户导出然后导入到另一个账户?

用户登录 是

NoSQL 数据库 是

云逻辑 使用在您的 Mobile Hub 项目内创建的 API:

使用导入到您的项目中的 API:

否 (对于补救措施,请参阅无法导入 API (p. 219))

用户文件存储 是

应用程序内容分发 是

连接器 是

推送通知 否 (对于补救措施,请参阅无法导入推送凭证 (p. 220))

消息传递和分析 (推送通知) 否 (对于补救措施,请参阅无法导入推送凭证 (p. 220))

未导出的项目组件

Mobile Hub 导入/导出功能不支持下列项目:

• 自定义策略

当您启用一个 Mobile Hub 功能时,将部署一组 AWS 服务。Mobile Hub 会将默认访问角色和策略附加到这些对象。导入项目之后,将应用默认角色和策略。

在您的原始项目中,您可以修改或添加到这些默认值;例如,将对数据表的访问权限设置为只读。导出项目配置之后,任何此类自定义将不会包含在项目导出中。要在导入的项目中启用您的自定义策略,导入者必须在导入的项目中手动配置这些策略。除了您的项目导出文件之外,我们建议您为导入者提供策略JSON 和分步说明。这些说明应描述如何使用 AWS 控制台或 AWS CLI 来实现您的自定义。

225

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

• 传统云逻辑

使用传统云逻辑功能的项目不支持导入和导出。此类项目直接调用 Lambda 函数。当前版本的云逻辑将使对 Amazon API Gateway API 的 RESTful 调用链接到 Lambda 函数处理程序。

Mobile Hub 项目导出格式

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

AWS Mobile Hub 提供了导出包含项目配置的 YAML 文件的功能。YAML 文件本身可导入,也可包含在.zip 文件 (其中包含在项目导入期间部署的其他项目组件) 中。本节介绍 YAML 的剖析情况以及典型的Mobile Hub 项目导出 .zip 文件。有关 Mobile Hub 导入/导出功能的更多信息,请参阅导出和导入 AWSMobile Hub 项目 (p. 223)。

主题• 项目导出 .zip 文件的结构 (p. 226)• 项目导出 .yml 文件的结构 (p. 227)

项目导出 .zip 文件的结构

当您选择 Export (file) (导出(文件)) 时,Mobile Hub 将生成一个以您的项目命名的 .zip 的文件。

默认文件结构

Mobile Hub 还会在 .zip 根目录中生成一个 mobile-hub-project.yml 项目配置文件。此位置需要有有效的 mobile-hub-project.yml 文件,Mobile Hub 项目导入才能成功。

示例文件结构

.zip 文件的文件结构 (一个导出的项目,被配置为包含 SAML 联合和云逻辑 API 处理程序的部署) 如下所示:

• /your-project-name.zip

• mobile-hub-project.yml

• saml.xml

• lambda API handler functions

• user data stored files

• hosted files

项目导出 .zip 文件中的文件可在文件夹中排列。该档案中的相对路径必须在引用了该路径的项目定义YAML 键值中反映。

Note

项目配置 .zip 文件中存在的任何文件或文件夹 (上一部分中所述的文件或文件夹除外) 都可能在导入时被忽略或导致问题。

226

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

项目导出 .yml 文件的结构

概括来说,Mobile Hub 项目导出 .yml 文件的基本结构如下所示:

features: FEATURE-TYPE: !com.amazonaws.mobilehub.v0.:FEATURE-TYPE components: FEATURE-NAME: !com.amazonaws.mobilehub.v0.FEATURE-TYPE attributes: ATTRIBUTE-NAME: !com.amazonaws.mobilehub.v0.ATTRIBUTE-VALUE OTHER-FEATURE-PROPERTY-TYPES: OTHER-FEATURE-PROPERTY-VALUES . . .

以下 YAML 是从启用了很多 Mobile Hub 功能的项目导出的 mobile-hub-project.yml 的一个示例。项目定义也已手动更新,以支持原始项目的组件的导入和上传。这些组件包括在原始项目的用户文件存储存储桶中存储的文件、在托管和流式处理存储桶中托管的文件以及其 Lambda 函数中的 API 处理程序代码。

--- !com.amazonaws.mobilehub.v0.Projectfeatures: cloudlogic: !com.amazonaws.mobilehub.v0.CloudLogic components: api-name: !com.amazonaws.mobilehub.v0.API attributes: name: api-name requires-signin: true sdk-generation-stage-name: Development paths: /items: !com.amazonaws.mobilehub.v0.Function codeFilename: uploads/lambda-archive.zip description: "Handler for calls to resource path : /items" enableCORS: true handler: lambda.handler memorySize: "128" name: handler-name runtime: nodejs6.10 timeout: "3" "/items/{proxy+}": !com.amazonaws.mobilehub.v0.Function codeFilename: uploads/lambda-archive.zip description: "Handler for calls to resource path : /items/{proxy+}" enableCORS: true handler: lambda.handler memorySize: "128" name: handler-name runtime: nodejs6.10 timeout: "3" content-delivery: !com.amazonaws.mobilehub.v0.ContentDelivery attributes: enabled: true visibility: public-global components: release: !com.amazonaws.mobilehub.v0.Bucket {} database: !com.amazonaws.mobilehub.v0.Database components: database-nosql: !com.amazonaws.mobilehub.v0.NoSQLDatabase tables: - !com.amazonaws.mobilehub.v0.NoSQLTable attributes: id: S hashKeyName: id hashKeyType: S rangeKeyName: "" rangeKeyType: "" tableName: ___DYNAMIC_PREFIX___-bbq-order

227

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

tablePrivacy: public - !com.amazonaws.mobilehub.v0.NoSQLTable attributes: id: S hashKeyName: id hashKeyType: S rangeKeyName: "" rangeKeyType: "" tableName: ___DYNAMIC_PREFIX___-bbq_restaurants tablePrivacy: public - !com.amazonaws.mobilehub.v0.NoSQLTable attributes: id: S restaurant_id: S hashKeyName: restaurant_id hashKeyType: S rangeKeyName: id rangeKeyType: S tableName: ___DYNAMIC_PREFIX___-bbq_menu_item tablePrivacy: public sign-in: !com.amazonaws.mobilehub.v0.SignIn attributes: enabled: true optional-sign-in: false components: sign-in-user-pools: !com.amazonaws.mobilehub.v0.UserPoolsIdentityProvider attributes: alias-attributes: - email - phone_number mfa-configuration: ON name: userpool password-policy: !com.amazonaws.mobilehub.ConvertibleMap min-length: "8" require-lower-case: true require-numbers: true require-symbols: true require-upper-case: true user-files: !com.amazonaws.mobilehub.v0.UserFiles attributes: enabled: true user-profiles: !com.amazonaws.mobilehub.v0.UserSettings attributes: enabled: truename: myProjectregion: us-east-1uploads: - !com.amazonaws.mobilehub.v0.Upload fileName: stored-file targetS3Bucket: user-file.png - !com.amazonaws.mobilehub.v0.Upload fileName: hosted-file targetS3Bucket: hosting.html - !com.amazonaws.mobilehub.v0.Upload fileName: api-handler-file.zip targetS3Bucket: deployments

手动导出的项目组件

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

228

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

此部分描述如何将项目组件手动添加到已导出的项目定义。

主题• 导入用户文件存储内容 (p. 229)• 导入托管和流式处理内容 (p. 230)• 导入 SAML 联合身份用户登录 (p. 230)• 为云逻辑 API 导入 API 处理程序 (p. 230)• 导入跨源资源共享 (CORS) 配置 (p. 233)

导入用户文件存储内容

在导出启用用户文件存储的项目时,在导出的项目定义中不包含在其 Amazon S3 存储桶中存储的文件。您可以手动配置项目定义以将这些文件上传到已导入项目的新存储桶。

为用户文件存储存储桶中存储的项目文件配置导入和上传

1. 解压缩您的已导出项目 .zip 文件。2. 复制并粘贴您要在导入到已解压文件的文件夹中时上传的每个文件。3. 将文件路径添加到您的已导出项目定义中:

a. 在编辑器中打开导出的 mobile-hub-project.yml 文件。b. 如果尚不存在,请在根目录级别创建一个 uploads: 节点。c. 对于要上传的每个文件,请在 uploads: 下添加以下三个项目。

i. 命名空间 - !com.amazonaws.mobilehub.v0.Uploadii. 键 fileName:,值为项目定义 .zip 文件中指向该文件的路径。iii. 键 targetS3Bucket:,值为 user-files。

--- !com.amazonaws.mobilehub.v0.Projectfeatures: sign-in: !com.amazonaws.mobilehub.v0.SignIn {} user-files: !com.amazonaws.mobilehub.v0.UserFiles attributes: enabled: true user-profiles: !com.amazonaws.mobilehub.v0.UserSettings attributes: enabled: truename: userfilesregion: us-east-1uploads: - !com.amazonaws.mobilehub.v0.Upload fileName: {example1.png} targetS3Bucket: user-files - !com.amazonaws.mobilehub.v0.Upload fileName: {example2.xml} targetS3Bucket: user-files. . .

4. 重新压缩已解压缩项目定义文件内的文件 (不是包含这些文件的文件夹,因为这可能导致路径错误)。

229

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

导入托管和流式处理内容

导入启用了托管和流式处理的某个项目后,存储在其 Amazon S3 存储桶中的文件将不会包含在导出的项目定义中。您可以手动配置项目定义以将这些文件上传到已导入项目的新存储桶。

为存储在托管和流式处理存储桶中的项目文件配置导入和上传

1. 解压缩您的已导出项目 .zip 文件。2. 复制并粘贴您要在导入到已解压文件的文件夹中时上传的每个文件。3. 将文件路径添加到您的已导出项目定义中:

a. 在编辑器中打开导出的 mobile-hub-project.yml 文件。b. 如果尚不存在,请在根目录级别创建一个 uploads: 节点。c. 对于要上传的每个文件,请在 uploads: 下添加以下三个项目。

i. 命名空间 - !com.amazonaws.mobilehub.v0.Uploadii. 键 fileName:,值为项目定义 .zip 文件中指向该文件的路径。iii. 键 targetS3Bucket:,值为 hosting。

--- !com.amazonaws.mobilehub.v0.Projectfeatures: content-delivery: !com.amazonaws.mobilehub.v0.ContentDelivery attributes: enabled: true visibility: public-global components: release: !com.amazonaws.mobilehub.v0.Bucket {}

. . .

uploads: - !com.amazonaws.mobilehub.v0.Upload fileName: {example1.html} targetS3Bucket: hosting - !com.amazonaws.mobilehub.v0.Upload fileName: {example2.js} targetS3Bucket: hosting. . .

4. 重新压缩已解压缩项目定义文件内的文件 (不是包含这些文件的文件夹,因为这可能导致路径错误)。

导入 SAML 联合身份用户登录

为 Mobile Hub 用户登录功能配置 SAML 联合需要您提供您联合的身份识别提供商的 SAML XML 配置(saml.xml)。SAML XML 配置未包含在 Mobile Hub 导出的 .zip 文件中。

配置已导出项目以在导入时部署原始项目的 SAML 联合

1. 解压缩您的已导出项目 .zip 文件。2. 将您的身份识别提供商的 saml.xml 文件复制到已解压缩 .zip 文件的根文件夹中。3. 重新压缩已解压缩项目定义文件内的文件 (不是包含这些文件的文件夹,因为这可能导致路径错误)。

为云逻辑 API 导入 API 处理程序

Mobile Hub 云逻辑功能将 RESTful API 接口 (API 网关) 与无服务器 API 处理程序函数 (Lambda) 配对。虽然 Mobile Hub 支持导出和导入云逻辑配置的 API 和处理程序对象的定义,但不会导出 API 处理程序函数代码。

230

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

利用 Mobile Hub,您能够手动配置您的项目导出 .zip 文件,以在满足下列条件时将您的 API 处理程序函数代码作为项目导入的一部分部署:

• 您的 API 处理程序仅访问 DynamoDB 表。当前不支持导入访问其他 AWS 服务 (如 Amazon S3) 的 API 处理程序。

• 采纳您的处理程序代码以使用 Lambda 环境变量来引用这些 DynamoDB 表。

当 Mobile Hub 导入 API 处理程序代码时,它将使用环境变量将数据操作映射到导入创建的新表。您可在项目的定义 YAML 中定义环境变量的键名称以与您在项目的 Lambda API 处理程序函数代码中定义的常量名称匹配。以下示例显示了相当于环境变量的 Lambda 函数变量。

const YOUR-FUNCTION-CONSTANT-NAME = process.env.KEY-NAME-DEFINED-IN-YAML;";

// exampleconst MENU_TABLE_NAME = process.env.MENU_TABLE_NAME;

这些注释之后的步骤描述如何在项目定义 YAML 中定义环境变量。

Note

替代方法是使用 Mobile Hub 生成的 MOBILE_HUB_DYNAMIC_PREFIX 项目标识符前缀。MobileHub 会将其值配置为已导入项目的唯一标识符。当您在函数代码中向该前缀追加有效表名称时,它将为已导入项目中的表构成一个有效的标识符。以下示例显示了相当于环境变量的 Lambda 函数变量。

const YOUR-FUNCTION-CONSTANT-NAME = process.env.MOBILE_HUB_DYNAMIC_PREFIX + "-YOUR-TABLE-NAME";

// exampleconst MENU_TABLE_NAME = process.env.MOBILE_HUB_DYNAMIC_PREFIX + "-bbq-menu";

此方法不需要对项目定义 YAML 执行额外的手动配置。

AWS Mobile 响应示例应用程序提供了通过 API 及其处理程序使用环境变量访问数据表的端到端示例。对您要导入其代码的每个 API 处理程序执行下列步骤。示例应用程序中的示例以内嵌的方式提供。

为已导出的云逻辑 API 启用 |LAM| 处理程序函数导入

1. 解压缩您的已导出项目 .zip 文件。2. 将您的 Lambda 函数复制到已解压缩的文件中。

a. 转至 Amazon S3 控制台并搜索您的 Mobile Hub 项目名称。b. 选择名称包含 -deployments- 的存储桶,然后选择 uploads 文件夹。c. 复制并保存此文件夹中 Lambda 函数文件的名称以在后续步骤中使用。d. 将此文件夹中的 Lambda 函数文件复制到您的已解压缩的导出项目文件中。

3. 将文件路径添加到您的已导出项目定义中。a. 在编辑器中打开导出的 mobile-hub-project.yml 文件。b. 如果尚不存在,请在根目录级别创建一个 uploads: 节点。c. 对于要上传的每个文件,请在 uploads: 下添加以下三个项目。

i. 命名空间 - !com.amazonaws.mobilehub.v0.Uploadii. 键 fileName:,值为项目定义 .zip 文件中指向该文件的路径。iii. 键 targetS3Bucket:,值为 deployments。

d. 如果每个云逻辑 . . . paths: items 节点中尚不存在,请创建一个 codeFilename: 键,其值为指向该处理程序的 Lambda 函数代码文件的路径。

231

AWS Mobile Hub 开发人员指南 开发人员指南导出和导入项目

Note

在此情况下,该路径相对于 Mobile Hub 为云逻辑预置的 -deployments-Amazon S3 存储桶的根目录。通常,Mobile Hub 将这些文件保存在 /uploads 文件夹中。如果未指定 codeFilename,则 Mobile Hub 将部署在收到请求时响应请求的默认处理程序。

e. 将环境变量添加到您的已导出项目定义中。

对于描述与 DynamoDB 表交互的处理程序的云逻辑 . . . paths: items 节点,请添加一个environment: 节点,其中的子成员将通过将环境变量名称与字符串 __DYNAMIC_PREFIX__ 和关联表名联接在一起而构成。变量名称应映射到您的 Lambda API 处理程序函数代码中的关联变量。

--- !com.amazonaws.mobilehub.v0.Projectfeatures: cloudlogic: !com.amazonaws.mobilehub.v0.CloudLogic components: api-name: !com.amazonaws.mobilehub.v0.API attributes: name: api-name requires-signin: true sdk-generation-stage-name: Development paths: /items: !com.amazonaws.mobilehub.v0.Function codeFilename: {uploads/lambda-archive.zip} description: "Handler for calls to resource path : /items" enableCORS: true handler: lambda.handler memorySize: "128" name: handler-name runtime: nodejs6.10 timeout: "3" environment: {MENU_TABLE_NAME}: ___DYNAMIC_PREFIX___{-bbq_menu_item} {ORDERS_TABLE_NAME}: ___DYNAMIC_PREFIX___{-bbq_orders} {RESTAURANTS_TABLE_NAME}: ___DYNAMIC_PREFIX___-{bbq_restaurants} "/items/{proxy+}": !com.amazonaws.mobilehub.v0.Function codeFilename: {uploads/lambda-archive.zip} description: "Handler for calls to resource path : /items/{proxy+}" enableCORS: true handler: lambda.handler memorySize: "128" name: handler-name runtime: nodejs6.10 timeout: "3" environment: {MENU_TABLE_NAME}: ___DYNAMIC_PREFIX___{-bbq_menu_item} {ORDERS_TABLE_NAME}: ___DYNAMIC_PREFIX___{-bbq_orders} {RESTAURANTS_TABLE_NAME}: ___DYNAMIC_PREFIX___-{bbq_restaurants}. . .

uploads: - !com.amazonaws.mobilehub.v0.Upload fileName: {lambda-archive.zip} targetS3Bucket: deployments - !com.amazonaws.mobilehub.v0.Upload fileName: {lambda.jar} targetS3Bucket: deployments. . .

4. 保存 .yml 文件并重新压缩已解压缩项目定义文件内的文件 (不是包含这些文件的文件夹,因为这可能导致路径错误)。

5. 测试您的已修订项目导出定义 (通过 Mobile Hub 控制台将其导入)。您可以通过 Lambda 控制台验证您的环境变量。

232

AWS Mobile Hub 开发人员指南 开发人员指南Amazon CloudFront 的安全性

Note

默认情况下,Mobile Hub NoSQL 数据库功能将配置表的权限来为 Lambda 函数授予读写访问权限。项目导出中不包含更改表权限所需的这种自定义 IAM 策略配置。依赖自定义策略的项目导入者需要足够的信息才能在导入项目之后重新创建策略。对于此类情况,我们建议您提供您的策略JSON 和有关策略附加方式和位置的分步说明 (控制台或 AWS CLI)。有关这些步骤的更多信息,请参阅 Amazon DynamoDB 的身份验证和访问控制。

导入跨源资源共享 (CORS) 配置默认情况下,AWS 安全基础设施阻止从浏览器对 API 网关 API 发出的调用。为您的 API 的每个路径安全地配置 CORS 使您可以通过 Web 进行 API 调用。CORS 配置未包含在 Mobile Hub 项目导出中。以下步骤描述如何在您的项目导出文件中手动包含 CORS 配置的导入。

为您的 |ABP| API 路径包含 CORS 配置

1. 解压缩您的已导出项目定义 .zip 文件。2. 在编辑器中打开导出的 mobile-hub-project.yml 文件。3. 对于每个 API 路径,在 enableCORS 下添加一个包含值 true 的名为 ... paths: "/

items/. . .": !com.amazonaws.mobilehub.v0.Function 的键,如以下片段中所示。

--- !com.amazonaws.mobilehub.v0.Project features: cloudlogic: !com.amazonaws.mobilehub.v0.CloudLogic components: ReactSample: !com.amazonaws.mobilehub.v0.API attributes: name: ReactSample requires-signin: false paths: "/items/{proxy+}": !com.amazonaws.mobilehub.v0.Function name: FirstHandler handler: lambda.handler enableCORS: true runtime: nodejs6.10 . . .

4. 重新压缩已解压缩项目定义文件内的文件 (不是包含这些文件的文件夹,因为这可能导致路径错误)。

针对 Mobile Hub 用户的 Amazon CloudFront 安全注意事项

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

当您启用 AWS Mobile Hub 托管和流式处理 (p. 192)功能时,会在您的账户中创建 Amazon CloudFront 分配。该分配将在全球 Amazon 边缘服务器网络中缓存您存储在关联的 Amazon S3 存储桶中的 Web 资产。这将为您的客户提供对 Web 资产的快速本地访问。

本主题介绍您可能要用于您的分配的关键 CloudFront 安全相关功能。有关源存储桶的相同类型的信息,请参阅 s3-security。

233

AWS Mobile Hub 开发人员指南 开发人员指南Amazon S3 安全性

访问管理托管和流式处理使分配中的资产公开可用。虽然这对基于 Internet 的资源是正常的安全策略,但如果情况不是这样,则您应考虑限制对资产的访问。安全最佳实践是遵守“最小权限”模型并尽可能地限制对资源的访问。您可能要修改基于资源的策略 (例如分配策略或访问控制列表 (ACL)),以仅向某些用户或某些用户组授予访问权限。

要保护对与托管和流式处理 Web 应用程序关联的任何 AWS 资源 (例如存储桶和数据库表) 的访问权限,我们建议仅限已验证身份的用户访问。通过启用用户登录 (p. 198)功能与登录所需的选项,您可以将此限制添加到您的 Mobile Hub 项目。

有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的 CloudFront 身份验证和访问控制。

要求 HTTPS 协议CloudFront 支持使用 HTTPS 协议对在分配中进行的通信进行加密。这种强烈建议的做法可以保护用户和服务。通过 CloudFront,您可以在客户和分配终端节点之间要求 HTTPS,并在分配的缓存和资产源自的源存储桶之间要求 CloudFront。还支持将 HTTP 流量全局重定向到 HTTPS、将 HTTPS 用于自定义域和其他选项。

有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的使用 HTTPS 以及 CloudFront。

保护私有内容CloudFront 支持一系列在分配缓存中保护私有内容的方法。这些方法包括使用签名 Cookie 和签名 URL 来仅限已验证身份的授权用户访问。

最佳实践是在用户和分配终端节点之间以及分配和内容 Amazon S3 源存储桶之间的连接上使用像这样的技术。

有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的通过 CloudFront 提供私有内容部分。

分配访问日志记录分配日志记录可帮助您了解有关您的应用程序用户的更多信息,满足组织的审核要求,以及了解 CloudFront成本。每个访问日志记录都提供有关单个访问请求的详细信息,如请求者、分配名称、请求时间、请求操作、响应状态和错误代码 (如果有)。您可以在 Amazon S3 存储桶中存储日志。如果希望帮助管理您的成本,您可以删除不再需要的日志,也可以暂停日志记录。

有关更多信息,请参阅 Amazon CloudFront 开发人员指南中的 CloudFront 访问日志。

针对 Mobile Hub 用户的 Amazon S3 安全注意事项

正在寻找适用于 iOS 和 Android 的 AWS 开发工具包? 现在,这些开发工具包及其文档已纳入 AWSAmplify 中。

此页面的内容仅适用于通过 AWS Mobile Hub 或 awsmobile CLI 配置的应用程序。对于使用 AWS 移动开发工具包 v2.8.0 之前版本的现有应用程序,强烈建议您迁移应用程序以使用 AWS Amplify 和最新的开发工具包。

在启用 Mobile Hub 用户文件存储或托管和流式处理功能时,它在您的账户中创建一个 Amazon S3 存储桶。本主题介绍您可能希望用于此存储桶的关键 Amazon S3 安全相关功能。托管和流式处理还会配置一个 CloudFront 分配,该分配将缓存存储在它创建的存储桶中的资产。有关分布的相同类型的信息,请参阅cloudfront-security。

234

AWS Mobile Hub 开发人员指南 开发人员指南Amazon S3 安全性

访问管理默认情况下,对 Amazon S3 存储桶和相关对象的访问权限是私有的:只有资源拥有者才能访问存储桶或包含在其中的资产。存储桶的管理员可通过附加基于资源的策略来授予与其设计相配的访问权限,如用于授予对用户或用户组的访问权限的存储桶策略或访问控制列表 (ACL)。

由 AWS Mobile Hub 托管和流式处理 (p. 192)功能预置的 Amazon S3 配置是设置用于允许访问所有用户的存储桶策略的一个示例。此访问策略在通过此功能公开托管 Web 应用程序的上下文中很有意义。我们建议,如果它满足应用程序设计标准,开发人员还要添加用户登录 (p. 198)功能,使得只有经过身份验证的用户才有权访问的应用程序的 AWS 资源 (如存储桶和数据库)。

有关更多信息,请参阅 Amazon S3 开发人员指南中的管理对 Amazon S3 资源的访问权限。

对象生命周期管理您可以使用对象生命周期管理来让 Amazon S3 基于特定条件对存储桶中的文件(在 Amazon S3 中也称为对象)执行操作。例如,在移动应用程序用户已将某个文件上传到存储桶特定的一段时间后,您可能希望永久删除该文件或将其移动到 Amazon S3 Glacier。您可能希望通过这样减少其他移动应用程序用户可能访问的文件中的数据量。您可能还希望通过删除或存档您知道自己或移动应用程序用户不再需要的文件来管理您的成本。

有关更多信息,请参阅 Amazon S3 开发人员指南中的对象生命周期管理。

对象加密当文件正在向存储桶传输、正在从存储桶传输以及位于存储桶中时,对象加密有助于增强对文件中的数据的保护。您可以使用 Amazon S3 对文件进行加密,也可以自行加密文件。文件可以通过 Amazon S3 托管加密密钥(由 AWS Key Management Service (AWS KMS) 托管的密钥)或您自己的密钥进行加密。

有关更多信息,请参阅 Amazon S3 开发人员指南 中的使用加密保护数据部分。

对象版本控制对象版本控制可帮助您在执行意外的移动应用程序用户操作以及移动应用程序失败后更轻松地恢复文件中的数据。版本控制支持您在存储桶中存储同一文件的多个状态。您可以通过每个版本的相关文件名和版本 ID唯一地访问该版本。如果希望帮助管理您的成本,您可以删除或存档不再需要的旧版本,也可以暂停版本控制。

有关更多信息,请参阅 Amazon S3 开发人员指南中的使用版本控制部分。

存储桶日志记录存储桶日志记录可帮助您了解有关您的应用程序用户的更多信息,满足组织的审核要求,以及了解 AmazonS3 成本。每个访问日志记录都提供有关单个访问请求的详细信息,如请求者、存储桶名称、请求时间、请求操作、响应状态和错误代码 (如果有)。您可以在同一存储桶中或其他存储桶中存储日志。如果希望帮助管理您的成本,您可以删除不再需要的日志,也可以暂停日志记录。

有关更多信息,请参阅 Amazon S3 用户指南中的管理存储桶日志记录。

235