SDK ์—ฐ๋™

๐Ÿ“˜

Hackle iOS SDK ๋Š” iOS 10 ์ด์ƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.


์˜์กด์„ฑ ์ถ”๊ฐ€

Hackle iOS SDK๋Š” Swift Package Manager์™€ CocoaPods๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

// ...
dependencies: [
    .package(url: "https://github.com/hackle-io/hackle-ios-sdk.git", from: "2.58.0")
],
targets: [
    .target(
        name: "YOUR_TARGET",
        dependencies: ["Hackle"]
    )
],
// ...
pod 'Hackle', '2.58.0'


SDK ์ดˆ๊ธฐํ™”

SDK๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜๋“œ์‹œ HackleApp์„ ์ดˆ๊ธฐํ™” ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. HackleApp์„ ์ดˆ๊ธฐํ™” ํ•˜๊ธฐ ์œ„ํ•ด SDK ํ‚ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • HackleApp์€ SDK์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • SDK ํ‚ค๋Š” ํ•ตํด ์„œ๋น„์Šค์˜ ๋Œ€์‹œ๋ณด๋“œ ์•ˆ์— ์œ„์น˜ํ•œ SDK ์—ฐ๋™ ์ •๋ณด์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™” ์‹œ ํ•ตํด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ์ •๋ณด๋“ค์„ ๊ฐ€์ ธ์™€์„œ SDK์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐํ™”๋Š” ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ดˆ๊ธฐํ™” ์‹œ ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ•˜๋ฉด SDK ์‚ฌ์šฉ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšง

์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ ๋˜๊ธฐ ์ „์— A/B ํ…Œ์ŠคํŠธ, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๊ธฐ๋ณธ ๊ทธ๋ฃน(A), ๊บผ์ง(false)์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

import Hackle

Hackle.initialize(sdkKey: YOUR_APP_SDK_KEY) {
    // SDK ready to use.
}
@import Hackle;

[Hackle initializeWithSdkKey:@"YOUR_APP_SDK_KEY" config:[HackleConfig DEFAULT] completion:^{
    // SDK ready to use.
}];

๊ถŒ์žฅ ์ดˆ๊ธฐํ™” ์ „๋žต: ๋กœ๋”ฉ ํ™”๋ฉด์„ ํ†ตํ•œ ์ดˆ๊ธฐํ™”

์•ฑ์„ ์ฆ‰์‹œ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  ์Šคํ”Œ๋ ˆ์‹œ ํ™”๋ฉด์„ ํ‘œ์‹œํ•˜๊ณ  SDK๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„ ์ฝœ๋ฐฑ์„ ํ†ตํ•ด ์Šคํ”Œ๋ ˆ์‹œ ํ™”๋ฉด์„ ๋‹ซ๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์•ฑ๊ณผ ์ƒํ˜ธ์ž‘์šฉ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.


์ดˆ๊ธฐํ™” ์‹œ ์‚ฌ์šฉ์ž ์ฃผ์ž…

์œ ์ € ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ SDK๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์œ ์ € ์ •๋ณด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ์œ ์ € ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ์œ ์ € ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ Hackle Device ID๋ฅผ device id๋กœ ๊ฐ€์ง€๊ณ  ์œ ์ €๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ“˜

์œ ์ € ์ •๋ณด๋Š” SDK ์ดˆ๊ธฐํ™” ์ดํ›„์—๋„ ์œ ์ € ์ •๋ณด ์„ค์ • ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ž์œ ๋กญ๊ฒŒ ์ˆ˜์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let user = User.builder()
    .userId("142")                  // ์‚ฌ์šฉ์ž ID
    .deviceId("ae2182e0")           // ๋””๋ฐ”์ด์Šค ID
    .build()

Hackle.initialize(sdkKey: YOUR_APP_SDK_KEY, user: user) {
    // SDK ready to use.
}
HackleUserBuilder *builder = [HackleUser builder];
[builder userId:@"142"];                   // ์‚ฌ์šฉ์ž ID
[builder deviceId:@"ae2182e0"];            // ๋””๋ฐ”์ด์Šค ID
HackleUser *user = [builder build];

