版本变动

版本日期

变动内容

2021/04/01

初稿

2021/07/28

老师布置作业成功新增回调

1. 准备工作

1.1. 成为开发者

向爱乐奇开放平台申请成为开发者,获得CompanyId、AppId、AppSecret等信息。

1.2. 申请测试环境

通过申请测试环境及测试账号,可以在测试环境调试测试数据。

1.3. 获取API文档

为帮助开发者更快地熟悉用友爱乐奇开放平台,更迅速地在平台发布自己的应用,更顺利地成长为优秀的开发者,爱乐奇开放平台特提供相应API文档。

2. 爱乐奇作业概述

爱乐奇作业是具有系统性、梯度性的英语学习计划,将课程内容浓缩成经典习题,覆盖十多种题型类别,在互动练习中全面培养孩子的听说读写能力。

2.1. 主要业务流程

爱乐奇作业服务 为机构老师、学生提供作业服务全流程,主要包括老师布置作业、学生做作业、老师/学生查看作业结果,其中绿色底的页面属于SDK范畴,外部其他页面由接入方提供,详细如下:

  • 老师布置作业

布置作业
  • 老师查看班级作业完成情况

查看班级作业完成情况
  • 学生做作业

做作业2
  • 学生查看结果

查看作业结果

2.2. 题型说明

  • 支持习题题型总计128个

  • 涵盖听、说、读、写4个维度,由11个类别构成(下方为部分类别简单说明)

    题型类别 题型数量 示例截图

    单词卡

    2

    RhinoPng_00

    自然拼读

    4

    RhinoPng_01

    语音跟读

    2

    RhinoPng_02

    客观判断

    9

    RhinoPng_03

    客观选择

    24

    RhinoPng_05

    连线

    15

    RhinoPng_04

    排序

    14

    RhinoPng_06

    文字输入

    11

    RhinoPng_07

    阅读与完形

    5

    RhinoPng_08

    口语练习

    7

    RhinoPng_09

3. 接入说明

在您的产品中集成 爱乐奇作业服务 主要包含以下模块的接入,

  • OpenAPI - 使用方通过AppId/AppSecret访问, 获取老师或者学生的作业相关信息

  • 移动端iOS/Android SDK - 支持调用发起作业的布置,做题和查看流程,具体请看模式说明

接入方和爱乐奇的相互关系如下图所示:

work-flow

注意: 在使用客户端SDK之前,接入方需要将老师、学生、班级等信息先通过账号服务API线下班级API同步给爱乐奇,获取对应班级和用户的OpenID

4. 调用时序图

下面用时序图简要描述各个业务的处理流程和各方调用关系

4.1. 老师布置作业

布置作业

说明:

4.2. 老师查看班级结果

查看班级作业完成情况

说明:

4.3. 老师删除未发布作业

删除未发布作业

说明:

4.4. 学生做作业

做作业

说明:

4.5. 学生查看结果

查看作业结果

说明:

5. OpenAPI

跟作业相关的OpenAPI主要有几下几块,在正式调用前请先阅读 开放平台对接流程平台API调用规范

5.1. 账号服务API

接入方把老师、学生账号信息同步给爱乐奇

5.2. 线下班级API

接入方把班级信息同步给爱乐奇

5.3. 作业相关API

老师和学生查看作业列表等功能

5.4. 学习卡相关API

学习卡相关业务功能

5.5. 业务数据回吐

学习卡开卡、作业布置和提交等信息回吐,方便接入方内部系统展示

6. Alo7 Homework iOS SDK接入文档

6.1. 集成方式

SDK适用于iOS 10及以上版本

cocoapods 集成:

  1. 安装CocoaPods

  2. 准备 Podfile

# CocoaPods master repo,如果使用其他的镜像源,此行可修改
# source 'https://github.com/CocoaPods/Specs.git'
# 若CocoaPods 版本高于 1.7.2,建议使用 CDN 地址。
source 'https://cdn.cocoapods.org/'

# SDK 依赖 CocoaPods Repo,必填
source 'https://github.com/alo7/ios-repo.git'

target 'YourTargetName' do
       platform :ios, "10.0"
       pod 'Alo7HomeworkSDK', '~> 0.3'
end

# 由于Apple关于新上APP禁止使用UIWebview,添加下面代码删除UIWebview相关代码
pre_install do |installer|
  installer.pod_targets.each do |target|
    if target.name == 'WebViewJavascriptBridge'
      target.all_files.each do |file|
        if file.match?(/\/WebViewJavascriptBridge\.[hm]$/)
          File.delete(file)
        end
      end
    end
  end
end

