34 lines
1.7 KiB
Objective-C
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);
|
|
}
|