Skip to content

iOS SDK 가이드

해당 문서는 최신버전 의 SDK를 기준으로 작성되었습니다.

SDK 정보

SDK 지원 버전

  • 컴파일 가능 iOS 버전: iOS 8.0 이상

    • iOS 8.0 에서는 SDK내 API를 호출해도 아무런 작업을 하지않습니다.
  • 실제 작동 iOS 버전: iOS 9.0 이상

SDK 적용

로플랫 SDK를 사용하기 위해서는 API 키가 필요합니다.

loplat SDK를 사용하기 위해서는 로플랫에서 제공하는 ID와 Secret 키를 발급받아야 합니다.
발급을 원하시는 기업, 개발자는 아래의 내용을 기입하여 business@loplat.com 으로 보내주시기 바랍니다.

  • 이름
  • 회사
  • 사용 목적

권한

권한 추가하기

loplat SDK를 사용하기 위해서는 권한을 추가해야합니다. 필요한 권한은 아래와 같습니다.

  • Access WiFi Information : iOS 12 이상부터 현재 연결되어 있는 와이파이 정보를 가져오기 위해 사용합니다. (iOS 13 이상부터 위치권한이 있어야만 작동하는 권한입니다.)
  • Background Modes - Location Updates : 백그라운드에서도 위치 정보를 수신하기 위해 사용합니다.

    Access WiFi Information
    	Background Modes
        - Location Updates
    

Xcode 에서 Project > Capabilities 에 들어가 위 권한 목록에 있는 권한들을 허용해줍니다.

XCode에서 권한 허용하기


사용자에게 위치 권한 요청하기 (필수)

iOS 11 이상부터 위치권한을 사용하기 위해서는 사용자에게 피드백 문구를 제공해야 합니다.

서비스 시나리오에 따라 위치 권한 사용이유를 명시해주세요.
위치 권한 사용이유가 부실할 경우 앱 스토어 심사에서 바이너리 파일이 거부당할 수 있습니다.
반드시 상세한 사용 이유를 사용자에게 설명해주세요.
상세한 사용 이유는 백그라운드에서 위치를 사용하는 합당한 이유를 포함해야 합니다.
따라서 항상 허용을 통해 유저가 받는 혜택 등을 고지하는 방향으로 작성해주십시오.

예시 문구는 다음과 같습니다.

위치 기반 이벤트와 혜택 알림을 제공하기 위해 필요합니다.
제휴 매장 진입시 쿠폰 발행 또는 오프라인 헤택 찾기 서비스를 제공해드립니다.
항상 허용을 하시면, 앱을 사용하지 않아도 혜택을 검색합니다.



프로젝트의 info.plist 파일에 아래 값을 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8">
<!DOCTYPE plist PUBLIC "=//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- 중간 생략 -->
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>예 : 앱이 제공하는 '모든 혜택'을 누리시려면 '항상' 허용을 선택해 주세요.</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>예 : 앱이 제공하는 '모든 혜택'을 누리시려면 '항상' 허용을 선택해 주세요.</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>예 : 앱이 제공하는 혜택을 누리시려면 위치 정보를 '앱을 사용하는 동안'으로 선택하고 이후, '항상' 허용을 선택해주세요.</string>
    <!-- 이하 생략 -->
</dict>
</plist>

위의 코드를 Xcode에서 보면 아래와 같습니다.

Location Permission Message



사용자에게 위치권한을 요청할 때 Plengi.requestAlwaysLocationAuthorization() 호출해주세요.

앱의 시나리오에 따라 Core Location API를 사용하려는 경우(ex: 로그인 이후, 포그라운드에서 항상 허용 권한을 묻고싶은 경우.) Core Location API 문서를 참고하여 요청해주십시오.

1
(void)Plengi.requestAlwaysLocationAuthorization;
1
Plengi.requestAlwaysLocationAuthorization()

위 API를 앱의 시나리오에 따라 사용자에게 위치 권한을 요청할 때 호출해주시기 바랍니다.
iOS 버전 별로 '항상' 허용을 받을 수 있는 시나리오는 아래의 예시 이미지를 참고해주십시오.

ex1) 유저가 앱 초기 설치시 첫 화면에서 위치 권한 요청
ex2) 유저가 로그인시 위치 권한 요청


