ÿÿ オンボーディング | iOS SDK | Adapty ドキュメント

iOS SDKã§ã‚ªãƒ³ãƒœãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã®ãƒ‡ãƒ¼ã‚¿ã‚’処ç†ã™ã‚‹

SDK v4以é™ã€ã‚ªãƒ³ãƒœãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã®ã‚ˆã‚Šå¼·åŠ›ãªä»£æ›¿ã¨ã—ã¦ãƒ•ローを構築ã§ãã¾ã™ã€‚オンボーディングãŒWebView内ã§å‹•作ã™ã‚‹ã®ã«å¯¾ã—ã€ãƒ•ローã¯ãƒ‡ãƒã‚¤ã‚¹ä¸Šã§ãƒã‚¤ãƒ†ã‚£ãƒ–ã«ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã•れるãŸã‚ã€ã‚¹ãƒ ãƒ¼ã‚ºãªã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã€iOSらã—ã„一貫ã—ãŸãƒ«ãƒƒã‚¯ï¼†ãƒ•ィールã€é«˜é€Ÿãªèª­ã¿è¾¼ã¿ã€WebViewランタイムã¸ã®ä¾å­˜ãŒãªã„ã¨ã„ã£ãŸãƒ¡ãƒªãƒƒãƒˆãŒã‚りã¾ã™ã€‚ã¾ãšã¯ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®å–å¾—ãŠã‚ˆã³ãƒ•ローã¨ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®è¡¨ç¤ºã‚’ã”覧ãã ã•ã„。

ユーザーãŒã‚¯ã‚¤ã‚ºã®è³ªå•ã«å›žç­”ã—ãŸã‚Šã€å…¥åŠ›ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«ãƒ‡ãƒ¼ã‚¿ã‚’入力ã—ãŸã‚Šã™ã‚‹ã¨ã€onStateUpdatedAction メソッドãŒå‘¼ã³å‡ºã•れã¾ã™ã€‚フィールドã®ç¨®é¡žã‚’コード内ã§ä¿å­˜ã—ãŸã‚Šå‡¦ç†ã—ãŸã‚Šã§ãã¾ã™ã€‚

例ãˆã°ï¼š

func onboardingController(_ controller: AdaptyOnboardingController, onStateUpdatedAction action: AdaptyOnboardingsStateUpdatedAction) {
    // ユーザーã®è¨­å®šã‚„回答をä¿å­˜ã™ã‚‹
    switch action.params {
    case .select(let params):
        // å˜ä¸€é¸æŠžã‚’処ç†ã™ã‚‹
    case .multiSelect(let params):
        // è¤‡æ•°é¸æŠžã‚’å‡¦ç†ã™ã‚‹
    case .input(let params):
        // テキスト入力を処ç†ã™ã‚‹
    case .datePicker(let params):
        // æ—¥ä»˜é¸æŠžã‚’å‡¦ç†ã™ã‚‹
    }
}

action オブジェクトã«ã¯ä»¥ä¸‹ãŒå«ã¾ã‚Œã¾ã™ï¼š

パラメーター説明
elementId入力è¦ç´ ã®ä¸€æ„ã®è­˜åˆ¥å­ã€‚ä¿å­˜æ™‚ã«è³ªå•ã¨å›žç­”を関連付ã‘ã‚‹ãŸã‚ã«ä½¿ç”¨ã§ãã¾ã™ã€‚
paramstypeãŠã‚ˆã³valueプロパティをå«ã‚€ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã€‚
params.type入力è¦ç´ ã®ã‚¿ã‚¤ãƒ—。以下ã®ã„ãšã‚Œã‹ã‚’指定ã§ãã¾ã™ï¼š
• "select" - é¸æŠžè‚¢ã‹ã‚‰1ã¤ã‚’é¸æŠž
• "multiSelect" - é¸æŠžè‚¢ã‹ã‚‰è¤‡æ•°ã‚’é¸æŠž
• "input" - テキスト入力フィールド
• "datePicker" - 日付ã®é¸æŠž
params.valueユーザーãŒé¸æŠžã¾ãŸã¯å…¥åŠ›ã—ãŸå€¤ã€‚構造ã¯ã‚¿ã‚¤ãƒ—ã«ã‚ˆã£ã¦ç•°ãªã‚Šã¾ã™ï¼š
• select:idã€valueã€labelã‚’æŒã¤ã‚ªãƒ–ジェクト
• multiSelect:idã€valueã€labelã‚’æŒã¤ã‚ªãƒ–ジェクトã®é…列
• input:typeã€valueã‚’æŒã¤ã‚ªãƒ–ジェクト
• datePicker:dayã€monthã€yearã‚’æŒã¤ã‚ªãƒ–ジェクト
ä¿å­˜ã•れãŸãƒ‡ãƒ¼ã‚¿ã®ä¾‹ï¼ˆå®Ÿè£…ã«ã‚ˆã£ã¦ç•°ãªã‚‹å ´åˆãŒã‚りã¾ã™ï¼‰
// Example of a saved select action
{
    "elementId": "preference_selector",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "preferences_screen",
        "screenIndex": 1,
        "screensTotal": 3
    },
    "params": {
        "type": "select",
        "value": {
            "id": "option_1",
            "value": "premium",
            "label": "Premium Plan"
        }
    }
}

// Example of a saved multi-select action
{
    "elementId": "interests_selector",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "interests_screen",
        "screenIndex": 2,
        "screensTotal": 3
    },
    "params": {
        "type": "multiSelect",
        "value": [
            {
                "id": "interest_1",
                "value": "sports",
                "label": "Sports"
            },
            {
                "id": "interest_2",
                "value": "music",
                "label": "Music"
            }
        ]
    }
}

