生活物联网平台与天猫精灵合作,为平台用户提供了免费的天猫精灵快捷通道。您只需在平台上完成相应的配置,并在App上集成淘宝授权,即可实现自有品牌App控制的设备,被天猫精灵音箱控制。本章针对开发者在生活物联网平台控制台和消费者在App端的使用步骤分别做了介绍。

限制条件

  • 生活物联网平台遵循ICA数据标准,为了确保您的设备可以被天猫精灵准确识别和控制,请确保使用标准功能。
  • 对接天猫精灵时,仅支持在生活物联网平台(中国站)创建项目、产品和App。

消费者使用

阿里IoT的公版免开发App支持天猫精灵控制,使用方式如下步骤所示。

  1. 用户拥有一台支持天猫精灵的设备,下载厂家自有品牌App,绑定该设备。
  2. 用户拥有一台天猫精灵音箱,从手机端应用商店下载天猫精灵App并绑定该音箱。
  3. 在厂家自有品牌App中,用户授权淘宝账号登录,成功绑定天猫精灵。
    说明 App账号和淘宝账号是一一对应的。
  4. 用户在天猫精灵App的设备列表中,在我家页签中可以看到绑定的设备。
    天猫精灵控制设备
  5. 完成以上步骤后,您可以通过天猫精灵音箱控制您的设备。

