Notice
Recent Posts
Recent Comments
Link
투케이2K
615. (ios/swift5) [유틸 파일] observableBeaconScanList : 비콘 beacon 실시간 리스트 목록 스캔 수행 본문
IOS
615. (ios/swift5) [유틸 파일] observableBeaconScanList : 비콘 beacon 실시간 리스트 목록 스캔 수행
투케이2K 2024. 12. 25. 10:18[개발 환경 설정]
개발 툴 : XCODE
개발 언어 : SWIFT5
[소스 코드]
// --------------------------------------------------------------------------------------
[개발 및 테스트 환경]
// --------------------------------------------------------------------------------------
- 언어 : Swift
- 개발 툴 : Xcode
- 기술 구분 : import CoreLocation / CLLocationManagerDelegate
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[사전) 의존성 설정 및 퍼미션 권한 설정 정리]
// --------------------------------------------------------------------------------------
/**
* // ------------------------------------------------------------
* 1. 필요 퍼미션 권한 설정 : 위치 사용 권한
* // ------------------------------------------------------------
* - Privacy - Location Always Usage Description
* - Privacy - Location Always and When In Use Usage Description
* - Privacy - Location When In Use Usage Description
* // ------------------------------------------------------------
* 2. 필요 import 호출 선언 :
* // ------------------------------------------------------------
* - import CoreLocation
* - import UIKit
* // ------------------------------------------------------------
* */
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[소스 코드]
// --------------------------------------------------------------------------------------
// -------------------------------------------------------
// MARK: - [전역 변수 선언]
// -------------------------------------------------------
public static let ACTIVITY_NAME = "C_Beacon_Client_Module"
// -------------------------------------------------------
// MARK: - [SEARCH FAST] : observableBeaconScanList : 비콘 실시간 목록 스캔 결과 반환
// -------------------------------------------------------
// [필요 info plist / import 및 delegate]
// -------------------------------------------------------
/*
// [필요 info plist]
Privacy - Location Always Usage Description
Privacy - Location Always and When In Use Usage Description
Privacy - Location When In Use Usage Description
// [필요 import 및 delegate]
import CoreLocation / CLLocationManagerDelegate
*/
// -------------------------------------------------------
// [소스 코드 사용 방법]
// -------------------------------------------------------
/*
C_Beacon_Client_Module().observableBeaconScanList(){(result) in
S_Log._D_(description: "실시간 비콘 리스트 스캔 결과", data: ["\(result)"])
}
*/
// -------------------------------------------------------
var scanBeaconList: Array<Dictionary<String, String>> = []
private let scanBeaconOperationQueue = OperationQueue() // [비콘 스캔 작업 큐 정의]
public static let BLE_SCAN_TIME_OUT = 10.0 // [비콘 스캔 타임 아웃 시간]
var beaconScanLocationManager: CLLocationManager! // [위치 권한 부여 상태 확인]
// MARK: [다중 :: 비콘 스캔 Uuid :: 필수 설정]
let scanUuid = [UUID(uuidString: "F7A3E806-F5BB-43F8-BA87-0783669EBEB1")!,
UUID(uuidString: "F7A3E806-F5BB-43F8-BA87-0783669EBEB2")!]
var scanBeaconRegion: CLBeaconRegion! // [실시간 비콘 스캔 감지 : 특정 uuid 일치값 설정]
var scanBeaconRegionConstraints: Any? = nil // [비콘 스캔 RegionConstraints]
func observableBeaconScanList(callback: @escaping (Array<Dictionary<String, String>>) -> ()) {
S_Log._D_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: observableBeaconScanList :: 실시간 비콘 리스트 스캔 실시", data: nil)
// ---------------------------------------------
// [초기 값 초기화]
// ---------------------------------------------
self.scanBeaconList = []
// ---------------------------------------------
// [작업 큐에 추가]
// ---------------------------------------------
self.scanBeaconOperationQueue.isSuspended = true
let block = { callback(self.scanBeaconList) }
self.scanBeaconOperationQueue.addOperation(block)
// ---------------------------------------------
// [비동기 작업 수행 실시]
// ---------------------------------------------
DispatchQueue.main.async {
// [CLLocationManager 초기화 및 딜리게이트 지정]
self.beaconScanLocationManager = CLLocationManager.init() // [locationManager 초기화]
self.beaconScanLocationManager.delegate = self // [델리게이트 넣어줌]
// MARK: [위치 권한 설정 값을 받아옵니다] : locationManager : didChangeAuthorization 에서 확인
self.beaconScanLocationManager.requestAlwaysAuthorization()
}
}
// -------------------------------------------------------
// MARK: - [위치 권한 부여 상태 응답 확인] : CLLocationManagerDelegate : Delegate
// -------------------------------------------------------
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
switch status {
// ---------------------------------------------------------
case .authorizedAlways:
S_Log._W_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: 위치 권한 :: authorizedAlways :: 항상 허용", data: nil)
self.beaconScanSetting() // MARK: [비콘 스캔 관련 옵션 설정]
// ---------------------------------------------------------
case .authorizedWhenInUse:
S_Log._W_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: 위치 권한 :: authorizedWhenInUse :: 앱 사용 시 허용", data: nil)
self.beaconScanSetting() // MARK: [비콘 스캔 관련 옵션 설정]
// ---------------------------------------------------------
case .notDetermined:
S_Log._E_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: 위치 권한 :: notDetermined :: 권한 대기 상태", data: nil)
self.scanBeaconOperationQueue.isSuspended = false // [비콘 스캔 큐 해제]
// ---------------------------------------------------------
case .restricted:
S_Log._E_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: 위치 권한 :: restricted :: 권한 대기 상태", data: nil)
self.scanBeaconOperationQueue.isSuspended = false // [비콘 스캔 큐 해제]
// ---------------------------------------------------------
case .denied:
S_Log._E_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: 위치 권한 :: denied :: 권한 거부", data: nil)
self.scanBeaconOperationQueue.isSuspended = false // [비콘 스캔 큐 해제]
// ---------------------------------------------------------
@unknown default:
S_Log._E_(description: "\(C_Beacon_Client_Module.ACTIVITY_NAME) :: 위치 권한 :: default :: 상태", data: nil)
self.scanBeaconOperationQueue.isSuspended = false // [비콘 스캔 큐 해제]
}
// ---------------------------------------------------------
}
// -------------------------------------------------------
// MARK: - [실시간 비콘 스캔 모니터링 감지 부분] : CLLocationManagerDelegate : Delegate
// -------------------------------------------------------
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if beacons.count > 0 { // MARK: [스캔된 비콘 개수가 있는 경우 : UUID]
// [for 반복문을 수행하면서 스캔한 비콘 정보 확인 실시]
for beacon in beacons {
// -----------------------------------------
var SCAN_UUID = ""
if #available(iOS 13, *) {
SCAN_UUID = String(beacon.uuid.uuidString) // uuid 값
}
else {
SCAN_UUID = String(beacon.proximityUUID.uuidString) // uuid 값
}
// -----------------------------------------
let SCAN_MINOR : String = String(beacon.minor.description) // minor 값
// -----------------------------------------
let SCAN_MAJOR : String = String(beacon.major.description) // major 값
// -----------------------------------------
print("\(C_Beacon_Client_Module.ACTIVITY_NAME) :: didRangeBeacons :: 실시간 비콘 스캔 정보 확인 >> UUID - \(SCAN_UUID)) / MINOR - \(SCAN_MINOR) / MAJOR - \(SCAN_MAJOR)")
// -----------------------------------------
// MARK: [비콘 스캔 리턴 배열에 추가]
var beaconScanDic : Dictionary<String, String> = [String : String]()
beaconScanDic["UUID"] = "\(SCAN_UUID)"
beaconScanDic["MINOR"] = "\(SCAN_MINOR)"
beaconScanDic["MAJOR"] = "\(SCAN_MAJOR)"
if self.scanBeaconList != nil {
self.scanBeaconList.append(beaconScanDic) // [배열에 추가]
}
// -----------------------------------------
}
}
}
// --------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------
[결과 출력]
// --------------------------------------------------------------------------------------
================================================================
LOG :: TYPE :: LOG :: 🟢
-------------------------------------------------
LOG :: CLASS PLACE :: A_Webview.swift :: testMain() :: 1458
-------------------------------------------------
LOG :: DESCRIPTION :: 실시간 비콘 리스트 스캔 결과
-------------------------------------------------
LOG :: [["MAJOR": "1", "UUID": "F7A3E806-F5BB-43F8-BA87-0783669EBEB1", "MINOR": "36"]]
================================================================
// --------------------------------------------------------------------------------------
반응형
'IOS' 카테고리의 다른 글
Comments