### 若项目中有使用RXSwift则需要在podfile中加入下面这段
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      if ['RxSwift', 'RxCocoa', 'RxRelay'].include?(target.name)
          config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = "YES"
      end
    end
  end
end
  1. 由于录音功能在模拟器上的限制,建议使用真机开发调试音视频及录音相关功能。

6.2. 使用场景

  • 老师场景

1) SDK初始化

       // 携带参数启动 SDK(参数待定义,以Key Value形式封装于Alo7HomeworkConfig)
       let config = Alo7HomeworkConfig()
       Alo7HomeworkSDK.start(with: context, config: config)

2) 布置作业

       // 布置作业,token为从后端API换取的Alo7 token
       // thirdPartyClazzIds 第三方班级Id, 可传多个, 默认为不传。
       Alo7HomeworkSDK.assignHomework(
              token: #{token}, thirdPartyClazzIds: #{thirdPartyClazzIds}, from: #{viewController},
              success: {
                  //打开作业成功回调
              },
              fail: { [weak self ](error) in
                  //打开作业失败回调
              },
             stateHandler: { [weak self] (state) in
                switch state {
                case .close(let data):
                    //关闭页面回调
                @unknown default:
                    fatalError()
                }
          })

3) 检查作业

       // 检查作业,homeworkId为作业ID,token为从后端API换取的Alo7 token
       Alo7HomeworkSDK.checkHomework(
            #{homeworkId}, token: #{token}, from: #{viewController},
            success: {
                //打开作业成功回调
            },
            fail: { [weak self ](error) in
                //打开作业失败回调
            },
            stateHandler: { [weak self] (state) in
              switch state {
                case .close(let data):
                    //关闭页面回调
                @unknown default:
                    fatalError()
                }
            }
        )

4) Alo7HomeworkSDK.checkHomework 的 stateHandler目前有case .close(let data),携带的返回数据data说明

回调参数是个通用的数据结构,序列化之后是个 {type: string,payload?: any} 类型,目前的 type 可能是如下值:

type

描述

publish_homework_success

布置作业成功

  • 学生场景

1) SDK初始化

       // 携带参数启动 SDK(参数待定义,以Key Value形式封装于Alo7HomeworkConfig)
       let config = Alo7HomeworkConfig()
       Alo7HomeworkSDK.start(with: context, config: config)

2) 查看作业

       // 进入作业详情页,homeworkId为作业ID,token为从后端API换取的Alo7 token
       Alo7HomeworkSDK.showHomework(
            #{homeworkId}, token: #{token}, from: #{viewController},
            success: {
                //打开作业成功回调
            },
            fail: { [weak self ](error) in
                //打开作业失败回调
            },
            stateHandler: { [weak self] (state) in
              switch state {
                case .close(let data):
                    //关闭页面回调
                @unknown default:
                    fatalError()
                }
            })

6.3. 错误类型

public enum Alo7HomeworkError: Error {
    /**
     * 网络请求未获得Response
     */
    case nonHTTPResponse(URLResponse)
    /**
     * 请求获得的URL格式不正确
     */
    case failGetURL
    /**
     * 网络连接失败
     * code:错误代码
     * message:错误信息
     */
    case fail(code: String, message: String)
    /**
     * 解析服务器数据异常
     */
    case jsonSerializationError

    /**
     * 未知的服务器异常
     */
    case serverUnkown
    /**
     * 未知异常
     */
    case unknown
}

7. Alo7 Homework Android SDK接入文档

7.1. 集成方式

SDK适用于Android 5(API Level 21)及以上版本

Gradle 集成:

1.项目级gradle文件中配置

allprojects {
    repositories {
        // mavenCentral仓库如果已有则无需添加
        mavenCentral()
        maven {
            url "https://maven.pkg.github.com/alo7/android-homework-sdk"
            credentials {
                username = "homework-sdk-user"
                password = "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"
            }
        }
    }
}

2.应用级gradle文件中配置

dependencies中artifactId的设置说明:

    android {
        ...
        //homework sdk 基于Java8开发, android block需要添加如下配置, 已有可跳过
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }

    dependencies {
        implementation 'androidx.appcompat:appcompat:1.2.0' //已有则无需添加
        implementation 'com.alo7.android:homeworksdk:0.3.0-SNAPSHOT'
    }

7.2. 使用方式

1.Proguard混淆配置

SDK已内置了相关类的混淆规则, 一般情况下无需再针对进行特殊配置

2.使用场景

  • 老师场景

1) SDK初始化

在Application中初始化Homework SDK

        // 携带参数启动 SDK
        // debugMode 是一个布尔值,表示是否为debug模式,为true时会有相关日志输出
        Alo7HomeworkSDK.initialize(this, debugMode);

2) 布置作业

