我正在使用Swift gRPC库(好奇地没有在gRPC的网站上列出,但有一个GitHub repo来构建)用于macOS的Google Assistant SDK的实现。我已经获得了我的OAuth2凭据和令牌,并且我正在尝试发出初始请求以开始对话,但是它没有这样做。
我总是收到错误Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantClientError error 1.)
和gRPC.CallError error 1.
我运行Wireshark尝试调试问题,我看到我的计算机 尝试建立连接但最终最终中止连接。我认为这可能是由于TLS问题,但我不确定是否真的是这种情况或如何解决它。
我注意到服务初始化函数有一个重载你指定证书,但我不知道放在那里(或者根本需要使用该函数)
typealias AssistantService = Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantService
typealias AssistantCall = Google_Assistant_Embedded_V1Alpha1_EmbeddedAssistantConverseCall
typealias AudioInConfig = Google_Assistant_Embedded_V1alpha1_AudioInConfig
typealias AudioOutConfig = Google_Assistant_Embedded_V1alpha1_AudioOutConfig
typealias ConverseRequest = Google_Assistant_Embedded_V1alpha1_ConverseRequest
typealias ConverseConfig = Google_Assistant_Embedded_V1alpha1_ConverseConfig
var service: AssistantService?
var currentCall: AssistantCall?
public init() {
service = AssistantService(address: Constants.ASSISTANT_API_ENDPOINT)
let token = "Bearer \(UserDefaults.standard.string(forKey: Constants.AUTH_TOKEN_KEY)!)"
service?.metadata = Metadata(["authorization" : token])
}
func initiateRequest() {
var request = ConverseRequest()
request.config = ConverseConfig()
var audioInConfig = AudioInConfig()
audioInConfig.sampleRateHertz = 16000
audioInConfig.encoding = .linear16
request.config.audioInConfig = audioInConfig
var audioOutConfig = AudioOutConfig()
audioOutConfig.sampleRateHertz = 16000
audioOutConfig.encoding = .linear16
audioOutConfig.volumePercentage = 50
request.config.audioOutConfig = audioOutConfig
do {
currentCall = try service?.converse(completion: { result in
print("Result code \(result.statusCode)")
print("Result description \(result.description)")
print("Metadata \(String(describing: result.initialMetadata))")
print("Status message \(result.statusMessage ?? "Error")")
print("Obj description \(String(describing: result))")
print("result \(result)")
})
try currentCall?.send(request) { err in
print("Error in initial request: \(err)")
}
} catch {
print("Initial error \(error)")
}
}
答案 0 :(得分:2)
我必须将找到here的roots.pem
文件添加到我的项目中,并按如下方式使用它:
let u = Bundle.main.url(forResource: "roots", withExtension: "pem")!
let certificate = try! String(contentsOf: u)
let token = "Bearer \(UserDefaults.standard.string(forKey: Constants.AUTH_TOKEN_KEY)!)"
service = AssistantService(address: Constants.ASSISTANT_API_ENDPOINT, certificates: certificate, host: nil)
service?.metadata = Metadata(["authorization" : token])
答案 1 :(得分:0)
我不知道Swift,你的Wireshark屏幕截图可能掩盖了重要信息,但我相信以下一个或两个可能是问题:
Constants.ASSISTANT_API_ENDPOINT
需要设置为“embeddedassistant.googleapis.com”。 (目前尚不清楚,但我不认为Wireshark中显示的目标地址是API端点,它应该是。)
Constants.AUTH_TOKEN_KEY
应该是您作为OAuth2舞蹈的一部分获得的身份验证令牌。请记住,它会过期(通常在一小时后),您需要获得一个新的。我不知道Swift配置是如何工作的,但在其他情况下,您不需要指定auth信息的“Bearer”部分,因为您没有专门传递标题。
答案 2 :(得分:0)
请参阅调用Google Cloud API的grpc-swift项目中的一些new examples。我已经简化了客户端创建以默认使用TLS并在库二进制文件中嵌入了默认的roots.pem。您可以看到here以及支持Google Application Default Credentials的auth library的使用情况。
答案 3 :(得分:0)
获取最新信息
pod'SwiftGRPC'
pod'SwiftProtobuf'
使用pod更新的版本,它已修复。
安装BoringSSL 10.0.6(原为10.0.5,源从https://github.com/CocoaPods/Specs.git
更改为https://github.com/cocoapods/specs.git
)
安装SwiftGRPC 0.5.1(原为0.4.3,源从https://github.com/CocoaPods/Specs.git
更改为https://github.com/cocoapods/specs.git
)
安装gRPC-Core 1.12.0(从1.11.0开始,源从https://github.com/CocoaPods/Specs.git
更改为https://github.com/cocoapods/specs.git
)
安装Realm 3.7.6(原为3.7.4,源从https://github.com/CocoaPods/Specs.git
更改为https://github.com/cocoapods/specs.git
)
安装RealmSwift 3.7.6(原为3.7.4,源从https://github.com/CocoaPods/Specs.git
更改为https://github.com/cocoapods/specs.git
)
然后我所需要的就是用我的证书创建会话/服务。
让certPath = Bundle.main.url(forResource:“ XYZ”,withExtension:“ pem”)! 让证书=尝试!字符串(contentsOf:certPath) 服务=发音者_PronounceServiceClient(地址:Constants.ServerApi.grpcBaseUrl,证书:证书)