亚马逊AWS官方博客

全新推出 – 适用于 Android 和 iOS 的 AWS Amplify 库

开发移动应用程序时,您必须为每个项目开发一组由云技术提供支持的功能。例如,大多数应用程序都需要用户身份验证或详细的应用内分析。您的应用程序很可能要调用 REST API 或 GraphQL API,并且还需要支持脱机场景和数据同步。AWS Amplify 让您可以轻松地在移动和 Web 应用程序内集成此类功能。

AWS Amplify 由一组工具和服务组成,用于构建安全、可扩展的移动和 Web 应用程序。它由三个组件组成:用于添加云功能的开源库和 UI 组件集,用于创建和管理云后端的命令行交互式工具链,以及部署和托管全堆栈无服务器 Web 应用程序的 AWS 服务 AWS Amplify 控制台

今天,我高兴地宣布,Amplify iOSAmplify Android 库与工具正式推出,以帮助移动应用程序开发人员轻松构建由云技术提供支持的安全、可扩展的应用程序。

直到今天,在您开发由云提供支持的移动应用程序时,您一直都要结合使用各种工具和开发工具包:使用 Amplify CLI 创建和管理后端,并使用一个或多个 AWS 移动开发工具包来访问后端。通常,AWS 移动开发工具包是封装 AWS 服务 API 的低级“封套”。它们要求您了解 API 的详细信息,大多数时候还要求编写许多行无差别的代码,例如对象序列化(和反序列化)、错误处理等。

Amplify iOS 和 Amplify Android 可以简化此过程。首先,它们提供围绕使用案例的本地库,例如身份验证、数据存储和访问、机器学习预测等使用案例。它们提供了声明性接口,通过这种接口,您可以以编程方式,通过抽象应用最佳实践。考虑使用案例而非 AWS 服务可以带来更高级别的抽象、更快的的开发周期和更少的代码行。其次,它们提供了可与原生 IDE 工具链集成的工具,包括适用于 iOS 的 XCode 和适用于 Android 的 Gradle

我们建议您使用 Amplify iOSAmplify Android 在您的移动应用程序中集成基于云的后端。

如何开始使用?
我已经构建了两个简单的移动应用程序(一个基于 iOS,另一个基于 Android),向您展示如何入门。这些示例的源代码可在我的 GitHub 中找到。如您所见,我不是平面设计师。这些应用程序具有用于触发不同流程的 UI 按钮列表,并且结果仅会显示在控制台中。

Amplify iOS 和 Android 演示

用于移动设备的 Amplify 库围绕“身份验证”、“API”(REST 和 GraphQL)、“分析”、“文件存储”、“数据存储”和“预测”这几个类别进行组织。在此示例中,我使用了三个类别。身份验证,用于实施登录、注册和使用 Facebook 登录流。数据存储,使用可查询的设备上持久性存储引擎。它具有内置的版本控制、冲突检测和解决功能,可在应用程序与云之间无缝同步数据。我还使用预测类别,添加英语与法语之间的自动翻译。

让我们回顾一下,在每个平台上开始使用的四个主要步骤和代码行。有关详细的分步教程,请查看 Amplify iOS 或 Amplify Android 文档。

第一步是设置项目、添加所需的依赖项和构建步骤。

在 iOS 上,您要向您的 Podfile 中添加几行代码,并为项目的构建阶段添加 AWS Amplify 构建脚本。
在 Android 上,您在用于模块和应用的 Gradle 文件中执行相同操作。

// iOS Podfile
target 'amplify-lib-ios-demo' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for amplify-lib-ios-demo
    pod 'Amplify'
    pod 'Amplify/Tools'

    pod 'AmplifyPlugins/AWSAPIPlugin'
    pod 'AmplifyPlugins/AWSDataStorePlugin'
    pod 'AmplifyPlugins/AWSCognitoAuthPlugin'
    pod 'AWSPredictionsPlugin'
// Android build.gradle fragment (Module: app) 
...
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
dependencies {
    implementation 'com.amplifyframework:core:1.0.0'
    implementation 'com.amplifyframework:aws-datastore:1.0.0'
    implementation 'com.amplifyframework:aws-api:1.0.0'
    implementation 'com.amplifyframework:aws-predictions:1.0.0'
    implementation 'com.amplifyframework:aws-auth-cognito:1.0.0'
}
...
// Android build.gradle fragment (Project: My Application)
...
repositories {
    mavenCentral()
    google()
    jcenter()
}
dependencies {
        classpath 'com.amplifyframework:amplify-tools-gradle-plugin:1.0.0'
}
apply plugin: 'com.amplifyframework.amplifytools'
...

在 iOS 上,您还必须向构建步骤手动添加一个 amplify-tools.sh

完成后,您要键入 pod install(对于 iOS),或者使用 Gradle 同步项目。

