/
BuzzAd-Benefit iOS SDK ์—ฐ๋™ ๊ฐ€์ด๋“œ

BuzzAd-Benefit iOS SDK ์—ฐ๋™ ๊ฐ€์ด๋“œ

๋ณธ ์—ฐ๋™ ๊ฐ€์ด๋“œ๋Š” BuzzAd-Benefit SDK๋ฅผ iOS Application ๋‚ด์— ์‚ฝ์ž…ํ•จ์œผ๋กœ์จ ํผ๋ธ”๋ฆฌ์…”๊ฐ€ ์›ํ•˜๋Š” ์ง€๋ฉด์— ๋ฆฌ์›Œ๋“œ๊ฐ€ ์ง€๊ธ‰๋˜๋Š” ๊ด‘๊ณ ๋ฅผ ๋„์šฐ๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ๊ด‘๊ณ ์™€ ๋™์˜์ƒ ๊ด‘๊ณ ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์ปค์Šคํ…€ UI ์š”์†Œ๋ฅผ ํ†ตํ•ด ๊ด‘๊ณ ๊ฐ€ ํผ๋ธ”๋ฆฌ์…” ์•ฑ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋…น์•„๋“ค๊ฒŒ ํ•˜๋ฉด์„œ ๋™์‹œ์— ๋งค์ถœ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Index

Getting Started


SDK๋ฅผ ์•ฑ์— ์—ฐ๋™ํ•˜๊ธฐ ์ „, ์•„๋ž˜ ์‚ฌํ•ญ์„ ๋จผ์ € ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Buzzvil์˜ BD ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ app_id

  • BD ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ unit_id (์›ํ•˜๋Š” Type ์— ๋งž๋Š” unit_id ์ˆ˜๋ น)

  • Buzzvil ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํฌ์ธํŠธ ์ ๋ฆฝ ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋งค์ฒด์‚ฌ API ์„œ๋ฒ„

ย 

Installation

๋‹ค์Œ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด, ์‹ค์ œ ๊ตฌํ˜„์— ์‚ฌ์šฉ๋œ ์˜ˆ์ œ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: github sample code (๋งํฌ)


1. Cocoapods ์‚ฌ์šฉ (๊ถŒ์žฅ)

Podfile์— ์•„๋ž˜ ์ฝ”๋“œ ์ถ”๊ฐ€

  • pod 'BuzzAdBenefit', '์—ฐ๋™ํ•˜๋ ค๋Š” ๋ฒ„์ „'์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.

pod 'BuzzAdBenefit', '~> 1.3.0'

ย 

2. Manual Import

cocoa pods ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์•„๋ž˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ง„ํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

step 1) ํ”„๋กœ์ ํŠธ์— framework ์ถ”๊ฐ€

[ํ”„๋กœ์ ํŠธ ๋ฉ”๋‰ด] -> [General] -> [Embedded Binaries] ์„น์…˜์— ๋‹ค์Œ framework๋“ค์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • BuzzAdBenefit.framework

  • BuzzAdBenefitNative.framework

  • BuzzAdBenefitInterstitial.framework (Interstitial type์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ)

  • BuzzAdBenefitFeed.framework (Feed type์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ)

  • AFNetworking.framework

  • SDWebImage.framework

  • libwebp.framework

(AFNetworking.framework, SDWebImage.framework, libwebp.framework๋Š” ๋ณธ ์ €์žฅ์†Œ Dependencies ํด๋”์—์„œ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

ย 

step 2) Run script ์ถ”๊ฐ€

[ํ”„๋กœ์ ํŠธ ๋ฉ”๋‰ด] -> [Build Phases] ํƒญ์—์„œ '+' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ New Run Script Phase๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ universal framework๋กœ ๋นŒ๋“œ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ๋ถˆํ•„์š”ํ•œ architecture๋“ค์„ ๋–ผ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ย 

APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK; do FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" EXTRACTED_ARCHS=() for ARCH in $ARCHS; do echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") done echo "Merging extracted architectures: ${ARCHS}" lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" rm "${EXTRACTED_ARCHS[@]}" echo "Replacing original executable with thinned version" rm "$FRAMEWORK_EXECUTABLE_PATH" mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" done

