Notice
Recent Posts
Recent Comments
Link
투케이2K
566. (ios/swift5) NEHotspotConfigurationManager 사용해 특정 WIFI 와이파이 다이렉트 연결 및 에러 발생 체크 분기 처리 수행 본문
IOS
566. (ios/swift5) NEHotspotConfigurationManager 사용해 특정 WIFI 와이파이 다이렉트 연결 및 에러 발생 체크 분기 처리 수행
투케이2K 2024. 11. 22. 11:03[개발 환경 설정]
개발 툴 : XCODE
개발 언어 : SWIFT5
[소스 코드]
// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------
- 언어 : Swift
- 개발 툴 : Xcode
- 사전 설명 :
>> NEHotspotConfigurationManager 는 iOS 11 이상에서 사용할 수 있으며, 사용자가 Wi-Fi 네트워크에 연결을 시도할 때 앱에서 요청을 처리할 수 있도록 도와줍니다
>> NEHotspotConfigurationManager 방법을 통해 Wi-Fi에 연결할 수 있지만, 사용자가 승인해야 하며 앱이 Wi-Fi 정보를 알지 못하도록 제한이 있습니다
- 사전 권한 설정 : info.plist
<key>NSLocationWhenInUseUsageDescription</key>
<string>앱에서 Wi-Fi 연결을 설정하려면 위치 권한이 필요합니다.</string>
- 사전 Xcode 프로젝트에서 유료 결제 개발자 계정 사용 Capabillity Hotspot Configuration 사용 설정
>> https://blog.naver.com/kkh0977/223669166907
- 사전 Xcode 프로젝트에서 Capabillity 개발 권한 추가 entitlements 속성 key , value 값 확인 방법
>> https://blog.naver.com/kkh0977/223669259799
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------
// MARK: - [SEARCH FAST] : observableSetWifiConnection : 특정 와이파이 SSID , PW 입력 다이렉트 연결 수행
// -----------------------------------------------------------------------------------------
static var WIFI_CONNECT_LOG = ""
func observableSetWifiConnection(ssid:String, pw:String, completion: @escaping (Bool)->()) {
/*
// -----------------------------------------
[observableSetWifiConnection 메소드 설명]
// -----------------------------------------
1. 특정 와이파이 SSID , PW 입력 다이렉트 연결 수행
// -----------------------------------------
2. 호출 방법 :
C_Wifi_Ap_Module().observableSetWifiConnection(ssid:"TWOK", pw:"1234"){(result) in
S_Log._F_(description: "특정 와이파이 SSID , PW 입력 다이렉트 연결 확인 수행", data: ["\(result)"])
if result == true {
// [현재 연결 된 WIFI SSID 체크 >> 소켓 통신 수행]
}
else {
S_Log._F_(description: "특정 와이파이 SSID , PW 입력 다이렉트 연결 에러 메시지", data: ["\(C_Wifi_Ap_Module.WIFI_CONNECT_LOG)"])
}
}
// -----------------------------------------
3. 필요 import :
import NetworkExtension
import SystemConfiguration.CaptiveNetwork
// -----------------------------------------
4. 필요 권한 : 위치 권한 Location
Privacy - Location Always Usage Description
Privacy - Location Always and When In Use Usage Description
// -----------------------------------------
5. MARK: xcode 프로젝트 Capabillity 사용 설정 방법 : [Hotspot Configuration]
- 사전) 유료 결제를 진행한 개발자 계정이 필요 (or 개발자 초대)
- Xcode 프로젝트 설정 >> Capabillity >> Hotspot Configuration 추가
- 프로젝트 entitlements 에서 추가한 Hotspot Configuration 권한이 정상 표시 되는 것 확인
- 설정 및 적용 참고 사이트 :
https://blog.naver.com/kkh0977/223669166907
https://blog.naver.com/kkh0977/223669259799
// -----------------------------------------
*/
// [리턴 변수 선언]
var returnData = false
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = ""
// [로직 처리 수행]
DispatchQueue.main.async {
S_Log._D_(description: "특정 와이파이 SSID , PW 입력 다이렉트 연결 수행", data: [
"SSID :: \(ssid)",
"PW :: \(pw)"
])
/*
// -----------------------------------------
[NEHotspotConfiguration 옵션 설명]
// -----------------------------------------
- Persistent configuration: Settings 에서 Wi-Fi 변경과 동일
- Join-once configuration: 일시적으로 Wi-Fi network 변경
>> joinOnce 가 true 로 설정되면 핫스팟은 앱이 포그라운드에서 실행되는 동안만 유지됩니다
>> 앱이 15초 이상 백그라운드에 머물러 있는 경우 >> 해제
장치가 절전 모드에 들어간 경우 >> 해제
앱이 충돌하거나 종료되거나 제거 된 경우 >> 해제
다른 Wi-Fi 네트워크에 연결 한 경우 >> 해제
// -----------------------------------------
지원 인증 모델 :
- 인증 없는 SSID
- password-based 인증 SSID (WEP, WPA, WPA2)
- EAP 인증 SSID
- EAP 인증 Hotspot 2.0
// -----------------------------------------
NEHotspotConfigurationManager 에러 코드 참고 사이트
>> https://developer.apple.com/documentation/networkextension/nehotspotconfigurationerror
// -----------------------------------------
*/
// [인풋 데이터 널 체크] : [비밀 번호는 null 일 수 있으니 예외]
if C_Util().stringNotNull(str: ssid) == true {
// [사전 다이렉트 연결 옵션이 있는 경우 해제]
NEHotspotConfigurationManager.shared.removeConfiguration(forSSID: "\(ssid)")
// [인풋으로 들어온 WIFI 정보로 연결 수행]
let hotspotConfig = NEHotspotConfiguration(ssid: "\(ssid)", passphrase: "\(pw)", isWEP: false)
hotspotConfig.joinOnce = true
NEHotspotConfigurationManager.shared.apply(hotspotConfig) { error in
if let errorLet = error as NSError? {
switch errorLet.code {
case NEHotspotConfigurationError.invalid.rawValue: // [구성이 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalid : 구성이 유효하지 않음"
case NEHotspotConfigurationError.invalidSSID.rawValue: // [SSID 값이 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidSSID : SSID 값이 유효하지 않음"
case NEHotspotConfigurationError.invalidWPAPassphrase.rawValue: // [WPA 암호가 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidWPAPassphrase : WPA 암호가 유효하지 않음"
case NEHotspotConfigurationError.invalidWEPPassphrase.rawValue: // [WEP 암호가 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidWEPPassphrase : WEP 암호가 유효하지 않음"
case NEHotspotConfigurationError.invalidEAPSettings.rawValue: // [EAP 설정이 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidEAPSettings : EAP 설정이 유효하지 않음"
case NEHotspotConfigurationError.invalidHS20Settings.rawValue: // [HS 2.0 설정이 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidHS20Settings : HS 2.0 설정이 유효하지 않음"
case NEHotspotConfigurationError.invalidHS20DomainName.rawValue: // [HS 2.0 도메인 이름이 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidHS20DomainName : HS 2.0 도메인 이름이 유효하지 않음"
case NEHotspotConfigurationError.invalidSSIDPrefix.rawValue: // [핫스팟 구성을 만드는 데 사용된 SSID 접두사가 잘못됨]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : invalidSSIDPrefix : 핫스팟 구성을 만드는 데 사용된 SSID 접두사가 잘못됨"
case NEHotspotConfigurationError.userDenied.rawValue: // [사용자가 네트워크 구성을 거부함 - 권한 거부]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : userDenied : 사용자가 네트워크 구성을 거부함"
case NEHotspotConfigurationError.pending.rawValue: // [네트워크 구성 작업이 완료되지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : pending : 네트워크 구성 작업이 완료되지 않음"
case NEHotspotConfigurationError.systemConfiguration.rawValue: // [시스템 구성이 유효하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : systemConfiguration : 시스템 구성이 유효하지 않음"
case NEHotspotConfigurationError.joinOnceNotSupported.rawValue: // [join-once 옵션은 EAP 구성을 지원하지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : joinOnceNotSupported : join-once 옵션은 EAP 구성을 지원하지 않음"
case NEHotspotConfigurationError.alreadyAssociated.rawValue: // [구성이 이미 핫스팟과 연결되어 있음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : alreadyAssociated : 구성이 이미 핫스팟과 연결되어 있음"
case NEHotspotConfigurationError.internal.rawValue: // [내부 시스템 에러 발생]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : internal : 내부 시스템 에러 발생 (네트워크 디버깅 해제, Xcode 설정 확인 및 재실행 - Hotspot Configuration 포함 확인, 휴대폰 재부팅 필요)"
case NEHotspotConfigurationError.applicationIsNotInForeground.rawValue: // [해당 애플리케이션이 포그라운드에서 실행되고 있지 않음]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : applicationIsNotInForeground : 해당 애플리케이션이 포그라운드에서 실행되고 있지 않음"
default: // [unknown = 알수 없음 오류]
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : default : \(errorLet.code)"
}
S_Log._D_(description: "특정 와이파이 SSID , PW 입력 다이렉트 연결 에러", data: [
"M_LOG :: \(C_Wifi_Ap_Module.WIFI_CONNECT_LOG)",
"Description :: \(errorLet.description)"
])
completion(returnData) // [콜백 반환]
return
} else {
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Success] : Wifi Connect : \(ssid)"
returnData = true
S_Log._D_(description: "특정 와이파이 SSID , PW 입력 다이렉트 연결 성공", data: [
"M_LOG :: \(C_Wifi_Ap_Module.WIFI_CONNECT_LOG)"
])
completion(returnData) // [콜백 반환]
return
}
}
}
else {
C_Wifi_Ap_Module.WIFI_CONNECT_LOG = "[Error] : Input Ssid Is Null"
S_Log._D_(description: "특정 와이파이 SSID , PW 입력 다이렉트 연결 실패", data: [ "M_LOG :: \(C_Wifi_Ap_Module.WIFI_CONNECT_LOG)" ])
completion(returnData) // [콜백 반환]
return
}
}
}
// --------------------------------------------------------------------------------------
[결과 출력]
반응형
'IOS' 카테고리의 다른 글
Comments