iOS 12 이하


위의 화면은 iOS 12 이하에서 위치 권한 허용 요청 알림창(Prompt)의 예시 화면 입니다.


iOS 13.0 ~ 13.3.1


위의 화면은 iOS 13.0 ~ 13.3.1에서 위치 권한 허용 요청 알림창(Prompt)의 예시 화면 입니다.
유저가 포그라운드(Foreground)에서 '앱을 사용하는 동안 허용'을 선택하면
백그라운드(Background)에서 SDK가 동작할 때 '항상'으로 위치 권한을 변경할지 알림창이 나타납니다.


iOS 13.4 ~ 13.7


위의 이미지는 iOS 13.4 ~ 13.7에서 위치 권한 허용 요청 알림창(Prompt)의 예시 화면 입니다.
유저가 '앱을 사용하는 동안 허용'을 선택하면 '항상'으로 위치 권한을 변경할지 알림창이 나타납니다.


iOS 14.0 이상


위의 이미지는 iOS 14.0 이상에서 위치 권한 허용 요청 알림창(Prompt)의 예시 화면 입니다.
유저가 '앱을 사용하는 동안 허용'을 선택하면 '항상'으로 위치 권한을 변경할지 알림창이 나타납니다. iOS 14.0 부터 유저는 '정확한 위치'에 대하여 '켬' 또는 '끔'으로 설정할 수 있습니다.



사용자에게 추적 권한 요청하기

iOS 14.5부터 IDFA(광고아이디)를 사용하기 위하여 유저가 권한을 부여해야 합니다.

서비스 시나리오에 따라 추적 권한 사용이유를 명시해주세요.

예시 문구는 다음과 같습니다.

‘추적 허용을 하시면 맞춤 광고를 받아보실수 있습니다.’


프로젝트의 info.plist 파일에 아래 값을 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?xml version="1.0" encoding="UTF-8">
<!DOCTYPE plist PUBLIC "=//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <!-- 중간 생략 -->
    <key>NSUserTrackingUsageDescription</key>
    <string>예 : 추적 허용을 하시면 맞춤 광고를 받아보실수 있습니다.</string>
    <!-- 이하 생략 -->
</dict>
</plist>


App Tracking Transparency import 하기

권한을 요청하는 파일에 아래의 구문을 추가하여 App Tracking Transparency import해 줍니다.

#import <AppTrackingTransparency/AppTrackingTransparency.h>
import AppTrackingTransparency


추적 권한 요청하기

앱의 시나리오에 따라 다음과 같은 코드를 추가하여 ‘추적’ 권한에 대하여 요청하여 주십시오.

- (void)requestIDFA {
  [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    // 앱 시나리오에 따른 코드를 작성해주십시오.
  }];
}
func requestIDFA() {
  ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
     // 앱 시나리오에 따른 코드를 작성해주십시오.
  })
}


아래는 요청에 대한 예시 이미지 입니다.

유저가 ‘추적 허용’ 을 선택하는 경우 IDFA를 사용할 수 있습니다.



프로젝트에 로플랫 SDK 추가

Cocoapod 적용하기

프로젝트에 이미 Cocoapods를 사용하고 있다면?

SDK 추가하기 로 넘어가세요.

Cocoapods를 사용하기 위해, macOS에 Cocoapod 바이너리를 설치합니다.
터미널에 아래의 명령어를 입력하세요.

$ sudo gem install cocoapods

설치가 완료되었다면, 로플랫 SDK를 적용할 프로젝트에서 Cocoapod 모듈을 활성화합니다.
터미널에 아래의 명령어를 입력하세요.

$ cd $PROJECT_PATH
$ pod init

loplat SDK 종속성 추가 하기

프로젝트 폴더에 있는 Podfile 을 텍스트 편집기로 열면 아래와 같은 예시 형식의 내용이 나옵니다.

1
2
3
4
5
6
7
8
platform :ios, '8.0'
# use_frameworks!

target 'MyApp' do
        pod 'AFNetworking', '~> 2.6'
        pod 'ORStackView', '~> 3.0'
        pod 'SwiftyJSON', '~> 2.3'
end

