투케이2K

123. (Objective-C/objc) CBPeripheralManager startAdvertising 사용해 실시간 비콘 (beacon) 신호 활성 수행 실시 본문

Objective-C

123. (Objective-C/objc) CBPeripheralManager startAdvertising 사용해 실시간 비콘 (beacon) 신호 활성 수행 실시

투케이2K 2022. 10. 27. 19:59

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : OBJECTIVE-C

 

[사전 info.plist 설정]

 

[ViewController.h : 소스 코드]

// MARK: - [import 정의]
#import <UIKit/UIKit.h>
#import <SafariServices/SafariServices.h>
#import <WebKit/WebKit.h>
#import <AVFoundation/AVFoundation.h>


// MARK: - [위치 권한 및 블루투스 권한 import]
#import <CoreLocation/CoreLocation.h>
#import <CoreBluetooth/CoreBluetooth.h>


@interface ViewController : UIViewController <CLLocationManagerDelegate, CBPeripheralManagerDelegate> { // [클래스 딜리게이트 정의]
    
    /*
     -----------------------------
     // [지역 변수 정의]
     -----------------------------
     1. self 키워드 없이 접근 가능
     -----------------------------
     2. 메소드 내에서 사용 필요
     -----------------------------
     3. 정보 은닉 데이터 처리
     -----------------------------
     */
    
}


// [get set 프로퍼티 선언]
@property (strong, nonatomic) CLLocationManager *locationManager; // [위치 상태]
@property (strong, nonatomic) CBPeripheralManager *peripheralManager; // [비콘 신호 활성]




@end
 

[ViewController.m : 소스 코드]

// MARK: - [뷰 컨트롤러 헤더 파일 import]
#import "ViewController.h"


// MARK: - [전처리 지시어 헤더 파일 import]
#import "S_Define.h"


// MARK: - [프로젝트-Swift.h import 명시]
#import "objectiveProject-Swift.h"


// MARK: - [클래스 @interface]
@interface ViewController(){
    
}
@end


// MARK: - [클래스 @implementation]
@implementation ViewController{
    
}


// MARK: [클래스 헤더 파일에 선언 한 property 속성 지정]
@synthesize locationManager; // [위치 상태]
@synthesize peripheralManager; // [비콘 신호 활성]





// MARK: - [전역 변수 선언]
NSDictionary *dicBeaconInfo = nil; // [비콘 신호 활성 정보 담기 위함]





// MARK: - [뷰 로드 실시]
- (void)viewDidLoad {
    [super viewDidLoad];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewDidLoad() :: 뷰 로드 실시] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewWillAppear() :: 뷰 로드 완료] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewDidAppear() :: 뷰 화면 표시] \n");
    printf("==================================== \n");
    printf("\n");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}





// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewWillDisappear() :: 뷰 정지 상태] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> viewDidDisappear() :: 뷰 종료 상태] \n");
    printf("==================================== \n");
    printf("\n");
}





// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> testMain() :: 테스트 메소드 수행] \n");
    printf("==================================== \n");
    printf("\n");

    
    // [try catch 구문 정의 실시]
    @try {
        
        dispatch_async(dispatch_get_main_queue(), ^{
                    
            // [CLLocationManager 인스턴스 할당 실시]
            self.locationManager = [[CLLocationManager alloc] init];
            
            
            // [딜리게이트 지정]
            self.locationManager.delegate = self;
            
            
            // [거리 정확도 설정]
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            
            
            // [위치 권한 설정 값 확인]
            [self.locationManager requestAlwaysAuthorization];
            
            
            // [위치 업데이트 시작]
            [self.locationManager startUpdatingLocation];

            
        });

    }
    @catch (NSException *exception) {
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> catch :: 예외 상황 확인] \n");
        printf("[name :: %s] \n", exception.name.description.UTF8String);
        printf("[reason :: %s] \n", exception.reason.description.UTF8String);
        printf("==================================== \n");
        printf("\n");
    }
}






// MARK: - [앱 상태 바 콘텐츠 색상 커스텀 변경 실시]
-(UIStatusBarStyle)preferredStatusBarStyle {
    // return UIStatusBarStyleLightContent; // [상태바 콘텐츠 색상 흰색으로 변경 : ex (배터리 표시)]
    if (@available(iOS 13.0, *)) { // [상태바 콘텐츠 색상 검정색으로 변경 : ex (배터리 표시)]
        return UIStatusBarStyleDarkContent;
    } else {
        return UIStatusBarStyleDefault;
    }
}





