首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS _nw_parameters_configure_protocol_disable直接调用

iOS _nw_parameters_configure_protocol_disable直接调用
EN

Stack Overflow用户
提问于 2020-07-22 16:22:49
回答 1查看 163关注 0票数 0

我正在尝试使用iOS Kotlin/原生公共模块中的TCP套接字。

根据Apple's documentation的说法,要打开nw_connection_t,您只需:

代码语言:javascript
复制
val connection = 
    nw_parameters_create_secure_tcp(
        NW_PARAMETERS_DISABLE_PROTOCOL,      // No TLS
        NW_PARAMETERS_DEFAULT_CONFIGURATION  // Default TCP config
    )

但是,当我在iOS应用程序中运行此模块时,我得到以下错误:

代码语言:javascript
复制
_nw_parameters_configure_protocol_disable_block_invoke _nw_parameters_configure_protocol_disable called directly, dumping backtrace:
[x86_64] libnetcore-1880.120.4
    0   libnetwork.dylib                    0x00007fff5118d1f8 __nw_create_backtrace_string + 120
    1   libnetwork.dylib                    0x00007fff5100a898 _nw_parameters_configure_protocol_disable_block_invoke + 120
    2   PhoenixShared                       0x00000001099af1b5 _70686f656e69783a70686f656e69782d736861726564_knbridge41 + 37
    3   PhoenixShared                       0x0000000109972eac kfun:fr.acinq.phoenix.io.BlockFunctionImpl16.invoke#internal + 220
    4   PhoenixShared                       0x0000000109972fbf kfun:fr.acinq.phoenix.io.BlockFunctionImpl16.$<bridge-UNNN>invoke(platform.darwin.NSObject?){}#internal + 95
    5   PhoenixShared                       0x000000010997342b _70686f656e69783a70686f656e69782d736861726564_knbridge47 + 251
    6   libnetwork.dylib                    0x00007fff5100d7b6 nw_parameters_create_secure_tcp + 342
...

苹果Network.framework的parameters.h头文件包含:

代码语言:javascript
复制
#define NW_PARAMETERS_DISABLE_PROTOCOL (_nw_parameters_configure_protocol_disable)

当然,_nw_parameters_configure_protocol_disable是直接调用...so的。

你知道我做错了什么吗?

EN

回答 1

Stack Overflow用户

发布于 2020-07-23 17:12:10

因此,事实证明,NW_PARAMETERS_DISABLE_PROTOCOLNW_PARAMETERS_DEFAULT_CONFIGURATION都不会被调用。尽管它们是块类型^(nw_protocol_options_t),但nw_parameters_create_secure_tcp函数将它们的指针地址用作特殊标记,并且从不实际调用它们。

这是一个问题,因为Kotlin/Native ObjC-interop层:

  1. NW_PARAMETERS_DISABLE_PROTOCOLNW_PARAMETERS_DEFAULT_CONFIGURATION块转换为Kotlin lambda。
  2. 包装了lambda,以便在将其作为参数传递时将其转换回ObjC块(正如我们在问题的堆栈跟踪行中看到的,编号为3和4)。

结果,这些特殊块的实际指针地址丢失,这些块被调用(它们不应该调用),并发生故障。

在Kotlin中没有办法解决这个问题,因为nw_parameters_create_secure_tcp的Kotlin版本请求lambda参数(而不是指针)。

一个非常简单的解决方法是使用我们自己的C-interop def文件创建我们自己的互操作性层:

代码语言:javascript
复制
package = fr.acinq.phoenix.io.network_framework
language = Objective-C

---

#include <Network/Network.h>

NW_RETURNS_RETAINED nw_parameters_t nw_k_parameters_create_secure_tcp(bool withTls) {
    return nw_parameters_create_secure_tcp(
        withTls ? NW_PARAMETERS_DEFAULT_CONFIGURATION : NW_PARAMETERS_DISABLE_PROTOCOL,
        NW_PARAMETERS_DEFAULT_CONFIGURATION
    );
}

这将创建一个Objective-C nw_k_parameters_create_secure_tcp函数(请注意nw_k_前缀),该函数使用正确的参数直接调用原始nw_parameters_create_secure_tcp,而不需要Kotlin块到λ到块的层,这可以从Kotlin正确调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63029901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档