第二步是在应用程序初始化时,向 Amplify 添加对应于每个类别的插件。在 iOS 上,我使用的是来自 AppDelegatedidFinishLaunchingWithOptions。在 Android 上,我使用的是来自 MainActivityonCreate。您可以随意选择在应用程序的任何阶段来初始化 Amplify,而非一定要在应用程序启动时进行初始化。

    // iOS AppDelegate class
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        do {
            try Amplify.add(plugin: AWSAPIPlugin())
            try Amplify.add(plugin: AWSDataStorePlugin(modelRegistration: AmplifyModels()))
            try Amplify.add(plugin: AWSCognitoAuthPlugin())
            try Amplify.add(plugin: AWSPredictionsPlugin())
            
            try Amplify.configure()
            print("Amplify initialized")
        } catch {
            print("Failed to configure Amplify \(error)")
        }
}
   // Android MainActivity class (Kotlin version)
   override fun onCreate(savedInstanceState: Bundle?) {
        // ...

        try {
            Amplify.addPlugin(AWSDataStorePlugin())
            Amplify.addPlugin(AWSApiPlugin())
            Amplify.addPlugin(AWSCognitoAuthPlugin())
            Amplify.addPlugin(AWSPredictionsPlugin())
            Amplify.configure(applicationContext)
            Log.i(TAG, "Initialized Amplify")
        } catch (error: AmplifyException) {
            Log.e(TAG, "Could not initialize Amplify", error)
        }
    }

第三步根据类别的不同而有所不同。通常情况下,这涉及到使用 AWS Amplify 命令行来预置和配置您的后端。输入诸如 amplify add authamplify add predictions 之类的命令来配置类别。

例如,要使用 Amazon Cognito 和社交身份提供程序(例如使用 Facebook 登录)来配置用户身份验证,请输入类似下面所示的代码。在创建和配置云后端时,此步骤对于 iOS 和 Android 平台都是相同的。

要了解如何使用 FacebookGoogleAmazon 之类的社交身份提供程序配置单点登录,您可以参考我在 Amplify iOS 研讨会中撰写的详尽分步式说明(我将尽快更新此研讨会的内容,以利用这些新的 AWS Amplify 库)。

配置“数据存储”类别涉及到为数据创建 GraphQL 架构。Amplify 生成原生(Swift 或 Java)代码,以便在您的应用程序中表示数据。它会透明地处理一个脱机数据存储,以存储您的数据,并在有网络连接可用时将其与后端同步。

第四步也是最后一步,就是在运行时实际调用 Amplify 的库代码。

例如,要触发使用 Amazon Cognito 托管的 Web 用户界面执行身份验证,您可以使用如下代码:

// iOS (swift) in AppDelegate object
    func signIn() {
        _ = Amplify.Auth.signInWithWebUI(presentationAnchor: UIApplication.shared.windows.first!) { (result) in
            switch(result) {
                case .success(let result):
                    print(result)
                case .failure(let error):
                    print("Can not signin \(error)")
            }
        }
    }
// Android (Kotlin) in MainActivity 
    fun signIn(view: View?) {
        Amplify.Auth.signInWithWebUI(
            this,
            { result: AuthSignInResult -> Log.i(TAG, result.toString()) },
            { error: AuthException -> Log.e(TAG, error.toString()) }
        )
    }

上述代码会触发如下 Web 视图:

用于 Cognito 的托管式 UI

类似地,要在“数据存储”中创建一个项目(并通过 GraphQL 将其持久保存到 Amazon DynamoDB 中),您需要使用如下代码:

    // iOS 
    func create() {
        let note = Note(content: "Build iOS application")
        Amplify.DataStore.save(note) {
            switch $0 {
            case .success:
                print("Added note")
            case .failure(let error):
                print("Error adding note - \(error.localizedDescription)")
            }
        }
    }
   // Android 
    fun create(view: View?) {
        val note: Note = Note.builder()
            .content("Build Android application")
            .build()

        Amplify.DataStore.save(
            note,
            { success -> Log.i(TAG, "Saved item: " + success.item.content) },
            { error -> Log.e(TAG, "Could not save item to DataStore", error) }
        )

要使用“预测”类别触发文本翻译,您只需要使用如下代码:

    // iOS 
    func translate(text: String) {
        _ = Amplify.Predictions.convert(textToTranslate: text, language: LanguageType.english, targetLanguage: LanguageType.french) {
            switch $0 {
            case .success(let result):
                // update UI on main thread 
                DispatchQueue.main.async() {
                    self.data.translatedText = result.text
                }
            case .failure(let error):
                print("Error adding note - \(error.localizedDescription)")
            }
        }
    }
   // Android
    fun translate(view: View?) {
        Log.i(TAG, "Translating")

        val et : EditText = findViewById(R.id.toBeTranslated)
        val tv : TextView = findViewById(R.id.translated)

        Amplify.Predictions.translateText(
            et.text.toString(),
            LanguageType.ENGLISH,
            LanguageType.FRENCH,
            { success -> tv.setText(success.translatedText) },
            { failure -> Log.e(TAG, failure.localizedMessage) }
        )
    }

简洁明了,不是吗?

Amplify 移动版翻译演示

价格和可用性
AWS Amplify 可免费使用,您只需要为您应用程序使用的后端服务付费(在免费套餐的用量用尽之后)。

Amplify iOSAmplify Android 现已可用,可通过 CocoaPodsMaven Central 代码库获得。源代码可通过 GitHub 获得(包括 iOS 版和 Android 版源代码)。欢迎随时给我们发送反馈(文档iOSAndroid),也欢迎您提交 Pull 请求 :-)

我也很愿意了解,您使用 AWS Amplify 构建出了哪些优秀的移动应用程序。请不吝与我分享您的屏幕截图或 App Store 链接

祝大家构建顺利!

— seb