(1) 不携带clazzId布置作业

 Alo7HomeworkSDK.assignHomework(this, token, new ResultCallback() {
             @Override
             public void onSuccess() {
                // assignHomework是一个异步操作,调用成功后会自动跳转到布置作业页面
                // 调用assignHomework时需要展示Loading,请求成功后可在此处隐藏Loading,
             }

             @Override
             public void onError(Alo7Error error) {
                // 可通过error.getErrorCode处理相应异常
             }
 });

(2)携带班级ID布置作业

Alo7HomeworkSDK.assignHomeworkWithClazzId(this, token, Arrays.asList(ids), new ResultCallback() {
        @Override
        public void onSuccess() {
            // assignHomeworkWithClazzId是一个异步操作,调用成功后会自动跳转到布置作业页面
            // 调用assignHomeworkWithClazzId时需要展示Loading,请求成功后可在此处隐藏Loading,
        }

        @Override
        public void onError(Alo7Error error) {
            // 可通过error.getErrorCode处理相应异常
        }
    });

上述两个布置作业的接口调用成功后会跳转至布置作业页面,在布置作业页面布置成功后会通过setResult()返回相关数据,如需处理数据,可以在调用这两个接口的页面中重写onActivityResult方法。代码如下:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 判断resultCode为RESULT_OK,并且requestCode为ASSIGN_HOMEWORK_REQUEST_CODE
        if (resultCode == Activity.RESULT_OK && requestCode == ASSIGN_HOMEWORK_REQUEST_CODE) {
            // 需要注意判断data是否为null
            String dataStr = data.getStringExtra(KEY_ASSIGN_HOMEWORK_RESULT);
            ToastUtils.showToast("关闭了H5页面,接收到数据:" + dataStr);
            // 成功布置作业后,dataStr的值为 `"{\"type\":\"publish_homework_success\"}"`
        }
    }

3) 检查作业

Alo7HomeworkSDK.checkHomework(this, homeworkId, token, new ResultCallback() {
            @Override
            public void onSuccess() {
                // checkHomework是一个异步操作,调用成功后会自动跳转到检查作业页面
                // 调用checkHomework时需要展示Loading,请求成功后可在此处隐藏Loading,
            }

            @Override
            public void onError(Alo7Error error) {
                // 可通过error.getErrorCode处理相应异常
            }
        });

4) 异常与错误码

Homework SDK接口的异常被封装在Alo7Error中,当发生异常时会通过回调onError方法给出Alo7Error异常信息

public interface ResultCallback {

    void onSuccess();

    void onError(Alo7Error error);
}

Alo7Error中封装了errorCode和errorMessage,可以根据errorCode进行相关错误的判断,errorCode如下:

errorCode

描述

homework.teacher_is_not_in_clazz

教师不在该班级或者已经退班了

connect.error

连接服务器异常

connect.timeout

连接服务器超时

parse.error

解析服务器返回的数据出现异常

unknown.server.exception

未知的服务器异常

unknown.exception

未知异常

5) 回调参数说明

回调参数是个通用的数据结构,序列化之后是个 {type: string,payload?: any} 类型,目前的 type 可能是如下值:

type

描述

publish_homework_success

布置作业成功

  • 学生场景

1) SDK初始化

在Application中初始化HomeworkSDK

// 携带参数启动 SDK
// debugMode 是一个布尔值,表示是否为debug模式,为true时会有相关日志输出
Alo7HomeworkSDK.initialize(this, debugMode);

2)学生做作业

Alo7HomeworkSDK.showHomework(this, homeworkId, token, new ResultCallback() {
            @Override
            public void onSuccess() {
                // showHomework是一个异步操作,调用成功后会自动跳转到查看作业页面
                // 调用checkHomework时需要展示Loading,请求成功后可在此处隐藏Loading
            }

            @Override
            public void onError(Alo7Error error) {
                // 可通过error.getErrorCode处理相应异常
            }
        });

3) 异常与错误码

Homework SDK接口的异常被封装在Alo7Error中,当发生异常时会通过回调onError方法给出Alo7Error异常信息

public interface ResultCallback {

    void onSuccess();

    void onError(Alo7Error error);
}

Alo7Error中封装了errorCode和errorMessage,可以根据errorCode进行相关错误的判断,errorCode如下:

errorCode

描述

homework.student_is_not_in_clazz

学生不在该班级或者已经退班了

homework.no_accessible_visa

没有学习套餐

connect.error

连接服务器异常

connect.timeout

连接服务器超时

parse.error

解析服务器返回的数据出现异常

unknown.server.exception

未知的服务器异常

unknown.exception

未知异常

Unresolved directive in index.adoc - include::data_feed.adoc[]