问题标签 [grpc-swift]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
571 浏览

ios - GRPC-Swift 从客户端发送 HTTPProtocolVersion

我正在为客户端-服务器应用程序尝试 GRPC-Swift。我在客户端和服务器端都使用 GRPC-Swift 客户端是一个 iPhone 应用程序,我在 iPhone 模拟器上尝试过。

我关注了客户端流式 RPC 的链接。当我从客户端向服务器发送消息时,我在服务器的控制台中收到以下错误消息,

从服务器中

HTTPProtocolSwitcher.swift

在函数内部func channelRead(context: ChannelHandlerContext, data: NIOAny),它正在检查HTTPProtocolVersion,但它丢失了。

如何从客户端代码发送 HTTPVersion?

更新:

客户代码

0 投票
0 回答
221 浏览

ios - 当 iOS 应用程序进入后台时,gRPC 服务器停止接收请求

我想在我的 iOS 应用程序中运行一个 gRPC 服务器,而我的应用程序可能在后台运行了很长时间。App 在前台模式下可以正常工作,但在后台模式下,gRPC Server 不会响应任何 Client 连接。一旦 App 回到前台,它将再次工作。

如果我在主线程上启动服务器,一切正常。但我不想阻塞我的主线程。

任何帮助将不胜感激!

0 投票
0 回答
202 浏览

ios - gRPC-Swift 有时有 GRPCStatus - 取消

我是 gRPC 的新手并使用pod gRPC-Swiftversion 1.0.0-alpha.21。有时我的回复中有一个错误 -error.localizedDescription是“操作无法完成。(GRPC.GRPCStatus 错误 1。)”,我注意到这errorCode = 1意味着“操作被取消,通常由调用者取消。”,但我不知道为什么会这样。这是我的代码:

我会很感激任何想法。

0 投票
0 回答
313 浏览

swift - 客户端崩溃后无法重新连接到 gRPC 服务器

我做了很多研究,但找不到解决 gRPC 问题的方法:

概括; 在我的 swift gRPC 客户端应用程序崩溃后,没有 gRPC 客户端可以连接到我的 gRPC 服务器(请参阅下面的错误)

我的设置: 我有一个 Swift 前端应用程序和一个 Rust 后端。rust 后端运行一个 gRPC 服务器(tonic)https://github.com/hyperium/tonic一个 rust 客户端(也是 tonic)和一个 Swift 客户端(https://github.com/grpc/grpc-swift)可以连接至。Swift 客户端崩溃后,所有客户端都无法再连接到服务器。

rust 客户端报告: Error: Status { code: Cancelled, message: "h2 protocol error: protocol error: stream no longer needed" }

迅速的客户报告: StreamClosed(streamID: HTTP2StreamID(1), errorCode: HTTP2ErrorCode<0x8 Cancel>, location: ".../swift-nio-http2/Sources/NIOHTTP2/HTTP2StreamChannel.swift:820")

我尝试过在服务器中 设置了一个http2 keepalive,但这并没有做任何事情。我试图通过故意使 rust 客户端崩溃来重现相同的效果——但没有成功。

我什至不确定是要查看 swift-grpc 和 tonic 库还是 grpc 本身(对我来说,看起来服务器故意关闭了流)。
有谁知道我能做些什么来解决这个问题?提前致谢!

0 投票
1 回答
137 浏览

ios - 自动化将生成的 proto 文件包含到 Xcode 项目中的过程

我们的 iOS 应用程序目前使用 Google protobuffer gRPC作为我们的 API 层来在应用程序和后端之间进行通信。所以我们.proto在后端目录中有这些文件,这些文件将由 gRPC-Swift-Plugins 转换为.grpc.swift文件.pb.swift然后由应用程序使用。

这工作正常,但转换的过程非常繁琐,我们希望将整个过程自动化。

以下是我们的做法:
  1. 删除先前复制的目录,并通过 shell 脚本将所有.proto文件从后端(.proto文件由后端开发人员维护)复制到名为“Protos”的 App 目录
  2. 我们已经在Compile Sources中设置了构建规则并包含.proto文件。按照SO 上的答案中的步骤进行操作

Xcode Build Rules中当前设置的屏幕截图:在此处输入图像描述

  1. 每当我们构建项目时,都会.pb.swift生成.grpc.swift并放入“Protos”文件夹下名为“generated”的目录中。