Podfiletarget 태그안에 아래의 코드를 입력한 후, 저장합니다.

pod 'MiniPlengi', '1.4.1.1.xcode12.550'


Xcode 12.4(12.2, 12.3포함)와 Swift 5를 사용하지 않으신다면 아래의 표를 참고하여 pod 버전을 추가하여주세요.


아래에 표에 해당하는 하위 버전으로 대체해 주세요.

Swift Xcode 12.0 ~ 12.1 Xcode 12.2 ~ 12.4 Xcode 12.5 ~
4.0 pod 'MiniPlengi', '1.4.1.1.xcode12.140' pod 'MiniPlengi', '1.4.1.1.xcode12.340' pod 'MiniPlengi', '1.4.1.1.xcode12.540'
4.2 pod 'MiniPlengi', '1.4.1.1.xcode12.142' pod 'MiniPlengi', '1.4.1.1.xcode12.342' pod 'MiniPlengi', '1.4.1.1.xcode12.542'
5.0 pod 'MiniPlengi', '1.4.1.1.xcode12.150' pod 'MiniPlengi', '1.4.1.1.xcode12.350' pod 'MiniPlengi', '1.4.1.1.xcode12.550'


Objective - C만 사용하는 경우 Swift 5.0에 맞추어서,
Objective - C + Swift 같이 사용하는 경우 Swift 버전에 맞추어서 버전을 선택해 주세요.


ex) Objc만 사용, Xcode 12.2 -> pod 'MiniPlengi', '1.4.1.1.xcode12.350'
ex) Objc + Swift 4.0 혼용, Xcode 12.4 -> pod 'MiniPlengi', '1.4.1.1.xcode12.340'
ex) Objc + Swift 4.2 혼용, Xcode 12.1 -> pod 'MiniPlengi', '1.4.1.1.xcode12.142'
ex) Objc + Swift 5.0 혼용, Xcode 12.3 -> pod 'MiniPlengi', '1.4.1.1.xcode12.350'
ex) Objc + Swift 5.0 혼용, Xcode 12.5 -> pod 'MiniPlengi', '1.4.1.1.xcode12.550'

SDK가 Swift를 사용하기 때문에, Podfile에 # use_frameworks 을 주석을 해제합니다. (#을 지우면 됨)

이후, 아래의 명령어를 터미널에 입력하여 라이브러리를 적용합니다.

$ pod update
$ pod install

로플랫 SDK가 프로젝트에 추가되었습니다.

Xcode 프로젝트를 열었는데, 모든 라이브러리를 찾을 수 없다며 오류가 발생합니다.

Cocoapod이 적용된 프로젝트를 열기 위해서는 확장자가 .xcodeproj 인 파일을 열면 안되며, 워크스페이스 파일 .xcworkspace 파일을 열여야 합니다.

Objective-C를 사용하실 경우 반드시 Swift Libraries를 포함하도록 설정해주십시오.

아래의 이미지와 같이 반드시 Swift 표준 라이브러리를 포함하도록 하여야합니다. 그렇지 않은 경우, 몇몇 iOS 버전에서 SDK를 포함하지 못하여 앱 자체가 실행되지 않을 수 있습니다.

Swift Library Always


SDK 초기화

import 하기

AppDelegate.h (Objective-C) / AppDelegate.swift (Swift) 파일에, 아래의 구문을 추가해줍니다.

#import <MiniPlengi/MiniPlengi-Swift.h>
import MiniPlengi


SDK 적용법

1. Plengi 초기화 (필수)

Plengi.initialize() 함수는 반드시 AppDelegate 에서 호출되어야 합니다.

다른곳에서 호출할 경우, SDK가 작동하지 않을 수 있습니다.


AppDelegate 클래스 선언부를 아래와 같이 수정합니다.

