투케이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"]]
================================================================

// --------------------------------------------------------------------------------------

 

반응형
Comments