以下是问题:

  1. 如果后端将新.proto文件添加到源目录中,我的脚本只会将文件复制到 Protos 目录中,但不会将新闻文件包含在Compile Sources列表中。
  2. 与第一个问题类似,我们需要在 Xcode 中手动设置编译源,这意味着如果新开发人员加入我们的团队,他/她也需要再次进行相同的设置。
  3. 我们有时需要在编码时参考.grpc.swift和文件。.ph.swift但是如果我们将这些文件添加到 Xcode 中并再次构建项目,Xcode 会抱怨这些生成的文件在那里(对不起,我们正在处理私有 repo,因此项目名称和文件名被替换):

多个命令产生'${user_path}/${proto_name}.pb.o':

  1. 目标“${my_project_name}”(项目“${my_project_name}”)具有 Swift 源文件的编译命令
  2. 目标“${my_project_name}”(项目“${my_project_name}”)具有 Swift 源文件的编译命令

非常感谢任何答案或意见和建议!

0 投票
1 回答
131 浏览

swift - RxSwift refreshToken 使用 retry(when:)

我为网络请求令牌刷新编写了这样的代码。

但是,我得到一个看起来像这样的日志

2021-07-19 16:24:24.208: refreshToken -> 订阅
2021-07-19 16:24:24.494: refreshToken -> isDisposed
2021-07-19 16:24:25.037: refreshToken -> 订阅
2021-07-19 16:24:25.251:refreshToken -> 事件错误(notLogin)
2021-07-19 16:24:25.251:refreshToken -> isDisposed

不知道为什么Refresh TokenisDisposed 没有ON NEXT
这个是偶尔出现的问题,但不知道是什么原因造成的它
的日志输出正常应该是这样的:

2021-07-22 10:04:45.794: refreshToken -> 订阅
2021-07-22 10:04:52.254: refreshToken -> 事件 next(())
2021-07-22 10:04:52.266: refreshToken -> 事件完成
2021-07-22 10:04:52.266: refreshToken -> isDisposed

如果您能帮助我,我将不胜感激。

0 投票
1 回答
36 浏览

javascript - React Native Native Module 循环调用直到在 iOS 上崩溃

我正在尝试在 iOS 上的 React Native 中构建一个 gRPC 客户端。

对于上下文:不直接支持 gRPC 的 React Native 必须从 Swift 调用自定义的 Native Module,它会调用 gRPC 并返回值。

gRPC 服务器是一个本地编译的 goLang 模块,它使用该http2server模块。我没有编写 gRPC 服务器,所以我无法更改它的代码。

看来 React Native 方法正在循环执行本机 gRPC 客户端调用,导致 Golang 的 http2Server 模块崩溃。

这个 gRPC 客户端调用是从按钮onPress()事件调用的,而不是从循环调用的。我尝试将 gRPC 调用包装在超时测试中,以防止调用过快。

我的 Native 模块有一个如下所示的导出函数:

​</p>

我的 React Native 像这样调用原生模块:

Xcode 输出如下所示 ​</p>

  1. 看起来 gRPC 客户端正在对 gRPC 服务器进行多次调用。你会看到 React Native 模块发射器在崩溃之前发出了大约 20 次相同的响应
  1. Golang 的 http2Server 在handlePing()通过原生 Swift 模块向 React Native 返回响应后,在方法过程中崩溃。似乎 gRPC 连接已关闭,然后再次尝试关闭,http2server 无法正常处理

这是 Xcode 控制台日志:

当我使用完全相同的 Swift 代码创建一个测试项目,但没有 React Native 前端时,我没有遇到这种崩溃。React Native 以某种方式参与了崩溃行为,可能是由于 Native Module 功能的功能?

有谁知道如何防止这种循环发生?

0 投票
1 回答
37 浏览

ios - 如何将 PATH 添加到 ClientConnection gRPC?

我正在使用 grpc 与服务器通信。我使用创建连接

但是在新版本中,连接被移到了https://testHost.com/api,<strong>如何添加 path = api 来连接服务器?

0 投票
0 回答
26 浏览

swift - 如何从包含导入的 proto 生成 Swift 文件?

假设我有一个位于 /home/me/project/first/a.proto 中的 .proto 文件。另一个 proto 文件位于 /home/me/project/second/b.proto 中。我希望能够从这些原型生成 swift 文件。b.proto 使用如下导入:

现在我尝试运行:

我收到一条错误消息,上面写着

如何正确使用导入?