GRPC 块 whenComplete 未触发

问题描述

我正在尝试使我的 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 (将#修改为@)