@interface AppDelegate : UIResponder <UIApplicationDelegate, PlaceDelegate>
class AppDelegate: UIResponder, UIApplicationDelegate, PlaceDelegate {

이후, AppDelegate 클래스에 실제 SDK를 초기화하는 코드를 추가합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // ********** 중간 생략 ********** //
  if ([Plengi initializeWithClientID:@"로플랫에서 발급받은 클라이언트 아이디"
                clientSecret:@"로플랫에서 발급받은 클라이언트 키"
                          echoCode:@"고객사 별 사용자를 식별할 수 있는 코드 (개인정보 주의바람)"] == Result.SUCCESS) {
        // init 성공
  } else {
        // init 실패
  }
  // ********** 중간 생략 ********** //
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func application(_ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [IOApplicationLaunchOptionsKey: Any]?) -> Bool {
        // ********** 중간 생략 ********** //
        if Plengi.initialize(clientID: "로플랫에서 발급받은 클라이언트 아이디",
                 clientSecret: "로플랫에서 발급받은 클라이언트 키",
                     echoCode: "고객사 별 사용자를 식별할 수 있는 코드 (개인정보 주의바람)")
                == PlengiResponse.Result.SUCCESS) {
                // init 성공
        } else {
                // init 실패
        }
        // ********** 중간 생략 ********** //
}
  • echoCode: 앱에서 사용자 식별(관리용) 및 추적하기 위한 ID입니다 (ex, 광고id,id,....,etc.). echoCode 관리를 원하지 않는 경우 nil 값을 입력하면 됩니다.

echoCode 에는 개인정보가 포함되면 안됩니다.

이메일, 전화번호와 같은 개인정보는 전달하지 마세요.

2. Plengi 초기화 - 백그라운드에서 앱이 살아날 때 (매우 중요)

