智能场景 UI 业务包

更新时间:2024-05-31 07:42:13下载pdf

涂鸦 智能场景 UI 业务包 iOS 版的业务功能包括 智能场景 模块的 添加智能编辑智能 的业务逻辑和 UI 界面。

背景信息

智能场景分为 一键执行场景自动化场景,分别简称为 场景自动化

  • 场景:用户添加动作,手动触发。
  • 自动化:由用户设定条件,当条件触发后自动执行设定的动作。

涂鸦支持用户根据实际生活场景,通过设置气象或设备条件,当条件满足时,让一个或多个设备执行相应的任务。

接入组件

在工程的 Podfile 文件中添加场景业务包组件,并执行 pod update 命令:

source 'https://github.com/tuya/tuya-private-specs.git'
source 'https://cdn.cocoapods.org/'
platform :ios, '11.0'

target 'your_target_name' do
    # 添加场景业务包
    pod 'ThingSmartSceneBizBundle'
    pod 'ThingSmartSceneExtendBizBundle'
end

服务权限

  • 场景业务包中 天气条件 会用到位置信息,其中会涉及到部分苹果隐私权限的声明。请在工程的 info.plist 中添加如下权限声明:

    NSLocationWhenInUseUsageDescription
    
  • 场景业务包开放了 地理围栏 功能,地理围栏需要位置服务的 始终 权限声明。请在工程的 info.plist 中添加如下权限声明:

    NSLocationAlwaysUsageDescription
    

服务协议

提供服务

场景业务包实现了 ThingSmartSceneProtocolThingSmartSceneBizProtocolThingSmartGeofenceServiceProtocol,以提供服务。您可以在在 ThingModuleServices 组件中,查看协议文件内容:

  • ThingSmartSceneProtocol.h

    @protocol ThingSmartSceneProtocol <NSObject>
    /**
     *    跳入新增场景页面,新增场景或者自动化
     *
     * @param callback 创建完成后结果回调
     */
    - (void)addAutoScene:(void(^)(ThingSmartSceneModel *secneModel, BOOL addSuccess))callback;
    /**
     *    跳入编辑场景页面,编辑指定场景或者自动化。
     * 注意调用此方法前,需要调用 ThingSmartSceneBizProtocol 的 getSceneListWithHomeId:方法查询家庭下的场景列表,这样会生成场景缓存,之后才能正常跳入编辑页面。
     *
     * @param model 要进行编辑的场景 model 对象
     */
    - (void)editScene:(ThingSmartSceneModel *)model;
    
    @end
    
  • ThingSmartSceneBizProtocol.h

    /**
     * 查询场景列表,包括自动化和场景
     *
     * @param 家庭 ID
     */
    - (void)getSceneListWithHomeId:(long long)homeId withSuccess:(void(^)(NSArray <ThingSmartSceneModel *> *scenes))success failure:(void(^)(NSError *error))failure;
    
  • ThingSmartGeofenceServiceProtocol.h

    /// 查询所有已创建的地理围栏列表,并注册到系统服务中
    - (void)getAllSmartGeofenceListAndRegisterGeofenceIntoSystem;
    
    /// 移除所有地理围栏服务
    - (void)removeAllMonitors;
    

依赖服务

场景业务包正常运行需要依赖 ThingSmartHomeDataProtocol 这个协议提供的协议方法。调用业务包之前,您需要实现以下协议:

  • 协议一(已废弃):ThingSmartHomeDataProtocol

    提供场景组件所需的当前家庭信息。

    建议实现 ThingFamilyProtocol 协议方法来提供当前家庭 ID。

    /**
    查询当前的家庭,当前没有家庭的时候,返回 nil。
    
    @return ThingSmartHome
    */
    - (ThingSmartHome *)getCurrentHome;
    
  • 协议二:ThingFamilyProtocol

    1. 提供场景组件所需的当前家庭 ID。

      /// 返回当前家庭 ID
      - (long long)currentFamilyId;
      

      如果同时引入了家庭业务包和场景业务包,家庭的使用方法详见 家庭管理 UI 业务包

    2. 提供场景操作需要的权限。

      /// 返回场景操作所需的权限
      - (BOOL)checkAdminAndRightLimit:(BOOL)alert;
      
  • 协议三:ThingSmartHouseIndexProtocol

    提供场景组件所需的管理员身份信息。如果非管理员也允许编辑场景,返回 YES 即可。

    /**
    * 是否是当前家庭的管理员。
    *
    * @return YES 代表是管理员
    */
    - (BOOL)homeAdminValidation;
    

接口协议

