精华内容
下载资源
问答
  • 企业app开发代理
    千次阅读
    2021-09-10 17:37:47

    微信生态下的小程序和公众号开发已经比较成熟,网上攻略很多,微信开发者工具的支持程度也很完备。但对于企业微信的应用开发,能搜到的信息要少得多。除了官方文档,网上资料大部分是接口调用问题相关的,当然也有部分提到了企业微信应用的开发调试问题。

    其实在开始网页应用开发前,我先摸索过几天企业微信小程序的开发。应该是在去年,微信开发者工具IDE中提供了“企业微信小程序插件”,基本上能够在模拟器中调试大部分的接口,算是比较方便。但小部分跟场景相关的还是不行,必须真机调试。这里要补充几句,企业微信和个人微信对于应用的使用/唤醒方式,有很大的区别。在企业微信中,应用加载时所处的“场景”是非常重要的信息,比如是从工作台、聊天附件还是侧边栏进入。通常不同进入方式,加载的页面或页面内容是不同的,而场景在模拟器中无法模拟。最好的方式就是把应用先上线一个基础版(可以只放几个控件、没有逻辑实现),然后在企业微信后台关联小程序,用体验版进行真机调试。

    后来小程序这条路没有继续。主要原因是我们要开发的是一个跟聊天双方都强关联的应用,在聊天侧边栏展示。而小程序会直接蹦出一个独立窗口,给人的感觉与正在聊的天联系非常弱,可能更适合工具类或弱交互的应用类型。

    回到网页应用的路上后,发现是个大坑。没有模拟器、各种约束限制。在搜遍各种文章后,我感觉并没能把“如何方便地开发和调试企业微信网页应用”这个问题彻底搞明白,缺少可操作、步骤清晰的指南。在早几年(16年之后)有过一波“微信企业号”的开发,是企业微信的早期版本,也存在开发调试难的问题(可见四五年过去了,并没有什么大变化)。网上能搜到相关文章,也给了我不少帮助。

    本篇文章目的是记录下我自己的环境搭建过程,存个档。也希望能给网友一些思路。

    诉求

    1. 企业微信客户端的应用绑定我本地的开发环境,而非生产环境

    2. 能在企业微信客户端实现前后端代码的调试,能打断点

    准备工作

    1. 一个已ICP备案的域名(要求见使用说明 - 企业微信API

    2. 准备一个内网渗透的工具(我选的是基于ngrok的natapp),创建一个通道将本地某个端口的服务暴露出去

    说明:内网渗透工具很多,有免费/付费的,也可以自己搭建。我是花钱买的(每个月不到10块),带宽共享但开发够用。为什么没有用免费,主要原因是免费的大部分不能提供固定域名,不定时变更。只要一变更就得在服务器上修改nginx配置,非常麻烦。

    另外需要注意一下,很多工具会对域名备案所在的云服务商(阿里云或腾讯云)有要求,如果不是一个服务商,会有额外的配置步骤。

    3. 在服务器上装nginx,将80端口代理到内网渗透工具提供的域名上

    4. 访问你的应用域名,此刻应该能看到本地服务成功运行

    5. 安装企业微信PC客户端

    步骤

    1. 登录企业微信管理后台,在应用管理下添加应用,并配置“网页授权及JSSDK”(oauth2.0按需配置)。按提示下载一个验证文件,将文件放到应用根目录下后,点击验证。

    说明:应用需要打包后用httpserver启动服务,确保内网渗透工具也是启动的。验证成功后就可以回到开发模式了。

    2. 企业微信管理后台,在应用管理下添加应用入口,比如侧边栏之类的。

    3. 使用PC客户端,查看是否能正确显示页面。如果没有的话,使用浏览器输入域名看看。如果浏览器中也没有,检查内网渗透和反向代理配置;如果浏览器中有,检查第1步配置的域名是否正确、以及第2步在入口中指定的页面链接是否正确。

    4. PC客户端中按shift + Ctrl + Alt + D开启调试模式。之后重新进入应用页面点右键“检查元素”就能进入调试工具了。跟chrome开发者工具差不多。

    5. 至此搭建完成

    前端调试

    有三种:

    1. PC客户端

    支持最完备,能够调试场景相关的api。缺点是调试工具和chrome相比略微不同,而且每次改完代码,需要手动点几下重新进入应用页面,不能直接刷新

    2. 微信开发工具的公众号网页

    比PC客户端方便一些。大部分api可支持,但无法调试场景相关的api

    3. 浏览器

    无法调试场景相关的api,而且js文件的引入方式有影响。不知道原因,但自己试下来,用cdn引入不好使,下载到本地是可以的。(注:我用了uniapp,它内置了一个叫wx的对象。网上查到有人用jWeixin替代wx解决了这个冲突,但我的jWeixin未定义。。)

    另外,浏览器可以模拟微信内置的浏览器,需要配置一下UA。可参考这篇文章:在 Chrome (谷歌浏览器) 中模拟微信内置浏览器_高先生的猫-CSDN博客_chrome模拟微信内置浏览器 配置完后,就可以避免某些api调用完显示“在微信(企业微信)中打开”这样的情况了。

    更多相关内容
  • PAGE 2 企业运维APP应用开发实践 文章目录 1. 准备工作 2. 代理 3. 页面框架 4. 获取数据 5. 绘图 6. 自问自答 效果图如下 页面逻辑简要说明 1. 一共三个 tab分别为 homeeszabbix 2. home 页面有 eszabbix 的性能...
  • 商城APP小程序公众号系统开发.pdf商城APP小程序公众号系统开发.pdf商城APP小程序公众号系统开发.pdf商城APP小程序公众号系统开发.pdf商城APP小程序公众号系统开发.pdf商城APP小程序公众号系统开发.pdf商城APP小程序...
  • 基于UNI-APP开发微信小程序的基本流程 1/申请微信小程序账号 申请微信小程序的两种途径: 通过公司微信服务号进行申请(推荐)。 通过公司微信服务号申请微信小程序可免认证,节省费用300元,同时审核周期更短。 ...

    基于UNI-APP开发微信小程序的基本流程

    1/申请微信小程序账号

    申请微信小程序的两种途径:

    1. 通过公司微信服务号进行申请(推荐)。
      通过公司微信服务号申请微信小程序可免认证,节省费用300元,同时审核周期更短。
      申请地址:进入公司微信服务号(登录时需要管理员认证)点击小程序管理快速注册 并认证小程序根据提示进行后续操作(需要提供未绑定任何微信服务端的邮箱)
      微信公众平台登录地址:微信公众平台入口

    2. 通过个人邮箱申请(不推荐)。
      通过个人邮箱(需提供未绑定任何微信服务的邮箱)申请微信小程序。根据注册提示完成信息录入。通过此种方法注册的微信小程序无法调用微信的高级接口,如微信支付,视频直播等。需要条用此类接口需要进行小程序认证。需提供企业营业执照,对公账号等信息,认证费用300元或企业小额打款验证。
      独立小程序注册地址:小程序申请地址

    2/微信小程序开发前准备

    获取小程序APPID,APPSERECT

    小程序注册成功,通过微信公众平台登录地址:微信小程序入口
    进入小程序。在</>开发开发者设置里获取到APPID(小程序ID)以及AppSecret AppID和AppSecret非常重要是后续开发的重要凭证。

    配置域名白名单

    在开发者设置里完成服务器域名配置(域名白名单)不在域名白名单里的URL资源正式上线后将无法访问。开发时若没有,此配置可展缓设置。
    注意:域名必须是HTTPS协议,服务器TLS1.2及以上

    基本信息设置

    在设置里完成小程序的通用配置,入名称,行业,头像等,按要求配置即可。

    开发人员,体验人员配置

    在管理成员管理下添加开发人员(主要是协同开发,以及让相关用户可以使用体验版本),权限什么的按要求配置即可。

    注意:添加开发者和体验人员需要通过微信号搜索,如果微信号正确,但是搜索不到,则可能是对方关闭了微信的通过微信号添加好友功能。解决办法:联系对方在微信手机端操作:点击我设置隐私添加我的方式开启允许通过微信号添加。设置完成后再次通过微信号搜索添加开发人员或体验人员。

    3/微信小程序开发工具

    1. HBUIDER-X (编辑器)下载地址:下载
    2. 微信开发者工具(预览、代码调试)下载地址:下载
    3. 开发工具配置
      将微信开发者工具和HBuiderX绑定,将浏览器与HBuiderX绑定。HBuiderX点击工具设置运行配置对应位置输入浏览器安装路径微信开发者工具安装路径。
      配置

    4/微信小程序开发步骤

    1. 新建uni-app项目:HBuiderX 文件新建项目UNI-App项目
    2. 参考uni-app官方文档及相关实例进行程序功能开发
      Uni-app官方文档:uni-app官网
    3. 程序在微信开发者工具运行测试:HBuiderX点击运行运行到小程序模拟器微信开发者工具
      注意:若是程序运行失败,请调试程序,若是无法打开开发者工具请检查是否将微信开发者工具和HBuiderX绑定。此外需要在初次启动微信开发者工具时在设置代理设置里将代理设置为使用系统代理、安全里开启服务端口。配置完成后关闭微信开发者工具,重启HBuiderX再次运行步骤3.
      在这里插入图片描述
    4. 微信小程序调试说明:
      【情形一】如果调试期间后台服务器不是https协议,或者服务器域名不在微信小程序后台域名白名单内,可在微信开发者工具里点击详情本地设置勾选不校验合法域名、web-view(业务域名)、TLS版本以及https证书
      在这里插入图片描述
      【情形二】无法启用预览和真机调试:请在详情基本信息中填入小程序的APPid
      注意:预览和真机测试人员必须在微信小程序的开发者列表内,详情见上文描述。

    5/微信小程序版本发布

    小程序业务功能开发完毕后可提交发布,发布前需要做如下准备:

    1. 配置域名白名单,参见配置域名白名单
    2. 在HBUIDERX里面完成APPID和APPSERECT绑定(这样在预览或真机调试时无须每次都输入APPID)在HBUIDERX里点击发行小程序(微信)填写小程序名字和小程序APPID,小程序APPID获取参见获取小程序APPId、APPSerect
    3. 将程序运行在微信开发者工具,调试无误后(确保实在未勾选不校验合法域名、WEB-VIEW(业务域名)、TLS版本及HTTPS证书的前提下程序运行正常,参见小程序调试说明)点击上传。
      程序上传完毕后,使用注册微信小程序的邮箱登录到微信小程序管理后台,点击管理版本管理查看刚才上传的版本,可将上传的版本设置为体验版(仅开发人员和体验人员可用,相关人员配置见开发人员,体验人员配置)
      微信小程序入口:小程序登录入口
    4. 发布正式版,选择要发布的版本提交审核,初次提交按照要求填写表单,完成提交。提交后等待微信官方审核。初次提交审核,审核时间较久(3—7个工作日),以后版本更新提交审核则审核相对较快。审核成功后需要进入当前界面手动发布。发布之后社会用户就能在微信上搜索到相关小程序了。

    6/学习参考文档

    微信小程序开发文档

    【参考】主要学习其 API,开发技巧及语法参看uni-app
    地址:微信小程序开发文档

    UNI-APP开发文档

    【重要】主要学习其基础组件的使用,语法,Api及开发规范
    地址:UNI_APP开发文档

    Vue开发文档

    【重要】uni-app基于vue的语法和规范,主要学习vue的指令,组件开发, 组件间通信,动态样式绑定等
    地址:Vue.js

    扩展

    【微信云开发】地址:微信云开发文档
    【vuex】地址:vuex

    展开全文
  • 如何基于App SDK快速地开发一个IoT App

    千次阅读 多人点赞 2020-11-25 11:52:05
    但是,对于一个公司来说,因为研发能力或者研发时间的原因,可能很难短期内完全自己开发出一个适用的App来。写代码、封装通用功能、还要考虑其他多种功能,统统都是很耗费时间的事情。现在很多物联网平台公司,为了...

    一、背景及大纲介绍

         

    在物联网大行其道的今天,万物互联已经是趋势。通过App控制智能设备,且能够实现场景联动,已经不是做不做的选择题,而是破局企业端到端解决方案的关键。

    智能硬件厂家如雨后春笋般涌现,但是,物联网的大框架—DCM(Device、Connect、Manage)架构,让IoT App成为刚需。智能硬件需要和App去结合,才能更好地发挥它的作用,更加便利人们的生活。如使用App去控制灯光的亮度,调节空调的温度,远程通过IPC监控家里情况等,甚至还可以使家里的相关电器完成一个场景联动(如手机设置“回家场景”,在下班回家的时候,点击“回家场景”,一键开灯、水壶烧水、空调开始工作等等)。这些原本只存在于想象中的场景,如今通过手机App+智能硬件即可实现。

    但是,对于大部分企业而言,IoT App开发不仅新,而且充满挑战。

    今天抽空以基于App SDK完成智能家居App的开发为例。通过这一篇文章,你就能通过创建App SDK、集成SDK、创建家庭、设备配网和设备控制等步骤,完整地完成一款智能家居App的开发。

    先列一下开发大纲:

    1. 创建App SDK
    2. 集成SDK
    3. 注册和登录
    4. 创建家庭
    5. 设备配网
    6. 设备控制

    我们再来简单介绍一下Tuya App SDK:

    涂鸦智能 App SDK 专为 IoT 移动 App 开发打造,提供丰富组件和示例代码,开发者可以快速实现移动 App 对智能设备的连接、控制以及丰富的智能场景应用。

    产品的优势在于:

    1. 低门槛快速集成:快速集成 SDK,提供示例代码、Demo App、接入案例等,低门槛轻松上手;
    2. 开发组件丰富:组件化开发,提供垂直品类 SDK、UI 业务包等功能组件,开发者根据需求灵活组合;
    3. 智能功能全面:全面覆盖用户、设备、智能场景等多种功能模块,开发者只需简单实现 UI 层代码;
    4. 主流通信协议兼容:同一 App 中支持添加和使用主流通信协议产品,轻松实现 All In One – App;
    5. 全球数据安全保障:双通道安全加密,五重安全策略,全球数据安全合规认证,全面保障用户数据隐私安全;
    6. 全球服务稳定:全球化智能云部署,让每一个 App 都轻松拥有亿级海量设备和千万级用户并发处理能力。

    App SDK的技术架构如下:

    二、如何基于 App SDK 开发一个 App

           准备就绪,我们来开始开发!

    (一)创建App SDK

    1. 注册开发者账号

    前往 涂鸦智能开发平台 注册开发者账号、创建产品、创建功能点等,具体流程请参考接入流程

    2. 创建SDK应用

    涂鸦 IoT 平台中 “App 工作台” 中点击 “App SDK”,点击“创建 App”。

    3. 填写 App 相关信息,点击确认。

    1. 应用名称:填写你的 App 名称。

    2. iOS 应用包名:填写你的 iOS App 包名(建议格式:com.xxxxx.xxxxx)。

    3. 安卓应用包名:填写你的安卓 App 包名(两者可以保持一致,也可以不一致)。

    4. 渠道标识符:不是必填项,如果不填写,系统会根据包名自动生成。

    你可以根据实际需求选择需要的选择方案,支持多选,然后根据 Podfile 和 Gradle 进行 SDK 的集成。

    点击获取密码,获取 SDK 的 AppKey,AppSecret,安全图片等信息。

    (二)集成 SDK

    1. 使用 CocoaPods 快速集成

    请注意:SDK 最低支持系统版本 9.0

    在 Podfile 文件中添加以下内容:

    platform :ios, '9.0'
    
    target 'Your_Project_Name' do
    
        pod "TuyaSmartHomeKit"
    
    end

    然后在项目根目录下执行 `pod update` 命令进行集成。

    2. 初始化 SDK

    1) 打开项目设置,Target => General,修改 Bundle Identifier 为涂鸦开发者平台对应的 iOS 包名

    2) 导入安全图片到工程根目录,重命名为 t_s.bmp,并加入「项目设置 => Target => Build Phases => Copy Bundle Resources」中。

    3) 在项目的PrefixHeader.pch文件添加以下内容:

    #import <TuyaSmartHomeKit/TuyaSmartKit.h>

    4) 打开AppDelegate.m文件,在[AppDelegate application:didFinishLaunchingWithOptions:]方法中初始化SDK。

    接口说明

    初始化 SDK

    - (void)startWithAppKey:(NSString *)appKey secretKey:(NSString *)secretKey;

    参数说明

    实例代码

    [[TuyaSmartSDK sharedInstance] startWithAppKey:<#your_app_key#> secretKey:<#your_secret_key#>];

    3. 打开 Debug 模式

    在开发的过程中可以开启 Debug 模式,打印一些日志用于分析问题,开发结束上线后建议关闭。

    #ifdef DEBUG
    
        [[TuyaSmartSDK sharedInstance] setDebugMode:YES];
    
    #else
    
    #endif

    (三)注册和登录

    涂鸦云支持多种用户体系:手机、邮箱、UID。其中手机支持验证码登录和密码登录两种方式,UID 登录主要用于已经有自己账号体系的场景。我们这里采用手机验证码注册登录。

    在注册登录方法中,需要提供 countryCode 参数(国家区号),用于就近选择涂鸦云的可用区。各个可用区的数据是相互独立的,因此在 中国大陆(86) 注册的账号,在 美国(1) 无法使用(用户不存在)。

    1. 手机密码注册

    手机号密码注册流程分为以下两步: 获取手机验证码  - 注册账号

    // 发送验证码   
    
    [[TuyaSmartUser sharedInstance] sendVerifyCode:@"86" phoneNumber:@"1300****" type:1 success:^{
    
        [TPDemoProgressUtils showSuccess:@"Verification code sent successfully" toView:nil];
    
    } failure:^(NSError *error) {
    
        [TPDemoProgressUtils showError:error.localizedDescription];
    
    }];
    
    // 通过验证码注册账号
    
    [[TuyaSmartUser sharedInstance] registerByPhone:@"86" phoneNumber:@"1300****" password:@"***" code:@"code" success:^{
    
        // 注册成功,跳转到首页
    
        [[TYDemoApplicationImpl sharedInstance] resetRootViewController:[TYDemoTabBarViewController class]];
    
    } failure:^(NSError *error) {
    
        [TPDemoProgressUtils showError:error.localizedDescription];
    
    }];

    2. 判断是否已经登录

    在程序启动后,如果登录过了就不需要重复登录,session的有效期是45天,直接到设备列表页面。如果没有登录过,就先到登录页进行登录,登录成功后再跳转到设备列表页。

    // 判断是否已经登录
    
    if ([TuyaSmartUser sharedInstance].isLogin) {
    
        // 首页
    
        [self resetRootViewController:[TYDemoTabBarViewController class]];
    
    } else {
    
        // 登录页
    
        [[TYDemoRouteManager sharedInstance] openRoute:kTYDemoPopLoginVC withParams:nil];
    
    }
    
    

    3. Session 失效处理

    长期未登录或者密码修改后的账号,在访问服务端接口的时候会返回 Session 过期的错误,需要监听 TuyaSmartUserNotificationUserSessionInvalid 通知,跳转至登录页面重新登录。

    - (void)loadNotification {
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sessionInvalid) name:TuyaSmartUserNotificationUserSessionInvalid object:nil];
    
    }
    
    - (void)sessionInvalid {
    
            NSLog(@"sessionInvalid");
    
            //跳转至登录页面
    
            MyLoginViewController *vc = [[MyLoginViewController alloc] init];
    
            self.window.rootViewController = vc;
    
          [self.window makeKeyAndVisible];
    
    }

    (四) 创建家庭

    用户登录成功后需要通过 TuyaSmartHomeManager 去获取整个家庭列表的信息,然后初始化其中的一个家庭TuyaSmartHome,获取家庭详情信息,就可以对家庭中的设备进行操作控制。

    1. 家庭列表获取

    在设备列表页面,我们先获取用户下的家庭列表,如果没有家庭,我们创建一个默认家庭。因为设备激活的时候,需要把设备添加到家庭里面。

    获取到家庭列表之后,我们就可以初始化一个家庭,然后从云端获取家庭的详情,刷新首页的设备列表。

    - (void)initData {
    
       
    
        _homeManager = [[TuyaSmartHomeManager alloc] init];
    
        _homeManager.delegate = self;
    
       
    
        // 获取本地的当前家庭
    
        NSString *homeId = [[NSUserDefaults standardUserDefaults] objectForKey:kDefaultCurrentHomeId];
    
        if ([homeId longLongValue] > 0) {
    
            self.home = [TuyaSmartHome homeWithHomeId:[homeId longLongValue]];
    
            if (self.home) {
    
                self.home.delegate = self;
    
                self.topBarView.leftItem.title = [NSString stringWithFormat:@"%@ ∨", self.home.homeModel.name];
    
                [TYDemoSmartHomeManager sharedInstance].currentHomeModel = self.home.homeModel;
    
                // 刷新设备列表数据
    
                [self reloadDataFromCloud];
    
            } else {
    
                // 如果没有,获取第一个家庭
    
                [self loadFirstHomeData];
    
            }
    
        } else {
    
            // 如果没有,获取第一个家庭
    
            [self loadFirstHomeData];
    
        }
    
    }
    
    - (void)reloadDataFromCloud {
    
        WEAKSELF_AT
    
        [self.refreshControl beginRefreshing];
    
        // 获取当前家庭的详情,并刷新列表
    
        [self.home getHomeDetailWithSuccess:^(TuyaSmartHomeModel *homeModel) {
    
           
    
            [weakSelf_AT reloadData];
    
        } failure:^(NSError *error) {
    
            if ([error.localizedFailureReason isEqualToString:@"PERMISSION_DENIED"]) {
    
                [weakSelf_AT loadFirstHomeData];
    
            }
    
            [weakSelf_AT.refreshControl endRefreshing];
    
        }];
    
    }

    2. 新增一个家庭

    // add home
    
    - (void)rightBtnAction {
    
        NSString *homeName = [NSString stringWithFormat:@"Home_%@", @(self.homeManager.homes.count)];
    
        WEAKSELF_AT
    
        [self.homeManager addHomeWithName:homeName geoName:@"hangzhou" rooms:@[@"room1"] latitude:0 longitude:0 success:^(long long homeId) {
    
            [TPDemoProgressUtils showSuccess:@"Add Success" toView:nil];
    
            // 切换到新增家庭
    
            TuyaSmartHome *home = [TuyaSmartHome homeWithHomeId:homeId];
    
            [weakSelf_AT swithCurrentHomeIdWithHomeModel:home.homeModel];
    
        } failure:^(NSError *error) {
    
            [TPDemoProgressUtils showError:error.localizedDescription];
    
        }];
    
    }

    3. 家庭列表信息变化回调

    实现 TuyaSmartHomeManagerDelegate 代理协议后,可以在家庭列表更变的回调中进行处理。

    #pragma mark - TuyaSmartHomeManagerDelegate
    
    // 添加一个家庭
    
    - (void)homeManager:(TuyaSmartHomeManager *)manager didAddHome:(TuyaSmartHomeModel *)home {
    
        NSLog(@"Add a home %@", home.name);
    
    }
    
    // 删除一个家庭
    
    - (void)homeManager:(TuyaSmartHomeManager *)manager didRemoveHome:(long long)homeId {
    
        // 如果删除的家庭是当前家庭,当前家庭切换到另外一个
    
        if ([TYDemoSmartHomeManager sharedInstance].currentHomeModel.homeId == homeId) {
    
            [self loadFirstHomeData];
    
        }
    
    }
    
    // MQTT连接成功
    
    - (void)serviceConnectedSuccess {
    
        // 去云端获取当前家庭的详情,然后去刷新 UI
    
        [self reloadDataFromCloud];
    
    }
    
    

    4. 单个家庭信息变化的回调

    实现 TuyaSmartHomeDelegate 代理协议后,可以在单个家庭信息更变的回调中进行处理。

    #pragma mark - TuyaSmartHomeDelegate
    
    // 家庭的信息更新,例如name
    
    - (void)homeDidUpdateInfo:(TuyaSmartHome *)home {
    
        [self.tableView reloadData];
    
    }
    
    // 添加一个房间
    
    - (void)home:(TuyaSmartHome *)home didAddRoom:(TuyaSmartRoomModel *)room {
    
        [self.tableView reloadData];
    
    }
    
    // 删除一个房间
    
    - (void)home:(TuyaSmartHome *)home didRemoveRoom:(long long)roomId {
    
        [self.tableView reloadData];
    
    }
    
    // 我收到的共享设备列表变化
    
    - (void)homeDidUpdateSharedInfo:(TuyaSmartHome *)home {
    
        [self.tableView reloadData];
    
    }
    
    // 房间信息变更,例如name
    
    - (void)home:(TuyaSmartHome *)home roomInfoUpdate:(TuyaSmartRoomModel *)room {
    
        [self.tableView reloadData];
    
    }
    
    // 房间与设备,群组的关系变化
    
    - (void)home:(TuyaSmartHome *)home roomRelationUpdate:(TuyaSmartRoomModel *)room {
    
        [self.tableView reloadData];
    
    }
    
    // 添加设备
    
    - (void)home:(TuyaSmartHome *)home didAddDeivice:(TuyaSmartDeviceModel *)device {
    
        [self.tableView reloadData];
    
    }
    
    // 删除设备
    
    - (void)home:(TuyaSmartHome *)home didRemoveDeivice:(NSString *)devId {
    
        [self.tableView reloadData];
    
    }
    
    // 设备信息更新,例如name
    
    - (void)home:(TuyaSmartHome *)home deviceInfoUpdate:(TuyaSmartDeviceModel *)device {
    
        [self.tableView reloadData];
    
    }
    
    // 设备dp数据更新
    
    - (void)home:(TuyaSmartHome *)home device:(TuyaSmartDeviceModel *)device dpsUpdate:(NSDictionary *)dps {
    
        [self.tableView reloadData];
    
    }
    
    // 添加群组
    
    - (void)home:(TuyaSmartHome *)home didAddGroup:(TuyaSmartGroupModel *)group {
    
        [self.tableView reloadData];
    
    }
    
    // 群组dp数据更新
    
    - (void)home:(TuyaSmartHome *)home group:(TuyaSmartGroupModel *)group dpsUpdate:(NSDictionary *)dps {
    
        [self.tableView reloadData];
    
    }
    
    // 删除群组
    
    - (void)home:(TuyaSmartHome *)home didRemoveGroup:(NSString *)groupId {
    
        [self.tableView reloadData];
    
    }
    
    // 群组信息更新,例如name
    
    - (void)home:(TuyaSmartHome *)home groupInfoUpdate:(TuyaSmartGroupModel *)group {
    
        [self.tableView reloadData];
    
    }

    (五) 设备配网

    设备配网是指设备在云端进行激活注册。

    1. 相关类

    2. EZ 配网

    这里主要介绍下 EZ 模式开发,又称快连模式(SmartConfig)。

    - (void)addDeviceWithEZMode {
    
       
    
        // 获取token
    
        WEAKSELF_AT
    
        id<TYDemoDeviceListModuleProtocol> impl = [[TYDemoConfiguration sharedInstance] serviceOfProtocol:@protocol(TYDemoDeviceListModuleProtocol)];
    
        long long homeId = [impl currentHomeId];
    
        [[TuyaSmartActivator sharedInstance] getTokenWithHomeId:homeId success:^(NSString *token) {
    
            // 开始配网
    
            [weakSelf_AT commitEZModeActionWithToken:token];
    
        } failure:^(NSError *error) {
    
           
    
            info = [NSString stringWithFormat:@"%@: token fetch failed, error message is %@",NSStringFromSelector(_cmd),error.localizedDescription];
    
            [weakSelf_AT appendConsoleLog:info];
    
        }];
    
    }
    
    // 开始配网
    
    - (void)commitEZModeActionWithToken:(NSString *)token {
    
        [TuyaSmartActivator sharedInstance].delegate = self;
    
        [[TuyaSmartActivator sharedInstance] startConfigWiFi:TYActivatorModeEZ ssid:self.ssidField.text password:self.passwordField.text token:token timeout:timeout];
    
    }
    
    #pragma mark - TuyaSmartActivatorDelegate
    
    - (void)activator:(TuyaSmartActivator *)activator didReceiveDevice:(TuyaSmartDeviceModel *)deviceModel error:(NSError *)error {
    
       
    
        [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(countDown) object:nil];
    
        timeout = timeLeft;
    
        [self hideProgressView];
    
       
    
        NSString *info = [NSString stringWithFormat:@"%@: Finished!", NSStringFromSelector(_cmd)];
    
        [self appendConsoleLog:info];
    
        if (error) {
    
            // 配网失败
    
            info = [NSString stringWithFormat:@"%@: Error-%@!", NSStringFromSelector(_cmd), error.localizedDescription];
    
            [self appendConsoleLog:info];
    
        } else {
    
            // 配网成功
    
            info = [NSString stringWithFormat:@"%@: Success-You've added device %@ successfully!", NSStringFromSelector(_cmd), deviceModel.name];
    
            [self appendConsoleLog:info];
    
        }
    
    }

    智能设备配网成功后就有了联网能力,就可以进行远程控制了。

    (六)设备控制

    设备激活后,就可以进行智能设备的控制,然后监听设备控制变化的回调。

    1. 相关类

    在进行设备控制之前,我们先了解下设备功能点的概念。

    2. 设备功能点

    功能点是对产品功能的抽象表示,是具体智能设备功能的抽象,用于描述产品功能及其参数。

    • 功能点 ID:功能点的编码。设备与云端的功能数据通过功能点 ID 进行传输。

    • 功能点名称:自定义的功能名称。

    • 标识名:功能点 Code 值,用于 App 显示功能名称的多语言管理。支持字母、数字和下划线,以字母开头。

    • 数据类型:

    • 数据传输类型:

         |-可下发可上报:指令数据可以发送给设备,设备数据可以传输给云端。

         |- 只上报:数据只支持从设备传输给云端。

         |- 只下发:数据只支持从云端发送给设备。

    TuyaSmartDeviceModel 类的 dps 属性(NSDictionary 类型)定义了当前设备的状态,称作数据点(DP 点)或功能点

    dps 字典里的每个 key 对应一个功能点的 dpId,value 对应一个功能点的 dpValue,dpValue 为该功能点的值

    产品功能点定义参见涂鸦开发者平台的产品功能,如下图所示:

    发送控制指令按照以下格式:

    {"<dpId>":"<dpValue>"}

    根据后台该产品的功能点定义,如下:

    示例代码

    - (void)publishDps {
    
        // self.device = [TuyaSmartDevice deviceWithDeviceId:@"your_device_id"];
    
        // self.device.delegate = self;
    
       
    
        NSDictionary *dps;
    
        //设置dpId为1的布尔型功能点示例 作用:开关打开
    
        dps = @{@"1": @(YES)};
    
        //设置dpId为4的字符串型功能点示例 作用:设置RGB颜色为ff5500
    
        dps = @{@"4": @"ff5500"};
    
        //设置dpId为5的枚举型功能点示例 作用:设置档位为2档
    
        dps = @{@"5": @"2"};
    
        //设置dpId为6的数值型功能点示例 作用:设置温度为20°
    
        dps = @{@"6": @(20)};
    
        //设置dpId为15的透传型(byte数组)功能点示例 作用:透传红外数据为1122
    
        dps = @{@"15": @"1122"};
    
        //多个功能合并发送
    
        dps = @{@"1": @(YES), @"4": @(ff5500)};
    
        [self.device publishDps:dps success:^{
    
            NSLog(@"publishDps success");
    
            //下发成功,状态上报通过 deviceDpsUpdate方法 回调
    
        } failure:^(NSError *error) {
    
            NSLog(@"publishDps failure: %@", error);
    
        }];
    
    }

    注意事项

    • 控制命令的发送需要特别注意数据类型

    比如功能点的数据类型是数值型(value),那控制命令发送的应该是 @{@"2": @(25)} 而不是 @{@"2": @"25"}

    • 透传类型传输的 byte 数组是字符串格式(16 进制字符串)、字母需小写并且必须是偶数位

    比如正确的格式是: @{@"1": @"011f"} 而不是 @{@"1": @"11f"}

    功能点更多概念参见快速入门-功能点相关概念

    3. 设备初始化和设备变化代理监听

    需要通过 TuyaSmartHome 初始化一个 home 实例,然后调用接口 getHomeDetailWithSuccess:failure: 获取家庭的详情,同步过家庭的详情后,初始化设备才能成功。错误的设备 id 可能会导致初始化失败,此时设备的实例返回 nil。

    - (void)publishDps {
    
        self.device = [TuyaSmartDevice deviceWithDeviceId:@"your_device_id"];
    
        self.device.delegate = self;
    
     
    
        [self.device publishDps:@{@"1" : @{YES}} success:^{
    
            NSLog(@"publishDps success");
    
            //下发成功,状态上报通过 deviceDpsUpdate方法 回调
    
        } failure:^(NSError *error) {
    
            NSLog(@"publishDps failure: %@", error);
    
        }];
    
    }
    
    #pragma mark - TuyaSmartDeviceDelegate
    
    /// dp数据更新
    
    - (void)device:(TuyaSmartDevice *)device dpsUpdate:(NSDictionary *)dps {
    
        [self.tableView reloadData];
    
    }
    
    /// 设备信息更新
    
    - (void)deviceInfoUpdate:(TuyaSmartDevice *)device {
    
       
    
    }
    
    /// 设备被移除
    
    - (void)deviceRemoved:(TuyaSmartDevice *)device {
    
       
    
    }
    
    

    三、总结

    我们已经完成了一个 IoT App 对智能硬件设备的激活入网,设备控制等主要环节,通过上述的流程说明,相信你已经可以基于App SDK完成一个智能家居App的开发,感兴趣就去试试吧,有问题可以评论或者私聊!

    四、参考

    IoT App SDK 简介

    Tuya Home SDK

    Demo 链接

    展开全文
  • 甲方提出大致需求,乙方负责细化整理,最终转换成供后期开发使用的需求文档,也是项目最终的验收文档) · 制作流程图 (乙方实施,根据上一步的《需求文档》设计出软件的运行流程,然后甲方确认,得到一个...

    深刻理解对于甲方来说,一个APP价值不菲,这个产品往严重了说可能就是身家性命,所以对于首次制作的用户来说,考虑的细一点无可厚非,但对于技术公司来说就是无数项目中的一个。我会站在甲方立场、技术思维来解答这个问题。

    APP制作的流程概要:

    · 商谈需求

    (双方参与。甲方提出大致需求,乙方负责细化整理,最终转换成供后期开发使用的需求文档,也是项目最终的验收文档)

     

    · 制作流程图

    (乙方实施,根据上一步的《需求文档》设计出软件的运行流程,然后甲方确认,得到一个流程图文件)

     

    · 制作原型图

    (根据前两部的《需求文档》和《流程图》制作,界面上要包含这个界面该有的所有的元素和字段,但是这一步是没有具体排版的和颜色渲染的)

     

    · 制作设计图(UI):

    根据上一步的原型图,来具体的排版,渲染颜色。最终产物是一套用户界面设计图

     

    · 编写:

    就是具体的代码编写

    · 测试:

    乙方负责,根据需求和后来制作的设计图来一步步检测功能是否有bug

    · 交付:

    正规公司会把我上面说到的所有东西都提供给甲方

    · 细节补充:

    现在国家做只是产权保护,所有的APP要上架必须具备《软件著作权》。有一些三方的代理公司协助办理。

    合同注意几个点:

    1. 实施工期

    2. 付款节点

    互联网公司一般是三期款项,334的模式支付。首付款30%、设计阶段结束支付30%,项目实施完甲方验收完毕40%。

    3. 需求文档

    一定要作为合同的附件,这个是到时候交付的标准。这个文档那个越细越好

    4. 产生的第三方费用要说清楚到底谁承担。

    a) 软件著作权的申请费(只是产权保护,现在APP上架必须需要的文件,相当于软甲你的专利。一般不加急3个月拿到,700元左右)

    b) 服务器的费用

    c) 短信的费用(用来发验证码的一般一条6分钱,一万条=600元)

    d) 支付权限申请的费用(微信是年费300.支付宝免费,但是这两项后期交易流水都存在手续费)

    e) 是否使用了付费的数据库(MySQL免费,Orcale是收费的)

    f) 是否使用了付费的第三方SDK(就是开发用到的一些快速集成工具,但是有些是收费的,按年收费一般是。比如要开发直播或者及时通讯)

    关于怎么避免被宰:

    整理

    一些常见的技术公司套路,其实就一个中心思想,价格低的离谱的肯定有问题,便宜的东西除了便宜好哪都不好。一般的甲方思维先找市场上的公司问一圈,然后整理看看哪个公司感觉说的专业,然后再在专业的俩面筛选几个报价不高的反复比较。互联网的坑太深了,方法大致没错,但是你得问清楚技术公司给你的这个报价是基于什么标准?

    为什么别人只要几千,你们要几十万?


    这里给大家提供一个新名词,随着行业的不断衍生和发展,技术公司也有了自己降低成本的方式,这个新产物叫“SaaS”这里我先不说SaaS不好,因为针对不同人群,SaaS确实也解决了很多人的问题。为了方便大家理解我专门做了个表,你说的那种几千的肯定是SaaS不用怀疑,定制是不可能那个成本把控出一个项目的。
    SaaS一般是按年付费的。优劣势我都有列出来大家自己选择。

     

    你们不是有案例嘛?套一个给我还要这么多钱?


    这里给大家提一个大的方向性问题,国家在抓知识产权保护,就是现在所有的软件上架应用市场都需要《软件著作权》,可以理解为软件的专利,这是硬性指标,也就是说软件开发所用的代码,理论上要保证原创性和独有性,才具备上架资格。实际上目前没有那么严格......不要求全部定制,还是可以复用部分以前的代码的,因为申请软著只需要4000行代码,就是说除了这4000行以外是可以复用的。
    并不是有了案例就像大家想的那么简单,随便套套几天就出来一个了。还有一个因素导致软件没法短期内迅速套出来,就是应用商店本身也会有限制,如果两个应用的相似度太高,上架肯定是失败的。一个软件的开发至少要保证4000行的原创代码,以及设计方面的独特,让软件无论是从外面和里面看起来都是定制的才有上架的可能性。


    套壳应用和原生应用


    咨询过一些技术公司的人听过这两个名词,却没得本质。因为本身负责跟你沟通的销售本身他自己应该也不怎么清楚.....毕竟是专业性较强的东西,却被很多公司用来偷换概念,欺骗客户。
    原生APP就是用官方语言来编写打APP,安卓是用Java写的,用Java来写APP就叫原生,苹果是用OC(Object-C)或者Swift写的,用OC和Swift来编写苹果APP就是原生。这里有两个概念,第一原生的APP苹果和安卓使用不同语言编写的也就是说要写两套代码,但是体验却是最优秀的,因为原生的APP很多资源文件,比如图片、文字等是可以放在手机本地的,一个APP加载东西直接从手机加载当然快。
    普及个基本概念:国内目前的操作系统只有安卓和苹果两种,Android系统是google公司开发的开源系统,通俗的讲就是免费的,所以各大手机厂商都用Android系统,苹果用的是不开源的iOS系统,只有他自己能用。至于大家一般听到的”华为“、”三星“、”ViVo“等都是安卓系统。当然国内还有”锤子系统“,基本死了不做描述......
    接下来说点专业性强的东西,不感兴趣的可以跳过。


    安卓系统和苹果系统从技术角度的分析:


    安卓系统的底层是C和C++然后再经过JAVA转译编译从而体现到用户界面。苹果的底层是C,可以直接编译。发现问题没?安卓系统比苹果系统多了一道编译的过程,所以就系统本身而言肯定是苹果的iOS较为优秀的,这就是为什么苹果手机体验要好于安卓的本质原因之一。

    还有个原因,安卓使用java写的,java有个垃圾回收机制,这个是最操蛋的,这个机制的初始想法是方便程序员,在用java编写的时候不用管内存的问题,因为机制本身会判断哪些内存该回收了就自动回收,而苹果的OC语言内存是需要程序员专门写方法来回收的。其实呢?

    java的垃圾回收机制就是SB,非常不智能,会导致安卓手机的内存得不到妥善的管理,经常有很多已经无效的内存占用手机的存储空间以及手机运行内存,从而导致安卓手机的运行内存永远不沟用,安卓手机的升级方法就是加内存,最早的运行内存1G到现在的32G.....听起来就凶残,但是系统本质的缺点得不到改善,只能从硬件升级配置。苹果呢?

    苹果手机的内存一般是1G、2G就这样了,但是处理速度却远快于安卓,系统本身的差距。乔帮主技术出身系统确实优秀,我们可以寄希望华为的”鸿蒙系统“能否得到质变,技术出身的我不做太多期待,面市的时候我估计就是安卓系统的阉割版.....却非要说自己研发的专利系统,就好比当时的锤子系统,不就是个安卓吗?你装啥呢?


    套壳应用是指H5编写的:


    H5是干啥的呢?它是一种写网页的代码,由于安卓和苹果都做了对网页的适应,所以H5应用只用做一套两边系统都可以用,但是体验比较差,因为网页的所有资源都需要放在云端的服务器,原生从本地手机拿资源,H5需要从遥远的云端做网络请求才能拉下来资源能不慢吗?


    神奇的中间产物RN(React Native


    RN之所以说是中间产物是因为他同事具备了原生和H5的双向特点。
    第一:RN的部分资源是可以放在本地的,因此加载速度也比较快。
    第二:RN也可以只做一套,就适配安卓和苹果两套系统。
    是否觉得发现了终极解决方案呢?其实不然,RN还是有一些缺点的。
    1.RN本身还不够完善,技术在持续的发展中
    2.掌握RN的技术人才非常少,因为比较难学,实用性又较少,学习RN需要同时懂得原生以及H5的js才能够学会,导致RN的人才招聘成本非常高。

    上架限制


    技术发展到今天,苹果和谷歌本身也出现了,针对RN和H5的政策,这种所谓的套壳应用已经不让上架了,套壳应用对于苹果和谷歌本身是存在风险的,套壳应用的本质是APP端其实不用写什么代码,只需要加载一个网页就行。
    一些不法分子就会利用这个漏洞,举例在上架的时候,他的域名绑定的是一个正规的商城,那么在上架成功之后,他会把域名的指向改成一个赌博平台,他的非法赌博平台就成功上架了。所以苹果和谷歌发现这种问题之后,就把h5的应用一棒子打死。从17年的一月开始,该类应用均不让上架。换个角度想问题,google和苹果都是技术公司,你要用我的操作系统,还要用我的应用市场,但是却不用我提供的官方语言开发,你想想这两个巨头能不弄你嘛?

    对你有帮助的话,只要一个赞。

    展开全文
  • 前言: 1、如果你想开发一个自己的App或者是第一次开发App,这个可以收藏当做指导手册 2、这篇文章主要讲个人开发者开发App到上架应用市场整个过程,很适合新手。
  • iOS开发 App间的相互打开/跳转的配置

    千次阅读 2021-12-24 11:33:40
    iOS调研App间的相互跳转; 两个App,A和B;App内相互跳转处理: 一、scheme方式跳转 1、A --> B ,跳转前判断目标App是否安装 在A的Info.plist的LSApplicationQueriesSchemes,配置B的scheme(即A中添加B跳转的白...
  • 你如果不想开发App,那么也可以阅读下看看开发App的艰难 作为一个开发者,可能都想过自己做一个app,可是这年头条件苛刻: 各大应用市场都逐渐不接受个人开发者上传app了,只能自己以公司的名义,这一步拦下了...
  • 企业微信开发

    万次阅读 多人点赞 2018-05-10 15:19:32
    企业微信的认识企业微信概念:企业微信2016年4月18日,腾讯正式发布全平台企业办公工具“企业微信”。与微信一致的沟通体验,为企业员工提供最基础和最实用的办公服务,并加入贴合办公场景的特色功能、轻OA工具,提供...
  • iOS 转让APP,变更App Store开发商名字。
  • 企查查app新增企业数据抓取

    千次阅读 2019-07-09 10:53:53
    企查查每日新增企业数据抓取 尚未完成的工作: 需要自行抓包获取设备id,appid,sign等等 sign和时间戳保持一致即可 ...有些工作尚未完成,需要自己进行继续开发,可以找我要app的脱壳源代码,继续分析。 已经完...
  • 如何快速的开发直播App

    千次阅读 2018-04-08 15:52:41
    【如何快速的开发一个完整的iOS直播app】(原理篇) 【如何快速的开发一个完整的iOS直播app】(播放篇) 【如何快速的开发一个完整的iOS直播app】(采集篇) 【如何快速的开发一个完整的iOS直播app】(美颜篇) 前言 大半年...
  • 我们继续探讨“怎样快速开发一个APP”,谈谈我的个人理解。   雷观:快速开发一个APP,至少有3种方法。什么也不做、拿来主义、标准化和复用。 一、什么都不做 听起来,有点“抖机灵”,但蕴藏着大道理,很多人...
  • 1 .iOS开发证书,描述文件,bundle ID的关系 2. Apple开发账号添加团队成员 3 .开发证书,生产证书,描述文件,AppID关系及生成。 4.证书导出p12文件 1 .iOS开发证书,描述文件,bundle ID的关系 苹果为了...
  • uniapp实战开发商城APP和小程序 从事多年web前端开发和教育培训(线...
  • SharePoint 2013 开发——APP开发的考虑和建议
  • csdn下载地址: ... 源码是原生APP的淘宝客,UI很漂亮,内含安卓和苹果IOS前端。详细的安装教程见压缩包内。...(可由优雅草官方代理申请 经济高效) 1.安卓和苹果上架 苹果开发者账号 https://developer.app...
  • 直播类 APP 项目开发实战(原理篇)

    万次阅读 2017-01-08 17:47:43
    在做直播开发时 碰到了很多问题,在收集了许多人博客的基础上做出来了成功的直播项目并做了整理,并在最后奉上我的全部代码。 其中采用博客的博主开篇在此感谢,本着开源分享的精神,我会将前辈的知识和
  • 此操作手册用于提供客户进行企业发布299美金的账户发布非AppStore的app程序的CSR证书,distribution证书以及p12证书导出用。 2 .iOS开发证书,描述文件,bundle ID的关系 苹果为了控制应用的开发与发布流程,...
  • 软件开发合同模板范本

    万次阅读 2018-08-23 10:17:48
    其它《软件开发合同模板范本》下载链接: https://download.csdn.net/download/daqiang012/10621400 合同编号:_________甲方(委托人):_________ 法定住址:_________ 法定代表人:_________ 职务:________...
  • 2021 跨平台开发框架到底哪家强?...目前来看比较火的应该是 Flutter,次之 RN,具体还要看企业的应用场景和领域,AVM,Ionic,NativeScript 在不少企业和个人开发者中也使用率较高。 一,安装环境
  • 云南天成科技旗下分公司(云南天智云科技有限公司),是钉钉官方授权云南钉钉高等定制服务商,提供基于钉钉的各类应用开发,对接企业现有OA系统、CRM系统、财务系统、大数据系统开发等企事业单位钉钉软件开发服务,...
  • 利用unli-app开发app项目时,前端为了方便发送请求需要配置服务代理。以本机ip来代理服务端的ip,这样发送请求时,就能从服务端获取到相应的数据。 在web开发端例如:vue框架项目需要在vue.config.js文件里做相应...
  • 其他链接 初识微信开发 企业微信三方开发:注册企业微信服务商 企业微信三方开发(一):回调验证及重要参数获取 企业微信三方开发(二):获取access_token 企业微信三方开发(三):网页授权登录 企业微信三方开发(四):...
  • B2G商城APP解决方案开发

    千次阅读 2018-03-27 17:12:00
    分享一下英唐众创开发的B2G商城APP解决方案。B2G是新近出现的电子商务模式,即“商家到政府”(是术语B2B或business-to-government的变化形式),它的概念是商业和政府机关能使用中央网站来交换数据并且与彼此作生意,...
  • 但在完成开发的时候,正值大三下期末考试期间,无赖地着眼于实现本身匆匆完成了功能需求(只是前期的要求,原因你懂得!),就去忙着复习准备考试了。因为我想尽可能地努力以获去高分来达到某种目的,所以这就需要更...
  • 它统一封装了Andriod,IOS,WindowsPhone,Symbian等几大移动开发平台的API,采用HTML5+JavaScript的混合开发的模式来开发智能移动的APP,解决系统兼容等问题。使用Cordova/PhoneGap,应用程序的构建可以无需本地...
  • 手把手教你springboot企业微信开发(二)1、企业微信开发第一步2、weixin-java-cp-demo-master1)、引入thymeleaf改造项目2)增加Configuration3)回到企业号4)穿透内外网5)完善 从这一篇开始,开始从实际项目探索...
  • App Growing以2018年4月1日-4月30日期间所追踪到的25家移动广告投放平台的数据,以App 开发商为维度汇总相关App的广告,并按各开发商投放广告数排序,整理出开发商推广排行榜Top10。(区分安卓及iOS端)针对安卓设备...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,737
精华内容 10,694
关键字:

企业app开发代理