抖音私信名片小编做一个抖音的私信名片链接,分析抖音app的原理后,需要一些加工方法,步骤记录如下:
制作加扣扣478387276
Charles数据采集
对于移动端开发者来说,并不是每个项目都有机会可以直接接触到后端代码,所以进行网络请求调试时,借助Charles、Fiddler、Wireshark等测试工具对请求进行抓包分析,将使请求细节清晰明了的展现在开发者眼前,降低开发者的调试难度。除此之外,对他人开发的app网络请求进行抓包分析也有助于学习其API架构思路。在这里我们则使用Charles分析抖音app的API设计并获取相应的json请求数据,用来搭建本项目所需使用到的网络请求API。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
抓包步骤:电脑端安装Charles并打开,然后打开需要进行网络请求抓包的移动设备,选择设置→无限局域网→"当前连接的网络名称"→蓝色感叹号图标→配置代理→手动,服务器一栏填入电脑端的ip地址,端口填写8888(Charles默认端口,可修改),最后点击保存即可进行抓包分析。HTTPS请求抓包则需在移动端浏览器打开chls.pro/ssl地址并安装证书即可,注意需要在移动端设备设置了代理的情况下进行。
如下图所显示,我们便获取了抖音所调用的网络请求接口数据,根据这些接口数据搭建了本项目所使用的网络请求API。
在这里插入图片描述
网络请求API接口
抖音demo的数据来自Charles抓包,这些数据被抓取后存储在抖音demo对应的服务器数据库中,以这些数据为基础搭建了抖音demo中的网络请求API,网络请求数据返回格式为json,所有接口返回的json数据结构如下所示:
//重写layoutAttributesForElementsInRect方法
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect{
//获取当前在屏幕rect中显示的元素属性
NSMutableArray*superArray=[[superlayoutAttributesForElementsInRect:rect]mutableCopy];
//移除掉所有Header和Footer类型的元素,因为抖音个人主页中只有第一个section包含Header和Footer类型元素,
即移除需要固定的Header和Footer,因为后续会单独添加,为了避免重复处理。
for(UICollectionViewLayoutAttributes*attributesin[superArraymutableCopy]){
if([attributes.representedElementKindisEqualToString:UICollectionElementKindSectionHeader]){
[superArrayremoveObject:attributes];
}
}
//单独添加上一步移除的Header和Footer,单独添加是因为第一步只能获取当前在屏幕rect中显示的元素属性,当第一个Sectioin移除屏幕便无法获取Header和Footer,
这是需要单独添加Header和Footer以及第二部单独移除Header和Footer的原因。
[superArrayaddObject:[superlayoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeaderatIndexPath:[NSIndexPathindexPathForItem:0inSection:0]]];
[superArrayaddObject:[superlayoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooteratIndexPath:[NSIndexPathindexPathForItem:0inSection:0]]];
//codebywww.douyin1688.com
//循环当前获取的元素
for(UICollectionViewLayoutAttributes*attributesinsuperArray){
//判断是否是第一个section
if(attributes.indexPath.section==0){
//判断是否为Header类型
if([attributes.representedElementKindisEqualToString:UICollectionElementKindSectionHeader]){
//获取Header的
CGRectrect=attributes.;
//判断Header的bottom是否滑动到导航栏下方
if(self.collectionView.contentOffset.y+self.navHeight-rect.size.height>rect.origin.y){
//修改Header的y值
rect.origin.y=self.collectionView.contentOffset.y+self.navHeight-rect.size.height;
attributes.=rect;
}
//设施Header层级,保证Header显示时不被其它cell覆盖
attributes.zIndex=5;
}
//判断是否为Footer类型
if([attributes.representedElementKindisEqualToString:UICollectionElementKindSectionFooter]){
//获取Footer的
CGRectrect=attributes.;
//判断Footer的top是否滑动到导航栏下方
if(self.collectionView.contentOffset.y+self.navHeight>rect.origin.y){
//修改Footer的y值
rect.origin.y=self.collectionView.contentOffset.y+self.navHeight;
attributes.=rect;
}
//设施Footer层级,保证Footer显示时不被其它cell覆盖,同时显示在Header之上
attributes.zIndex=10;
}
}
}
//返回修改后的元素属性
return[superArraycopy];
}
//重写shouldInvalidateLayoutForBoundsChange方法
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBound{
returnYES;//返回YES,修改newBound内的元素属性
}
在这里插入图片描述
结构总览
本项目共分为三个部分。第一部分为抖音个人主页实现,包含NSOperationQueue多队列解析webp动图、网络资源二级缓存框架搭建。第二部分围绕AVPlayerLayer展开,涉及网络视频边播放边下载、UITableView控制多个视频源播放。第三部分则为WebSocket实现IM即时聊天,其中穿插文本计算、表情编辑等功能。三个部分都涉及网络请求、json数据模型转换以及手势、动画效果处理。项目文件结构则如下图所示:
布局、接口分析
抖音聊天界面和大部分app聊天界面功能设计上基本一致,UITableView用于显示聊天消息列表,底部一个UITextView用于消息文本编辑,除此之外还有UICollectionView实现的表情选择器、图片选择器用于发送表情、图片信息。
在这里插入图片描述
在线演示地址 www.dycard.com.cn
制作加扣扣478387276
Charles数据采集
对于移动端开发者来说,并不是每个项目都有机会可以直接接触到后端代码,所以进行网络请求调试时,借助Charles、Fiddler、Wireshark等测试工具对请求进行抓包分析,将使请求细节清晰明了的展现在开发者眼前,降低开发者的调试难度。除此之外,对他人开发的app网络请求进行抓包分析也有助于学习其API架构思路。在这里我们则使用Charles分析抖音app的API设计并获取相应的json请求数据,用来搭建本项目所需使用到的网络请求API。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
抓包步骤:电脑端安装Charles并打开,然后打开需要进行网络请求抓包的移动设备,选择设置→无限局域网→"当前连接的网络名称"→蓝色感叹号图标→配置代理→手动,服务器一栏填入电脑端的ip地址,端口填写8888(Charles默认端口,可修改),最后点击保存即可进行抓包分析。HTTPS请求抓包则需在移动端浏览器打开chls.pro/ssl地址并安装证书即可,注意需要在移动端设备设置了代理的情况下进行。
如下图所显示,我们便获取了抖音所调用的网络请求接口数据,根据这些接口数据搭建了本项目所使用的网络请求API。
在这里插入图片描述
网络请求API接口
抖音demo的数据来自Charles抓包,这些数据被抓取后存储在抖音demo对应的服务器数据库中,以这些数据为基础搭建了抖音demo中的网络请求API,网络请求数据返回格式为json,所有接口返回的json数据结构如下所示:
//重写layoutAttributesForElementsInRect方法
-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect{
//获取当前在屏幕rect中显示的元素属性
NSMutableArray*superArray=[[superlayoutAttributesForElementsInRect:rect]mutableCopy];
//移除掉所有Header和Footer类型的元素,因为抖音个人主页中只有第一个section包含Header和Footer类型元素,
即移除需要固定的Header和Footer,因为后续会单独添加,为了避免重复处理。
for(UICollectionViewLayoutAttributes*attributesin[superArraymutableCopy]){
if([attributes.representedElementKindisEqualToString:UICollectionElementKindSectionHeader]){
[superArrayremoveObject:attributes];
}
}
//单独添加上一步移除的Header和Footer,单独添加是因为第一步只能获取当前在屏幕rect中显示的元素属性,当第一个Sectioin移除屏幕便无法获取Header和Footer,
这是需要单独添加Header和Footer以及第二部单独移除Header和Footer的原因。
[superArrayaddObject:[superlayoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeaderatIndexPath:[NSIndexPathindexPathForItem:0inSection:0]]];
[superArrayaddObject:[superlayoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooteratIndexPath:[NSIndexPathindexPathForItem:0inSection:0]]];
//codebywww.douyin1688.com
//循环当前获取的元素
for(UICollectionViewLayoutAttributes*attributesinsuperArray){
//判断是否是第一个section
if(attributes.indexPath.section==0){
//判断是否为Header类型
if([attributes.representedElementKindisEqualToString:UICollectionElementKindSectionHeader]){
//获取Header的
CGRectrect=attributes.;
//判断Header的bottom是否滑动到导航栏下方
if(self.collectionView.contentOffset.y+self.navHeight-rect.size.height>rect.origin.y){
//修改Header的y值
rect.origin.y=self.collectionView.contentOffset.y+self.navHeight-rect.size.height;
attributes.=rect;
}
//设施Header层级,保证Header显示时不被其它cell覆盖
attributes.zIndex=5;
}
//判断是否为Footer类型
if([attributes.representedElementKindisEqualToString:UICollectionElementKindSectionFooter]){
//获取Footer的
CGRectrect=attributes.;
//判断Footer的top是否滑动到导航栏下方
if(self.collectionView.contentOffset.y+self.navHeight>rect.origin.y){
//修改Footer的y值
rect.origin.y=self.collectionView.contentOffset.y+self.navHeight;
attributes.=rect;
}
//设施Footer层级,保证Footer显示时不被其它cell覆盖,同时显示在Header之上
attributes.zIndex=10;
}
}
}
//返回修改后的元素属性
return[superArraycopy];
}
//重写shouldInvalidateLayoutForBoundsChange方法
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBound{
returnYES;//返回YES,修改newBound内的元素属性
}
在这里插入图片描述
结构总览
本项目共分为三个部分。第一部分为抖音个人主页实现,包含NSOperationQueue多队列解析webp动图、网络资源二级缓存框架搭建。第二部分围绕AVPlayerLayer展开,涉及网络视频边播放边下载、UITableView控制多个视频源播放。第三部分则为WebSocket实现IM即时聊天,其中穿插文本计算、表情编辑等功能。三个部分都涉及网络请求、json数据模型转换以及手势、动画效果处理。项目文件结构则如下图所示:
布局、接口分析
抖音聊天界面和大部分app聊天界面功能设计上基本一致,UITableView用于显示聊天消息列表,底部一个UITextView用于消息文本编辑,除此之外还有UICollectionView实现的表情选择器、图片选择器用于发送表情、图片信息。
在这里插入图片描述
在线演示地址 www.dycard.com.cn