智能场景 UI 业务包

更新时间:2023-05-22 06:38:27下载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 'TuyaSmartSceneBizBundle'
	pod 'TuyaRNApi/Scene'
	pod 'TuyaSmartCameraSettingBizBundle'
end

服务权限

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

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

    NSLocationAlwaysUsageDescription
    

服务协议

提供服务

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

  • TYSmartSceneProtocol.h

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

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

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

依赖服务

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

  • 协议一(已废弃):TYSmartHomeDataProtocol

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

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

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

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

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

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

  • 协议三:TYSmartHouseIndexProtocol

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

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

接口协议

注意事项

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

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

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

    #import <TuyaSmartBizCore/TuyaSmartBizCore.h>
    #import <TYModuleServices/TYModuleServices.h>
    #import <TuyaSmartSceneKit/TuyaSmartSceneModel.h>
    

    Objective-C 示例

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

    Swift 示例

    class TYSceneTest: NSObject,TYSmartHomeDataProtocol,TYSmartHouseIndexProtocol,TYFamilyProtocol {
    	func test() {
    TuyaSmartBizCore.sharedInstance().registerService(TYSmartHomeDataProtocol.self, withInstance: self)
    TuyaSmartBizCore.sharedInstance().registerService(TYSmartHouseIndexProtocol.self, withInstance: self)
    TuyaSmartBizCore.sharedInstance().registerService(TYFamilyProtocol.self, withInstance: self)
    	}
    
    	func getCurrentHome() -> TuyaSmartHome! {
    		let home = TuyaSmartHome.init(homeId: 111)
    		return home
    	}
    
    	func homeAdminValidation() -> Bool {
    		return true
    	}
    
    	func currentFamilyId() -> Int64 {
    		return 111
    	}
    }
    

新增场景

Objective-C 示例

#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSmartSceneProtocol.h>

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

	}];
}

Swift 示例

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

	})
}

编辑场景

Objective-C 示例

#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSmartSceneProtocol.h>

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

Swift 示例

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

	}
}

查询场景列表

Objective-C 示例

#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSmartSceneBizProtocol.h>

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

	} failure:^(NSError * _Nonnull error) {

	}];
}

Swift 示例

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

	   }, failure: { (error) in

	  })
}

查询地理围栏信息

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

Objective-C 示例

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

Swift 示例

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

事件通知

  • kNotificationSmartSceneListUpdate,通知发送事件:

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

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