星的天空的博客

种一颗树,最好的时间是十年前,其次是现在。

0%

前言

在上层应用开发中,HTTP协议可以说是最常见,使用最频繁的网络协议了。在网上也有非常多的文章进行解读,但是大部分都是讲解HTTP协议的内容和使用,很少有人讲HTTP协议是怎么实现的。网络协议可以涉及很大的广度和深度,不是一篇文章就能讲清楚的,我这里更多的是提供一个思路供读者来思考。本篇文章会基于iOS平台来进行说明,但是并不代表这篇文章只针对iOS开发,因为协议是跨平台的,其中涉及到的编程思想也是。本文会分四个部分进行讲解:

  1. 第一部分:数据是如何在网络上进行传输的。这部分主要让你对网络模型和各层协议有一个基础的了解,如果您对这部分比较了解,可以直接从第二部分看起。
  2. 第二部分:HTTP协议数据是如何转换为TCP数据收发的。
  3. 第三部分:HTTP协议中RequestResponse的解析和相关逻辑处理。
  4. 第四部分:修改HTTP底层实现,完成自有需求。
阅读全文 »

问题的由来

Apple发布M1芯片之前,一直使用Intel的芯片,没有出现什么问题。发布M1芯片后,由于两者架构的不同(M1arm64架构,Intelx86_64的架构),导致很多软件运行出现了问题。我们在M1机型中使用Xcode编译模拟器时,可能会碰到如下报错:

1
ld: in youpath/Pods/UMCommon/UMCommon_7.3.5/UMCommon.framework/UMCommon(UMComBaseEvent.o), building for iOS Simulator, but linking in object file built for iOS, file '/Users/mtgj/Desktop/TestArch1/Pods/UMCommon/UMCommon_7.3.5/UMCommon.framework/UMCommon' for architecture arm64

1
2
3
4
5
ld: warning: ignoring file YoupPth/Build/Products/Debug-iphonesimulator/FMDB/FMDB.framework/FMDB, building for iOS Simulator-x86_64 but attempting to link with file built for iOS Simulator-arm64
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_FMDatabaseQueue", referenced from:
objc-class-ref in SqflitePlugin.o
ld: symbol(s) not found for architecture x86_64

这些报错,都是是由于项目中存在.a.framework静态库导致的。以前,我们创建静态库时,会分别打包出一份针对真机(arm64)和模拟器的(x86_64),然后将这两份合并成一个包后引入项目中进行使用。在Intel机型上,真机上使用arm64指令,模拟器(x86_64)中使用x86_64指令,所以不存在问题。但是在M1机型上,模拟器是以arm64运行的,显然再以x86_64运行就会出现问题。

阅读全文 »

前言

在iOS日常开发中,对某些方法进行hook是很常见的操作。最常见的是使用Category在+load中进行方法swizzle,它是针对类的,会改变这个类所有实例的行为。但是有时候我们只想针对单个实例进行hook,这种方法就显得无力了。而Aspects框架可以搞定这个问题。
它的原理是通过Runtime动态的创建子类,把实例的isa指针指向新创建的子类,然后在子类中对hook的方法进行处理,这样就支持了对单个实例的hook。Aspects框架支持对类和实例的hook,API很易用,可以方便的让你在任何地方进行hook,是线程安全的。但是Aspects框架也有一些缺陷,一不小心就会掉坑里面,我会通过源码解析进行说明。

阅读全文 »

独立开发经历

第一个小程序项目

我在17年的时候买人生的第一套房,是一套二手房,当时对二手房的各项交易费用一知半解,感觉自己就像一头屠宰桌上的猪,任人宰割。刚好那个时候微信小程序开始兴起,基于学习兴趣和需求,做了一个计算购房费用的小程序(在微信上搜索“首付款计算器”可以看到)。做出来后找了一个中介朋友,让他以激活码的方式帮我销售,收入五五分成,他帮我销售了几份后反馈有的客户没法安装(微信版本异常),有的客户有异常问题(非技术问题)。那个时候刚好工作比较忙,又觉得整这些事情太麻烦了(收益低),就没有更新和维护这个项目了。

