android native 定时器,开发App端的本地定时功能

创建一个自有App,并完成SDK下载。详细操作请参见创建自有App。

获取本地定时的属性字段。

本地定时是属于TSL的一个属性,定时就是操作TSL的LocalTimer。根据设备模型SDK获取对应设备的TSL,并从中获取本地定时的个数、Targets、Timezoneoffset属性字段。

// 获取本地定时的个数,是否支持 Targets、Timezoneoffset

NSUInteger size = 0;

IMSThing *thing = [[IMSThingManager sharedManager] buildThing:iotId];

IMSThingProfile *profile = [thing getThingProfile];

NSArray *proList = [profile allPropertiesOfModel];

__block BOOL hasTargets = NO;

__block BOOL hasTimezoneOffset = NO;

for (NSUInteger i = 0; i

IMSThingTslProperty * _Nonnull obj = proList[i];

NSLog(@"%lul", (unsigned long)i);

if ([obj.identifier isEqualToString:@"LocalTimer"]) {

NSString *sizeTmp = obj.dataType[@"specs"][@"size"];

size = sizeTmp.integerValue;

NSArray *itemList = obj.dataType[@"specs"][@"item"][@"specs"];

[itemList enumerateObjectsUsingBlock:^(id _Nonnull item, NSUInteger idx, BOOL * _Nonnull stop) {

if ([item[@"identifier"] isEqualToString:@"Targets"]) {

hasTargets = YES;

} else if ([item[@"identifier"] isEqualToString:@"TimezoneOffset"]){

hasTimezoneOffset = YES;

}

}];

}

}

获取设备端的定时器列表数据。

// 本地定时model数据结构

@interface IMSLocalTimerModel : NSObject

@property (nonatomic, copy) NSString *timer;

@property (nonatomic, assign) BOOL enable;

@property (nonatomic, assign) BOOL isValid;

@property (nonatomic, strong) NSMutableDictionary *propertyValueDic;

@property (nonatomic, strong) NSString *iotId;

@property (nonatomic, strong, nullable) NSString *targets;

@property (nonatomic, assign) NSInteger timezoneOffset;

@end

// 获取本地定时列表数据

id thingObj = [thing getThingActions];

NSMutableArray *list = [NSMutableArray array];

