Capacitor SDK'da flow verilerini işleme

Bir kullanıcı flow içindeki bir giriş alanına yazı yazdığında, bir teste yanıt verdiğinde veya bir düğmeyi çevirdiğinde, SDK bu değeri analitik callback’i aracılığıyla uygulamanıza iletir.

Uygulamalar bu verileri çoğunlukla şu amaçlarla kullanır:

  • Kullanıcıları kendi backend’lerinize kaydedin: Kullanıcının onboarding flow’unuzda girdiği e-posta adresini ve adı alın, flow kapandığında hesaplarını oluşturun.
  • Yanıtları ve tercihleri kaydedin: Kullanıcının ne seçtiğini takip edin, böylece uygulamanız bunu daha sonra kullanabilsin — örneğin özel özellikler olarak Adapty profiline yazın.
  • Gelecekteki flow’ları özelleştirin: Quiz yanıtlarını özel özellikler olarak kaydedin, ardından ilerideki bir placement’ı hedefleyerek her segmentin farklı bir flow veya içinde farklı bir paywall görmesini sağlayın.
  • Üçüncü taraf analiz platformlarına veri gönderin: Yanıtları Amplitude, Mixpanel veya kullandığınız ürün analitiği platformuna iletin.

Girdiler ve seçilebilir gruplar değerlerini otomatik olarak raporlar. Kodunuzda girdileri birbirinden ayırt edebilmek için, builder’da her girdiye anlamlı bir Element ID ve her seçilebilir gruba bir Group ID verin.

Başlamadan önce

Şunlara ihtiyacınız var:

  • Adapty SDK v4 veya üzeri: Flow callback’leri önceki sürümlerde mevcut değildir.
  • Flow & Paywall Builder’da oluşturulmuş bir flow: Yalnızca flow’lar bu callback aracılığıyla giriş değerlerini raporlar.
  • Yakın zamanda yayımlanmış bir flow sürümü: Bir flow, yalnızca bu özellik kullanıma sunulduktan sonra yayımlandıysa giriş değerlerini raporlar. Uygulamanıza hiçbir şey ulaşmıyorsa flow’un yeni bir sürümünü yayımlayıp tekrar deneyin.

Girdi değerlerini alma

Girdi değerleri, bir flow’dan gelen diğer tüm analitik etkinlikleriyle aynı handler’a ulaşır ve etkinlik adı flow_user_input olarak gelir. onAnalytics’i diğer flow etkinlik handler’larınızla birlikte kaydedin:

view.setEventHandlers({
  onAnalytics(name, params) {
    handleFlowInput(name, params);
    return false; // keep the flow open
  },
});

onAnalytics geri çağırımı, ekran görüntülemeleri dahil olmak üzere bir flow’daki tüm analitik olayları iletir.

  • name parametresi olay adını içerir. Kullanıcı girişi olaylarını filtrelemek için name değerini flow_user_input ile karşılaştırın.
  • element_type parametresi, öğe kategorisini belirtir.
  • Girişin değeri, öğe türüne bağlı olarak farklı parametrelerde saklanır:
    • Metin alanları, seçiciler ve geçiş düğmeleri kullanıcının girişini value içinde saklar
    • Seçilebilir gruplar, aktif seçenekleri item_ids ve item_titles alanlarında raporlar
function handleFlowInput(name: string, params: Record<string, unknown>) {
  if (name !== 'flow_user_input') return;

  // The screen the input sits on. Pair it with element_id to tell apart
  // two fields that share an Element ID on different screens.
  const screenId = params.instanceId as string;

  switch (params.element_type) {
    case 'text_input':
    case 'email_input':
    case 'number_input':
    case 'phone_input': {
      const text = params.value as string;
      break;
    }
    case 'date_picker':
    case 'time_picker':
    case 'date_time_picker': {
      // Unix time in milliseconds.
      const date = new Date(params.value as number);
      break;
    }
    case 'single_choice': {
      const optionId = (params.item_ids as string[])[0];
      break;
    }
    case 'multi_choice': {
      const optionIds = params.item_ids as string[];
      break;
    }
    case 'toggle': {
      const isOn = params.value as boolean;
      break;
    }
  }
}

Callback’in tetiklendiğini doğrulamak için kendi uygulamanızın test derlemesindeki input ile etkileşime girin. Callback handler’ınız bir event almıyorsa ön koşulları kontrol edin. Flow’un bu özellik kullanıma sunulduktan sonra yayımlandığından emin olun.

Uygulamanız girdiyi aldığında

Important