第二个跨平台项目

在20年的时候,由于年龄的逐渐增长,开始考虑去扩展一些额外的收入点。那个时候刚好在学习Flutter,就想用Flutter对之前的项目进行重构,做市面上最专业的购房费用计算器。当时的初衷是想从开发到发布,系统的学习一项新技能,另外就是看能不能赚点钱。但是实际情况和我预想的有点偏差,我增加了很多预想之外的需求。

阅读全文 »

技术选型

项目中需要定制一个基于Gif图片的下拉刷新功能,调研发现
Flutter支持上下拉刷新的框架很多,其中有两个比较有名的有flutter_easyrefreshpull_to_refresh,两个框架功能都很强大,都能满足需求,其中flutter_easyrefresh在github的star更多,lib包大小为644KB,pull_to_refresh在pub.dev的评分更高,lib包大小为172KB,综合考虑后,选择基于pull_to_refresh来实现框架功能。

阅读全文 »

前言:开发效率和质量是每位开发人员永恒的追求,而Xcode的模板功能可以帮助你更好的达成这个目标,更难能可贵的是它还能在一定程度上帮助你统一实现逻辑和开发规范。

阅读全文 »

什么是plugin

FlutterDart生态系统的软件包有两种模板,分别是packagesplugin,其中plugin包含AndroidiOS平台特定实现,一般需要Flutter端与Android或iOS进行通讯交互(类比Hybrid或RN中JS与Native的交互),以实现特定功能。

创建plugin

一般使用命令创建Plugin:flutter create —-org com.example —-template=plugin hello,执行命令后,会在当前目录下生成一个hello文件夹,里面是一个plugin的简单demo实现。iOS可以使用OC和Swift,Android可以使用Java和kotlin进行代码编写,命令默认使用swift及kotlin,如需修改,使用-i-o命令。例如要创建一个使用OC及java的plugin,命令为:flutter create --org com.example --template=plugin --platforms=android,ios -a java -i objc hello

平台通道数据类型及编解码器

在平台通道进行数据传输时,Flutter它会自动对这些值进行序列化和反序列化。 下表展示了如何在平台端接收 Dart 值,反之亦然:

创建一个样例Demo

为了更好的说明流程,这里创建一个禁用截屏功能的plugin进行说明,plugin提供三个功能:全局添加水印截屏监控禁用截屏。其中全局添加水印为在Flutter当前页面栈的最上层添加一个半透、有水印、穿透触摸事件的全遮盖页面,为纯dart实现,不需要与平台进行交互; 截屏监控为当平台监听到截屏行为后,立即通知Flutter端,是一个持续通讯的过程;禁用截屏为Flutter端通知平台执行禁用操作(只支持Android平台)。
此plugin已经开发完成并发布到官方pub,可以在GitHub - disable_screenshots下载并查看源码。

阅读全文 »

WKWebView与App不在同一个进程运行,不会从App的标准Cookie容器NSHTTPCookieStorage读取Cookie。跨进程的数据同步是一个麻烦及容易出现问题的场景,Apple在iOS11之前没有专门的API用于Cookie操作,在iOS11之后提供了WKHTTPCookieStore,但是自测发现存在一些奇怪的bug,无法使用,此部分后续会做说明。

网上关于WKWebView的Cookie同步我有查到多种方案,但是均无法解决跨域请求的Cookie问题,后来发现使用WKProcessPool可以解决跨域问题。

阅读全文 »

carsh文件符号化需要symbolicatecrash脚本、.crash文件、产生crash的app对应的.dSYM文件。脚本可以通过.dSYM文件对.crash文件进行格式化。

阅读全文 »

Hexo是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。本文基于Hexo进行说明。

环境搭建

安装

  • 确保电脑中是安装有Node.jsGit
  • hexo安装:npm install -g hexo-cli

建站

执行下列命令,Hexo 将会在指定文件夹中新建所需要的文件。

1
2
3
$ hexo init <folder>
$ cd <folder>
$ npm install
阅读全文 »