推送、套接字 Socket

1.推送

iOS 中的通知包括本地推送通知和远程推送通知,两者在 iOS 系统中都可以通过弹出横幅的形式来提醒用户,点击横幅会打开应用。在 iOS 10及之后版本的系统中,还支持通知扩展功能(UNNotificationServiceExtension、UNNotificationContentExtension)。

相关链接:
https://juejin.cn/post/6844903695784607751
https://juejin.cn/post/6844903426963275784

1.本地推送通知

本地推送通知是由本地应用触发的,是基于时间的通知形式,一般用于闹钟定时、待办事项等提醒功能。发送本地推送通知的大体步骤如下:
(1)注册本地通知;
(2)创建本地通知相关变量,并初始化;
(3)设置处理通知的时间 fireDate;
(4)设置通知的内容:通知标题、通知声音、图标数字等;
(5)设置通知传递的参数 userInfo,该字典内容可自定义(可选);
(6)添加这个本地通知到 UNUserNotificationCenter。

2.远程推送通知

远程推送通知是通过苹果的 APNsApple Push Notification service)发送到app,而APNs必须先知道用户设备的令牌(device token)。在启动时,appAPNs通信并接收device token,然后将其转发到App ServerApp Server将该令牌和要发送的通知消息发送至APNs
PS:苹果官网APNs概述

  • 远程推送通知的传递过程涉及几个关键组件

App Server
Apple 推送通知服务(APNs)
用户的设备(iPhone、iPad、iTouch、Mac 等)
相应的 app

苹果官方提供的远程推送通知的传递示意图
各关键组件之间的交互细节
  • 开发远程推送功能

一般远程推送通知的实现可以通过第三方比如极光推送、百度推送、友盟推送或者也可以公司自己后台开发推送相关服务功能进行 App 远程推送。开发根据相关文档和 SDK 进行配置开发即可。

极光推送:https://www.jiguang.cn/push
百度推送:https://push.baidu.com/
友盟推送:https://www.umeng.com/push
公司自己后台开发推送服务器:比如 bbx App

3.iOS 通知扩展

iOS 10及之后的推送通知具有扩展功能,包括两个方面:

  • 通知服务扩展(UNNotificationServiceExtension),是在收到通知后且展示通知前允许开发者做一些事情,比如添加附件、加载网络请求等。点击查看官网文档
  • 通知内容扩展(UNNotificationContentExtension),是在展示通知时展示一个自定义的用户界面。点击查看官网文档

2.套接字 Socket

1.什么是 Socket ?

概念:Socket 是对 TCP/IP 或 UDP/IP 的封装,处于网络层中的第五层,是一个抽象层。Socket 是应用层与 TCP/IP 协议族通信的中间抽象层,它是一组接口。

说明:

1.进行 socket 需要一个必要元素: 协议类型是 UDP 或者是 TCP、源主机地址、源主机地址进程的端口、目标主机地址、目标主机进程的端口。

2.它本身不是一个协议而是基于 TCP/IP 封装了 TCP/UDP 类型对上层提供了一套基于 c 的 api 接口。

3.socket 主要分为两类,当使用的是字节流数据类型,当前的 socket 就是一个 TCP 协议 Socket;当使用用户包,当前的 socket 就是一个 UDP 协议 Socket。

套接字 Socket 的类型
Socket 常用类
Socket中处于应用层与传输层之间,在设计模中 Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

2.Socket 的作用?

Socket 是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。Socket 把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