Varsayılan giriş veya seçim değeri bu callback aracılığıyla uygulamanıza hiçbir zaman ulaşmaz. Kullanıcı Set as default olarak işaretlenmiş seçeneği kabul edip devam ederse herhangi bir olay tetiklenmez. Eksik olayı “yanıt yok” şeklinde yorumlamayın — kullanıcı yalnızca varsayılan değeri olduğu gibi bırakmıştır.

Aşağıdaki öğeler bu olayı tetikler:

  • Metin, e-posta, sayı ve telefon alanları
  • Tarih, saat ve tarih-saat seçicileri
  • Tekli seçim ve çoklu seçim grupları ile geçiş düğmeleri (toggle)

Aşağıdakiler tetiklemez:

  • Parola alanları, ürün seçimleri ve sekme geçişleri
  • Ekranlar arasında paylaşılan bir Header öğesinin içindeki giriş alanları
  • Yinelenen veya eksik seçenek Element ID’lerine sahip ya da başka bir ekranda Group ID’si tekrarlanan seçilebilir gruplar. Bu tür bir grup, yanıtın bir kısmını göndermek yerine hiçbir şey göndermez.

Olay şu durumlarda tetiklenir:

  • Bir alan odağı kaybettiğinde. Temizlenmiş bir alan boş dize bildirir; kullanıcının hiç düzenlemediği bir alan hiçbir şey bildirmez. Yer tutucu (placeholder) bir değer değildir. Kullanıcı alana geri dönür, düzenler ve tekrar ayrılırsa ikinci bir olay oluşur.
  • Kullanıcı yeni bir değer seçtikten sonra seçiciyi kapattığında. Değiştirilmeden kapatılması hiçbir şey bildirmez.
  • Kullanıcı bir seçenek veya geçiş düğmesine (toggle) dokunduğunda. Çoklu seçim olayı, seçili olan tüm seçenekleri listeler; bu nedenle son seçeneğin seçimini kaldırmak iki boş dizi gönderir.

Olay şu durumlarda tetiklenmez:

  • Kullanıcı yazarken. Tuş vuruşu akışı yoktur; yalnızca odak ayrıldığında alanın tuttuğu değer bildirilir.
  • Kullanıcı flow’u gönderdiğinde veya kapattığında. O anda hâlâ düzenlenmekte olan bir değer kaybolabilir; teslimat sınırlamaları bölümü, son ekranın bu duruma göre nasıl tasarlanacağını ele alır.
  • Kullanıcı etkileşimi olmadan bir değer ayarlandığında. Set as default olarak işaretlenen bir seçenek, ekran açıldığında önceden seçili gelir; Set Variable eylemi ise başka bir etkileşimden bir seçenek belirleyebilir veya bir girişi doldurabilir. Bu durumların hiçbiri olay göndermez; önceden doldurulmuş bir giriş yalnızca kullanıcı onu düzenlediğinde bildirilir.

Ne alırsınız

Callback iki olay iletir. Yalnızca flow_user_input olaylarını görüntülemek için name alanına göre filtreleyin. Yanıt JSON yükü şu şekilde görünür:

{
  "name": "flow_user_input",
  "instanceId": "scr_registration",
  "isBackendEvent": false,
  "isCustomerEvent": true,
  "element_id": "email",
  "element_type": "email_input",
  "value": "jane@example.com"
}
ParametreAçıklama
nameGirdi olayları için flow_user_input, ekran görüntülemeleri için flow_screen_showed.
instanceIdGirdinin bulunduğu ekranın ID’si. Element ID’leri bir ekran içinde benzersizdir, flow genelinde değil. Flow’unuzda birden fazla ekranda girdi varsa, olayları filtrelerken instanceId ile element_id’yi birlikte kullanın.
element_idGirdinin Element ID’si ya da seçilebilir grubun Group ID’si.
element_typeOlayı gönderen elementin türü. Aşağıdaki parametrelerden hangisinin girdi değerini taşıdığını belirler.
valueYalnızca metin alanları, seçiciler ve geçiş düğmeleri için. Girdi değeri: metin alanları için string, seçiciler için integer, geçiş düğmeleri için boolean.
item_idsYalnızca tek seçimli ve çok seçimli gruplar için. Seçilen seçeneklerin Element ID’leri, builder’daki görünüm sırasıyla. Tek seçimli grupta bir kayıt; çok seçimlide herhangi bir sayıda kayıt bulunabilir.
item_titlesYalnızca tek seçimli ve çok seçimli gruplar için. item_ids içinde listelenen seçeneklerin başlıkları, aynı sırayla. Hiçbir zaman boş olmaz: başlığı olmayan bir seçenek kendi ID’sini bildirir.
isCustomerEventYardımcı bir bayrak; bu olay için her zaman true’dur. SDK’nın callback’inize ilettiği olayları işaretler. Tek bir handler her flow olayını analytics’inize iletiyorsa ve name yerine bu bayrağa göre koşul koyuyorsanız kullanışlıdır.
isBackendEventYardımcı bir bayrak; bu olay için her zaman false’tur. Adapty’nin kendi analytics’i için de kaydettiği olayları işaretler. false, kullanıcıların girdiği verilerin yalnızca uygulamanıza ulaştığını, başka bir yere gitmediğini doğrular — Adapty bu verileri almaz veya saklamaz.