ย 

SDK Initialization


Step 1: Initialize BuzzAdBenefit

AppDelegate์˜ application:didFinishLaunchingWithOptions์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋‚˜, ์ตœ์ดˆ ๊ด‘๊ณ  ์š”์ฒญ ์ „์—๋งŒ ๋ถˆ๋ฆฐ๋‹ค๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ฝ”๋“œ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • YOUR_APP_ID ๋ถ€๋ถ„์— ์œ„ ๋‹จ๊ณ„์—์„œ ์ค€๋น„ํ•œ app_id ์‚ฝ์ž…


// Objective-C BABConfig *config = [[BABConfig alloc] initWithAppId:YOUR_APP_ID]; [BuzzAdBenefit initializeWithConfig:config];

ย 

// Swift let config = BABConfig(appId: YOUR_APP_ID) BuzzAdBenefit.initialize(with: config)

ย 

Step 2: Set UserProfile of the user

์œ ์ €๊ฐ€ ํผ๋ธ”๋ฆฌ์…” ์•ฑ์— ๋กœ๊ทธ์ธํ•œ ์‹œ์ ์— ์•„๋ž˜์™€ ๊ฐ™์ด UserProfile ์„ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.

โ€ป ์ฃผ์˜์‚ฌํ•ญ

User ID์™€ ํƒ€๊ฒŒํŒ… ์ •๋ณด (์„ฑ๋ณ„, ์—ฐ๋ น)๋Š” ์›ํ™œํ•œ ์„œ๋น„์Šค ์šด์˜์„ ์œ„ํ•ด ์ œ๊ณตํ•ด์•ผ ํ•  ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ’์„ ์ž…๋ ฅํ•˜๋Š” setUserProfile ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์œผ๋ฉด ๊ด‘๊ณ ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

  • userId (Required): ๋งค์ฒด์‚ฌ ์„œ๋น„์Šค ์œ ์ €๋ฅผ unique ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹๋ณ„๊ฐ’

    • ๋งค์ฒด์‚ฌ ์„œ๋น„์Šค์—์„œ ์œ ๋‹ˆํฌํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ์œ ์ €์— ๋Œ€ํ•˜์—ฌ, userId ๊ฐ’์ด ๋ณต์ˆ˜ ๊ฐœ ์—ฐ๋™๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ๊ฒฝ์šฐ ์‚ฌ์ „์— BD ๋งค๋‹ˆ์ €์™€ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์˜ˆ: ๋งค์ฒด์‚ฌ ์•ฑ ์‚ญ์ œ ํ›„ ์žฌ์„ค์น˜ ์‹œ userId ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ

  • gender

    • BABUserGenderMale: ๋‚จ์„ฑ

    • BABUserGenderFemale: ์—ฌ์„ฑ

  • birthYear: ์ถœ์ƒ๋…„๋„


// Objective-C BABUserProfile *userProfile = [[BABUserProfile alloc] initWithUserId:YOUR_SERVICE_USER_ID birthYear:1985 gender:BABUserGenderMale]; [BuzzAdBenefit setUserProfile:userProfile];
// Swift let userProfile = BABUserProfile(userId: YOUR_SERVICE_USER_ID, birthYear: 1985, gender: BABUserGenderMale) BuzzAdBenefit.setUserProfile(userProfile)

ย 

โ€ป ์ฃผ์˜์‚ฌํ•ญ

Step 1, 2๋ฅผ ํ†ตํ•ด ์„ธ์…˜ํ‚ค ๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜๋ฉด BABSessionRegisteredNotification notification์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ํ‚ค๋Š” SDK๊ฐ€ ๊ด‘๊ณ ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์„œ๋ฒ„ API Key๋กœ์„œ ์„ธ์…˜ํ‚ค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๊ด‘๊ณ  ๋กœ๋“œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Step 2 ์™€ ๊ด‘๊ณ  ์š”์ฒญ ์‹œ์ ๊ฐ„ ๊ฐ„๊ฒฉ์ด ์งง์€ ๊ฒฝ์šฐ ์ด notification์„ observeํ•˜์—ฌ ์„ธ์…˜ํ‚ค ๋“ฑ๋ก์„ ํ™•์ธํ•œ ํ›„ ๊ด‘๊ณ  ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