[thingObj getPropertiesFull:^(IMSThingActionsResponse * _Nullable response) {

// 回调不在主线程,请注意

NSDictionary *dic = (NSDictionary *)response.dataObject;

NSDictionary *data = dic[@"data"];

for (NSString *key in data){

if ([key isEqualToString:@"LocalTimer"]){

NSDictionary *localTimer = data[key];

NSArray *value = localTimer[@"value"];

for (NSDictionary *item in value) {

IMSLocalTimerModel *timer = [IMSLocalTimerModel new];

timer.isValid = NO;

timer.propertyValueDic = [NSMutableDictionary dictionary];

for (NSString *a in item) {

if ([a isEqualToString:@"IsValid"]) {

NSNumber *isValid = item[a];

timer.isValid = isValid.boolValue;

} else if ([a isEqualToString:@"Enable"]) {

NSNumber *enable = item[a];

timer.enable = enable.boolValue;

} else if ([a isEqualToString:@"Timer"]) {

timer.timer = item[a];

} else if ([a isEqualToString:@"Targets"]){

timer.targets = item[a];

} else if ([a isEqualToString:@"TimezoneOffset"]){

NSNumber *timezoneOffset = item[a];

timer.timezoneOffset = timezoneOffset.integerValue;

} else {

timer.propertyValueDic[a] = item[a];

}

}

if (!timer.isValid) {

timer.propertyValueDic = [NSMutableDictionary dictionary];

timer.timer = @"";

timer.targets = @"";

timer.timezoneOffset = 0;

}

timer.hasTargets = hasTargets;

timer.hasTimezoneOffset = hasTimezoneOffset;

[list addObject:timer];

}

break;

}

}

// 如果get到的属性值的timer个数没有达到tsl要求的定时器数,需要补齐,因为set的时候,tsl要求返回的个数和tsl要求的一样

for (NSInteger i = list.count; i < size; i++) {

IMSLocalTimerModel *timer = [IMSLocalTimerModel new];

timer.isValid = NO;

timer.timer = @"";

timer.iotId = iotId;

timer.hasTargets = hasTargets;

timer.hasTimezoneOffset = hasTimezoneOffset;

timer.propertyValueDic = [NSMutableDictionary dictionary];

timer.modelList = list;

[list addObject:timer];

}

}

设置(编辑/创建/删除等)一个定时器。

@implementation IMSLocalTimerModel

// 单个定时转换为json接口,供参考

- (NSMutableDictionary *)toJson{

NSMutableDictionary *json = [NSMutableDictionary dictionary];

[json addEntriesFromDictionary:self.propertyValueDic];

[json addEntriesFromDictionary:@{@"Enable":@(self.enable?1:0),@"IsValid":@(self.isValid?1:0), @"Timer":self.timer?:@""}];

if (self.hasTargets) {

[json addEntriesFromDictionary:@{@"Targets":self.targets?:@""}];

}

if (self.hasTimezoneOffset) {

[json addEntriesFromDictionary:@{@"TimezoneOffset":@(self.timezoneOffset)}];

}

return json;

}

/* 如果 TimezoneOffset 字段存在 这个字段是为了让设备端能获取到app端设置定时时所处时区*/

propertyValues[@"TimezoneOffset"] = @([NSTimeZone localTimeZone].secondsFromGMT);

/*

假设当前设备有3个属性可以通过本地定时进行控制,这3个属性的identifier分别为id1、id2、id3

如果本地定时存在Targets字段,则允许1个定时只控制3个属性中部分属性,假设这个定时是控制属性id1和属性id2,

则 Targets = @"id1, id2"

如果本地定时不存在Targets字段,则要求改定时创建或者编辑的时候,必须对3个属性都设置属性值(定时时间到的是属性需要生效的值)

*/

// list 是属性的 identifier 的列表

- (NSString *)setTargetList:(NSArray *)list{

if (list.count == 0) {

return @"";

}

NSString *targets = list.firstObject;

for (NSUInteger i = 1; i < list.count; i++) {

targets = [targets stringByAppendingString:@","];

targets = [targets stringByAppendingString:list[i]];

}

return targets;

}

propertyValues[@"TimezoneOffset"] = [obj setTargetList:@[id1, id2]];

/* 假设tsl中获取到设备可以设置3个本地定时,则timerList=@[[timer1 toJson], [timer2 toJson], [timer3 toJson]] :

每个定时器的json生成参考 [IMSLocalTimerModel toJson]

[

1. 同时控制属性1和属性2的定时

{"id1":1,"id2":2,"id3":1,"Timer":"0 8 * * *","Enable":1,"IsValid":1, "Targets":"id1, id2", "TimezoneOffset":""},

2. 只控制属性1的定时

{"id1":1,"id2":2,"id3":1,"Timer":"2 6 * * 3","Enable":1,"IsValid":1, "Targets":"id1", "TimezoneOffset":""},

3. 设置一个定时的IsValid为0,则就是删除该定时器,但是这里建议把IsValid 也设置为0,因为设备端的实现可能只认IsValid字段

{"id1":1,"id2":2,"id3":1,"Timer":"2 6 * * 3","Enable":0,"IsValid":0, "Targets":"", "TimezoneOffset":""}

]

*/

[thingActions setProperties:@{@"LocalTimer":timerList} responseHandler:^(IMSThingActionsResponse * _Nullable response) {

}

订阅本地定时属性值。

以监听定时的Enable状态为例,设定定时的有效性是一次,当定时超时后,App端会收到定时的Enable属性变为0的通知,并进行界面刷新等相关操作。相应示例代码如下。

// 代码供参考

a.注册订阅

IMSThing *thing = [[IMSThingManager sharedManager] buildThing:controller.iotId];

[thing registerThingObserver:(id)obj];

b.订阅通知处理

- (void)onPropertyChange:(NSString *)iotId params:(NSDictionary *)params{

IMSDeviceLogDebug(@"onPropertyChange %@ %@", iotId, params);

NSArray *list = params[@"items"][@"LocalTimer"][@"value"];

for (NSInteger i = 0; i < list.count; i++) {

NSDictionary *timer = list[i];

if (i >= self.list.count) {

[self.list addObject:[IMSLocalTimerModel new]];

}

IMSLocalTimerModel *model = self.list[i];

model.timezoneOffset = NO;

model.hasTargets = NO;

model.propertyValueDic = [NSMutableDictionary dictionary];

[timer enumerateKeysAndObjectsUsingBlock:^(NSString *_Nonnull key, NSNumber* _Nonnull obj, BOOL * _Nonnull stop) {

if ([key isEqualToString:@"Enable"]) {

model.enable = obj.boolValue;

} else if ([key isEqualToString:@"IsValid"]){

model.isValid = obj.boolValue;

} else if ([key isEqualToString:@"Targets"]){

model.targets = (NSString *)obj;

model.hasTargets = YES;

} else if ([key isEqualToString:@"Timer"]){

model.timer = (NSString *)obj;

} else if ([key isEqualToString:@"TimezoneOffset"]){

model.timezoneOffset = obj.integerValue;

model.hasTimezoneOffset = YES;

} else {

model.propertyValueDic[key] = obj;

}

}];

}

// 刷新界面等

}

c.注销订阅

IMSThing *thing = [[IMSThingManager sharedManager] buildThing:self.iotId];

[thing unregisterThingObserver:self];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值