自iOS8之后,苹果支持了扩展(Extension)的开发,开发者可以通过系统提供给我们的扩展接入点 (Extension point) 来为系统特定的服务提供某些附加的功能。但iOS14后,苹果更新了扩展组件,引入了新的UI组件:WidgetKit 而舍弃了iOS14以下版本的Today Extension组件
Widget介绍这里有一份官方的小组件使用指南
简单来说:小组件相当于一个动态程序入口,在有限的空间内展示你想看到的重要的信息
苹果自带的日历使用起来非常不适,下载第三方日历又不想被捆绑的无用功能打扰。有了小组件之后这个问题就很好的解决了,比如上面的日历小组件,清晰的展示了今天的日期和农历以及周几,打开手机锁屏就能看见。
此外系统自带的电量小组件,方便的展示了需要下滑去状态栏才能看到的耳机电量:
之前发布的时候觉得这都是安卓系统玩剩下的东西,没什么卵用,不过现在是真香!
Widget设计指南这里有一份官方的设计指南
简而言之,设计一个简单漂亮吸引人并且快速显示内容的小组件。
Widget: HelloWorld这里有一份官方的开发文档可以参考
一个小组件...
APP内部代理
wifi的代理配置不会自动保存?使用iPhone的大概都遇见过这种事情:
每次需要给APP抓包的时候都需要到设置-WIFI-下手动配置代理,然而当我们连着代理的时候无法访问App Store或其他禁止代理的服务,这个时候我们会把WIFI的代理给关闭。
弄完杂七杂八的东西之后回到抓包调试,打开WIFI设置页,手动配置代理…
???
我刚才填的本机IP和端口呢?我还得再输一次?WTF!
解决方案一弄两个wifi信号,一个挂笔记本的代理不关,另一个正常联网,需要切换代理的时候切换wifi。
说实话操作起来挺麻烦的,并且公司只有一个公用的wifi信号,想弄一个新的信号还需要运维小伙伴来搞,难顶。
解决方案二安装VPN软件,配置本地代理规则,需要抓包的时候打开网络代理。
小火箭之类好用的软件需要美区账号安装,每个测试机都可能会有这个需求,不可能每个测试机都这么操作一遍。
解决方案三APP内部通过代码设置代理,只在APP内部生效,开发环境使用,可持久化配置文件。
去goole了一圈,发现URLSessionConfiguration 中有个字典专门保存代理信息conn...
从一个问题开始Runloop 和线程有什么关系?
Runloop 和 线程是密不可分的,可以说Runloop是为线程而生的。线程和runloop是一一对应的,我们只可以在当前线程内操控当前线程对应的Runloop。
Runloop是懒加载的在线程第一次获取他的时候创建,在线程结束的时候销毁。
主线程的runloop是默认启动的,因为主线程需要一直监听事件。子线程的Runloop默认是不启动的,需要手动开启循环。
Runloop 的作用?保持程序的运行,主线程的runloop使得APP不会退出
响应并处理APP中的事件,用户交互、定时任务等
节省cpu资源,按需运行,提升程序性能
Runloop的运行过程Run Loop本质是一个处理事件源的循环。我们对Run Loop的运行时具有控制权,如果当前没有时间发生,Run Loop会让当前线程进入睡眠模式,来减轻CPU压力。如果有事件发生,Run Loop就处理事件并通知相关的Observer。具体的顺序如下:
Run Loop进入的时候,会通知Observer
Timer即将被触发时,会通知Observer
有其它非Port-B...
__block 是干什么用的1234567int val = 10; MyBlock block = ^{ NSLog(@"val = %d",val);};block();//输出2020-09-22 14:24:47.018497+0800 MyDemo[2987:2658512] val = 10
从一段简单的code说起,在block中修改val的值该怎么办呢?
直接在block中修改会报编译错误Variable is not assignable (missing __block type specifier)
显而易见我们只需要在val变量前加__block关键字即可。
12345678__block int val = 10;MyBlock block = ^{ val += 10; NSLog(@"val = %d",val);};block();//输出2020-09-22 14:29:38.065700+0800 MyDemo[2991:2660066] ...
致未来的我:你是不是有点忘记了GCD的一些知识?恰巧这几天我有看这些,让我给你讲讲吧?GCD是基于C语言的API,开发者只需要将任务放在block内,并指定好追加的队列,就可以完成多线程开发.
知识点速览1.队列: 串行队列、并发队列
2.任务: 同步任务、异步任务
3.队列和任务的交叉组合使用
4.死锁的产生和预防
队列Dispatch Queue是执行处理的等待队列,按照任务(block)追加到队列里的顺序,先进先出执行处理。
而等待队列有两种
Serial Dispatch Queue:串行队列,等待当前执行任务处理结束的队列。
Concurrent Dispatch Queue:并发队列,不等待当前执行任务处理结束的队列
那么如何创建一个新队列呢
12345//创建了串行队列dispatch_queue_t serailQueue = dispatch_queue_create("Test_SERIAL_GCD_Queue", DISPATCH_QUEUE_SERIAL);//创建了并行队列dispatch_queue_t concurrentQueu...