// Objective-C [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadBABAd) name:BABSessionRegisteredNotification object:nil];
// Swift NotificationCenter.default.addObserver(self, selector: #selector(loadBABAd), name: NSNotification.Name.BABSessionRegistered, object: nil)

ย 

iOS 14 ์ด์ƒ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ App Tracking Transparency ๊ถŒํ•œ ํ—ˆ์šฉ ํŒ์—…์„ ๋…ธ์ถœํ•˜๋ ค๋ฉด setUserProfile์˜ ์ธ์ž๋กœ shouldShowAppTrackingTransparencyDialog ๊ฐ’์„ true๋กœ ํ•˜์—ฌ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(SDK 1.3.3 ์ด์ƒ). ๊ทธ๋ฆฌ๊ณ  ์•ฑ์˜ info.plist ํŒŒ์ผ์— NSUserTrackingUsageDescription ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ถŒํ•œ ํ—ˆ์šฉ ํŒ์—…์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์งˆ ๋ฉ”์„ธ์ง€๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

ํ•ด๋‹น ํŒ์—…์€ ์•„์ง ๊ถŒํ•œ ํ—ˆ์šฉ ์—ฌ๋ถ€๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์— ํ•œํ•˜์—ฌ ์ตœ์ดˆ 1ํšŒ๋งŒ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Step 3: Set UserPreference of the user

์œ ์ €๊ฐ€ ํผ๋ธ”๋ฆฌ์…” ์•ฑ์— ๋กœ๊ทธ์ธํ•œ ์‹œ์ ์— UserPreference๋ฅผ ๋นŒ๋“œํ•˜์—ฌ BuzzAdBenefit SDK์— ํ•ด๋‹น ๊ฐ’์„ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.

  • autoplayType: ๋™์˜์ƒ ๊ด‘๊ณ ์— ๋Œ€ํ•œ ์ž๋™์žฌ์ƒ ์˜ต์…˜์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. AutoplayType ์˜ ์„ค์ •๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • BABVideoAutoPlayEnabled: ๋™์˜์ƒ ๊ด‘๊ณ ๊ฐ€ Wifi, LTE ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ํ•ญ์ƒ ์ž๋™์žฌ์ƒ๋จ

    • BABVideoAutoPlayOnWifi: ๋™์˜์ƒ ๊ด‘๊ณ ๊ฐ€ Wifi ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋งŒ ์ž๋™์žฌ์ƒ๋จ (Default)

    • BABVideoAutoPlayDisabled: ๋™์˜์ƒ ๊ด‘๊ณ ๊ฐ€ ์ž๋™์žฌ์ƒ๋˜์ง€ ์•Š์Œ


// Objective-C BABUserPreference *userPreference = [[BABUserPreference alloc] initWithAutoPlayType:BABVideoAutoPlayEnabled]; [BuzzAdBenefit setUserPreference:userPreference];

ย 

// Swift let userPreference = BABUserPreference(autoPlayType: BABVideoAutoPlayEnabled) BuzzAdBenefit.setUserPreference(userPreference)

ย 

Step 4. Delete user setting

์œ ์ €๊ฐ€ ํผ๋ธ”๋ฆฌ์…” ์•ฑ์—์„œ ๋กœ๊ทธ์•„์›ƒํ•˜๋Š” ์‹œ์ ์— UserProfile ๋ฐ UserPreferences ์„ค์ •๊ฐ’์„ ์ง€์›Œ ์œ ์ €์˜ ์‚ฌ์šฉ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.


// Objective-C [BuzzAdBenefit setUserProfile:nil]; [BuzzAdBenefit setUserPreference:nil];

ย 

// Swift BuzzAdBenefit.setUserProfile(nil) BuzzAdBenefit.setUserPreference(nil)

ย 

Step 5. Proceed to the next step

