SwiftTor

通过 Tor 创建 URLSession 并访问 .onion 网站。这个 Swift 包是一个使用 Tor 框架的简单 Tor 客户端。

允许 Tor 连接

要允许 Tor 连接,请在应用传输安全设置中启用任意加载。

SwiftTor 可用于 iOS 和 macOS。

macOS

如果您在 macOS 上使用 SwiftTor,请确保您激活了传入和传出连接。

文档

创建实例

let tor = SwiftTor()

检查连接

if tor.state == .connected {
    // connected
}else {
    // not connected
}

在 onion 地址上执行 http 请求

let onionAddress = "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1/fees/recommended"
let url = URL(string: onionAddress)!
let request = URLRequest(url: url)
let result = try! await tor.request(request: request)

Tor 隐藏服务

let tor = SwiftTor(hiddenServicePort: 80)
Timer.scheduledTimer(withTimeInterval: 3.7, repeats: false) { _ in
    print(tor.onionAddress ?? "No onion address")
}

SwiftUI 示例

import SwiftUI
import SwiftTor

struct ContentView: View {
    
    @StateObject var tor = SwiftTor()
    
    @State private var text = ""
    
    @State private var time = 0.0
    
    @State private var requesting = false
    
    var body: some View {
        VStack {
            Text("Time: \(time) seconds")
            Text(text)
            Text(tor.state == .connected ? "Tor Connected" : "Tor not connected")
                .foregroundColor(tor.state == .connected ? .green : .red)
            Button("Tor Request", action: request)
        }
    }
    
    func request() {
        guard tor.state == .connected else {return}
        guard self.requesting == false else {return}
        self.text = ""
        self.requesting = true
        self.time = 0.0
        Task {
            let time1 = Date().timeIntervalSince1970
            let onionAddress = "http://mempoolhqx4isw62xs7abwphsq7ldayuidyx2v2oethdhhj6mlo2r6ad.onion/api/v1/fees/recommended"
            let url = URL(string: onionAddress)!
            let request = URLRequest(url: url)
            let result = try! await tor.request(request: request)
            let time2 = Date().timeIntervalSince1970
            self.time = time2 - time1
            text = String(data: result.0, encoding: .utf8)!
            self.requesting = false
        }
    }
}