// Example of a saved input action
{
    "elementId": "name_input",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "profile_screen",
        "screenIndex": 0,
        "screensTotal": 3
    },
    "params": {
        "type": "input",
        "value": {
            "type": "text",
            "value": "John Doe"
        }
    }
}

// Example of a saved date picker action
{
    "elementId": "birthday_picker",
    "meta": {
        "onboardingId": "onboarding_123",
        "screenClientId": "profile_screen",
        "screenIndex": 0,
        "screensTotal": 3
    },
"params": {
    "type": "datePicker",
    "value": {
        "day": 15,
        "month": 6,
        "year": 1990
        }
    }
}

ユースケース

ユーザープロファイルã¸ã®ãƒ‡ãƒ¼ã‚¿ä»˜åŠ 

入力データをユーザープロファイルã¨ã™ãã«ç´ä»˜ã‘ã€åŒã˜æƒ…報を二度èžã‹ãªãã¦æ¸ˆã‚€ã‚ˆã†ã«ã™ã‚‹ã«ã¯ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®å‡¦ç†æ™‚ã«å…¥åŠ›ãƒ‡ãƒ¼ã‚¿ã‚’ä½¿ã£ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ãƒ—ロファイルを更新ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

ãŸã¨ãˆã°ã€IDãŒnameã®ãƒ†ã‚­ã‚¹ãƒˆãƒ•ィールドã§ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«åå‰ã‚’入力ã—ã¦ã‚‚らã„ã€ãã®å€¤ã‚’ユーザーã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ã—ã¦è¨­å®šã—ãŸã„å ´åˆã‚„ã€emailフィールドã§ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ã‚‚らã„ãŸã„å ´åˆã€ã‚¢ãƒ—リã®ã‚³ãƒ¼ãƒ‰ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚

func onboardingController(_ controller: AdaptyOnboardingController, onStateUpdatedAction action: AdaptyOnboardingsStateUpdatedAction) {
    // Store user preferences or responses
    switch action.params {
    case .input(let params):
        // Handle text input
        let builder = AdaptyProfileParameters.Builder()

        // Map elementId to appropriate profile field
        switch action.elementId {
        case "name":
            builder.with(firstName: params.value.value)
        case "email":
            builder.with(email: params.value.value)
        default:
            break
        }

        // Delegate methods are synchronous; kick off the async update in a Task.
        Task {
            do {
                try await Adapty.updateProfile(params: builder.build())
            } catch {
                // handle the error
            }
        }
    default:
        break
    }
}

オンボーディングã®å›žç­”ã«åŸºã¥ã„ã¦ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’カスタマイズã™ã‚‹

オンボーディングã®ã‚¯ã‚¤ã‚ºã‚’活用ã™ã‚‹ã¨ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ãŒã‚ªãƒ³ãƒœãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚’完了ã—ãŸå¾Œã«è¡¨ç¤ºã™ã‚‹ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚‚カスタマイズã§ãã¾ã™ã€‚

ãŸã¨ãˆã°ã€ã‚¹ãƒãƒ¼ãƒ„経験ã«ã¤ã„ã¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«è³ªå•ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚°ãƒ«ãƒ¼ãƒ—ã”ã¨ã«ç•°ãªã‚‹CTAやプロダクトを表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

  1. オンボーディングビルダーã«ã‚¯ã‚¤ã‚ºã‚’追加ã—ã€å„é¸æŠžè‚¢ã«ã‚ã‹ã‚Šã‚„ã™ã„IDを設定ã—ã¾ã™ã€‚
experience.webp
  1. IDã«åŸºã¥ã„ã¦ã‚¯ã‚¤ã‚ºã®å›žç­”を処ç†ã—ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚«ã‚¹ã‚¿ãƒ å±žæ€§ã‚’設定ã—ã¾ã™ã€‚
func onboardingController(_ controller: AdaptyOnboardingController, onStateUpdatedAction action: AdaptyOnboardingsStateUpdatedAction) {
    // Handle quiz responses and set custom attributes
    switch action.params {
    case .select(let params):
        // Handle quiz selection
        let builder = AdaptyProfileParameters.Builder()

        // Map quiz responses to custom attributes
        switch action.elementId {
        case "experience":
            // Set custom attribute 'experience' with the selected value (beginner, amateur, pro)
            try? builder.with(customAttribute: params.value.value, forKey: "experience")
        default:
            break
        }

        // Delegate methods are synchronous; kick off the async update in a Task.
        Task {
            do {
                try await Adapty.updateProfile(params: builder.build())
            } catch {
                // handle the error
            }
        }
    default:
        break
    }
}
  1. カスタム属性値ã”ã¨ã«ã‚»ã‚°ãƒ¡ãƒ³ãƒˆã‚’作æˆã—ã¾ã™ã€‚
  2. プレースメントを作æˆã—ã€ä½œæˆã—ãŸå„セグメントã«å¯¾ã—ã¦ã‚ªãƒ¼ãƒ‡ã‚£ã‚¨ãƒ³ã‚¹ã‚’追加ã—ã¾ã™ã€‚
  3. アプリã®ã‚³ãƒ¼ãƒ‰å†…ã§ãƒ—レースメントã®ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’表示ã—ã¾ã™ã€‚オンボーディングã«ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã‚’é–‹ãボタンãŒã‚ã‚‹å ´åˆã¯ã€ã“ã®ãƒœã‚¿ãƒ³ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã¸ã®å¿œç­”ã¨ã—ã¦ãƒšã‚¤ã‚¦ã‚©ãƒ¼ãƒ«ã®ã‚³ãƒ¼ãƒ‰ã‚’実装ã—ã¦ãã ã•ã„。
ÿÿÿÿ