Client SDK - iOS
Notifly iOS SDK는 노티플라이를 iOS 어플리케이션과 연동하기 위해 사용할 수 있습니다. 다음과 같은 기능들을 지원합니다:
- 기기 정보를 노티플라이에 등록하여 노티플라이를 통해 발송된 앱 푸시, 인앱 팝업을 iOS 앱에서 수신할 수 있습니다.
- 노티플라이의 인앱 팝업은 앱이 Foreground 상태일 때만 수신됩니다. Background 및 Quit 상태일 때는 무시됩니다.
- 이벤트, 유저 정보를 노티플라이와 연동하여 모든 캠페인에서 활용할 수 있습니다.
- 캠페인의 성과를 측정할 수 있도록 이벤트를 로깅합니다.
노티플라이에서는 푸시를 발송하기 위해 Firebase Cloud Messaging을 활용하고 있습니다. 다음 과정을 먼저 진행해주세요:
1. Capability 설정
대상 Project의 iOS Deployment Target과 Target의 Minimum Deployments iOS를 13.0 혹은 그 이상으로 설정합니다.
Push Notification Capability를 추가합니다.
Background Modes Capability를 추가합니다. - Remote notifications과 Background Fetch를 선택합니다.
2. iOS SDK 설치
Notifly iOS SDK는 CocoaPods 또는 Swift Package Manager를 통해 설치할 수 있습니다.
2-1. CocoaPods
- Xcode 프로젝트에 CocoaPods 설치가 되어있는지 확인합니다. 설치가 되어있지 않은 경우 CocoaPods 설치 가이드를 참고해 주세요.
- Podfile 파일의 상단에 platform :ios, '13.0' 또는 그 이상의 버전으로 입력해 주세요.
- Podfile 파일에 다음 코드를 추가해 주세요.
- Podfile
target 'YOUR_PROJECT_NAME' do
pod 'notifly_sdk'
end
2-2. Swift Package Manager
- Xcode 프로젝트에 Swift Package Manager 설치가 되어있는지 확인합니다. 설치가 되어있지 않은 경우 Swift Package Manager 설치 가이드를 참고해 주세요.
- Project's Settings > Package Dependencies > + 버튼을 클릭합니다.
- 다음 URL을 입력하고 Next를 클릭합니다.
https://github.com/team-michael/notifly-ios-sdk
- Add Package를 클릭합니다.
3. Notifly 연동 코드 작성
3-1. (SwiftUI) AppDelegate.swift 파일 수정
만약, SwiftUI프로젝트를 사용하고 계시다면, AppDelegate.swift 파일이 없을 수 있습니다. 이 경우, 다음과 같이 AppDelegate.swift 파일을 생성해 주세요.
이미 존재한다면 3-2로 넘어가 주세요.
- AppDelegate.swift
import UIKit
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
}
- <YOUR_PROJECT_NAME>App.swift
struct <YOUR_PROJECT_NAME>App: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
}
3-2. Notifly 연동 코드 작성
AppDelegate.swift 파일 에서 다음 코드들을 추가해 주세요.
notifly_sdk
프래임워크를 import 합니다.
import notifly_sdk
- 다음 AppDelegate.swift의
UIApplicationDelegate
함수들 내에 각각 Notifly코드를 추가해 주세요.
application(_:didFinishLaunchingWithOptions:)
- Notifly SDK 초기화에 앞서 Firebase SDK를 초기화 합니다. (Required)
- PROJECT_ID, USERNAME, PASSWORD 는 노티플라이 홈페이지의 설정 페이지의 SDK, API 인증정보 섹션에서 확인하실 수 있습니다.
- 개발/프로덕션에 따라 PROJECT_ID가 다릅니다.
- Notifly SDK를 초기화 합니다.
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
- APNs 토큰을 노티플라이에 등록합니다.
application(_:didFailToRegisterForRemoteNotificationsWithError:)
- APNs 토큰 등록에 실패한 경우, 노티플라이에 알립니다.
- Swift
import notifly_sdk
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_: UIApplication,
didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
/* ...YOUR CODE */
FirebaseApp.configure() // if you don't configure Firebase SDK yet.
Notifly.initialize(projectId: "YOUR_PROJECT_NAME", username: "YOUR_USERNAME", password: "YOUR_PASSWORD")
UNUserNotificationCenter.current().delegate = self
return true
}
func application(_ application: UIApplication,
didFailToRegisterForRemoteNotificationsWithError error: Error) {
/* ...YOUR CODE */
Notifly.application(application,
didFailToRegisterForRemoteNotificationsWithError: error)
}
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
/* ...YOUR CODE */
Notifly.application(application,
didRegisterForRemoteNotificationsWithDeviceToken: deviceToken)
}
/* ...YOUR CODE */
}
- 앱 푸시 알림 트래픽을 노티플라이에도 전달하도록
UNUserNotificationCenterDelegate
프로토콜에 다음 코드를 추가합니다.userNotificationCenter(_:willPresent:withCompletionHandler:)
- 앱이 실행 중일 때, 앱 푸시 알림 트래픽을 노티플라이로 전달합니다.
userNotificationCenter(_:didReceive:withCompletionHandler:)
- 앱 푸시 알림 클릭 이벤트를, 노티플라이로 전달합니다.
- Swift
import notifly_sdk
class AppDelegate: UIResponder, UIApplicationDelegate {
/* ...YOUR CODE */
}
// Extension of AppDelegate conforming to the UNUserNotificationCenterDelegate protocol
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ notificationCenter: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completion: () -> Void) {
/* ...YOUR CODE */
Notifly.userNotificationCenter(notificationCenter,
didReceive: response)
/* ...YOUR CODE */
completion()
}
func userNotificationCenter(_ notificationCenter: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completion: (UNNotificationPresentationOptions) -> Void) {
/* ...YOUR CODE */
Notifly.userNotificationCenter(notificationCenter,
willPresent: notification,
withCompletionHandler: completion)
}
}
4. 유저 프로퍼티 등록하기
노티플라이에서는 유저의 아이디 (userId) 및 프로퍼티 (userProperties)를 설정하여 마케팅 캠페인 집행 시에 활용할 수 있습니다.
- 노티플라이에서는 채널 별 푸시 알림 수신 동의 여부를 유저 프로퍼티로 설정하여, 푸시 알림 전송 전에 필터링 할 수 있습니다.
- 카카오 알림톡, 친구톡, 문자 발송을 위해서는 전화번호를 유저 프로퍼티로 설정해야 합니다.
- 이메일 발송을 위해서는 이메일 주소를 유저 프로퍼티로 설정해야 합니다.
- 전화번호와, 이메일의 프로퍼티 필드명은 꼭 각각 $phone_number, $email로 설정해 주세요.
- Notifly SDK 초기화 코드 추가를 마친 후 프로퍼티 등록을 시작해 주세요.
- (권장사항) 로그아웃 시 userId를 nil로 하여 setUserId 호출함으로써 유저의 userId 등록을 해지해 주세요.
- 유저 아이디 등록해지를 호출할 경우, 유저 프로퍼티 및 캠페인 피로도 관리 데이터 등 모든 유저 정보가 삭제됩니다.
4-1. userId 등록
Parameter | Type | Required |
---|---|---|
userId | String | No |
- Swift
import notifly_sdk
// set userId
Notifly.setUserId(userId: "exampleUserId")
// Unregister userId
Notifly.setUserId(userId: nil)
4-2. userProperties 등록
Parameter | Type | Required |
---|---|---|
userProperties | [String:Any] | Yes |
- Swift
import notifly_sdk
let sampleUserProperties = [
"age": 15,
"sex": "male",
"push_allowed": true
] as [String : Any]
Notifly.setUserProperties(userProperties: sampleUserProperties)
5. 이벤트 로깅
- 노티플라이에서는 유저의 행동 등 이벤트를 트래킹하여 캠페인 집행 시 타겟팅에 활용할 수 있습니다. 트래킹 된 이벤트는 푸시 알림 발송 타이밍, 발송 대상 설정 등에 활용할 수 있습니다.
- Notifly SDK 초기화 코드 추가를 마친 후 이벤트 로깅을 시작해 주세요.
- segmentation_event_param_keys를 활용하여 이벤트 변수 (event_params)를 발송 대상 설정 등에 활용할 수 있습니다. 이를 위해서, 발송 대상 설정에 사용할 event params의 특정 field의 key 값을 segmentation_event_param_keys에 지정해주세요.
- 현재는 segmentation_event_param_key를 한 개까지 지원하고 있기 때문에, segmentation_event_param_keys는 길이는 1이하인 List이어야합니다.
5-1. 이벤트 로깅
Parameter | Type | Required |
---|---|---|
eventName | String | Yes |
eventParams | [String:Any] | No |
segmentationEventParamKeys | [String] | No |
- Swift
import notifly_sdk
...
Button(action: {
Notifly.trackEvent(eventName: "click_button_1")
}) {
Text("버튼1")
.padding(5)
.background(Color.red)
.foregroundColor(.white)
.cornerRadius(10)
}
...
Button(action: {
Notifly.trackEvent(
eventName: "ticket_purchase",
eventParams: [
"ticket_name": "exampleTicket",
"ticket_price": 10000,
"ticket_purchase_date": "2021-01-01"
],
segmentationEventParamKeys: ["ticket_name"]
)
}) {
Text("티켓 구매하기")
.padding(5)
.background(Color.black)
.foregroundColor(.white)
.cornerRadius(10)
}
...
6. (권장) Notification Service Extension 설정
- Notifly의 안내에 따라, Notification Service Extension을 설정하시면 다음 기능들이 지원됩니다.
- 푸시 알림에 이미지 및 비디오를 첨부할 수 있습니다.
- 푸시 수신 지표를 수집할 수 있어, 캠페인 성과를 보다 자세하게 확인하실 수 있습니다.
6. 연동 테스트
Client SDK - 연동 Test 섹션에서 테스트를 진행합니다.
7. (Advanced) 푸시 알림 동의 프롬프트
(Advanced) Client SDK - iOS 를 참고해 주세요.
FAQ
Q. 이미 Firebase Cloud Messaging을 사용 중인데 어떻게 해야 할까요?
- A. Notifly iOS SDK는 기존 앱에서 사용하고 있을 수 있는 Firebase Cloud Messaging과 함께 사용하실 수 있습니다.
Q. SwiftUI를 사용하고 있습니다. 연동 후, 앱 푸시는 작동하는데 인앱 팝업이 작동하지 않는데 무엇이 문제일까요?
- A. Info.plist에 FirebaseAppDelegateProxyEnabled를 NO(BOOL)로 설정해주세요.
- A. Firebase 공식 문서에 따르면 특정 문제로 인해 SwiftUI를 사용할 때 FirebaseAppDelegateProxyEnabled를 NO로 설정해야만 정상적으로 작동한다고 합니다.