【问题标题】:iOS _nw_parameters_configure_protocol_disable called directlyiOS _nw_parameters_configure_protocol_disable 直接调用
【发布时间】:2020-11-11 17:48:23
【问题描述】:

我正在尝试在 iOS Kotlin/Native 通用模块中使用 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
...

Apple 的 Network.framework 中的 parameters.h 标头包含:

#define NW_PARAMETERS_DISABLE_PROTOCOL (_nw_parameters_configure_protocol_disable)

...所以_nw_parameters_configure_protocol_disable 当然是直接调用的。

知道我做错了什么吗?

【问题讨论】:

    标签: ios kotlin-native network-framework


    【解决方案1】:

    所以,事实证明NW_PARAMETERS_DISABLE_PROTOCOLNW_PARAMETERS_DEFAULT_CONFIGURATION 都不应该被调用。 尽管它们是块类型^(nw_protocol_options_t)nw_parameters_create_secure_tcp 函数使用它们的指针地址作为特殊标记,并且从不实际调用它们。

    这是一个问题,因为 Kotlin/Native ObjC 互操作层:

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

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

    在 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 的 block-to-lambda-to-block 层,可以从 Kotlin 正确调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-21
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多