BuzzAd Benefit ๊ด‘๊ณ ๋ฅผ ๋…ธ์ถœ์‹œํ‚ฌ ๊ณต๊ฐ„์— ์ ํ•ฉํ•œ ์—ฐ๋™ ํƒ€์ž…์„ ์„ ํƒํ•˜์—ฌ ๋‚˜๋จธ์ง€ ์—ฐ๋™์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • Type A - Native Ads : ์ธ์•ฑ ๋””์ž์ธ๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šฐ๋Ÿฌ์ง€๋„๋ก ๊ด‘๊ณ ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ

  • Type B - Feed : ๋ฒ„ํŠผ ๋“ฑ ๋ณ„๋„์˜ ์ง„์ž… ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๊ด‘๊ณ  ๋ชฉ๋ก์„ ๋…ธ์ถœ์‹œํ‚ค๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ

  • Type C - Interstitial : ๋ฒ„์ฆˆ๋นŒ์ด ์‚ฌ์ „์— ๋งŒ๋“ค์–ด ๋†“์€ ๋ ˆ์ด์•„์›ƒ์„ ํ™œ์šฉํ•˜์—ฌ Dialog ๋˜๋Š” BottomSheet ํ˜•ํƒœ๋กœ ์ „๋ฉด ๊ด‘๊ณ ๋ฅผ ๋…ธ์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ

ย 

Advanced Usage


๊ด‘๊ณ  ์‹คํ–‰ Customization - Custom Launcher ์‚ฌ์šฉ

๊ด‘๊ณ  ์‹คํ–‰์„ Customize ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด‘๊ณ  ๋žœ๋”ฉ ํŽ˜์ด์ง€ ๋กœ๋“œ ๋“ฑ์„ ๋งค์ฒด์‚ฌ๊ฐ€ ์ง€์ •ํ•˜๋Š” Class์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€ป ์ฃผ์˜์‚ฌํ•ญ

Launcher์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ฆญ URI๋Š” ์ž„์˜๋กœ Decoding ํ•ด์„œ ๋กœ๋“œํ•˜๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ์˜ ๋™์ž‘์ด ๋‹ฌ๋ผ์ ธ ๊ด‘๊ณ  ๊ด€๋ จ ํ†ต๊ณ„๊ฐ€ ์ œ๋Œ€๋กœ ์ง‘๊ณ„๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. BABLauncher ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
    openUrl:object:userInfo ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ๋„˜์–ด์˜ค๋Š” object๋Š” BABAd ๋˜๋Š” BABArticle ๊ฐ์ฒด๋ฅผ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.


    // Objective-C @interface BABCustomLauncher : NSObject <BABLauncher> @end @implementation BABCustomLauncher - (void)openUrl:(NSURL *)url object:(id)object userInfo:(nullable NSDictionary *)userInfo { if ([object isKindOfClass:BABAd.class]) { BABAd *ad = object; NSString *unitId = ad.unitId; NSString *title = ad.creative.title; } ... [UIApplication.sharedApplication openURL:url options:@{} completionHandler:nil]; } @end

    ย 

    // Swift class BABCustomLauncher: NSObject, BABLauncher { func open(_ url: URL, object: Any?, userInfo: [AnyHashable : Any]? = nil) { if let ad = object as? BABAd { let unitId = ad.unitId let title = ad.creative.title } ... UIApplication.shared.open(url, options: nil, completionHandler: nil) } }



  2. BuzzAdBenefit์— Launcher๋ฅผ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.


    // Objective-C BABCustomLauncher *launcher = [[BABCustomLauncher alloc] init]; [BuzzAdBenefit setLauncher:launcher];

    ย 

    // Swift let adLauncher = BABCustomLauncher() BuzzAdBenefit.setLauncher(launcher)

โ€ป ์ฃผ์˜์‚ฌํ•ญ