注意事项

  • 调用任何接口之前,务必确认用户已登录。

  • 调用场景业务包逻辑前,要先实现:

    • ThingFamilyProtocol 中的协议方法 currentFamilyId
    • ThingFamilyProtocol 中的协议方法 checkAdminAndRightLimit:checkAdminAndRightLimit:withHomeId:
    • ThingSmartHouseIndexProtocol 中的协议方法 homeAdminValidation
  • 如果是 Swift 工程,您需要在桥接文件内引用业务包头文件。

    #import <ThingSmartBizCore/ThingSmartBizCore.h>
    #import <ThingModuleServices/ThingModuleServices.h>
    #import <ThingSmartSceneKit/ThingSmartSceneModel.h>
    

    Objective-C 示例

    #import <ThingSmartBizCore/ThingSmartBizCore.h>
    #import <ThingModuleServices/ThingModuleServices.h>
    #import <ThingSmartDeviceKit/ThingSmartDeviceKit.h>
    
    - (void)registerProtocol {
        // 注册要实现的协议
        [[ThingSmartBizCore sharedInstance] registerService:@protocol(ThingSmartHomeDataProtocol) withInstance:self];
        [[ThingSmartBizCore sharedInstance] registerService:@protocol(ThingSmartHouseIndexProtocol) withInstance:self];
        [[ThingSmartBizCore sharedInstance] registerService:@protocol(ThingFamilyProtocol) withInstance:self];
    }
    
    // 实现对应的协议方法
    - (ThingSmartHome *)getCurrentHome {
        ThingSmartHome *home = [ThingSmartHome homeWithHomeId:@"当前家庭 ID"];
        return home;
    }
    
    // 可根据实际用户身份返回,也可直接返回 YES 允许所有用户编辑
    - (BOOL)homeAdminValidation {
        return YES;
    }
    
    // 返回当前家庭 ID
    - (long long)currentFamilyId {
        return [ThingDemoSmartHomeManager sharedInstance].currentHomeModel.homeId;
    }
    
    - (BOOL)checkAdminAndRightLimit:(BOOL)alert {
       return YES;
    }
    

    Swift 示例

    class ThingSceneTest: NSObject,ThingSmartHomeDataProtocol,ThingSmartHouseIndexProtocol,ThingFamilyProtocol {
        func test() {
            ThingSmartBizCore.sharedInstance().registerService(ThingSmartHomeDataProtocol.self, withInstance: self)
            ThingSmartBizCore.sharedInstance().registerService(ThingSmartHouseIndexProtocol.self, withInstance: self)
            ThingSmartBizCore.sharedInstance().registerService(ThingFamilyProtocol.self, withInstance: self)
        }
    
        func getCurrentHome() -> ThingSmartHome! {
            let home = ThingSmartHome.init(homeId: 111)
            return home
        }
    
        func homeAdminValidation() -> Bool {
            return true
        }
    
        func checkAdminAndRightLimit(alert: Bool) -> Bool {
            return true
        }
    
        func currentFamilyId() -> Int64 {
            return 111
        }
    }
    

新增场景

Objective-C 示例

#import <ThingSmartBizCore/ThingSmartBizCore.h>
#import <ThingModuleServices/ThingSmartSceneProtocol.h>

- (void)gotoAddScene {
    id<ThingSmartSceneProtocol> impl = [[ThingSmartBizCore sharedInstance] serviceOfProtocol:@protocol(ThingSmartSceneProtocol)];
    [impl addAutoScene:^(ThingSmartSceneModel *secneModel, BOOL addSuccess) {

    }];
}

Swift 示例

func addScene() {
    let impl = ThingSmartBizCore.sharedInstance().service(of: ThingSmartSceneProtocol.self) as? ThingSmartSceneProtocol
    impl?.addAutoScene({ (sceneModel, result) in

    })
}

编辑场景

Objective-C 示例

#import <ThingSmartBizCore/ThingSmartBizCore.h>
#import <ThingModuleServices/ThingSmartSceneProtocol.h>

- (void)gotoEditScene {
    id<ThingSmartSceneProtocol> impl = [[ThingSmartBizCore sharedInstance] serviceOfProtocol:@protocol(ThingSmartSceneProtocol)];
    [impl editScene:(your sceneModel)];
}

Swift 示例

func editScene() {
    let impl = ThingSmartBizCore.sharedInstance().service(of: ThingSmartSceneProtocol.self) as? ThingSmartSceneProtocol
    impl?.editScene(your scenemodel)

    }
}

查询场景列表

Objective-C 示例

#import <ThingSmartBizCore/ThingSmartBizCore.h>
#import <ThingModuleServices/ThingSmartSceneBizProtocol.h>

- (void)getSceneList {
    id<ThingSmartSceneBizProtocol> impl = [[ThingSmartBizCore sharedInstance] serviceOfProtocol:@protocol(ThingSmartSceneBizProtocol)];
    [impl getSceneListWithHomeId:'your homeId' withSuccess:^(NSArray<ThingSmartSceneModel *> * _Nonnull scenes) {

    } failure:^(NSError * _Nonnull error) {

    }];
}

Swift 示例

func getSceneList() {
    let impl = ThingSmartBizCore.sharedInstance().service(of: ThingSmartSceneBizProtocol.self) as? ThingSmartSceneBizProtocol
    impl?.getSceneList(withHomeId: 111, withSuccess: { (sceneArr) in

    }, failure: { (error) in

    })
}

查询地理围栏信息

场景业务包已开放地理围栏功能,但每次使用业务包前,您必须要查询地理围栏信息列表,并注册到系统服务中。

Objective-C 示例

- (void)getGeofenceListAndRegister {
    id<ThingSmartGeofenceServiceProtocol> geofenceService = [[ThingSmartBizCore sharedInstance] serviceOfProtocol:@protocol(ThingSmartGeofenceServiceProtocol)];
    [geofenceService getAllSmartGeofenceListAndRegisterGeofenceIntoSystem];
}

Swift 示例

func getGeofenceListAndRegister() {
    let geofenceImpl = ThingSmartBizCore.sharedInstance().service(of: ThingSmartGeofenceServiceProtocol.self) as! ThingSmartGeofenceServiceProtocol
    geofenceImpl.getAllSmartGeofenceListAndRegisterGeofenceIntoSystem()
}

事件通知

  • kNotificationSmartSceneListUpdate,通知发送事件:

    • 添加场景成功
    • 编辑场景成功
    • 删除场景成功(UI 业务包发送的默认场景类型为 ThingSmartSceneRecommendTypeNoneThingSmartSceneCollectionTypeNone
  • kNotificationSmartSceneSaved,通知发送事件:

    • 添加场景成功
    • 编辑场景成功
  • kNotificationSmartSceneRecomDeleted,通知发送事件:推荐场景或者收藏场景删除成功