自动化切换企业证书,持久会话和消息队列

2019-10-02 00:58栏目:专项工作
TAG:

RAC里面80%的用法是最常用同时也是很简单的,剩下20%的用法不常用同时也是不容易掌握的

本文翻译自

图片 1

备注:初学者很容易被RAC吓到,特别是看到网上有些文章大篇幅的介绍枯燥的理论和很少用到的高级用法后。

不要被RAC吓到,RAC并不难,难的那一部分在项目中很少遇到。所以:这篇文章只介绍最常用最简单的那 80%的用法

//退出登录的方法里发送通知: [[NSNotificationCenterdefaultCenter]postNotificationName:@"log_out"object:nil];// 接收通知的地方:(takeUntil:[self rac_willDeallocSignal]]这句可以保证在页面销毁的时候移除通知)[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"login_out" object:nil] takeUntil:[self rac_willDeallocSignal]] subscribeNext:^ { NSNotification* notification = (NSNotification*)x; // 退出登录的时候接受到的通知 }];

/// 监听输入金额是否合法([unowned self]可以避免swift循环引用,比OC更方便) self.codeTF.rac_textSignal().take(until: self.rac_willDeallocSignal.subscribeNext { [unowned self]  in if let text = text as? String { if text.length >= 1 { // 输入内容的长度判断 self.submitBtn.backgroundColor = UIColor.getMain() self.submitBtn.setTitleColor(UIColor.white, for: .normal) self.submitBtn.isUserInteractionEnabled = true } else { self.submitBtn.backgroundColor = UIColor.colorRGB16(value: 0xececec) self.submitBtn.setTitleColor(UIColor.getContentSecond(), for: .normal) self.submitBtn.isUserInteractionEnabled = false } } }

 // 普通按钮点击 [[button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^ { }]; //点击事件拦截。(filter 可以拦截某个条件的方法) [[[button rac_signalForControlEvents:UIControlEventTouchUpInside]filter:^BOOL(UIButton *button) { if ([button.currentTitle isEqualToString:@"sd"]) { return YES; }else{ return NO; } }]subscribeNext:^ { NSLog; }];

[[segmentedControl rac_signalForControlEvents:UIControlEventValueChanged] subscribeNext:^ { }];

 //某个类的某个属性一发生变化就执行。 [RACObserve(self, count) subscribeNext:^ { if ([x integerValue] == 0) { }else if ([x integerValue] > 100){ } }];// 监听 contentOffset的值,比代理简单的多。[RACObserve(scrollView, contentOffset) subscribeNext:^ { NSLog; }]; //返回Bool赋值给createEnabled RAC(self, createEnabled) = [RACSignal combineLatest:@[RACObserve(self, password),RACObserve(self, passwordConfirm)] reduce:^(NSString *pwd,NSString *pwdConfirm) { return @([pwd isEqualToString:pwdConfirm]); }];

//map 改变返回的类型给结果管道。(NSString--->UIColor) [[self.textField.rac_textSignal map:^id(NSString *text) { if ([text isEmptyString]) { return [UIColor whiteColor]; }else{ return [UIColor yellowColor]; } }]subscribeNext:^(UIColor *color) { self.textField.backgroundColor = color; }]; // 返回类型:UIButton --> NSString [[[self.buttonrac_signalForControlEvents:UIControlEventTouchUpInside]map:^id(UIButton *button) { if ([button.currentTitle isEqualToString:@"按钮"]) { return [NSString stringWithFormat:@"按钮"]; }else{ return [NSString stringWithFormat:@"不是按钮"]; } }]subscribeNext:^(NSString *resultString) { NSLog(@"%@",resultString); }];

//filter某个属性满足一定条件才执行。 [[RACObserve(self, count) filter:^BOOL {//返回的是BOOL类型 if ([count integerValue] == 5) { return YES; }else{ return NO; } }]subscribeNext:^ {//上面return YES 才走这里 NSLog(@"数量为===%@",count); }];

// RAC() 可以将Signal发出事件的值赋值给某个对象的某个属性,其参数为对象名和属性名// RACObserve() 参数为对象名和属性名,新建一个Signal并对对象的属性的值进行观察,当值变化时Signal会发出事件

// 这里不能使用基本数据类型,RAC中传递的都是id类型,使用基本类型会崩溃,所以使用mapRAC(self.lb_age,text)=[RACObserve(model, age) map:^id { return [NSString stringWithFomat:@"%@",value]; }];// 其实上面的写法也可以写成:[RACObserve(model, age) map:^id { self.lb_age.text = [NSString stringWithFomat:@"%@",value]; }];

 //将self.button.enables 属性 和 右边的signal sendNext 值绑定。 RAC(self.button,enabled) = [RACSignal combineLatest:@[RACObserve(self, password),self.textField.rac_textSignal,RACObserve(self, passwordConfirm)] reduce:^(NSString *password,NSString *textString,NSString *passwordConfirm){ if ([password isEqualToString:passwordConfirm] && textString.length > 0) { return @; }else{ return @; } }];

未经允许,不得转载

在利用Jenkins进行iOS持续集成的时候,有时候需要用开发证书打包、有时候需要企业证书打包。我们在平时开发中一般都采用开发证书,会在git 中和代码一起push同步,,因此平时用开发证书打包的时候,不用进行修改,直接使用git拉下来的证书和bundle ID。而在需要企业证书打包的时候需要切换到企业证书,而在持续集成中讲究自动化,所以一个方案能够实现在构建之前进行自动化切换切换到企业证书,而不是手动更换证书。在网上查询了一些相关经验,并没有找到相关可适用的实现方案,因此我根据自己的想法实现了这个自动化方案。

当一个客户端连接到MQTT broker时,它需要订阅所有它感兴趣的主题以便从broker接收消息。再重新连接时,已订阅的主题会丢失,而客户端需要重新发起订阅。在没有持久会话时这是一个正常的流程。但是对于资源受限的设备来说,每次重连都需要重新订阅会是较大的负担。所以,持久会话在broker上保存了所有关于此客户端的信息以解决此问题。会话由客户端建立连接时提供的clientId所确定。

首先我们需要在Jenkins两个项目Job,一个用于开发证书打包,一个用于企业证书打包。负责开发证书打包的项目job只需要用git上的开发证书和相关配置即可(当然要保证git 上的配置是正确的)而负责企业证书打包的项目job就需要在构建之前进行证书切换和相关配置修改的步骤。切换证书更改是在project.pbxproj文件中,因此我们主要是通过更改project.pbxproj来切换证书。而实现自动化修改证书、配置有两个方案:

  • 即使没有订阅,也会生成会话
  • 所有订阅信息
  • 所有尚未被客户端确认,且QoS为1和2级别的消息
  • 所有因客户端离线而没有收到,且QoS为1和2级别的消息
  • 所有客户端已经收到,但尚未确认的QoS为2的消息

方案一 :

备份一份企业证书打包时的project.pbxproj文件,在Jenkins构建之前,覆盖掉更新下来的工程代码中的project.pbxproj文件,这样便切换了相关证书配置。

这意味着即使客户端离线,所有上述信息也会被broker存储起来,等下次客户端重新连接时继续使用。

具体步骤:

版权声明:本文由ag真人发布于专项工作,转载请注明出处:自动化切换企业证书,持久会话和消息队列