问题描述
我正在尝试使我的 GRPC 请求调用正常工作。以前我使用 SwiftGRPC 并且它有效,但现在我必须使用 grpc-Swift 并且它有点停止工作。任何块 (whenComplete,whenSuccess,whenFailure) 都不会执行。我的 TLS 连接似乎有问题。这是代码,请告诉我我做错了什么:
//
// GRPCManager.swift
// Created by Maria Davidenko
//
import Foundation
import NIO
import NIOSSL
import SwiftProtobuf
import NIOHTTP1
import NIOHTTP2
import NIOHPACK
import GRPC_Swift
import NIOTransportServices
import Logging
@objc protocol GRPServiceManagerDelegate : class {
@objc optional func serviceManagerDidReturnUnitId(unitID uId: String)
@objc optional func serviceManagerDidSetActiveStatus()
@objc optional func serviceManagerDidFailToPerformOperation(message msg : String)
}
class GRPCServiceManager: NSObject {
static let shared = GRPCServiceManager()
private let address = "\(GRPC.IP):\(GRPC.PORT)"
var certificatePath :String?
var configuration : TLSConfiguration?
var sslContext : NIOSSLContext?
var handler: NIOSSLClientHandler?
var builder: ClientConnection.Builder?
//Step iv: Create an event loop group
var group = MultiThreadedEventLoopGroup(numberOfThreads: 5)
var connection :ClientConnection?
var client: Ridevision_V1_AppServiceClient?
var certificateURL:URL
let certificateContent: String
let headers: HPACKHeaders = [Shared.AUTHORIZATION_HEADER: Shared.REQUEST_TOKEN]
var callOptions: CallOptions? = nil
var delegate:GRPServiceManagerDelegate?
override init() {
callOptions = CallOptions(customMetadata: headers)
callOptions?.customMetadata.add(name: "ssl_target_name_override",value: GRPC.HOST_OVERRIDE)
callOptions?.customMetadata.add(name: "default_authority",value: GRPC.HOST_OVERRIDE)
certificateURL = Bundle.main.url(forResource: Shared.CERTIFICATE_FILE_NAME,withExtension: Shared.CERTIFICATE_EXTENSION_NAME)!
certificateContent = try! String(contentsOf: certificateURL)
certificatePath = certificateURL.absoluteString
super.init()
setUpTLS2()
}
func setUpTLS() {
//Step i: get certificate path from Bundle
certificatePath = Bundle.main.path(forResource: Shared.CERTIFICATE_FILE_NAME,ofType: Shared.CERTIFICATE_EXTENSION_NAME)
//Step ii: create TLS configuration
configuration = TLSConfiguration.forClient(applicationProtocols: ["h2"])
configuration?.trustRoots = .file(certificatePath!) //anchors the ca certificate to trust roots for TLS configuration. Not required incase of insecure communication with host
//Step iii: generate SSL context
sslContext = try? NIOSSLContext(configuration: configuration!)
handler = try? NIOSSLClientHandler(context: sslContext!,serverHostname: address)
//Step v: Create client connection builder
builder = ClientConnection.secure(group: group).withTLS(trustRoots: (configuration?.trustRoots!)!)
connection = builder?.connect(host: GRPC.IP,port: GRPC.PORT)
client = Ridevision_V1_AppServiceClient(channel: connection!,defaultCallOptions: callOptions!,interceptors: nil)
print(configuration)
}
func setUpTLS2() {
//Step i: get certificate path from Bundle
let certificatePath = Bundle.main.path(forResource: Shared.CERTIFICATE_FILE_NAME,ofType: Shared.CERTIFICATE_EXTENSION_NAME)
//Step ii: create TLS configuration
configuration = TLSConfiguration.forClient(applicationProtocols: ["h2"])
configuration?.trustRoots = .file(certificatePath!) //anchors the ca certificate to trust roots for TLS configuration. Not required incase of insecure communication with host
//Step iii: generate SSL context
guard let sslContext = try? NIOSSLContext(configuration: configuration!) else { return }
let handler = try? NIOSSLClientHandler(context: sslContext,serverHostname: address)
//Step iv: Create an event loop group
group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
//Step v: Create client connection builder
let builder: ClientConnection.Builder
builder = ClientConnection.secure(group: group).withTLS(trustRoots: (configuration?.trustRoots!)!)
//Step vi: Start the connection and create the client
connection = builder.connect(host: GRPC.IP,port: GRPC.PORT)
print("Connection Status=>:\(String(describing: connection?.eventLoop))")
//Step vii: Create client
//use appropriate service client from .grpc server to replace the xxx call : <your .grpc.swift ServiceClient> = <XXX>ServiceClient
client = Ridevision_V1_AppServiceClient(channel: connection as! GRPCChannel,defaultCallOptions: callOptions!)
//if no token or call options required,just use below commented code
//var client: <your .grpc.swiftServiceClient> = <XXX>ServiceClient(channel: connection)
//Step viii: Call specific service request
}
func getUnitId() {
var responseString = Shared.EMPTY_STRING
let tokenParam = Google_Protobuf_Empty()
let request = client?.getUnitId(tokenParam,callOptions:callOptions)
print(request?.response ?? Shared.EMPTY_STRING)
request?.response.whenFailure({ (error) in
print(error.localizedDescription)
self.delegate?.serviceManagerDidFailToPerformOperation?(message: error.localizedDescription)
})
request?.response.whenSuccess({ (result) in
responseString = result.value
#if DEBUG
print(responseString)
#endif
self.delegate?.serviceManagerDidReturnUnitId?(unitID: responseString)
})
request?.response.whenComplete({ (result) in
let unitId = try? result.get().value
print(unitId)
})
request?.response.whenCompleteBlocking(onto: dispatchQueue.main,{ (resultReponse) in
let result = try? resultReponse.get().value
print(result ?? Shared.EMPTY_STRING)
})
request?.response.whenSuccessBlocking(onto: dispatchQueue.global(),{ (result) in
print(result.value)
})
}
}
调用如下:
let grpcManager = GRPCServiceManager()
grpcManager.delegate = self
grpcManager.getUnitId()
这是阻止我们在 AppStore 中使用新应用程序的唯一原因。如果有人知道发生了什么,请帮忙!
提前致谢, 玛丽亚。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)