// MARK: - [위치 권한 부여 상태 확인 딜리게이트]
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    
    if (status == kCLAuthorizationStatusAuthorizedAlways){
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> locationManager :: 위치 권한 부여 상태 확인] \n");
        printf("[status :: kCLAuthorizationStatusAuthorizedAlways] \n");
        printf("[message :: 위치 사용 권한 항상 허용] \n");
        printf("==================================== \n");
        printf("\n");
        
        // [비콘 신호 활성 실시]
        [self startBeaconSend];
    }
       
    else if (status == kCLAuthorizationStatusAuthorizedWhenInUse){
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> locationManager :: 위치 권한 부여 상태 확인] \n");
        printf("[status :: kCLAuthorizationStatusAuthorizedWhenInUse] \n");
        printf("[message :: 위치 사용 권한 앱 사용 시 허용] \n");
        printf("==================================== \n");
        printf("\n");
        
        // [비콘 신호 활성 실시]
        [self startBeaconSend];
    }
    else if (status == kCLAuthorizationStatusDenied){
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> locationManager :: 위치 권한 부여 상태 확인] \n");
        printf("[status :: kCLAuthorizationStatusDenied] \n");
        printf("[message :: 위치 사용 권한 거부] \n");
        printf("==================================== \n");
        printf("\n");
    }
    else if (status == kCLAuthorizationStatusRestricted){
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> locationManager :: 위치 권한 부여 상태 확인] \n");
        printf("[status :: kCLAuthorizationStatusRestricted] \n");
        printf("[message :: 위치 사용 권한 제한 상태] \n");
        printf("==================================== \n");
        printf("\n");
    }
    else if (status == kCLAuthorizationStatusNotDetermined){
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> locationManager :: 위치 권한 부여 상태 확인] \n");
        printf("[status :: kCLAuthorizationStatusNotDetermined] \n");
        printf("[message :: 위치 사용 권한 대기 상태] \n");
        printf("==================================== \n");
        printf("\n");
    }
    else {
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> locationManager :: 위치 권한 부여 상태 확인] \n");
        printf("[status :: else] \n");
        printf("==================================== \n");
        printf("\n");
    }
}






// MARK: - [비콘 스캔 시작 실시 부분]
- (void)startBeaconSend {
    
    // [스캔을 수행할 비콘 UUID 선언 실시]
    NSString *uuidString = @"F7A3E806-F5BB-43F8-BA87-0783669EBEB1";
    
    
    // [비콘 거리 측정 가능 여부 체크]
    if ([CLLocationManager isRangingAvailable]) {
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> startBeaconScan() :: 비콘 신호 활성 정보 설정] \n");
        printf("==================================== \n");
        printf("\n");
        
        // [비콘 신호 활성 시작]
        NSUUID *beaconUuid = [[NSUUID UUID] initWithUUIDString:uuidString];
        CLBeaconMajorValue major = 123;
        CLBeaconMinorValue minor = 456;
        
        CLBeaconRegion *beaconRegion = [[CLBeaconRegion alloc]
                                        initWithProximityUUID:(NSUUID *)beaconUuid
                                        major:(CLBeaconMajorValue)major
                                        minor:(CLBeaconMinorValue)minor
                                        identifier:(NSString *)uuidString];
        
        dicBeaconInfo = [beaconRegion peripheralDataWithMeasuredPower:nil];

        self.peripheralManager = [[CBPeripheralManager alloc] init];
        self.peripheralManager.delegate = self;
        
    } else {
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> startBeaconScan() :: 비콘 신호 활성 에러] \n");
        printf("[error :: 비콘 거리 측정 불가능 디바이스] \n");
        printf("==================================== \n");
        printf("\n");
    }
}





// MARK: - [비콘 신호 활성 권한 상태 확인]
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral {
    // [변수 선언]
    NSString *status = @"";
    bool beaconSendFlag = false;
    
    // [블루투스 로직 권한 상태 확인 실시]
    if(peripheral.state == CBManagerStatePoweredOn){
        status = @"블루투스 활성 상태";
        beaconSendFlag = true;
    }
    else if (peripheral.state == CBManagerStatePoweredOff){
        status = @"블루투스 비활성 상태";
    }
    else if (peripheral.state == CBManagerStateUnknown){
        status = @"블루투스 상태 알수 없음";
    }
    else if (peripheral.state == CBManagerStateResetting){
        status = @"블루투스 서비스 리셋";
    }
    else if (peripheral.state == CBManagerStateUnsupported){
        status = @"블루투스 지원하지 않는 기기";
    }
    else if (peripheral.state == CBManagerStateUnauthorized){
        status = @"블루투스 권한 확인 필요";
    }
    else {
        status = @"블루투스 DEFAULT";
    }
    printf("\n");
    printf("==================================== \n");
    printf("[ViewController >> peripheralManagerDidUpdateState() :: 블루투스 권한 부여 상태 확인] \n");
    printf("[STATUS :: %s] \n", status.description.UTF8String);
    printf("==================================== \n");
    printf("\n");
    
    
    // [비콘 신호 활성 실시]
    if (dicBeaconInfo != nil && beaconSendFlag == true){
        printf("\n");
        printf("==================================== \n");
        printf("[ViewController >> peripheralManagerDidUpdateState() :: 비콘 신호 활성 수행] \n");
        printf("==================================== \n");
        printf("\n");
        
        [self.peripheralManager startAdvertising: dicBeaconInfo];
    }

}


// --------------------------------------
@end
// --------------------------------------

[결과 출력]

 
 


 

반응형
Comments