๋‹ค์–‘ํ•œ ๊ด‘๊ณ ์˜ ํŠน์„ฑ์ƒ ๊ด‘๊ณ ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋”ฅ๋งํฌ๊ฐ€ ๋™์ž‘ํ•˜์—ฌ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ด‘๊ณ ์ฃผ์˜ ์•ฑ์œผ๋กœ ์ดํƒˆํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Launcher ์‚ฌ์šฉ์‹œ ์œ ์ €๊ฐ€ ๊ด‘๊ณ  ํด๋ฆญ ํ›„ ๊ด‘๊ณ ์ฃผ ์•ฑ ํ™”๋ฉด์—์„œ ๋’ค๋กœ๊ฐ€๊ธฐ ํ˜น์€ Back ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์ฒ˜์Œ ๊ด‘๊ณ ๊ฐ€ ๋ณด์ด๋Š” ํ™”๋ฉด์œผ๋กœ ์ œ๋Œ€๋กœ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €์˜ ๋™์ž‘์ด ๊ตฌํ˜„ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ด‘๊ณ ์ฃผ ์•ฑ์œผ๋กœ ์ดํƒˆํ•˜๊ฒŒ ๋˜๋Š” ๋”ฅ๋งํฌ URL ๊ด‘๊ณ ์˜ ๊ฒฝ์šฐ ad.creative.isDeeplink์˜ ๊ฐ’์ด YES๋กœ return ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ย 

Custom launcher ์‚ฌ์šฉ์‹œ ๋”ฅ๋งํฌ ๊ด‘๊ณ  ์ฒ˜๋ฆฌ ๊ฐ€์ด๋“œ

์™ธ๋ถ€ ์•ฑ์œผ๋กœ ๋žœ๋”ฉ๋˜๋Š” ๋”ฅ๋งํฌ ๊ด‘๊ณ ์˜ ๊ฒฝ์šฐ redirect ๊ณผ์ •์„ ๊ฑฐ์ณ ์ตœ์ข…์ ์œผ๋กœ ํƒ€๊ฒŸ ์•ฑ(๋˜๋Š” ์•ฑ์Šคํ† ์–ด)์œผ๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์‹œ ๋ณธ ์•ฑ์œผ๋กœ ๋Œ์•„์™”์„ ๋•Œ redirect๊ฐ€ ์ผ์–ด๋‚ฌ๋˜ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋นˆ ํŽ˜์ด์ง€์ธ ์ƒํƒœ๋กœ ์—ด๋ ค์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž์—ฐ์Šค๋Ÿฌ์šด UX๋ฅผ ์œ„ํ•˜์—ฌ ์™ธ๋ถ€ ์•ฑ์œผ๋กœ ๋žœ๋”ฉ๋˜๋Š” ๊ด‘๊ณ ์˜ ๊ฒฝ์šฐ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์•„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ ์•ฑ์œผ๋กœ ๋Œ์•„์™”์„ ๋•Œ ๋นˆ ํ™”๋ฉด์„ ๋ณด์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์•„๋ž˜ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜์—ฌ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์—์„œ ์ผ์–ด๋‚˜๋Š” redirect๋ฅผ ๋ชจ๋‹ˆํ„ฐํ•˜์—ฌ http/https๊ฐ€ ์•„๋‹Œ scheme์ด ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ ํƒ€๊ฒŸ ์•ฑ์ด ์—ด๋ฆฐ ๋’ค ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  2. Ad ์•ˆ์˜ Creative ๊ฐ์ฒด๊ฐ€ ๊ฐ€์ง„ isDeeplink ํ•„๋“œ(ad.creative.isDeeplink)๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ ค์žˆ๋Š” ์ƒํƒœ์—์„œ ๋ณธ ์•ฑ์„ ์ดํƒˆํ–ˆ์„ ๋•Œ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋„๋ก ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„์ฆˆ๋นŒ์—์„œ๋Š” ๊ฐ ๊ด‘๊ณ ์˜ ๋žœ๋”ฉ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์ฒดํฌํ•˜์—ฌ ๋”ฅ๋งํฌ ๊ด‘๊ณ ์ธ ๊ฒฝ์šฐ isDeeplink๋ฅผ true๋กœ, ์ผ๋ฐ˜ ์›น ๋žœ๋”ฉ ๊ด‘๊ณ ์ธ ๊ฒฝ์šฐ isDeeplink๋ฅผ false๋กœ ๋‚ด๋ ค์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ isDeeplink๊ฐ€ true์ธ ๊ด‘๊ณ ๊ฐ€ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๋กœ ์—ด๋ ค์žˆ๋Š” ์ƒํƒœ์—์„œ ๋ณธ ์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋‚ด๋ ค๊ฐ„ ๊ฒฝ์šฐ ํƒ€๊ฒŸ ์•ฑ์œผ๋กœ ์ด๋™ํ•œ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ์ธ์•ฑ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋‹ซ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ย 

