梦幻泡影

孔思哲的博客空间


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 相册

  • 站点地图

  • 搜索

为什么说基于TCP的移动端IM仍然需要心跳保活?

发表于 2020-07-20 | 分类于 iOS

为什么说基于TCP的移动端IM仍然需要心跳保活?

(转自 http://www.52im.net/thread-281-1-1.html)

前言

很多人认为,TCP协议自身先天就有KeepAlive机制,为何基于它的通讯链接,仍然需要在应用层实现额外的心跳保活?本文将从移动端IM实践的角度告诉你,即使使用的是TCP协议,应用层的心跳保活仍旧必不可少。

在使用 TCP 长连接的 IM 服务设计中,往往都会涉及到心跳。心跳一般是指某端(绝大多数情况下是客户端)每隔一定时间向对端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳,故被称为心跳指令。

TCP协议不是自带KeepAlive的吗?

那么问题就随之而来了:为什么需要在应用层做心跳,难道 TCP 不是个可靠连接吗?我们不能够依赖 TCP 做断线检测吗?比如使用 TCP 的 KeepAlive 机制来实现。应用层心跳是目前的最佳实践吗?怎么样的心跳才是最佳实践。

很多做移动端IM的同行,以前确实没有仔细考虑过这些问题,潜意识里想当然的认为这仅仅只是个简单的心跳而已啊。好吧,事实并非这么简单,请继续往下看。

IM中保持有效长连接的重要性

对于客户端而言,使用 TCP 长连接来实现业务的最大驱动力在于:在当前连接可用的情况下,每一次请求都只是简单的数据发送和接受,免去了 DNS 解析,连接建立等时间,大大加快了请求的速度,同时也有利于接受服务器的实时消息。但前提是连接可用。

如果连接无法很好地保持,每次请求就会变成撞大运:运气好,通过长连接发送请求并收到反馈。运气差,当前连接已失效,请求迟迟没有收到反馈直到超时,又需要一次连接建立的过程,其效率甚至还不如 HTTP。而连接保持的前提必然是检测连接的可用性,并在连接不可用时主动放弃当前连接并建立新的连接。

基于这个前提,必须要有一种机制用于检测连接可用性。同时移动网络的特殊性也要求客户端需要在空余时间发送一定的信令,避免连接被回收。详见微信和运营商的撕B(另一篇针对微信的信令风暴技术研究文章请见:《微信对网络影响的技术试验及分析》)。

而对于服务器而言,能够及时获悉连接可用性也非常重要:一方面服务器需要及时清理无效连接以减轻负载,另一方面也是业务的需求,如游戏副本中服务器需要及时处理玩家掉线带来的问题。

TCP的KeepAlive无法替代应用层心跳保活机制的原因

上面说了保持连接的重要性,那么现在回到具体实现上。为什么我们需要使用应用层心跳来做检测,而不是直接使用 TCP 的特性呢?

我们知道 TCP 是一个基于连接的协议,其连接状态是由一个状态机进行维护,连接完毕后,双方都会处于 established 状态,这之后的状态并不会主动进行变化。这意味着如果上层不进行任何调用,一直使 TCP 连接空闲,那么这个连接虽然没有任何数据,但仍是保持连接状态,一天、一星期、甚至一个月,即使在这期间中间路由崩溃重启无数次。举个现实中经常遇到的栗子:当我们 ssh 到自己的 VPS 上,然后不小心踢掉网线,此时的网络变化并不会被 TCP 检测出,当我们重新插回网线,仍旧可以正常使用 ssh,同时此时并没有发生任何 TCP 的重连。

有人会说 TCP 不是有 KeepAlive 机制么,通过这个机制来实现不就可以了吗?但是事实上,TCP KeepAlive 的机制其实并不适用于此。Keep Alive 机制开启后,TCP 层将在定时时间到后发送相应的 KeepAlive 探针以确定连接可用性。一般时间为 7200 s(详情请参见《TCP/IP详解》中第23章),失败后重试 10 次,每次超时时间 75 s。显然默认值无法满足我们的需求,而修改过设置后就可以满足了吗?答案仍旧是否定的。

因为 TCP KeepAlive 是用于检测连接的死活,而心跳机制则附带一个额外的功能:检测通讯双方的存活状态。两者听起来似乎是一个意思,但实际上却大相径庭。

考虑一种情况,某台服务器因为某些原因导致负载超高,CPU 100%,无法响应任何业务请求,但是使用 TCP 探针则仍旧能够确定连接状态,这就是典型的连接活着但业务提供方已死的状态,对客户端而言,这时的最好选择就是断线后重新连接其他服务器,而不是一直认为当前服务器是可用状态,一直向当前服务器发送些必然会失败的请求。

从上面我们可以知道,KeepAlive 并不适用于检测双方存活的场景,这种场景还得依赖于应用层的心跳。应用层心跳有着更大的灵活性,可以控制检测时机,间隔和处理流程,甚至可以在心跳包上附带额外信息。从这个角度而言,应用层的心跳的确是最佳实践。

心跳保活机制的实现方案参考

从上面我们可以得出结论,目前而言,应用层心跳的确是检测连接有效性,双方是否存活的最佳实践,那么剩下的问题就是怎么实现。

最简单粗暴做法当然是定时心跳,如每隔 30 秒心跳一次,15 秒内没有收到心跳回包则认为当前连接已失效,断开连接并进行重连。这种做法最直接,实现也简单。唯一的问题是比较耗电和耗流量。以一个协议包 5 个字节计算,一天收发 2880 个心跳包,一个月就是 5 2 2880 * 30 = 0.8 M 的流量,如果手机上多装几个 IM 软件,每个月光心跳就好几兆流量没了,更不用说频繁的心跳带来的电量损耗。

既然频繁心跳会带来耗电和耗流量的弊端,改进的方向自然是减少心跳频率,但也不能过于影响连接检测的实时性。基于这个需求,一般可以将心跳间隔根据程序状态进行调整,当程序在后台时(这里主要考虑安卓),尽量拉长心跳间隔,5 分钟、甚至 10 分钟都可以。

而当 App 在前台时则按照原来规则操作。连接可靠性的判断也可以放宽,避免一次心跳超时就认为连接无效的情况,使用错误积累,只在心跳超时 n 次后才判定当前连接不可用。当然还有一些小 trick 比如从收到的最后一个指令包进行心跳包周期计时而不是固定时间,这样也能够一定程度减少心跳次数。

Online聊天卡顿崩溃原因和聊天数据源的优化

发表于 2020-07-20 | 分类于 SAMIM

Online聊天卡顿崩溃原因和聊天数据源的优化

测试反馈的问题有一些是界面卡顿,测试的问题不易重现和追查困难。

怎么判断主线程是不是发生了卡顿?

一般来说,用户感受得到的卡顿大概有三个特征:

  1. FPS 降低
  2. CPU 占用率很高
  3. 主线程 Runloop 执行了很久

我们先思考一下,界面卡顿是由哪些原因导致的?

阅读全文 »

Online优化记录及近期需要优化点

发表于 2020-07-19 | 分类于 SAMIM

Online近期优化记录及还需优化点

Online近期添加的新功能

  1. 会员中心的钻石会员和VIP会员功能。
  2. 聊天中发送iCloud文件功能。
  3. 类似QQ侧滑菜单和单聊和群聊中消息列表侧边栏功能。

Online近期优化记录

  1. 聊天查看大图时黑屏问题修复。
  2. 替换navigationBar隐藏的方法。
  3. 修改界面返回时偶尔卡住的问题。
  4. 音频通话开始后显示视频通话界面才有的翻转摄像头按钮问题修改,个人视频通话接通后自己的默认视图改为小视图,对方的视图默认是大视图。
  5. 杀死程序时发送的消息添加容错处理。
  6. 保存资料后消息列表小红点消失问题修改。
  7. 朋友圈发表评论删除消息等去掉文字提示和网络加载框优化体验。
  8. 朋友圈加入文字链接点击(网址和电话号码)功能,和长按朋友圈文字复制功能。
  9. 进入后台保活策略修改(改为播放无声音乐方式),进入后台断开socket改为定时器发送socket心跳,保证用户的在线状态。
  10. 朋友圈显示字体显示优化,刷新列表显示体验优化。
  11. 加载提示框加载时屏幕不可点击体验优化,网络请求超时时间统一设置为30秒。
  12. Online官方公众号聊天页面的头像显示修改为默认app图标。
  13. 聊天中的数据源由不安全的数组改为安全数组。
  14. 图片发送的进度显示优化。

准备优化点

  1. 用户登录过后,过段时间又重新打开app时直接进入到主界面体验优化。现在的逻辑是先走登录接口,拿到后台返回的数据后直接存储显示。这样的导致的一个体验问题是,当用户网络不好时,重新打开app会显示启动页,上面显示登录接口的加载框。直到登录接口返回数据,最多30秒的时间不能进入到app。
    优化思路,把现在临时的个人数据存储改为文件数据存储,重新登录后先拿到存储的数据进行展示,再异步请求更新数据,用户重新打开app后无缝进入app主界面优化用户体验。

鲁东大学毕业调查

发表于 2020-07-19 | 分类于 杂项

NAT(Network Address Translation)

发表于 2020-07-18 | 分类于 计算机网络

NAT(Network Address Translation)

NAT(Network Address Translation,网络地址转换)是1994年提出的。当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。

1.NAT功能

NAT不仅能解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。
1.宽带分享:这是 NAT 主机的最大功能。
2.安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC 。

2. NAT实现方式

NAT的实现方式有三种,即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。
静态 转换是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。
动态转换是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。
端口多路复用( Port address Translation,PAT)是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。因此,目前网络中应用最多的就是端口多路复用方式。

初识OpenGL ES

发表于 2020-07-07 | 分类于 OpenGL

初识OpenGL ES

OpenGL是用于可视化的二维和三维数据。它是一个多用途开放标准图形库,支持2D和3D数字内容创建,机械和建筑设计,虚拟原型,飞行模拟,视频游戏等应用。您可以使用OpenGL配置3D图形管道并提交数据。顶点被变换和点亮,组合成原始图像,并进行光栅化以创建2D图像。OpenGL旨在将函数调用转换为可发送到底层图形硬件的图形命令。因为这个底层硬件专门用于处理图形命令,因此OpenGL绘图通常非常快。
用于嵌入式系统的OpenGL(OpenGL ES)是OpenGL的简化版本,可以消除冗余功能,从而提供更容易学习和易于在移动图形硬件中实现的库。
OpenGL ES允许应用程序利用底层图形处理器的功能。iOS设备上的GPU可以执行复杂的2D和3D绘图,以及最终图像中每个像素的复杂阴影计算。您应该使用OpenGL ES,如果您的应用程序的设计要求要求最直接和全面的访问可能对GPU硬件

在iOS中构建OpenGL ES应用程序需要几个注意事项,其中一些是OpenGL ES编程的通用,其中一些特定于iOS。

  • 1.确定哪个版本的OpenGL ES具有适合您应用程序的功能集,并创建一个OpenGL ES上下文。
  • 2.在运行时验证设备是否支持您要使用的OpenGL ES功能。
  • 3.选择在哪里渲染您的OpenGL ES内容。
  • 4.确保您的应用程序在iOS中正常运行。
  • 5.实现您的渲染引擎。
  • 6.使用Xcode和Instruments调试您的OpenGL ES应用程序,并调整它以获得最佳性能。

选择哪些OpenGL ES版本支持

决定您的应用程序是否应支持OpenGL ES 3.0,OpenGL ES 2.0,OpenGL ES 1.1或多个版本。
OpenGL ES 3.0是iOS 7中的新功能。它增加了许多新功能,可以实现更高性能,通用GPU计算技术,以及以前只能在桌面级硬件和游戏机上使用更复杂的视觉效果。
OpenGL ES 2.0是iOS设备的基准配置文件,具有基于可编程着色器的可配置图形流水线。
OpenGL ES 1.1仅提供基本的固定功能图形管道,主要用于向后兼容的iOS中。

配置OpenGL ES上下文

EAGL是iOS实现的OpenGL ES渲染上下文

在您的应用程序可以调用任何OpenGL ES函数之前,它必须初始化一个
EAGLContext对象。EAGLContext类还提供用于OpenGL ES的内容与核心动画结合的方法。

每个上下文定位一个特定版本的OpenGL ES

一个EAGLContext对象只支持一个版本的OpenGL ES。例如,为OpenGL ES 1.1编写的代码与OpenGL ES 2.0或3.0上下文不兼容。使用核心OpenGL ES 2.0功能的代码与OpenGL ES 3.0上下文兼容,为OpenGL ES 2.0扩展设计的代码通常可以在OpenGL ES 3.0上下文中进行微小更改。许多新的OpenGL ES 3.0功能和增加的硬件功能需要OpenGL ES 3.0上下文。
您的应用程序决定时,它支持哪种OpenGL ES的版本创建和初始化的EAGLContext对象。如果设备不支持所需版本的OpenGL ES,则该initWithAPI返回nil。您的应用程序必须进行测试,以确保在使用之前成功初始化上下文。
为了支持OpenGL ES的多个版本作为应用程序中的渲染选项,您应该首先尝试初始化要定位的最新版本的渲染上下文。如果返回的对象是nil,则初始化旧版本的上下文。

1
2
3
4
5
6
7
- (EAGLContext *)createBestEAGLContext {
EAGLContext * context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
if(context == nil){
context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
}
return context;
}

绘制OpenGL ES和GLKit

GLKit框架提供视图和视图控制器类,可以消除绘图和动画化OpenGL ES内容所需的设置和维护代码。本GLKView类管理OpenGL ES的基础设施,为您的绘制代码提供一个场所,而GLKViewController类提供了在GLKit视图的OpenGL ES内容的流畅的动画渲染循环。这些类扩展了用于绘制视图内容和管理视图呈现的标准UIKit设计模式。因此,您可以将重点放在OpenGL ES渲染代码上,使您的应用程序快速启动并运行。GLKit框架还提供了其他功能来简化OpenGL ES 2.0和3.0开发。

使用GLKit视图渲染OpenGL ES内容

点击下载 OpenGL+ES应用开发实践指南:iOS卷 源码

凡凡添加好友流程

发表于 2020-06-15 | 更新于 2020-06-17 | 分类于 iOS

1.进入通讯录-添加朋友界面,输入手机号搜索用户信息。
2.搜索到调用接口发送添加好友信息。

20200616
凡凡
1.消息下滑到顶部时自动拉取上一页信息显示添加。
2.时间戳显示添加,全局配置时间戳显示时间间隔。(删除和插入消息的时间戳显示进行中)
3.选择联系人界面添加。
4.添加创建群组接口,群管理类封装创建群接口。(后台暂未返回群ID)
5.添加查询用户群列表接口(后台返回结果暂时是空)

20200617
凡凡
1.发送消息插入时间戳显示逻辑优化。
2.发送消息生成消息ID的唯一标识符方法修改。
3.发送图片消息的构造方法修改,用消息ID+文件名构造消息一一对应的缓存文件,方便消息的缓存管理。
4.压缩图片获取缩略图的资源文件管理方法修改。
5.音频和视频消息构造和缓存处理方法修改,用消息ID+文件名构造消息一一对应的缓存文件(进行中)
Online
1.iOS13.5通知收不到处理,通知设置更新。

filePath = [SIMFileLocationHelper filepathForAudio:audioObject.path];

有感并困惑

发表于 2020-05-19 | 分类于 生活

1.人怎样虐待动物,就会怎样虐待人。并不见得哪个民族是多么恶,而是集体作恶和作恶的“机遇”条件塑造的。并不见得某泱泱大国就。。。只是在某个时间某个条件下释放了人性的恶。

2.万事万物的源头究竟是什么呢?意识是什么呢?
我相信人是精心设计出来的,地球上动植物的基因都是设计好的。

npm更新模块并同步到package.json中

发表于 2020-04-25 | 分类于 NodeJS

npm更新模块并同步到package.json中

使用原始npm
1.查看需要更新的版本

outdated```
1
2
3
4
5
该命令会列出所有需要更新的项目

2.修改package.json中需要更新的包对应的版本号

```npm update

由于npm update只能按照package.json中指定的版本号进行更新,太繁琐复杂,接下来使用插件更新

使用

1
2
3
1.安装

```npm install -g npm-check-updates

2.查看需要更新的版本

1
2
3
可以简写为ncu,该命令会列出需要更新的包。

3.更新

ncu -a

1
2
3
4
5
6
7
8

更新包的同时更新package.json文件


<!-- more -->


-------

zikong@zikongdeiMac kongdezhi % npm install -g npm-check-updates

/usr/local/bin/ncu -> /usr/local/lib/node_modules/npm-check-updates/bin/ncu
/usr/local/bin/npm-check-updates -> /usr/local/lib/node_modules/npm-check-updates/bin/npm-check-updates

  • npm-check-updates@4.1.2
    added 235 packages from 91 contributors in 36.495s
    zikong@zikongdeiMac kongdezhi % npm-check-updates

Checking /Users/zikong/Documents/Myblog/kongdezhi/package.json
[====================] 30/30 100%

gulp-imagemin ^6.0.0 → ^7.1.0
hexo ^3.9.0 → ^4.2.0
hexo-blog-encrypt ^2.2.7 → ^3.0.12
hexo-deployer-git ^1.0.0 → ^2.1.0
hexo-generator-archive ^0.1.5 → ^1.0.0
hexo-generator-category ^0.1.3 → ^1.0.0
hexo-generator-index ^0.2.1 → ^1.0.0
hexo-generator-searchdb ^1.0.8 → ^1.3.0
hexo-generator-sitemap ^1.2.0 → ^2.0.0
hexo-generator-tag ^0.2.0 → ^1.0.0
hexo-renderer-ejs ^0.3.1 → ^1.0.0
hexo-renderer-marked ^1.0.1 → ^2.0.0
hexo-renderer-stylus ^0.3.3 → ^1.1.0
hexo-server ^0.3.3 → ^1.0.0
leancloud-storage ^3.15.0 → ^4.5.3
valine ^1.3.9 → ^1.4.9
@babel/core ^7.5.5 → ^7.9.0

Run ncu -u to upgrade package.json
zikong@zikongdeiMac kongdezhi % ncu -u
Upgrading /Users/zikong/Documents/Myblog/kongdezhi/package.json
[====================] 30/30 100%

gulp-imagemin ^6.0.0 → ^7.1.0
hexo ^3.9.0 → ^4.2.0
hexo-blog-encrypt ^2.2.7 → ^3.0.12
hexo-deployer-git ^1.0.0 → ^2.1.0
hexo-generator-archive ^0.1.5 → ^1.0.0
hexo-generator-category ^0.1.3 → ^1.0.0
hexo-generator-index ^0.2.1 → ^1.0.0
hexo-generator-searchdb ^1.0.8 → ^1.3.0
hexo-generator-sitemap ^1.2.0 → ^2.0.0
hexo-generator-tag ^0.2.0 → ^1.0.0
hexo-renderer-ejs ^0.3.1 → ^1.0.0
hexo-renderer-marked ^1.0.1 → ^2.0.0
hexo-renderer-stylus ^0.3.3 → ^1.1.0
hexo-server ^0.3.3 → ^1.0.0
leancloud-storage ^3.15.0 → ^4.5.3
valine ^1.3.9 → ^1.4.9
@babel/core ^7.5.5 → ^7.9.0

Run npm install to install new versions.

zikong@zikongdeiMac kongdezhi % cnpm install
⠹ [9/30] Installing hexo-generator-index@^1.0.0[hexo-asset-image@https://github.com/CodeFalling/hexo-asset-image] install hexo-asset-image from git git+https://github.com/CodeFalling/hexo-asset-image.git, may be very slow, please keep patience
⠦ [17/30] Installing utils-merge@1.0.1[npminstall:runscript] hexo-blog-encrypt@3.0.12 › hexo-fs@1.0.2 › chokidar@2.1.8 › fsevents@^1.2.7 found binding.gyp file, auto run “node-gyp rebuild”, root: “/Users/zikong/Documents/Myblog/kongdezhi/node_modules/_fsevents@1.2.12@fsevents”
⠴ [27/30] Installing @types/node@* SOLINK_MODULE(target) Release/.node
⠧ [28/30] Installing safe-buffer@~5.2.0 CXX(target) Release/obj.target/fse/fsevents.o
⠏ [28/30] Installing delayed-stream@~1.0.0 SOLINK_MODULE(target) Release/fse.node
✔ Installed 30 packages
✔ Linked 722 latest versions
[1/5] scripts.postinstall hexo-renderer-ejs@1.0.0 › ejs@^2.6.1 run “node ./postinstall.js”, root: “/Users/zikong/Documents/Myblog/kongdezhi/node_modules/_ejs@2.7.4@ejs”
Thank you for installing EJS: built with the Jake JavaScript build tool (https://jakejs.com/)

[1/5] scripts.postinstall hexo-renderer-ejs@1.0.0 › ejs@^2.6.1 finished in 124ms
[2/5] scripts.postinstall gulp-imagemin@7.1.0 › imagemin-mozjpeg@8.0.0 › mozjpeg@^6.0.0 run “node lib/install.js”, root: “/Users/zikong/Documents/Myblog/kongdezhi/node_modules/_mozjpeg@6.0.1@mozjpeg”
✔ mozjpeg pre-build test passed successfully
[2/5] scripts.postinstall gulp-imagemin@7.1.0 › imagemin-mozjpeg@8.0.0 › mozjpeg@^6.0.0 finished in 2s
[3/5] scripts.postinstall gulp-imagemin@7.1.0 › imagemin-gifsicle@7.0.0 › gifsicle@^5.0.0 run “node lib/install.js”, root: “/Users/zikong/Documents/Myblog/kongdezhi/node_modules/_gifsicle@5.0.0@gifsicle”
✔ gifsicle pre-build test passed successfully
[3/5] scripts.postinstall gulp-imagemin@7.1.0 › imagemin-gifsicle@7.0.0 › gifsicle@^5.0.0 finished in 1s
[4/5] scripts.postinstall gulp-imagemin@7.1.0 › imagemin-optipng@7.1.0 › optipng-bin@^6.0.0 run “node lib/install.js”, root: “/Users/zikong/Documents/Myblog/kongdezhi/node_modules/_optipng-bin@6.0.0@optipng-bin”
✔ optipng pre-build test passed successfully
[4/5] scripts.postinstall gulp-imagemin@7.1.0 › imagemin-optipng@7.1.0 › optipng-bin@^6.0.0 finished in 2s
[5/5] scripts.postinstall babel-preset-env@1.7.0 › babel-plugin-check-es2015-constants@6.22.0 › babel-runtime@6.26.0 › core-js@^2.4.0 run “node -e \”try{require(‘./postinstall’)}catch(e){}\””, root: “/Users/zikong/Documents/Myblog/kongdezhi/node_modules/_core-js@2.6.11@core-js”
Thank you for using core-js ( https://github.com/zloirock/core-js ) for polyfilling JavaScript standard library!

The project needs your help! Please consider supporting of core-js on Open Collective or Patreon:

https://opencollective.com/core-js
https://www.patreon.com/zloirock

Also, the author of core-js ( https://github.com/zloirock ) is looking for a good job -)

[5/5] scripts.postinstall babel-preset-env@1.7.0 › babel-plugin-check-es2015-constants@6.22.0 › babel-runtime@6.26.0 › core-js@^2.4.0 finished in 58ms
✔ Run 5 scripts
deprecate hexo-blog-encrypt@3.0.12 › hexo-fs@1.0.2 › chokidar@^2.0.4 Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
deprecate hexo-blog-encrypt@3.0.12 › hexo-fs@1.0.2 › chokidar@2.1.8 › fsevents@^1.2.7 fsevents 1 will break on node v14+. Upgrade to fsevents 2 with massive improvements.
deprecate babel-preset-env@1.7.0 › babel-plugin-check-es2015-constants@6.22.0 › babel-runtime@6.26.0 › core-js@^2.4.0 core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
Recently updated (since 2020-04-18): 12 packages (detail see file /Users/zikong/Documents/Myblog/kongdezhi/node_modules/.recently_updates.txt)
Today:
→ babel-preset-env@1.7.0 › browserslist@3.2.8 › electron-to-chromium@^1.3.47(1.3.418) (12:02:35)
✔ All packages installed (874 packages installed from npm registry, 1 packages installed from git, used 27s(network 22s), speed 746.06kB/s, json 740(1.46MB), tarball 14.46MB)

`

零碎代码记录

发表于 2020-04-25 | 分类于 iOS

// [socket on:@”chat” callback:^(NSArray dataArray, SocketAckEmitter ackEmitter) {
// //NSLog(@”chat dataArray:%@”,dataArray);
// if (dataArray.count > 0) {
// NSString messageStr = dataArray.firstObject;
// NSString
desDeStr = [messageStr desDecryptWithKey:deskey];
// if ([NSString isBlankWithStr:desDeStr]) {
// NSLog(@”数据解密失败”);
// return ;
// }
// NSLog(@”desDeStr:%@”,desDeStr);
// NSDictionary messageDict = [self dictionaryWithJsonString:desDeStr];
//
// NSLog(@”messageDict:%@”,messageDict);
// NSString
msgId = messageDict[@”msgId”];
// // NSLog(@”ackEmitter.expected:%d”,ackEmitter.expected);
// #pragma mark –19年11-19修改
// // NSDictionary dic = @{@”fromId”:[NSString acquireUserId],@”msgId”:msgId,@”msgBody”:dataArray.firstObject};
// NSDictionary
dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSString acquireUserId],@”fromId”,msgId,@”msgId”,messageDict,@”msgBody”,nil];
// // [ackEmitter with:@[msgId]];
// [ackEmitter with:@[[JSON stringWithObject:dic]]];
// [weakSelf receiveSocketMessageWith:@[messageDict]];
//
//// NSDictionary messageDict = dataArray.firstObject;
//// NSString
msgId = messageDict[@”msgId”];
////// NSLog(@”ackEmitter.expected:%d”,ackEmitter.expected);
////#pragma mark –19年11-19修改
////// NSDictionary dic = @{@”fromId”:[NSString acquireUserId],@”msgId”:msgId,@”msgBody”:dataArray.firstObject};
//// NSDictionary
dic = [NSDictionary dictionaryWithObjectsAndKeys:[NSString acquireUserId],@”fromId”,msgId,@”msgId”,dataArray.firstObject,@”msgBody”,nil];
////// [ackEmitter with:@[msgId]];
//// [ackEmitter with:@[[JSON stringWithObject:dic]]];
//// [weakSelf receiveSocketMessageWith:dataArray];
// }
// }];

123
ZacharyIcoderKong

ZacharyIcoderKong

一切有为法,如梦幻泡影,如露亦如电,应作如是观。
25 日志
14 分类
22 标签
GitHub E-Mail Weibo Google Twitter FB Page StackOverflow YouTube Instagram Skype
友情链接
  • 我的网站
  • 我的WordPress博客
  • 阿里云代码托管
  • coding代码托管
  • 码云代码托管
© 2020 孔思哲
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v7.1.1
|
0%