在 macOS 10.12 上绑定到套接字时出现 NSPOSIXErrorDomain

问题描述 投票:0回答:3

我正在 Swift 中使用 CocoaAsyncSocket 来绑定到 UDP 套接字并通过本地网络接收消息。

我正在初始化套接字,并尝试绑定到端口,但收到

NSPOSIXErrorDomain
错误。也许表明某种权限问题?

我的代码:

import Cocoa
import CocoaAsyncSocket

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate, GCDAsyncUdpSocketDelegate {
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        let socket = GCDAsyncUdpSocket.init(delegate: self, delegateQueue: DispatchQueue.main)
        do {
            try socket.bind(toPort: 53401)
        } catch let msg {
            NSLog("Error....\(msg)")
        }
    }
}

完整错误:

Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted" UserInfo={NSLocalizedDescription=Operation not permitted, NSLocalizedFailureReason=Error in bind() function}
swift macos sockets udp cocoaasyncsocket
3个回答
8
投票

您应该启用其网络功能

macOS Catalina 版本 10.15.3 中:


4
投票

我相信是生成的 Xcode 权利阻止了绑定。我将这些值更改为

false
,现在绑定可以工作了

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.security.app-sandbox</key>
    <false/>
    <key>com.apple.security.files.user-selected.read-only</key>
    <false/>
</dict>
</plist>

0
投票

您不应禁用应用程序沙盒。

这将至少导致您的应用程序在您尝试将其分发到 AppStoreConnect 时被拒绝。

添加到权利文件中的正确值是这两个:

<key>com.apple.security.network.client</key>
<true/>

<key>com.apple.security.network.server</key>
<true/>

您还可以使用 GUI:

  1. 前往应用程序的目标设置
  2. 转到应用程序目标设置中的“签名和功能”
  3. 根据您的需要勾选“传入网络连接(服务器)”和/或“传出网络连接(客户端)”

请注意,这只会在权利文件中创建条目,因此直接编辑它可能更容易。

© www.soinside.com 2019 - 2024. All rights reserved.