控制台开通

  1. 一键开通天猫精灵。
    说明 请登录生活物联网平台(中国站)完成如下操作。
    1. 参见创建项目内容,创建一个新项目。
      说明 若已有创建好的项目,可无需重复创建。
    2. 参见创建产品内容,创建一个新产品。
    3. 参见定义功能内容,为产品定义功能。
    4. 参见调试设备内容,调试设备。
    5. 人机交互页面,选择打开使用公版App控制产品,并选择天猫精灵单击设置,其余内容详情请参见人机交互
      选择天猫精灵
      打开天猫精灵。
      打开天猫精灵
  2. 功能映射。
    生活物联网平台已经默认完成了部分天猫精灵品类的映射。

    可单击品类图标,查看生活物联网平台已经完成映射的天猫精灵属性/指令。这些已经完成映射的品类,开发者无需再自行映射,只需确保设备使用了映射过的标准属性,即可被天猫精灵控制。


    天猫精灵品类功能映射
  3. 设备调试。
    参见创建App内容,下载公版App。配网绑定了您的测试设备后,可以根据下方消费者使用步骤,绑定天猫精灵,即可实现音箱的控制。
    注意 首次注册账号时,国家和地区请选择中国大陆
  4. App开发。
    由于天猫精灵使用淘宝账号体系,厂家自有品牌App中,需要根据以下方式,集成淘宝的账号授权,实现和天猫精灵的对接。

    调用淘宝登录授权页面的唤起接口开发步骤如下图所示。


    调用接口流程
    • Android系统示例代码
      1. 单击授权按钮,进入授权界面,加载WebView,授权网址URL如下(需要拼接AppKey)。
        String url = "https://oauth.taobao.com/authorize?response_type=code&client_id=<项目的appKey>&redirect_uri=<控制台定义的回调地址>&view=wap";
      2. 在shouldOverrideUrlLoading中判断地址是否包含code,获取code并传到上一步访问URL后的界面。
        mWebView.setWebViewClient(new WebViewClient() {
                    //设置结束加载函数
                    @Override
                    public void onPageFinished(WebView view, String url) {
                        topbar.setTitle(view.getTitle());
                    }
                    @Override
                    public boolean shouldOverrideUrlLoading(WebView view, String url) {
                        if (isTokenUrl(url)) {
                            Intent intent = new Intent();
                            intent.putExtra("AuthCode", mAuthCode);
                            setResult(RESULT_CODE, intent);
                            finish();
                            return true;
                        }
                        view.loadUrl(url);
                        return false;
                    }
                });
        
          private boolean isTokenUrl(String url) {
                if (!TextUtils.isEmpty(url)) {
                    if ( url.contains("code=")) {
                        String[] urlArray = url.split("code=");
                        if (urlArray.length > 1) {
                            String[] paramArray = urlArray[1].split("&");
                            if (paramArray.length > 1) {
                                mAuthCode = paramArray[0];
                                return true;
                            }
                        }
                    }
                }
                return false;
            }
      3. 根据code绑定淘宝账号的示例代码如下。
        public void bindAccount(String authCode) {
        
                JSONObject params = new JSONObject();
                if (null != authCode) {
                    params.put("authCode", authCode);
                }
                Map<String, Object> requestMap = params.getInnerMap();
        
                IoTRequest ioTRequest = new IoTRequestBuilder()
                        .setAuthType("iotAuth")
                        .setApiVersion("1.0.5")
                        .setPath("/account/taobao/bind")
                        .setParams(requestMap)
                        .setScheme(Scheme.HTTPS)
                        .build();
                new IoTAPIClientFactory().getClient().send(ioTRequest, new IoTCallback() {
                    @Override
                    public void onFailure(IoTRequest ioTRequest, Exception e) {
        
                    }
        
                    @Override
                    public void onResponse(IoTRequest ioTRequest, IoTResponse ioTResponse) {
        
                    }
                });
            }
    • iOS系统示例代码
      1. 单击授权按钮,进入授权界面,加载WebView,授权网址URL如下(需要拼接AppKey)。
        https://oauth.taobao.com/authorize?response_type=code&client_id=<项目的appKey>&redirect_uri=<控制台定义的回调地址>&view=wap

        参照以下案例,初始化一个WebView,设置代理加载。

        - (void)viewDidLoad {
            [super viewDidLoad];
            [super viewDidLoad];
          WKWebView *webView = [[WKWebView alloc]init];
          [self.view addSubview:webView];
          [webView mas_makeConstraints:^(MASConstraintMaker *make) {
              make.left.equalTo(self.view);
              make.right.equalTo(self.view);
              make.top.equalTo(self.view);
              make.bottom.equalTo(self.view);
            }];
          webView.navigationDelegate = self;//代理:WKNavigationDelegate
          [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"https://oauth.taobao.com/authorize?response_type=code&client_id=%@&redirect_uri=控制台定义的回调地址&view=wap", 项目的appkey]]]];
        }
      2. 加载页面成功,进行真实的淘宝账号登录。
        淘宝账号登录
      3. 登录成功后,处理您在控制台填写的回调地址。
        回调地址
        - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
        
            NSRange range = [navigationAction.request.URL.absoluteString rangeOfString:@"控制台定义的回调地址"];
            if (range.location){
                //允许跳转
                decisionHandler(WKNavigationActionPolicyAllow);
            } else {
                //不允许跳转
                decisionHandler(WKNavigationActionPolicyCancel);
                NSURLComponents *components = [NSURLComponents componentsWithString:navigationAction.request.URL.absoluteString];
        
                for (NSURLQueryItem *item in components.queryItems){
                    if ([item.name isEqualToString:@"code"]){
                //用户绑定淘宝ID请求
                        [IMSTmallSpeakerApi bindTaobaoIdWithParams:@{@"authCode":item.value} completion:^(NSError *err, NSDictionary *result) {
        
                            if (self.completion){
                                self.completion(err, result);
                            }
                            [self.navigationController popViewControllerAnimated:YES];
                        }];
                        break;
                    }
                }
            }
        }
        // 用户绑定淘宝Id
        + (void)bindTaobaoIdWithParams:(NSDictionary *)para
                            completion:(void (^)(NSError *, NSDictionary *))completion{
            [self requestTmallSpeakerApi:@"/account/taobao/bind" version:@"1.0.5" params:para completion:completion];
        }
        此处para = @{@"authCode":@"xxxx"},其中xxxx为网页回调的code,具体查看登录成功后的回调处理步骤。
        // 封装的请求类,依赖请求类#import <IMSApiClient/IMSApiClient.h>
        + (void)requestTmallSpeakerApi:(NSString *)api
                               version:(NSString *)ver
                                params:(NSDictionary *)para
                            completion:(void (^)(NSError *, id))completion {
        
            IMSIoTRequestBuilder *builder = [[IMSIoTRequestBuilder alloc] initWithPath:api
                                                                            apiVersion:ver
                                                                                params:para];
            [builder setScheme:@"https"];
        
            IMSRequest *request = [[builder setAuthenticationType:IMSAuthenticationTypeIoT] build];
            [IMSRequestClient asyncSendRequest:request responseHandler:^(NSError * _Nullable error, IMSResponse * _Nullable response) {
                if (completion) {
                    //返回请求过期后,需要重新登录;重新登录后重新初始化主框架,不需要重新请求
                    if (response.code == 401) {
                        if (NSClassFromString(@"IMSAccountService") != nil) {
                            // 先退出登录
                            if ([[IMSAccountService sharedService] isLogin]) {
                                [[IMSAccountService sharedService] logout];
                            }
                            return;
                        }
                    }
        
                    if (!error && response.code == 200) {
                        completion(error, response.data);
                        return ;
                    }
        
                    NSError *bError = [NSError errorWithDomain:NSURLErrorDomain
                                                          code:response.code
                                                      userInfo:@{NSLocalizedDescriptionKey: response.localizedMsg ? : @"服务器应答错误"}];
                    completion(bError, nil);
                    return;
                }
            }];
        }
      4. 处理回调后返回code200,表示授权成功,请刷新网页。
      5. (可选)调用接口解除绑定。
        // 用户解绑淘宝Id
        + (void)unbindTaobaoIdWithParams:(NSDictionary *)para
                              completion:(void (^)(NSError *, NSDictionary *))completion{
            [self requestTmallSpeakerApi:@"/account/thirdparty/unbind" version:@"1.0.5" params:para completion:completion];
        }
        
        此处para = @{@"accountType":@"TAOBAO"}
      6. 判断是否已绑定。
        // 查询用户绑定的淘宝Id
        + (void)getTaobaoIdWithParams:(NSDictionary *)para
                           completion:(void (^)(NSError *, NSDictionary *))completion{
            [self requestTmallSpeakerApi:@"/account/thirdparty/get" version:@"1.0.5" params:para completion:completion];
        }
        此处para = @{@"accountType":@"TAOBAO"}
        
        返回数据存在以下内容代表已绑定;
        {
            accountId = 90xxx335;
            accountType = TAOBAO;
            linkIndentityId = 50ebop9xxxxxxxxxxxxxx8dbc58643423092968;
        }