Her elementin bildirdikleri:

Builder’daelement_typeDeğeri saklayan parametreNe içerir
Text, Number, Phone number girditext_input, number_input, phone_inputvalueKullanıcının yazdığı ham string. Sayılar numeric tip olarak değil, string olarak gelir.
E-mail girdiemail_inputvalueKullanıcının yazdığı ham string; builder’ın format doğrulamasından geçememiş olsa bile. Kullanmadan önce kendi tarafınızda doğrulayın.
Password girdiyokyokHiçbir olay göndermez.
Date girdidate_pickervalueSeçilen tarihin yerel gece yarısında Unix zamanı, milisaniye cinsinden integer olarak.
Time girditime_pickervalueDakikaya yuvarlanmış Unix zamanı, milisaniye cinsinden integer olarak.
Date & Time girdidate_picker ve time_pickervalueİki element: bir tarih seçici ve bir saat seçici. Her biri kendi olayını gönderir.
Type açılır listesinde Date & Time olarak değiştirilen girdidate_time_pickervalueDakikaya yuvarlanmış Unix zamanı, milisaniye cinsinden integer olarak.
Single choice grubusingle_choiceitem_ids, item_titlesİki dizi. item_ids: seçilen seçeneğin Element ID’sini içeren bir dizi. item_titles: o seçeneğin başlığını içeren bir dizi.
Multi-choice grubumulti_choiceitem_ids, item_titlesİki dizi. item_ids: seçilen tüm seçeneklerin Element ID’leri, builder’daki görünüm sırasıyla. item_titles: aynı sırayla başlıkları. Hiçbir şey seçilmediğinde her iki dizi de boştur.
Toggle grubutogglevalueBir boolean.

Bir cevaba göre dallanmak için item_titles değil item_ids ile karşılaştırın. Başlık türetilmiş bir değerdir: ayarladıysanız seçeneğin Element Title’ı, yoksa varsayılan dilinizdeki metni, o da yoksa Element ID’si kullanılır. Flow’u başka bir dilde okuyan kullanıcı farklı bir metin görmüştür.

Olay örnekleri

Bu örnekler, her olayda mevcut olan özellikleri ve yorumlarda açıklayıcı değerlerle birlikte göstermektedir.

Metin, e-posta, sayı ve telefon girişi (Genişletmek için tıklayın)
onAnalytics(name, params) {
    name;                      // 'flow_user_input'
    params.name;               // 'flow_user_input'
    params.instanceId;         // 'scr_J260KU5q'
    params.isCustomerEvent;    // true
    params.isBackendEvent;     // false
    params.element_id;         // 'email'
    params.element_type;       // 'email_input'
    params.value;              // 'jane@example.com'   (string)
}
Tarih, saat ve tarih-saat seçiciler (Genişletmek için tıklayın)
onAnalytics(name, params) {
    params.element_id;         // 'birthday'
    params.element_type;       // 'date_picker'
    params.value;              // 645408000000   (Unix milliseconds — 1990-06-15, local midnight)
}
Tekli seçim (Genişletmek için tıklayın)
onAnalytics(name, params) {
    params.element_id;         // 'experience'
    params.element_type;       // 'single_choice'
    params.item_ids;           // ['pro']
    params.item_titles;        // ['I train professionally']
}
Çoklu seçim (Genişletmek için tıklayın)
onAnalytics(name, params) {
    params.element_id;         // 'interests'
    params.element_type;       // 'multi_choice'
    params.item_ids;           // ['sports', 'music']
    params.item_titles;        // ['Sports', 'Music']
}
Geçiş düğmesi (Genişletmek için tıklayın)
onAnalytics(name, params) {
    params.element_id;         // 'reminders'
    params.element_type;       // 'toggle'
    params.value;              // true   (boolean)
}

Teslimat ve sınırlamalar

Warning

