1. Bagaimana cara melihat solusi pelacakan?
Sebelum memasukkan titik penguburan, Anda perlu menentukan di mana dan apa yang akan dilacak, yaitu menyusun persyaratan titik penguburan yang jelas. Di platform Quick Tracking, persyaratan pelacakan eksplisit disebut solusi pelacakan, dan template spesifikasi dirancang untuk solusi tersebut.

Dalam rencana pelacakan, konten pelacakan yang diperlukan meliputi:
1. Subjek kejadian: ID Perangkat dan ID Akun.
ID Perangkat: ID perangkat default untuk perangkat Windows adalah ID unik perangkat pada tingkat aplikasi. ID perangkat secara otomatis dibuat oleh Quick Tracking SDK atau Anda dapat memanggil operasi setCustomDeviceId.
ID Akun: ID akun pengguna klien untuk masuk ke sistem. Ketika pengguna masuk dari perangkat yang berbeda, ID perangkat berubah, tetapi ID akun tidak berubah. Sebagai contoh, seorang pengguna masuk secara terpisah menggunakan komputer dan tablet.
2. Atribut pengguna: atribut dari ID akun, seperti pengguna dengan ID akun "testdemo@111", "tanggal lahir" adalah "1999-02-13", dan "tingkat keanggotaan" adalah "platinum". "Tanggal lahir" dan "peringkat keanggotaan" adalah atribut pengguna.
3. Atribut global: atribut yang dibawa dalam setiap kejadian setelah atribut global ditetapkan sekali.
4. Kejadian penelusuran halaman: kejadian yang dilaporkan ketika halaman dimuat. Dalam rencana pelacakan, kejadian dengan kode halaman yang sama dengan kode kejadian ditandai dengan warna biru.
5. Klik, tayangan, dan kejadian kustom: kejadian yang dilaporkan ketika pengguna klien berinteraksi dengan klien.
2. Catatan Pelacakan
Parameter input tidak mendukung string khusus seperti tanda kutip tunggal dan tipe data. Jika tidak, kejadian mungkin gagal dijatuhkan dari database dan data mungkin hilang.
Penggunaan parameter Cina mengharuskan bahwa pengkodean file sumber adalah pengkodean Unicode (UTF-8 tanpa tanda) yang valid.
Kecuali untuk operasi saklar log, Anda harus memanggil operasi initQTPC sebelum operasi berlaku.
Di Windows 10.x, Anda dapat menggunakan GetVersionEx untuk mendapatkan versi sistem secara tidak akurat. Dalam kasus ini, Anda harus menambahkan file manifest ke folder proyek dan tambahkan file manifest ke properti proyek> alat inventaris> masukan dan keluaran> file inventaris tambahan. File sampel berikut digunakan:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>false</dpiAware> </asmv3:windowsSettings> </asmv3:application> <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- Windows 10 and Windows 11 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <!-- Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- Windows Vista --> <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> </application> </compatibility> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <!-- Pengaturan UAC: - aplikasi harus berjalan pada tingkat integritas yang sama dengan proses pemanggil - aplikasi tidak perlu memanipulasi jendela milik proses tingkat integritas lebih tinggi --> <requestedExecutionLevel level="asInvoker" uiAccess="false" /> </requestedPrivileges> </security> </trustInfo> </assembly>Batas ukuran parameter input:
// Jika kunci dan nilai atribut kustom dan global melebihi batas atas, pengaturan tidak dapat diselesaikan.
const size_t kStringPropertyValueMaxLength=4096; // Batas atas nilai properti kustom dan global.
const size_t kStringPropertyKeyMaxLength=1024; // Nilai maksimum kunci properti kustom dan global.
const size_t kStringArrayValueMaxSize=100; // Batas atas panjang array string atribut kustom. Jika batas atas terlampaui, array string dipotong.
const size_t kStringMapValueMaxSize=50; // Batas atas set atribut global. Jika batas atas terlampaui, tidak ada lagi data yang dapat dimasukkan.
const size_t kStringEventCodeMaxLength=500; // panjang maksimum kode kejadian 3. Pengaturan ID Perangkat, ID Akun, dan atribut pengguna
3.1 ID Perangkat
SDK mendukung ID perangkat kustom. Jika Anda ingin menggunakan ID perangkat kustom, Anda harus mengatur antarmuka setCustomDeviceId ke nilai yang valid.
Fungsi antarmuka:
// Tentukan ID perangkat kustom.
QTFORPC_API QT_VOID setCustomDeviceId(QT_CSTR deviceId);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
deviceId | const char * | ID perangkat kustom. Nilainya harus berupa string non-kosong. | Ya |
string customDeviceId = "testId";
qtInterface->setCustomDeviceId(customDeviceId.c_str());3.2 ID Akun
3.2.1 Masuk Pengguna
Quick Tracking SDK dalam statistik pengguna berdasarkan standar perangkat. Jika Anda perlu mencatat akun mereka sendiri, silakan gunakan metode berikut.
Fungsi antarmuka:
// Masuk ke aplikasi.
QTFORPC_API QT_VOID onProfileSignIn(QT_CSTR userID, QT_CSTR nick);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
userID | const char * | ID akun pengguna, yang merupakan string non-kosong | Ya |
nick | const char * | Nama panggilan pengguna. | Tidak, string kosong bisa dilewatkan |
qtInterface->onProfileSignIn("userId", "userNick");3.2.2 Keluar Pengguna
Jika Anda tidak lagi perlu mengikat akun pengguna, Anda dapat memanggil metode logout pengguna yang disediakan oleh SDK. Setelah Anda memanggil metode tersebut, SDK tidak lagi mengirimkan konten terkait akun pengguna.
Fungsi antarmuka:
// Keluar.
QTFORPC_API QT_VOID onProfileSignOff();qtInterface->onProfileSignOff();3.3 Unggah atribut pengguna
Gunakan pengkodean kejadian untuk $$_user_profile unggah kejadian kustom. Atribut kejadian yang dibawa oleh kejadian disimpan dalam tabel pengguna sebagai atribut pengguna.
Catatan: uploadUserProfile harus dipanggil setelah onPageStart dan sebelum onPageEnd untuk memastikan akurasi data.
Fungsi antarmuka:
// Unggah properti pengguna.
QTFORPC_API QT_VOID uploadUserProfile(QT_VSTR pageObj, QT_MAP customProperties);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
pageObj | void * | Kami sarankan Anda menggunakan wadah untuk WNDCLASS | Ya |
customProperties | const char * | Parameter bisnis. Anda harus menentukan string templat literal JSON untuk parameter tersebut. | Ya |
WNDCLASS *wndClass = new WNDCLASS();
qtInterface->onPageStart(wndClass, "PageName");
std::string cusp = R"({
"age": 18,
"level": "King",
"name": "coolboy",
})";
qtInterface->uploadUserProfile(wndClass, cusp.c_str());
qtInterface->onPageEnd(wndClass);4. Atribut Global
4.1 Daftarkan Atribut Global
Fungsi antarmuka:
// Tetapkan properti global.
QTFORPC_API QT_VOID registerGlobalProperty(QT_CSTR key, QT_CSTR value);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
key | const char * | Tetapkan kunci properti global | Ya |
value | const char * | Tetapkan nilai properti global | Ya |
qtInterface->registerGlobalProperty("key", "value");Catatan: Jika kunci atribut global yang ada sama dengan kunci atribut global yang ada, nilai yang ada diperbarui. Jika kunci atribut global yang ada berbeda dari kunci atribut global yang ada, atribut global baru dimasukkan.
4.2 hapus atribut global
Fungsi API:
// Hapus atribut global berdasarkan kunci.
QTFORPC_API QT_VOID unregisterGlobalProperty(QT_CSTR key);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
key | const char * | Hapus kunci atribut global | Ya |
qtInterface->unregisterGlobalProperty("key");4.3 untuk mendapatkan atribut global tunggal berdasarkan kunci
Fungsi API:
// Dapatkan properti global berdasarkan kunci.
QTFORPC_API QT_VOID getGlobalProperty(QT_CSTR key, QT_STR value, QT_INT size);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
key | const char * | Kunci properti global untuk mendapatkan | Ya |
value | char * | Nilai properti global untuk mendapatkan | Ya |
size | int | Panjang nilai atribut global | Ya |
// Ukuran diatur sesuai kebutuhan.
char value[64] = { 0 };
qtInterface->getGlobalProperty("key", value, 64);
string myValue = value;4.4 Dapatkan Semua Properti Global
Fungsi API:
// Dapatkan semua atribut global.
QTFORPC_API QT_VOID getGlobalProperties(QT_STR properties, QT_INT size);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
properties | char * | Melacak properti global untuk mendapatkan | Ya |
size | int | Panjang nilai atribut global | Ya |
// Ukuran diatur sesuai kebutuhan.
char properties[128] = { 0 };
qtInterface->getGlobalProperties(properties);
std::map<string, string> myProperties = QT::Helper::QT_DeserializePerson(properties, 128);Catatan: Properti yang diperoleh perlu dikonversi menjadi std::map melalui antarmuka QT::Helper::QT_DeserializePerson.
5. Kejadian Penelusuran Halaman
Pelacakan Manual pada Halaman 5.1
Catatan
onPageStart digunakan oleh SDK untuk mencatat informasi masuk halaman. onPageStart tidak melaporkan kejadian. Kejadian PageView hanya dilaporkan ketika onPageEnd dipanggil.
Metode onPageStart dan onPageEnd harus digunakan berpasangan. Nilai pageObj harus sama. Jika metode onPageEnd tidak ada atau tidak konsisten dengan nilai pageObj yang digunakan oleh onPageStart, informasi yang dicatat oleh onPageStart tidak berlaku. Ini memengaruhi akurasi pelacakan kejadian halaman.
Fungsi antarmuka:
// Halaman mulai ditampilkan.
QTFORPC_API QT_VOID onPageStart(QT_VSTR pageObj, QT_CSTR pageName);
// Halaman mulai menghilang.
QTFORPC_API QT_VOID onPageEnd(QT_VSTR pageObj);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
pageObj | void * | Kami sarankan Anda menggunakan objek wadah WNDCLASS. Di halaman yang sama, ketika Anda memanggil onPageEnd, Anda perlu melewati pageObj yang sama dengan onPageStart. | Ya |
pageName | const char * | Kode kejadian halaman | Ya |
WNDCLASS *wndClass = new WNDCLASS();
qtInterface->onPageStart(wndClass, "PageName");
qtInterface->onPageEnd(wndClass);5.2 pengaturan properti kejadian halaman
Fungsi API:
// Tetapkan parameter kejadian halaman.
QTFORPC_API QT_VOID updatePageProperties(QT_VSTR pageObj, QT_MAP pageProperties);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
pageObj | void * | Kami sarankan Anda menggunakan objek wadah WNDCLASS. Di halaman yang sama, ketika memanggil updatePageProperties, Anda perlu melewati pageObj yang sama dengan onPageStart. | Ya |
pageProperties | const char * | parameter halaman, yang sesuai dengan atribut kejadian dalam log kejadian halaman. Anda harus menentukan string templat literal JSON untuk parameter tersebut. | Ya |
WNDCLASS *wndClass = new WNDCLASS();
qtInterface->onPageStart(wndClass, "PageName");
std::string cusp = R"({
"param_str": "hello c++",
"param_num": 1900,
"param_bool": true,
"param_list": ["hello", "world", "c++"]
})";
qtInterface->updatePageProperties(wndClass, cusp.c_str());
qtInterface->onPageEnd(wndClass);5.3 Lewati Kontainer
Melewati halaman sebelumnya (halaman sumber adalah halaman kontainer) dari halaman saat ini (halaman anak di dalam kontainer).
Fungsi API:
// Lewati kontainer untuk bersarang multi-kontainer.
QTFORPC_API QT_VOID skipPage(QT_VSTR pageObj);Bidang | Fitur | Deskripsi lengkap | Diperlukan |
pageObj | void * | Kami sarankan Anda menggunakan objek wadah WNDCLASS. Di halaman yang sama, ketika memanggil skipPage, Anda perlu melewati pageObj yang sama dengan onPageStart. | Ya |
WNDCLASS *wndClass = new WNDCLASS();
qtInterface->onPageStart(wndClass, "firstPage");
std::string cusp = R"({
"param_str": "hello c++",
"param_num": 1900,
"param_bool": true,
"param_list": ["hello", "world", "c++"]
})";
qtInterface->updatePageProperties(wndClass, cusp.c_str());
qtInterface->onPageEnd(wndClass);
WNDCLASS *wndClass1 = new WNDCLASS();
qtInterface->onPageStart(wndClass1, "secondPage");
qtInterface->onPageEnd(wndClass1);
WNDCLASS *wndClass2 = new WNDCLASS();
// Melewati halaman sebelumnya dari thirdPage, yaitu secondPage. Dalam hal ini, ref_page_name dari thirdPage adalah firstPage. Jika skipPage tidak dipanggil, ref_page_name adalah secondPage.
qtInterface->skipPage(wndClass2);
qtInterface->onPageStart(wndClass2, "thirdPage");
qtInterface->onPageEnd(wndClass2);6. Pelacakan Kejadian
Kejadian kustom dapat digunakan untuk melacak perilaku pengguna dan mencatat detail spesifik dari perilaku tersebut.
Catatan: Untuk menggunakan trackEvent atau trackEventWithPageName, pastikan pemanggilan dilakukan setelah onPageStart dan sebelum onPageEnd untuk memastikan akurasi data.
Fungsi antarmuka:
// Melacak kejadian.
QTFORPC_API QT_VOID trackEvent(QT_VSTR pageObj, QT_CSTR id, QT_MAP customProperties);
// Melacak kejadian termasuk nama halaman.
QTFORPC_API QT_VOID trackEventWithPageName(QT_VSTR pageObj, QT_CSTR id, QT_MAP customProperties, QT_CSTR pageName);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
pageObj | void * | Kami sarankan Anda menggunakan objek wadah WNDCLASS. Ketika memanggil trackEvent atau trackEventWithPageName di halaman yang sama, Anda perlu melewati pageObj yang sama dengan onPageStart. | Ya |
id | const char * | Pengkodean kejadian. Anda tidak dapat melewati parameter yang dimulai dengan "$$_" sebagai string non-kosong dari id | Ya |
customProperties | const char * | Atribut kejadian. Anda harus menentukan string templat literal JSON untuk parameter tersebut. | Tidak |
pageName | const char * | Pengkodean halaman | Tidak |
WNDCLASS *wndClass = new WNDCLASS();
qtInterface->onPageStart(wndClass, "PageName");
std::string cusp = R"({
"param_str": "hello c++",
"param_num": 1900,
"param_bool": true,
"param_list": ["hello", "world", "c++"]
})";
qtInterface->trackEventWithPageName(wndClass, "test_event", cusp.c_str(), "PageName");
qtInterface->onPageEnd(wndClass);7. Lacak secara manual acara startup dan keluar aplikasi
Catatan: Penggunaan enterForeground/enterForegroundWithPageName atau enterBackground/enterBackgroundWithPageName memerlukan bahwa onPageStart dan onPageEnd dipanggil sebelum pemanggilan untuk memastikan akurasi data.
Fungsi antarmuka:
// Masuk ke latar depan.
QTFORPC_API QT_VOID enterForeground(QT_VSTR pageObj, QT_MAP customProperties);
// Masuk ke latar depan dengan NamaHalaman.
QTFORPC_API QT_VOID enterForegroundWithPageName(QT_VSTR pageObj, QT_MAP customProperties, QT_CSTR pageName);
// Masuk ke latar belakang.
QTFORPC_API QT_VOID enterBackground(QT_VSTR pageObj, QT_MAP customProperties);
// Masuk ke latar belakang dengan NamaHalaman.
QTFORPC_API QT_VOID enterBackgroundWithPageName(QT_VSTR pageObj, QT_MAP customProperties, QT_CSTR pageName);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
pageObj | void * | Kami sarankan Anda menggunakan objek wadah WNDCLASS. Ketika memanggil trackEvent atau trackEventWithPageName di halaman yang sama, Anda perlu melewati pageObj yang sama dengan onPageStart. | Ya |
customProperties | const char * | Parameter bisnis. Anda harus menentukan string templat literal JSON untuk parameter tersebut. | Tidak |
pageName | const char * | Pengkodean halaman | Tidak |
WNDCLASS *wndClassForeground = new WNDCLASS();
qtInterface->onPageStart(wndClassForeground, "StartPageName");
std::string start_cusp = R"({
"param_str": "hello c++",
"param_num": 1900,
"param_bool": true,
"param_list": ["hello", "world", "c++"]
})";
qtInterface->enterForeground(wndClassForeground, start_cusp.c_str());
qtInterface->onPageEnd(wndClassForeground);
WNDCLASS *wndClassBackground = new WNDCLASS();
qtInterface->onPageStart(wndClassBackground, "EndPageName");
std::string end_cusp = R"({
"param_str": "hello c++",
"param_num": 1900,
"param_bool": true,
"param_list": ["hello", "world", "c++"]
})";
qtInterface->enterBackground(wndClassBackground, end_cusp.c_str());
qtInterface->onPageEnd(wndClassBackground);8. Lainnya
8.1 hentikan penyimpanan data ke lokal
Anda dapat memanggil finiQTPC untuk menghentikan penjatuhan data dari database. Saat ini, hanya metode Stop yang tersedia.
Fungsi API:
// deinitialize QT
QTFORPC_API QT_VOID finiQTPC(QT_CB cb);Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
cb | void | Hooks siklus hidup | Ya |
void callBackFunc()
{
fprintf(stderr, "finiQTPC callback\n");
}
qtInterface->finiQTPC(callBackFunc);Mode debugging waktu nyata 8.2
Panggil turnOnRealTimeDebug untuk mengaktifkan mode debugging waktu nyata. Interval pelaporan data menjadi 30 detik. Panggil turnOffRealTimeDebug untuk menonaktifkan debugging waktu nyata.
Catatan: Sebelum aplikasi diluncurkan secara resmi, nonaktifkan mode debugging waktu nyata SDK.
Fungsi API:
// Aktifkan mode debugging waktu nyata.
QTFORPC_API QT_VOID turnOnRealTimeDebug(QT_MAP configs);
// Nonaktifkan debugging waktu nyata.
QTFORPC_API QT_VOID turnOffRealTimeDebug();Parameter:
Bidang | Fitur | Deskripsi lengkap | Diperlukan |
configs | const char * | Konfigurasikan parameter. Parameter input harus dalam bentuk peta pelacakan. Kemudian, panggil serialisasi QT::Helper::QT_Serializable. | Ya |
map<string, string> configs;
configs["debug_key"] = "test";
std::string sconfig;
QT::Helper::QT_Serializable(sconfig, configs);
qtInterface->turnOnRealTimeDebug(sconfig.c_str());
qtInterface->turnOnRealTimeDebug();Aktifkan mode unggah cepat 8.3
Panggil setFastUploadMode untuk mengaktifkan mode unggah cepat. Interval pelaporan data berubah menjadi satu laporan per detik. Nilai defaultnya adalah tiga laporan per detik.
Catatan: Sebelum aplikasi diluncurkan secara resmi, nonaktifkan mode unggah cepat SDK.
Fungsi API:
// Aktifkan mode unggah cepat.
QTFORPC_API QT_VOID setFastUploadMode();qtInterface->setFastUploadMode();