[Hackle initializeWithSdkKey:@"YOUR_APP_SDK_KEY" user:user completion:^{
    // SDK ready to use.
}];

์ดˆ๊ธฐํ™” ์„ค์ •์ •๋ณด

์„ค์ •์ •๋ณด๋ฅผ ํฌํ•จํ•˜์—ฌ SDK๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

let config = HackleConfigBuilder()
  .build()

Hackle.initialize(sdkKey: YOUR_APP_SDK_KEY, config: config) {
    // SDK ready to use.
}
HackleConfigBuilder *builder = [[HackleConfigBuilder alloc] init];
[builder exposureEventDedupIntervalSeconds:1];
HackleConfig *config = [builder build];

[Hackle initializeWithSdkKey:@"YOUR_APP_SDK_KEY" config:config completion:^{
    // SDK ready to use.
}];

์„ค์ • ์˜ต์…˜

์„ค์ •

๊ธฐ๋Šฅ

๊ธฐ๋ณธ๊ฐ’

์ง€์› ๋ฒ„์ „

exposureEventDedupIntervalSeconds

๋™์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์—ฐ์†์œผ๋กœ ๋ฐœ์ƒ์‹œํ‚จ ๋™์ผํ•œ A/B ํ…Œ์ŠคํŠธ, ๊ธฐ๋Šฅํ”Œ๋ž˜๊ทธ ๋ถ„๋ฐฐ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๋…ธ์ถœ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ตœ์†Ÿ๊ฐ’: 1 ์ตœ๋Œ“๊ฐ’:

  • ~2.40.1 : 3600 (1์‹œ๊ฐ„)
  • 2.41.0~ : 86400(24์‹œ๊ฐ„)

60 (1๋ถ„)

2.7.0+ (2.41.0 ์ดํ›„๋ถ€ํ„ฐ ์•ฑ ์ข…๋ฃŒ ํ›„ ์žฌ์‹œ์ž‘ ์‹œ์—๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.)

eventFlushInterval

์ˆ˜์ง‘๋œ ์ด๋ฒคํŠธ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜๋Š” ์ฃผ๊ธฐ์ž…๋‹ˆ๋‹ค.

์ตœ์†Ÿ๊ฐ’: 1 ์ตœ๋Œ“๊ฐ’: 60 (1๋ถ„)

10

2.10.0+

sessionTimeoutIntervalSeconds

์„ธ์…˜๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1800 (30๋ถ„)

2.13.0+

pollingIntervalSeconds

๋Œ€์‹œ๋ณด๋“œ์—์„œ ์„ค์ •ํ•œ ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ตœ์†Ÿ๊ฐ’ : 60 (1๋ถ„)

-1 (์ฃผ๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์Œ)

2.18.0+

automaticScreenTracking

์ž๋™ ํ™”๋ฉด ์ถ”์  ํ™œ์„ฑํ™” ์—ฌ๋ถ€

true

2.34.0+


์ธ์Šคํ„ด์Šค ๊ฐ€์ ธ์˜ค๊ธฐ

์ดˆ๊ธฐํ™” ์ดํ›„ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด HackleApp ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ์ด์ „์— ํ˜ธ์ถœํ•˜๋ฉด nil์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™” ์ดํ›„ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

let hackleApp = Hackle.app()
HackleApp *hackleApp = [Hackle app];

๋Œ€์‹œ๋ณด๋“œ ์„ค์ • ์ •๋ณด ๊ฐฑ์‹ 

๋Œ€์‹œ๋ณด๋“œ ์„ค์ • ์ •๋ณด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐฑ์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿšง

ํ•ด๋‹น ํ•จ์ˆ˜๋Š” 60์ดˆ์— ํ•œ๋ฒˆ ์ œํ•œ์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

hackleApp.fetch { 
  // done
}
[hackleApp fetch:^{
    // done
}];