LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > 趣味技术——用你的iPhone建立自己的实时比特币价格更新

趣味技术——用你的iPhone建立自己的实时比特币价格更新

2020-02-25 量化踢马河 来源:区块链网络

相信看到这篇文章的读者中,有不少用的恰好就是Iphone手机,只要你的手机是iPhone SE,或者iPhone 6S之后的型号,那么你都可以用自己的手机尝试建立自己的比特币价格代码。

WebView的JavascriptAPI以前支持WebSockets. 随着iOS 13和macOS Catalina的推出,Apple在其网络框架URLSession和Network中引入了该协议。

WebSocket是什么?

首先来大致了解下这个关键性的WebSocket是什么。WebSocket是一种网络传输协议,可以在单个TCP连接上进行全双工通信,它位于OSI模型的应用层。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

大多数浏览器都支持该协议,其中比较常见的有:Google chrome、Firefox、Safari、MicrosoftEdge和Opera.与HTTP不同,WebSocket提供全双工通信,虽然Comet也可以,但是它存在TCP握手和HTTP头的开销,因此,对于小消息来说效率很低。WebSocket协议刚好能够解决这些问题。通常,WebSocket用于聊天应用程序和多人游戏。

我们的目标

在本文中,我们的目标有两个:

1.如何使用我们手机客户端上的URLSession轻松的构建WebSocket;

2.如何创建一个基于SwiftUI和Combine的iOS应用程序,这个应用程序将会使用WebSockets从API接收实时的比特币价格更新。

下图为创建好后的完成形态(实际屏幕显示价格是实时更新的):

通过URLSession构建WebSockets

URLSessionWebSocketTask使得通过URLSession创建WebSocket非常容易。接下来将分五部来完成WebSocket的构建。

1.打开链接

2.以字符串或者数据的形式发送消息

3.接收包含在结果中的信息

4.断开连接 (Disconnect)

5.Ping pong

完成以上4步之后,我们设定一个Ping来验证并确保连接处于可用状态并返回pong:

使用WebSocket的SwiftUI比特币价格代码

为了能够获得加密货币的实时更新,需要生成一个API密钥,并使用该网站上的WebSocket URL.

下面的SwiftUI视图由一个图像组成,该图像包含一个带有前景色(foreground color) 的SF Symbol以及一个显示实时价格更新的文本:

import SwiftUI

import Combine

import Foundation

struct ContentView: View {

@ObservedObject var service = WebSocketService()

varbody: some View {

VStack{

Image(systemName: "bitcoinsign.circle.fill")

.font(.system(size: 150))

.foregroundColor(Color(red: 247/ 255, green: 142 / 255, blue: 26 / 255))

.padding()

Text("USD")

.font(.largeTitle)

.padding()

Text(service.priceResult)

.font(.system(size: 60))

}.onAppear {

self.service.connect()

}

}

}

PriceResult需要通过OvservableObject一栏中的WebSocketService.swift发布,具体如下:

class?WebSocketService?:?ObservableObject?{? ????private?let?urlSession?=?URLSession(configuration:?.default)????private?var?webSocketTask:?URLSessionWebSocketTask???? ????private?let?baseURL?=?URL(string:?"wss://ws.finnhub.io?token=XYZ")!??? ????let?didChange?=?PassthroughSubject<Void,?Never>()????@Published?var?price:?String?=?""??? ????private?var?cancellable:?AnyCancellable??=?nil??? ????var?priceResult:?String?=?""?{????????didSet?{????????????didChange.send()????????}????}?????init()?{????????cancellable?=?AnyCancellable($price????????????.debounce(for:?0.5,?scheduler:?DispatchQueue.main)????????????.removeDuplicates()????????????.assign(to:?\.priceResult,?on:?self))??????? ????}}

在上述代码中,我们定义了一些属性,并用init方式设置了一个订阅,你需要用自己生成的API密钥替换XYZ.

Publisher中使用的运算符很重要。Debounce用于减缓那些实时更新,removeDuplicates仅用于发送与先前值不同的那部分更新。

需要手动更改发布到SwiftUI的视图,当priceResult的属性通过Combine 订阅更新时,将会触发didChange.send().

下面是构造WebSocketService一栏中的其余部分——WebSocket URLSession的代码:

class?WebSocketService?:?ObservableObject?{?func?connect()?{??????? ????????stop()????????webSocketTask?=?urlSession.webSocketTask(with:?baseURL)????????webSocketTask?.resume()??????? ????????sendMessage()????????receiveMessage()????}?????func?stop()?{????????webSocketTask?.cancel(with:?.goingAway,?reason:?nil)????}??? ????private?func?sendMessage()????{????????let?string?=?"{\"type\":\"subscribe\",\"symbol\":\"BINANCE:BTCUSDT\"}"??????? ????????let?message?=?URLSessionWebSocketTask.Message.string(string)????????webSocketTask?.send(message)?{?error?in????????????if?let?error?=?error?{????????????????print("WebSocket?couldn’t?send?message?because:?\(error)")????????????}????????}????}??? ????private?func?receiveMessage()?{????????webSocketTask?.receive?{[weak?self]?result?in??????????? ????????????switch?result?{????????????case?.failure(let?error):????????????????print("Error?in?receiving?message:?\(error)")????????????case?.success(.string(let?str)):??????????????? ????????????????do?{????????????????????let?decoder?=?JSONDecoder()????????????????????let?result?=?try?decoder.decode(APIResponse.self,?from:?Data(str.utf8))????????????????????DispatchQueue.main.async{????????????????????????self?.price?=?"\(result.data[0].p)"????????????????????}??????????????????? ????????????????}?catch??{????????????????????print("error?is?\(error.localizedDescription)")????????????????}??????????????? ????????????????self?.receiveMessage()??????????????? ????????????default:????????????????print("default")????????????}????????}????}}

以下的结构模型用于解码API响应:

struct?APIResponse:?Codable?{????var?data:?[PriceData]????var?type?:?String??? ????private?enum?CodingKeys:?String,?CodingKey?{????????case?data,?type????}}struct?PriceData:?Codable{??? ????public?var?p:?Float??? ????private?enum?CodingKeys:?String,?CodingKey?{????????case?p????}}

当应用程序构建在watchOS模拟器上时,显示结果如下:

以上就是如何利用自己的iPhone创建比特币实时更新的方法。如果想要获取完整的源代码,可用在GitHub repository中找到。文章末尾我会附上GitHub的网址,有兴趣的可以尝试实际操作。

GitHub: https://github.com/anupamchugh/iowncode/tree/master/SwiftUIWebSockets

踢马河:RaTiO Fintech合伙人,曾任某券商自营操盘手,十余年海外对冲基金和国内大型投资机构基金经理,资深交易建模专家,币圈大咖。

请尊重原创!转载请注明出处。

—-

编译者/作者:量化踢马河

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...