Files
Commilitia-Drop/desktop/platform/localnetwork_darwin.m
T

34 lines
1.7 KiB
Objective-C

#import <Network/Network.h>
// cdropTriggerLocalNetwork:起一个对 _commilitia-drop._tcp 的 Bonjour 浏览,触发 macOS 本地网络权限弹窗。
// WKWebView 自身不会触发该权限请求,须由宿主 App 主动发起一次本地网络访问;授权后本进程内的
// WebRTC 才能收集 host / mDNS 候选实现同内网直连(见 localnetwork_darwin.go 注释)。浏览结果本身
// 不关心——「发起访问」这一动作即触发授权。保活单个 browser(静态全局,ARC 下持有),幂等。
static nw_browser_t gCdropBrowser = nil;
void cdropTriggerLocalNetwork(void) {
if (gCdropBrowser != nil) {
return;
}
nw_browse_descriptor_t descriptor =
nw_browse_descriptor_create_bonjour_service("_commilitia-drop._tcp", NULL);
nw_parameters_t parameters = nw_parameters_create();
nw_parameters_set_include_peer_to_peer(parameters, true);
nw_browser_t browser = nw_browser_create(descriptor, parameters);
nw_browser_set_queue(browser, dispatch_get_main_queue());
nw_browser_set_browse_results_changed_handler(
browser, ^(nw_browse_result_t old_result, nw_browse_result_t new_result, bool batch_complete) {
// 不关心结果;浏览动作本身即触发权限请求。
});
nw_browser_set_state_changed_handler(
browser, ^(nw_browser_state_t state, nw_error_t error) {
// 进入 failed/cancelled 时释放,允许下次重试。
if (state == nw_browser_state_failed || state == nw_browser_state_cancelled) {
gCdropBrowser = nil;
}
});
gCdropBrowser = browser;
nw_browser_start(browser);
}