add macos

This commit is contained in:
2026-07-01 10:06:31 +07:00
parent 248d3a6722
commit b702287cfb
10 changed files with 148 additions and 47 deletions

View File

@@ -2,45 +2,52 @@
package winapi
/*
#cgo LDFLAGS: -framework CoreWLAN -framework CoreLocation -framework Foundation
#include <stdlib.h>
typedef struct {
char* ssid;
char* bssid;
} CWifiInfo;
void RequestLocationPermission();
CWifiInfo GetCurrentWifiInfo();
*/
import "C"
import (
"bytes"
"os/exec"
"strings"
"unsafe"
)
// GetWifiConnection đọc SSID và BSSID từ ipconfig (macOS)
func GetWifiConnection() WifiConnection {
// Find Wi-Fi interface dynamically
wifiInterface := "en0"
cmdPort := exec.Command("networksetup", "-listallhardwareports")
if outPort, err := cmdPort.Output(); err == nil {
lines := strings.Split(string(outPort), "\n")
for i := 0; i < len(lines)-1; i++ {
if strings.Contains(lines[i], "Hardware Port: Wi-Fi") {
next := strings.TrimSpace(lines[i+1])
if strings.HasPrefix(next, "Device:") {
wifiInterface = strings.TrimSpace(strings.TrimPrefix(next, "Device:"))
break
}
}
}
}
cmd := exec.Command("ipconfig", "getsummary", wifiInterface)
var out bytes.Buffer
cmd.Stdout = &out
if err := cmd.Run(); err != nil {
return WifiConnection{}
}
var conn WifiConnection
for _, line := range strings.Split(out.String(), "\n") {
trimmed := strings.TrimSpace(line)
if strings.HasPrefix(trimmed, "SSID :") {
conn.SSID = strings.TrimSpace(strings.TrimPrefix(trimmed, "SSID :"))
} else if strings.HasPrefix(trimmed, "BSSID :") {
conn.BSSID = normalizeMAC(strings.TrimSpace(strings.TrimPrefix(trimmed, "BSSID :")))
}
}
return conn
// RequestLocationAccess requests Location permission on macOS
func RequestLocationAccess() {
C.RequestLocationPermission()
}
// GetWifiConnection đọc SSID và BSSID từ CoreWLAN (macOS)
func GetWifiConnection() WifiConnection {
info := C.GetCurrentWifiInfo()
defer func() {
if info.ssid != nil {
C.free(unsafe.Pointer(info.ssid))
}
if info.bssid != nil {
C.free(unsafe.Pointer(info.bssid))
}
}()
ssid := ""
if info.ssid != nil {
ssid = C.GoString(info.ssid)
}
bssid := ""
if info.bssid != nil {
bssid = C.GoString(info.bssid)
}
return WifiConnection{
SSID: ssid,
BSSID: normalizeMAC(bssid),
}
}

View File

@@ -0,0 +1,45 @@
#import <CoreWLAN/CoreWLAN.h>
#import <CoreLocation/CoreLocation.h>
#import <Foundation/Foundation.h>
static CLLocationManager *locationManager = nil;
void RequestLocationPermission() {
dispatch_async(dispatch_get_main_queue(), ^{
if (locationManager == nil) {
locationManager = [[CLLocationManager alloc] init];
}
if (@available(macOS 10.15, *)) {
[locationManager requestWhenInUseAuthorization];
}
});
}
typedef struct {
char* ssid;
char* bssid;
} CWifiInfo;
CWifiInfo GetCurrentWifiInfo() {
CWifiInfo info;
info.ssid = NULL;
info.bssid = NULL;
@autoreleasepool {
CWWiFiClient *client = [CWWiFiClient sharedWiFiClient];
if (client != nil) {
CWInterface *interface = [client interface];
if (interface != nil) {
NSString *ssidStr = [interface ssid];
NSString *bssidStr = [interface bssid];
if (ssidStr != nil) {
info.ssid = strdup([ssidStr UTF8String]);
}
if (bssidStr != nil) {
info.bssid = strdup([bssidStr UTF8String]);
}
}
}
}
return info;
}

View File

@@ -6,3 +6,6 @@ package winapi
func GetWifiConnection() WifiConnection {
return WifiConnection{}
}
// RequestLocationAccess requests Location permission (stub for other systems)
func RequestLocationAccess() {}

View File

@@ -38,3 +38,6 @@ func GetWifiConnection() WifiConnection {
}
return conn
}
// RequestLocationAccess requests Location permission (stub for Windows)
func RequestLocationAccess() {}