백그라운드에서 자동으로 앱이 살아나기 위해서는 해당 작업이 필수입니다. (AppDelegate에 UI 작업이 들어갈 경우 크래시가 날 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
        (NSDictionary *)launchOptions {
        
        [Plengi initializeWithClientID:@"로플랫에서 발급받은 클라이언트 아이디"
                clientSecret:@"로플랫에서 발급받은 클라이언트 키"
                echoCode:@"고객사 별 사용자를 식별할 수 있는 코드 (개인정보 주의바람)"];
	
	// MainViewController에서 유저 약관 동의 후 Start된 이력이 있는 경우 start
	if ([Plengi getEngineStatus] == EngineStatusSTARTED ) {
                [Plengi start];
        }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func application(_ application: UIApplication, didFinishLaunchingWithOptions
        launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
        // 앱이 백그라운드 모드로 재시작 되었을 때 (필수!!!!! 없으면 재시작 되지 않음)
        _ = Plengi.initialize(clientID: "로플랫에서 발급받은 클라이언트 아이디",
                   	      clientSecret: "로플랫에서 발급받은 클라이언트 키",
                              echoCode: "고객사 별 사용자를 식별할 수 있는 코드 (개인정보 주의바람)")
	// MainViewController에서 유저 약관 동의 후 Start된 이력이 있는 경우 start
       if Plengi.getEngineStatus() == .STARTED {
		_ = Plengi.start()
       }
       
}


PlaceDelegate 등록하기

서버로부터 장소 인식 이벤트를 받았을 때, loplat X 광고 수신 등이 되었을 때의 이벤트를 수신하기 위해 PlaceDelegate 를 등록해줍니다.

Plengi.init 이 호출된 후, setDelegate 를 호출합니다.

1
2
3
4
5
if ([Plengi setDelegate:self] == ResultSUCCESS) {
        // setDelegate 등록 성공
} else {
        // setDelegate 등록 실패
}
1
2
3
4
5
if Plengi.setDelegate(self) == .SUCCESS {
    // setDelegate 등록 성공
} else {
        // setDelegate 등록 실패
}

이후, PlaceDelegate 를 구현해줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@implementation AppDelegate

- (void)responsePlaceEvent:(PlengiResponse *)plengiResponse {
        if ([plengiResponse echoCode] != nil) {
                // 고객사에서 넣은 echoCode
        }

        if ([plengiResponse result] == ResultSUCCESS) {
                if ([plengiResponse type] == ResponseTypePLACE_EVENT) {
		
			// Lite 요금제를 사용할 경우 실시간 위치기반 메시지 발송 기능 제공에 따라 Advertisement 정보만 제공됩니다.
			if ([plengiResponse advertisement] != nil) {
                                // loplat X 광고 정보가 있을 때
                                // 기본으로 Plengi SDK에서 광고이벤트를 직접 알림으로 처리합니다.
                                // 하지만 설정값에 따라 광고이벤트를 직접 처리할 경우 해당 객체를 사용합니다.
                        }

			// Basic / Premium 요금제를 사용할 경우 Lite 요금제 기능에 더하여 위치인식 결과 데이터를 확인할 수 있습니다.
                        if ([plengiResponse place] != nil) {
                                if ([plengiResponse placeEvent] == PlaceEventENTER) {
                                        // 사용자가 장소에 들어왔을 때
                                } else if ([plengiResponse placeEvent] == PlaceEventNEARBY) {
                                        // NEARBY로 인식되었을 때
                                } else if ([plengiResponse placeEvent] == PlaceEventLEAVE) {
                                        // 사용자가 장소를 떠났을 때
                                }
                        }

                        if ([plengiResponse complex] != nil) {
                                // 복합몰이 인식되었을 때
                        }

                        if ([plengiResponse area] != nil) {
                                // 상권이 인식되었을 때
                        }

                        

                        if ([plengiResponse geofence] != nil) {
                                // Geofence 정보가 있을 때
                        }

                        if ([plengiResponse location] != nil) {
                                // 인식할 때의 기기의 위경도 값
                        }

                        if ([plengiResponse district] != nil) {
                                // 행정구역 (District) 정보가 있을 때               
                        } 
                }
        } else {
                /* 여기서부터는 오류인 경우입니다 */
                // [plengiResponse errorReason] 에 위치 인식 실패 / 오류 이유가 포함됨

                // FAIL : 위치 인식 실패
                // NETWORK_FAIL : 네트워크 오류
                // ERROR_CLOUD_ACCESS : 클라이언트 ID/PW가 틀렸거나 인증되지 않은 사용자가 요청했을 때
        }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
func responsePlaceEvent(_ plengiResponse: PlengiResponse) {
  if plengiResponse.echoCode != nil {
        // 고객사에서 설정한 echoCode
  }

  if plengiResponse.result == .SUCCESS {
        if plengiResponse.type == .PLACE_EVENT {
                if plengiResponse.place != nil {
                        if plengiResponse.placeEvent == .ENTER {
                                // PlaceEvent가 NEARBY 일 경우, NEARBY 로 인식된 장소 정보가 넘어옴
                        } else if plengiResponse.placeEvent == .NEARBY {
                                // PlaceEvent가 ENTER 일 경우, 들어온 장소 정보 객체가 넘어옴
                        } else if plengiResponse.placeEvent == .LEAVE {
                                // PlaceEvent가 LEAVE 일 경우, 떠난 장소 정보 객체가 넘어옴
                        }
                }

                if plengiResponse.complex != nil {
                        // 복합몰이 인식되었을 때
                }

                if plengiResponse.area != nil {
                        // 상권이 인식되었을 때
                }

                if plengiResponse.advertisement != nil {
                        // loplat X 광고 정보가 있을 때
                        // 기본으로 Plengi SDK에서 광고이벤트를 직접 알림으로 처리합니다.
                        // 하지만 설정값에 따라 광고이벤트를 직접 처리할 경우 해당 객체를 사용합니다.
                }

                if plengiResponse.geofence != nil {
                        // Geofence 정보가 있을 때
                }

                if plengiResponse.location != nil {
                        // 인식할 때의 기기의 위경도 값
                }

                if plengiResponse.district != nil {
                        // 행정구역 (District) 정보가 있을 때
                }
    }
  } else {
        /* 여기서부터는 오류인 경우입니다 */
        // plengiResponse.errorReason 에 위치 인식 실패 / 오류 이유가 포함됨

        // FAIL : 위치 인식 실패
        // NETWORK_FAIL : 네트워크 오류
        // ERROR_CLOUD_ACCESS : 클라이언트 ID/PW가 틀렸거나 인증되지 않은 사용자가 요청했을 때
        // Location Acquisition Fail : plengiResponse.location에서 위경도 값만 있는 경우
  }
}

SDK 구동하기

Start/Stop

  • 사용자 장소/매장 방문 모니터링을 시작하거나 정지 할 수 있습니다. start는 사용자의 위치약관동의 직후 호출해주세요.

    앱 시작 혹은 로그인 할 때 마다 사용자의 위치약관동의 여부를 매번 확인해서 start를 호출해줘야만 합니다.

    SDK에는 Start / Stop 이 중복으로 호출될 수 없도록 처리되어 있습니다.

    start/stop을 중복 호출 하더라도 SDK 내에서 1회만 호출되도록 구현되어 있습니다.

    예외적인 케이스에 대해서는 Stop을 호출하면 안됩니다.

        예외적인 케이스에 대해서 stop을 호출하지 마세요. stop은 사용자의 위치약관동의에 대한 거부시에만 호출해주세요.
    

  • 사용자의 위치 정보는 PlaceDelegate로 전달됩니다.

  • 모니터링 시작과 정지는 다음과 같이 선언합니다.

    [Plengi start]; //Monitoring Start
    [Plengi stop];  //Monitoring Stop
    
    Plengi.start() // Monitoring Start
    Plengi.stop()  // Monitoring Stop
    

장소인식결과

  • 장소 결과 값은 PlengiResponse 객체로 전달 됩니다.

Lite 요금제

  • 실시간 위치기반 메시지 발송 기능 제공에 따라 Advertisement 정보가 제공됩니다.
  • (켐페인 성과는 loplat X에서 확인할 수 있습니다.)

    • Advertisement : 광고 (PlengiResponse.Advertisement 클래스, response.advertisement 결과 전달)

      @objc public let body: String                           // 광고 내용
      @objc public let campaign_id: Int                       // loplat X 캠페인 고유번호
      @objc public let img: String                            // 광고에 포함된 이미지 URL
      @objc public let intent: String                         // 광고 이벤트 타입 (Url link or Deep link
      @objc public let msg_id: Int                            // loplat X 광고 고유번호
      @objc public let target_pkg: String                     // 광고에 해당하는 앱의 패키지명
      @objc public let title: String                          // 광고 제목
      @objc public let client_code: String            // 광고에 대한 Client Code
      

Basic / Premium 요금제

  • Lite 요금제 기능에 더하여 위치인식 결과 데이터를 확인할 수 있습니다.

    장소 인식 결과에 따라 PlengiResponse 객체에서 사용할 수 있는 정보가 달라집니다.

    장소 인식시 인식된 장소 결과에 따라 area (상권정보), complex (복합몰) 정보가 추가로 전달됩니다. 상권만 인식된 경우에는 place 정보가 null 로 넘어가니 코드 작성시 주의 부탁드립니다.

  • echoCode ( 사용자 식별 code 값 )

    @objc public var echoCode: String?                                  // 사용자 식별 echoCode
    
    • init시 전달한 echo_code 값이 전달됩니다.
  • result (위치 인식 성공/실패)

    @objc public var result: Result                                             // 결과 보고
    // Result.SUCCESS // 요청위치 정보획득 성공
    // Result.FAIL // 실패
    
  • 위치 인식 실패 한 경우

    • errorReason : 위치 인식 실패한 사유

      @objc public var errorReason: String                            // result가 FAIL시 사유
      
    • 현재 위치 획득 실패: Location Acquisition Fail

    • client 인증 실패: Not Allowed Client
  • 위치 인식 성공 한 경우

    • type : 위치 요청 타입

      @objc public var type: ResponseType                                     // 요청타입
      // ResponseType.PLACE // 테스트로 refreshPlace() 요청시
      // ResponseType.PLACE_EVENT // 설정된 주기에 따라 요청시
      
    • placeEvent : 인식된 place event 타입 (ENTER, NEARBY, LEAVE)

      @objc public var placeEvent: PlaceEvent                         // 인식된 Place event 타입
      // PlaceEvent.NOT_AVAILABLE // Place 정보가 없음, Area, Complex, Geofence와 관련이 없음
      // PlaceEvent.ENTER // Place에 들어감
      // PlaceEvent.LEAVE // Place에서 떠남
      // PlaceEvent.NEARBY // Place근처에 있음
      
    • place : 위치 정보 (PlengiResponse.Place 클래스, response.place로 획득 가능)

      @objc public let loplat_id: Int                                         // 장소 ID
      @objc public let name: String                                           // 장소 이름
      @objc public let tags: String?                                          // 장소와 관련된 태그 (Nullable)
      @objc public let floor: Int                                                     // 층 정보
      @objc public let lat: Double                                            // 장소의 위도
      @objc public let lng: Double                                            // 장소의 경도
      @objc public let accuracy: Double                                       // 정확도 (accuracy > threshold 비교 필요)
      @objc public let threshold: Double                                      // 한계치
      @objc public let client_code: String?                           // 고객사 코드 (Nullable)
      @objc public let category: String                                       // 장소 카테고리
      @objc public let category_code: String                          // 장소 카테고리 코드
      @objc public let address: String?                                       // 장소 (구) 주소 (Nullable)
      @objc public let address_road: String?                          // 장소 (도로명) 주소 (Nullable)
      @objc public let post: String?                                          // 장소 우편번호 (Nullable)
      
      • accuracy > threshold: 현재 위치 내에 있는 경우
      • 그 외에 경우: 현재 위치 근처에 있는 경우
    • Area : 상권 정보 (PlengiResponse.Area 클래스, response.area로 획득 가능)

      • 장소 위치 요청한 장소가 상권 안일 경우 상권 정보가 인식 결과에 함께 같이 전달됩니다.
      • 위도 및 경도는 아래의 조건으로 결과가 전달됩니다.

        • 장소 인식 결과값이 있다면 -> 인식된 장소 위도/경도
        • 장소 인식 결과값이 없으면 -> device의 위도/경도
      @objc public let id: Int                                                        // 상권 ID
      @objc public let name: String                                           // 상권 이름
      @objc public let tag: String                                            // 상권 지역
      @objc public let lat: Double                                            // 상권 위도
      @objc public let lng: Double                                            // 상권 경도
      
    • Complex : Complex(복합몰) 정보 (PlengiResponse.Complex 클래스, response.complex로 획득 가능)

      • 인식된 장소가 복합몰 내인 경우 복합몰 정보도 함께 인식 결과에 포함되어 전달됩니다.
      @objc public let id: Int                                        // 복합몰 ID
      @objc public let name: String                           // 복합몰 이름
      @objc public let branch_name: String            // 복합몰 지점
      @objc public let category: String                       // 복합몰 카테고리
      @objc public let category_code: String          // 복합몰 카테고리 코드
      
    • GeoFence : Geofence & Fence (PlengiResponse.Geofence 클래스, response.geofence 결과 전달), fence 정보는 geofence에 포함되어 전달

      class GeoFence {
          @objc public let lat: Double                                // Geofence 위도
          @objc public let lng: Double                                // Geofence 경도
          @objc public let fences: Array<Fence>               // 하위 fence 리스트
      }
      
      class Fence {
          @objc public let gfid: Int                                  // fence ID
          @objc public let name: String                               // fence 이름
          @objc public let dist: Double                               // fence 중심 좌표와 사용자 위치 간 거리
          @objc public let client_code: String                // fence의 대한 Client Code
      }
      
    • District : 행정구역 (PlengiResponse.District 클래스, response.district 결과 전달)

      class District {
          @objc public let lv0_code: String           // 국가 코드, code만 지원
          @objc public let lv1_code: String           // 시, 도
          @objc public let lv1_name: String           //
          @objc public let lv2_code: String           // 시, 구, 군
          @objc public let lv2_name: String           //
          @objc public let lv3_code: String           // 읍, 동, 면
          @objc public let lv3_name: String           //
      }
      

loplat X 연동하기

loplat X를 사용하기 위해서는 등록이 필요합니다.

미등록 시 서비스 이용에 제한이 발생할 수 있습니다. 자세한 사항은 로플랫 비즈니스팀에 문의 바랍니다.

  • loplat X 를 통해 로컬 알림(APNs를 사용한 푸쉬 메시지가 아님) (광고 및 알림 메시지)를 받기 위해서는 마케팅 알림 설정 메뉴와 Plengi.initialize 전에 아래와 같은 코드 작성이 필요합니다.
  • 직접 구현한 Notification을 사용을 원하는 경우 (아래 코드 참조), 광고 정보 값은 장소 인식 결과 내의 Advertisement(response.advertisement)를 확인하면 됩니다.

마케팅 알림 설정이 On인 경우 - loplat X 사용 설정하기

SDK에서 loplat X 를 사용하기 위해 함수를 호출해줍니다.

enableNoti는 광고정보의 처리대상을 결정합니다.
TRUE일 경우, SDK에서 광고정보를 직접 iOS알림으로 유저에게 알립니다, (기본값)
FALSE일 경우, 광고 알림을 클라이언트앱에서 직접 관리할 수 있으며, SDK에서 처리하지 않습니다.

loplat X 사용 설정 - 클라이언트 앱에서 직접 광고정보 처리

[Plengi enableAdNetwork:YES enableNoti:NO];
Plengi.enableAdNetwork(true, enableNoti: false)

loplat X 사용 설정 - SDK에서 광고정보 처리

[Plengi enableAdNetwork:YES enableNoti:YES];
Plengi.enableAdNetwork(true, enableNoti: true)

마케팅 알림 설정이 Off인 경우 - loplat X 비활성화하기

사용자가 푸시알림 동의를 하지 않을경우 등, 특정 시나리오에 따라 광고 수신을 허용하지 않을 경우, 아래의 코드를 추가하여 loplat X 사용을 중지합니다.

[Plengi enableAdNetwork:NO enableNoti:NO];
Plengi.enableAdNetwork(false, enableNoti: false)

알림 권한이 허용된 후, SDK에서 loplat X 광고 수신을 사용하기 위해서 시스템에 이벤트를 등록해야 합니다.

AppDelegate 클래스에 application_handleActionWithIdentifier 이벤트를 추가하고, 아래의 코드를 추가해주세요.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
if (@available(iOS 10.0, *)) {
  UNUserNotificationCenter.currentNotificationCenter.delegate = self;
}

- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
    forLocalNotification:(UILocalNotification *)notification
        completionHandler:(void (^)())completionHandler {
  [Plengi processLoplatAdvertisement:application
          handleActionWithIdentifier:identifier
                      for:notification
              completionHandler:completionHandler];
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
      willPresentNotification:(UNNotification *)notification
        withCompletionHandler:(void  (^)(UNNotificationPresentationOptions))
      completionHandler API_AVAILABLE(ios(10.0)) {

  completionHandler(UNNotificationPresentationOptionAlert |
            UNNotificationPresentationOptionBadge |
            UNNotificationPresentationOptionSound);

  // iOS 10 이상에서도 포그라운드에서 알림을 띄울 수 있도록 하는 코드
  // (가이드에는 뱃지, 소리, 경고 를 사용하지만, 개발에 따라 빼도 상관 무)
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
      withCompletionHandler:(void  (^)(void))completionHandler API_AVAILABLE(ios(10.0)) {

  [Plengi processLoplatAdvertisement:center
              didReceive:response
              withCompletionHandler:completionHandler];
  completionHandler();
  // loplat SDK가 사용자의 알림 트래킹 (Click, Dismiss) 를 처리하기 위한 코드
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
if #available(iOS  10.0, *) {
  UNUserNotificationCenter.current().delegate = self
}

func application(_ application: UIApplication,
                  handleActionWithIdentifier identifier: String?,
                  for notification: UILocalNotification,
                  completionHandler: @escaping () -> Void)
  Plengi.processLoplatAdvertisement(application,
                                      handleActionWithIdentifier: identifier,
                                      for: notification,
                                      completionHandler: completionHandler)
}

@available(iOS 10.0,  *)
func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping ()  ->  Void) {
  Plengi.processLoplatAdvertisement(center,
                                      didReceive: response,
                                      withCompletionHandler: completionHandler)
  completionHandler()

  // loplat SDK가 사용자의 알림 트래킹 (Click, Dismiss) 를 처리하기 위한 코드
}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
                            withCompletionHandler completionHandler: @escaping  (UNNotificationPresentationOptions) -> Void) {

  completionHandler([.alert,  .sound,  .badge])
  // iOS 10 이상에서도 포그라운드에서 알림을 띄울 수 있도록 하는 코드
  // (가이드에는 뱃지, 소리, 경고 를 사용하지만, 개발에 따라 빼도 상관 무)
}

샘플앱