3.Socket 连接过程

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听、客户端请求、连接确认。Socket 可以支持不同的传输层协议(TCP/UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接,UDP 同理。

1.服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

2.客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3.连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

iOS 用原生代码写一个简单的 socket 连接:https://juejin.cn/post/6844903940459331598

Socket 连接过程
Socket 连接过程
Socket 通讯的过程
Socket 怎么用

4.Socket 传输特点

1.传输数据为字节级,传输数据可自定义,数据量小(对于手机应用讲:费用低)
2.传输数据时间短,性能高
3.适合于客户端和服务器端之间信息实时交互
4.可以加密,数据安全性强

正因为上面这些优势,常被用来做即时通讯重要媒介,本图就是通过 socket 在客户端和终端做的来回通讯

5.Socket 和 http 的区别和应用场景

  • Socket 连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉。
  • Socket 适用场景:网络游戏,银行持续交互,直播,在线视屏等。
  • http 连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断开等待下次连接。
  • http 适用场景:公司 OA 服务,互联网服务,电商,办公,网站等。
Socket 编程
环信的实现原理:基于 Socket

https://www.jianshu.com/p/168aa3a39996

6.Socket 相关知识点储备

6.1长连接

客户端和服务器一直连着,当有数据更新的时候,服务器会直接发给客户端,不需要客户端主动请求。(client 需要监听流的输入)

ps:在这过程中为了保证服务端和客户端一直是连接状态,客户端会定时不间断的发送心跳数据到服务器,表明还连接着,不然长时间没有数据更新,会断开连接,这样一直有心跳数据的时候,就会保证了连接没有中断。至于心跳数据的内容,就是前端后端共同商量的,和请求的数据是单独的。(通常采用 nstimer)

补充 - http请求:每次更新数据都要向对应的端口发送一次请求,之后返回数据之后关闭连接。

  • 长连接与短连接的区别

1.所谓长连接:指在一个 TCP 连接上可以连续发送多个数据包,在 TCP 连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接(心跳包),一般需要自己做在线维持。 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

2.短连接:指通信双方有数据交互时就建立一个 TCP 连接,数据发送完成后,则断开此 TCP 连接。比如 Http 的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。

3.通常的短连接操作步骤是:连接→数据传输→关闭连接;而长连接通常就是:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接。

  • 什么时候用长连接,短连接?

长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。每个 TCP 连接都需要三步握手,这需要时间,如果每个操作都是先连接再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就 OK 了,不用建立 TCP 连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成 Socket 错误,而且频繁的 Socket 创建也是对资源的浪费。

6.2 心跳包(心跳机制)

心跳包就是在客户端和服务端间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳所以叫做心跳包。

说明:

网络中的接收和发送数据都是使用 Socket 进行实现。但是如果此套接字已经断开(比如一方断网了),那发送数据和接收数据的时候就一定会有问题。可是如何判断这个套接字是否还可以使用呢?这个就需要在系统中创建心跳机制。其实 TCP 中已经为我们实现了一个叫做心跳的机制。如果你设置了心跳,那 TCP 就会在一定的时间(比如你设置的是3秒钟)内发送你设置的次数的心跳(比如说2次),并且此信息不会影响你自己定义的协议。也可以自己定义,所谓“心跳”就是定时发送一个自定义的结构体(心跳包或心跳帧),让对方知道自己“在线”,以确保链接的有效性。

相关链接:https://blog.csdn.net/a787188834/article/details/60469876?locationNum=6&fps=1

心跳机制实现流程
  • iOS 和服务端保持 Socket 长连接一般多少秒发送下心跳检测?

心跳检测一般是检测一些极端情况,例如断网、断电、手机关闭网络等导致的网络断开。心跳间隔主要根据业务需求设置,如果业务需要实时监测到,比如点对点的聊天,心跳间隔就小一些,比如5秒甚至更小。如果业务不需要很及时检测到,例如一些新闻的推送应用,就可以大一些,比如1分钟甚至更大。

  • TCP 传输协议中如何解决丢包问题

https://juejin.cn/post/6982434243695607821
https://blog.csdn.net/weibo1230123/article/details/82899931
https://juejin.cn/post/7126710506936598558

  • uni-app 使用 websocket - 实现心跳检测的思路

每隔一段固定的时间,向服务器端发送一个 ping 数据,如果在正常的情况下,服务器会返回一个 pong 给客户端,如果客户端通过 onMessage 事件能监听到的话,说明请求正常。这里使用了一个定时器,每隔5秒的情况下,如果是网络断开的情况下,在指定的时间内服务器端并没有返回心跳响应消息,因此服务器端断开了,因此这个时通过 onClose 事件监听到。因此在 onClose 事件内,我们可以调用 reconnect 事件进行重连操作。

6.3 Socket 连接池

Socket 连接池

6.4 tweak

tweak 实质就是 iOS 平台的动态库。iOS 平台上有两种形势的动态库,dylib 与 framework。Framework 这种开发者用的比较多,而 dylib 这种就相对比较少一点,比如 libsqlite.dylib,libz.dylib 等。而 tweak 用的正是 dylib 这种形势的动态库。

说明:

1.越狱开发中,各种破解补丁的统称为 Tweak。iOS tweak 基本上都依赖于 cydia Substrate 的动态库,Substrate 是 Cydia 作者 Jay Freeman 的作品,它的主要功能是 hook 某个 App 修改代码,比如替换其中方法的实现,Cydia 上的 tweak 都是基于 Mobile Substrate 实现的。

2.我们可以在设备的 /Library/MobileSubstrate/DynamicLibraries 目录下查看手机上存在着的所有 tweak。这个目录下除 dylib 外还存在着 plist 与 bundle 两种格式的文件,plist 文件是用来标识该 tweak 的作用范围,而 bundle 是 tweak 所用到的资源文件。

6.5 WebSocket

websocket 是一个协议,是基于 http 协议的,是建立在 TCP 连接之上的,是应用层上的一个应用层协议,和 socket 不是一个概念。它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端。

WebSocket 特点
WebSocket 和 HTTP 协议
WebSocket 与 Socket 关系

你可能感兴趣的:(推送、套接字 Socket)