Flow’lar ham değerler gönderir — e-posta adresleri, telefon numaraları ve kullanıcının yazdığı her şey. Analytics callback’inin ilettiği her şeyi kişisel veri olarak değerlendirin ve bir kullanıcının e-posta adresini yazmayacağınız bir yere yazmayın.

  • Son değer geçerlidir: Alan başına bir olay alırsınız; bu olay, kullanıcının tuş tuş değil, en sonunda girdiği değeri taşır. Kullanıcı bir alanı düzenlerse yalnızca son sürüm size ulaşır.
  • Gönderim garantisi yoktur: Kullanıcılar flow boyunca ilerledikçe değerler size ulaşır ve kullanıcı her an çıkabilir. Bir yanıt kümesini tamamlanmış saymadan önce flow’un kapanmasını bekleyin.
  • En iyi çaba teslimatı: Bir alan odaklanmışken veya bir seçici açıkken kullanıcı flow’u kapatır ya da uygulamayı arka plana alırsa o değer kaybolabilir.

Son alanın değerinin güvenilir olmasını sağlamak için flow’u; giriş veya seçici içermeyen bir ekranla bitirin ve bu ekran açıldığında otomatik olarak değil, açık bir kullanıcı eylemiyle flow’u kapatın. Son ekrana geçmek, önceki alandaki odağı kaldırır ve bu sayede değer gönderilir.

Her giriş değerini handler’ınız aldığı gibi saklayın ve flow kapandığında tüm seti gönderin. Bu anı yakalamak için onAnalytics ile birlikte bir onDisappeared handler’ı kaydedin. Bu handler, kullanıcı flow’u tamamlasa da yarıda kapansa da, flow görünümü kapatıldığında çalışır.

Kullanım Senaryoları

Kullanıcıları arka uçta kaydedin

Değerleri geldikçe toplayın ve flow kapandıktan sonra tek bir istekle gönderin; böylece eksiksiz bir yanıt seti tek seferde iletilmiş olur.

Flow, kullanıcı tamamlasın ya da yarıda bıraksın, her iki durumda da kapanır. Arka ucunuzu çağırmadan önce ihtiyacınız olan alanları kontrol edin.

Flow, arka ucunuzdan gelen hataları gösteremez. Handler’ın dönüş değeri yalnızca flow görünümünü kapatır; SDK’nın çalışan bir flow’a veri gönderen bir yöntemi yoktur. Kayıt başarısız olursa (örneğin e-posta adresi zaten kullanımda olduğu için), hatayı flow kapandıktan sonra kendi arayüzünüzde gösterin.

const flowAnswers: Record<string, string> = {};

view.setEventHandlers({
  onAnalytics(name, params) {
    if (name === 'flow_user_input' && typeof params.value === 'string') {
      flowAnswers[params.element_id as string] = params.value;
    }
    return false;
  },
  onDisappeared() {
    if (flowAnswers.email) {
      // Send flowAnswers to your backend here to create the account.
    }
    return false;
  },
});

Kullanıcı profillerini verilerle zenginleştirin

Kullanıcının girdiği bilgileri profiline bağlamak ve aynı bilgileri iki kez sormaktan kaçınmak için değerler geldikçe kullanıcı profilini güncelleyin.

Örneğin, flow’unuzda name Element ID’sine sahip bir metin girişi ve email Element ID’sine sahip bir e-posta girişi varsa:

function handleFlowInput(name: string, params: Record<string, unknown>) {
  if (name !== 'flow_user_input') return;
  if (typeof params.value !== 'string') return;

  const profileParams: Partial<AdaptyProfileParameters> = {};

  switch (params.element_id) {
    case 'name':
      profileParams.firstName = params.value;
      break;
    case 'email':
      profileParams.email = params.value;
      break;
    default:
      return;
  }

  adapty.updateProfile(profileParams).catch((error) => {
    // handle the error
  });
}

Sonraki akışları özelleştirme

Quiz yanıtları, kullanıcının daha sonra bir placement’da göreceği şeyi de belirleyebilir — farklı bir flow veya içindeki farklı bir paywall.

Örneğin, onboarding flow’unuzda kullanıcılara spor deneyimlerini sorun, ardından her gruba farklı ürünler ve metinlerle kendi flow’unu gösterin.

  1. Flow’unuza bir quiz ekleyin. Seçilebilir gruba experience Grup ID’si verin ve her seçeneğe anlamlı bir Element ID atayın.
  2. Yanıtları işleyin ve kullanıcı için özel nitelikler belirleyin.
function handleFlowInput(name: string, params: Record<string, unknown>) {
  if (name !== 'flow_user_input') return;
  if (params.element_id !== 'experience') return;

  const optionId = (params.item_ids as string[])[0];

  adapty
    .updateProfile({
      // Set the custom attribute 'experience' to the option the user selected
      // (beginner, amateur, or pro).
      codableCustomAttributes: { experience: optionId },
    })
    .catch((error) => {
      // handle the error
    });
}
  1. Her özel özellik değeri için bir segment oluşturun.
  2. Bir placement oluşturun ve her segment için bir kitle ekleyin.
  3. Uygulamanızda o placement için flow’u görüntüleyin.