我正在尝试使用iOS Kotlin/原生公共模块中的TCP套接字。
根据Apple's documentation的说法,要打开nw_connection_t,您只需:
val connection =
nw_parameters_create_secure_tcp(
NW_PARAMETERS_DISABLE_PROTOCOL, // No TLS
NW_PARAMETERS_DEFAULT_CONFIGURATION // Default TCP config
)但是,当我在iOS应用程序中运行此模块时,我得到以下错误:
_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头文件包含:
#define NW_PARAMETERS_DISABLE_PROTOCOL (_nw_parameters_configure_protocol_disable)当然,_nw_parameters_configure_protocol_disable是直接调用...so的。
你知道我做错了什么吗?
发布于 2020-07-23 17:12:10
因此,事实证明,NW_PARAMETERS_DISABLE_PROTOCOL和NW_PARAMETERS_DEFAULT_CONFIGURATION都不会被调用。尽管它们是块类型^(nw_protocol_options_t),但nw_parameters_create_secure_tcp函数将它们的指针地址用作特殊标记,并且从不实际调用它们。
这是一个问题,因为Kotlin/Native ObjC-interop层:
NW_PARAMETERS_DISABLE_PROTOCOL和NW_PARAMETERS_DEFAULT_CONFIGURATION块转换为Kotlin lambda。结果,这些特殊块的实际指针地址丢失,这些块被调用(它们不应该调用),并发生故障。
在Kotlin中没有办法解决这个问题,因为nw_parameters_create_secure_tcp的Kotlin版本请求lambda参数(而不是指针)。
一个非常简单的解决方法是使用我们自己的C-interop def文件创建我们自己的互操作性层:
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正确调用。
https://stackoverflow.com/questions/63029901
复制相似问题