Custom launcher ์‚ฌ์šฉ์‹œ Article์˜ sourceUrl ์‚ฌ์šฉ๋ฒ•

์ปจํ…์ธ ์˜ ๊ฒฝ์šฐ url scheme์— ๋”ฐ๋ผ ๋žœ๋”ฉ ๋ฐฉ์‹์„ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด(ex. ์•ฑ ์•ˆ์—์„œ ๋ธŒ๋ผ์šฐ์ € ์˜คํ”ˆ ์—†์ด ๋‹ค๋ฅธ ํ™”๋ฉด์œผ๋กœ ์ด๋™๋˜๋Š” ์ปจํ…์ธ ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœย NativeArticleย ๊ฐ์ฒด์˜ย sourceUrl์„ ๊ฐ€์ ธ์™€ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

// Objective-C - (void)openUrl:(NSURL *)url object:(id)object userInfo:(nullable NSDictionary *)userInfo { if ([object isKindOfClass:BABArticle.class]) { BABArticle *article = object; NSString *sourceUrl = article.sourceUrl; ... } }

ย 

// Swift func open(_ url: URL, object: Any?, userInfo: [AnyHashable : Any]? = nil) { if let article = object as? BABArticle { let sourceUrl = article.sourceUrl ... } }

ย 

๊ด‘๊ณ  ๋กœ๋“œ ์‹คํŒจ์‹œ ์—๋Ÿฌ ์ •๋ณด ํ™•์ธ

๊ด‘๊ณ  ๋กœ๋“œ ์‹คํŒจ์‹œ ๋ถˆ๋ฆฌ๋Š” ์ฝœ๋ฐฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜์–ด์˜ค๋Š” BABError ๊ฐ์ฒด์˜ code ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์—๋Ÿฌ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

typedef enum { BABUnknownError = 0, BABServerError, BABInvalidRequest, BABRequestTimeout, BABEmptyResponse } BABErrorCode;

ย 

์•ก์…˜ํ˜• ๊ด‘๊ณ ์— ๋Œ€ํ•œ ์œ ์ € VOC ํŽ˜์ด์ง€

BuzzAd Benefit SDK๋Š” ๋น„๋””์˜ค, ์•ฑ ์ธ์Šคํ†จ, ํŽ˜์ด์Šค๋ถ ํŽ˜์ด์ง€ ์ข‹์•„์š” ๋“ฑ ๋‹ค์–‘ํ•œ ์œ ์ € ์•ก์…˜์— ๋ฆฌ์›Œ๋“œ๋ฅผ ์ง€๊ธ‰ํ•˜๋Š” ๊ด‘๊ณ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ๊ด‘๊ณ ์˜ ๊ฒฝ์šฐ ์ข…์ข… ๋ฆฌ์›Œ๋“œ ๋ฏธ์ ๋ฆฝ์„ ์ด์œ ๋กœ ์œ ์ €๊ฐ€ VOC๋ฅผ ๋ณด๋‚ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์œ ์ € VOC์— ๋Œ€ํ•œ ์ ‘์ˆ˜ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™ํ™” ํ•˜๊ธฐ ์œ„ํ•ด SDK์—์„œ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ์›น ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ย 

  1. ์•„๋ž˜ ์˜ˆ์‹œ์™€ ๊ฐ™์ด VOC ํŽ˜์ด์ง€ ๋กœ๋“œ๋ฅผ ์œ„ํ•œ ์œ ์ € ์ง„์ž… Icon/Tab์„ ๋””์ž์ธ ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹จ,ย Type B - Feed๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด์„œ Toolbar๋ฅผ Customize ํ•˜์ง€ ์•Š๊ณ  Default Toolbar๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒฝ์šฐ ์˜ˆ์‹œ ์ค‘ 2๋ฒˆ๊ณผ ๊ฐ™์€ ์•„์ด์ฝ˜์ดย ์ด๋ฏธ ๋””์ž์ธ์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.




  2. 1๋ฒˆ์˜ Icon/Tab์ด ํด๋ฆญ๋  ๋•Œ [BuzzAdBenefit showInquiryPageOnViewController:viewController] ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ย