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 이상부터 현재 연결되어 있는 와이파이 정보를 가져오기 위해 사용합니다.
  • Background Modes - Location Updates : 백그라운드에서도 위치 정보를 수신하기 위해 사용합니다.

    Access WiFi Information
    Background Modes
    - Location Updates
    

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

XCode에서 권한 허용하기


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

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

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

SDK에는 사용자에게 위치 권한을 요청하는 코드가 포함되어 있지 않습니다.

위치 권한 허용 요청 / 위치 권한 확인 로직 등 은 서비스 시나리오에 맞게 직접 구현하여야 합니다.
시나리오 구성에 도움이 필요하시면 [샘플앱] 을 참고하세요.

프로젝트의 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에서 보면 아래와 같습니다.

XCode에서 권한 허용하기



프로젝트에 로플랫 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.3.3'

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

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

$ pod update
$ pod install

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

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

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

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고객사 별 사용자를 트래킹 할 수 있는 고유 코드 를 인자값으로 넘겨줍니다. 따로 관리하지 않는다면 nil 을 넘길 수 있습니다.

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

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

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

백그라운드에서 자동으로 앱이 살아나기 위해서는 해당 작업이 필수입니다.

이미 application_didFinishLaunchingWithOptions 에서 Plengi.init 를 호출하는 부분이 있다면 해당 단계는 넘겨도 됩니다.

1
2
3
4
5
6
7
8
9
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
	(NSDictionary *)launchOptions {
	if (launchOptions[UIApplicationLaunchOptionsLocationKey]) {
		[Plengi initializeWithClientID:@"로플랫에서 발급받은 클라이언트 아이디"
             		clientSecret:@"로플랫에서 발급받은 클라이언트 키"
						echoCode:@"고객사 별 사용자를 식별할 수 있는 코드 (개인정보 주의바람)"];
	    [Plengi start];
	}
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func application(_ application: UIApplication, didFinishLaunchingWithOptions
	launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
	if ((launchOptions?.index(forKey: UIApplicationLaunchOptionsKey.location)) != nil) {
	// 앱이 백그라운드 모드로 재시작 되었을 때 (필수!!!!! 없으면 재시작 되지 않음)
		_ = Plengi.initialize(clientID: "로플랫에서 발급받은 클라이언트 아이디",
                        clientSecret: "로플랫에서 발급받은 클라이언트 키",
                        echoCode: "고객사 별 사용자를 식별할 수 있는 코드 (개인정보 주의바람)")
		_ = 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
@implementation AppDelegate

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

	if ([plengiResponse result] == ResultSUCCESS) {
		if ([plengiResponse type] == ResponseTypePLACE_EVENT) {
            // refreshPlace() 로 테스트 시, type값은 ResponseTypePLACE 입니다.
			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 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가 틀렸거나 인증되지 않은 사용자가 요청했을 때
	}
}
 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 {
      // refreshPlace() 로 테스트 시, type값은 .PLACE 입니다.
  		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가 틀렸거나 인증되지 않은 사용자가 요청했을 때
  }
}

SDK 구동하기

Start/Stop

  • 사용자 장소/매장 방문 모니터링을 시작하거나 정지 할 수 있습니다.

    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 객체로 전달 됩니다.

    장소 인식 결과에 따라 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 타입 (ENETER, 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		// 복합몰 카테고리 코드
      
    • Advertisement : 광고 (PlengiResponse.Advertisement 클래스, response.advertisement 결과 전달)

      @objc public let body: String				// 광고 내용
      @objc public let campaign_id: Int			// loplat X 캠페인 고유번호
      @objc public let delay: Int					// 광고가 수신되기 전 딜레이
      @objc public let delay_type: String			// 광고 수신되기 전 딜레이 종류 (enter, leave)
      @objc public let img: String				// 광고에 포함된 이미지 URL
      @objc public let intent: String				// 광고를 클릭했을 때의 이벤트
      @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
      
    • 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 를 통해 푸쉬 메시지 (광고 및 알림 메시지)를 받기 위해서는 광고 알림 허용을 한 시점에 아래와 같이 코드 작성이 필요 합니다.
  • 직접 구현한 Notification을 사용을 원하는 경우 (아래 코드 참조), 광고 정보 값은 장소 인식 결과 내의 Advertisement(response.advertisement)를 확인하면 됩니다.

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)

loplat X 비활성화하기

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

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

알림 권한 획득하기

기본적으로 loplat X는 알림 기능을 사용하기 때문에, 알림 권한이 있어야만 정상 작동합니다.
아래는 알림 권한을 요청하는 예시 코드입니다.

1
2
3
4
5
6
7
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
  [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert |
                                            UNAuthorizationOptionBadge |
                                            UNAuthorizationOptionSound)
    completionHandler:^(BOOL granted, NSError * _Nullable error) {

}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
if #available(iOS 10, *) {
	UNUserNotificationCenter.current()
		.requestAuthorization(options:[.badge, .alert, .sound]) { (granted,error) in}
	UIApplication.shared.registerForRemoteNotifications()
}
else {
	UIApplication.shared.registerUserNotificationSettings(
		UIUserNotificationSettings(types: [.badge, .sound, .alert],
                                   categories: nil))
    UIApplication.shared.registerForRemoteNotifications()
}

알림 권한이 허용된 후, 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 이상에서도 포그라운드에서 알림을 띄울 수 있도록 하는 코드
  // (가이드에는 뱃지, 소리, 경고 를 사용하지만, 개발에 따라 빼도 상관 무)
}

샘플앱