این راهنمای توسعهدهنده نحوه پیادهسازی Google Tag Manager در یک برنامه تلفن همراه را توضیح میدهد.
مقدمه
Google Tag Manager توسعه دهندگان را قادر می سازد تا مقادیر پیکربندی را در برنامه های تلفن همراه خود با استفاده از رابط Google Tag Manager بدون نیاز به بازسازی و ارسال مجدد باینری های برنامه به بازارهای برنامه تغییر دهند.
این برای مدیریت مقادیر پیکربندی یا پرچمها در برنامهتان که ممکن است در آینده نیاز به تغییر داشته باشید، مفید است، از جمله:
- تنظیمات UI مختلف و رشته های نمایش
- اندازه، مکان یا انواع تبلیغات ارائه شده در برنامه شما
- تنظیمات بازی
مقادیر پیکربندی همچنین ممکن است در زمان اجرا با استفاده از قوانین ارزیابی شوند و تنظیمات پویا مانند:
- استفاده از اندازه صفحه برای تعیین اندازه بنر تبلیغاتی
- استفاده از زبان و مکان برای پیکربندی عناصر UI
Google TagManager همچنین اجرای پویا ردیابی برچسب ها و پیکسل ها را در برنامه ها فعال می کند. توسعهدهندگان میتوانند رویدادهای مهم را به لایه داده فشار دهند و بعداً تصمیم بگیرند که کدام تگها یا پیکسلهای ردیابی باید اجرا شوند. TagManager در حال حاضر از برچسب های زیر پشتیبانی می کند:
- Google Mobile App Analytics
- برچسب تماس تابع سفارشی
قبل از شروع
قبل از استفاده از این راهنمای شروع، به موارد زیر نیاز دارید:
- یک حساب Google Tag Manager
- یک محفظه Tag Manager جدید و ماکرو مجموعه ارزش
- یک اپلیکیشن موبایل برای اندروید که در آن گوگل تگ منیجر را پیاده سازی می کند
- Google Analytics Services SDK ، که شامل کتابخانه Tag Manager است.
اگر در گوگل تگ منیجر تازه کار هستید، توصیه می کنیم قبل از ادامه این راهنما ، درباره کانتینرها، ماکروها و قوانین (مرکز راهنمایی) اطلاعات بیشتری کسب کنید .
شروع به کار
این بخش توسعه دهندگان را از طریق یک گردش کار معمولی Tag Manager راهنمایی می کند:
- Google Tag Manager SDK را به پروژه خود اضافه کنید
- مقادیر پیش فرض کانتینر را تنظیم کنید
- کانتینر را باز کنید
- مقادیر پیکربندی را از کانتینر دریافت کنید
- رویدادها را به DataLayer فشار دهید
- پیش نمایش و انتشار کانتینر
1. افزودن Google Tag Manager SDK به پروژه شما
قبل از استفاده از Google Tag Manager SDK، باید بسته SDK را از حالت فشرده خارج کنید و کتابخانه را به مسیر ساخت پروژه خود اضافه کنید و مجوزها را به فایل AndroidManifest.xml
خود اضافه کنید.
ابتدا کتابخانه Google Tag Manager را به پوشه /libs
پروژه خود اضافه کنید.
سپس، فایل AndroidManifest.xml خود را برای استفاده از مجوزهای زیر بهروزرسانی کنید:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />
2. افزودن یک فایل کانتینر پیش فرض به پروژه خود
Google Tag Manager در اولین اجرای برنامه شما از یک ظرف پیش فرض استفاده می کند. ظرف پیشفرض تا زمانی که برنامه قادر به بازیابی یک کانتینر جدید از طریق شبکه نباشد، استفاده میشود.
برای دانلود و افزودن یک باینری کانتینر پیش فرض به برنامه خود، این مراحل را دنبال کنید:
- به رابط وب Google Tag Manager وارد شوید.
- نسخه ظرف مورد نظر برای دانلود را انتخاب کنید.
- برای بازیابی باینری کانتینر روی دکمه دانلود کلیک کنید.
- فایل باینری را به مسیر زیر اضافه کنید:
< project-root >/assets/tagmanager/
نام فایل پیش فرض باید شناسه کانتینر باشد (به عنوان مثال GTM-1234
). هنگامی که فایل باینری را دانلود کردید، حتما پسوند نسخه را از نام فایل حذف کنید تا مطمئن شوید که از قرارداد نامگذاری صحیح پیروی می کنید.
اگرچه استفاده از فایل باینری توصیه می شود، اما اگر ظرف شما حاوی قوانین یا برچسب نیست، می توانید به جای آن از یک فایل JSON ساده استفاده کنید. فایل باید در پوشه /assets/tagmanager
جدید پروژه Android شما قرار داشته باشد و باید از این قرارداد نامگذاری پیروی کند: <Container_ID>.json
. برای مثال، اگر شناسه کانتینر شما GTM-1234
است، باید مقادیر کانتینر پیشفرض خود را به /assets/tagmanager/GTM-1234.json
اضافه کنید.
3. باز کردن یک ظرف
قبل از بازیابی مقادیر از یک ظرف، برنامه شما باید ظرف را باز کند. باز کردن یک کانتینر، آن را از دیسک بارگیری می کند (در صورت وجود)، یا آن را از شبکه درخواست می کند (در صورت نیاز).
سادهترین راه برای باز کردن کانتینر در Android استفاده از ContainerOpener.openContainer(..., Notifier notifier)
است، مانند مثال زیر:
import com.google.tagmanager.Container; import com.google.tagmanager.ContainerOpener; import com.google.tagmanager.ContainerOpener.OpenType; import com.google.tagmanager.TagManager; import android.app.Activity; import android.os.Bundle; public class RacingGame { // Add your public container ID. private static final String CONTAINER_ID = "GTM-YYYY"; volatile private Container mContainer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TagManager mTagManager = TagManager.getInstance(this); // The container is returned to containerFuture when available. ContainerOpener.openContainer( mTagManager, // TagManager instance. CONTAINER_ID, // Tag Manager Container ID. OpenType.PREFER_NON_DEFAULT, // Prefer not to get the default container, but stale is OK. null, // Time to wait for saved container to load (ms). Default is 2000ms. new ContainerOpener.Notifier() { // Called when container loads. @Override public void containerAvailable(Container container) { // Handle assignment in callback to avoid blocking main thread. mContainer = container; } } ); // Rest of your onCreate code. } }
در این مثال، ContainerOpener.openContainer(..., Notifier notifier)
برای درخواست یک کانتینر ذخیره شده از حافظه محلی استفاده می شود. با رسیدگی به تخصیص mContainer
در پاسخ به تماس containerAvailable
، اطمینان حاصل می کنیم که رشته اصلی مسدود نشده است. اگر کانتینر ذخیرهشده قدیمیتر از 12 ساعت باشد، تماس همچنین درخواستی برای بازیابی ناهمزمان یک کانتینر تازه از طریق شبکه برنامهریزی میکند.
این پیاده سازی نمونه ساده ترین راه را برای باز کردن و بازیابی مقادیر از یک کانتینر با استفاده از کلاس راحتی ContainerOpener
نشان می دهد. برای گزینه های پیاده سازی پیشرفته تر، تنظیمات پیشرفته را ببینید.
4. گرفتن مقادیر پیکربندی از کانتینر
پس از باز شدن ظرف، مقادیر پیکربندی ممکن است با استفاده از متدهای get<type>Value()
بازیابی شوند:
// Retrieving a configuration value from a Tag Manager Container. // Get the configuration value by key. String title = mContainer.getStringValue("title_string");
درخواستهایی که با یک کلید ناموجود انجام میشوند، مقدار پیشفرض مناسب با نوع درخواستی را برمیگردانند:
// Empty keys will return a default value depending on the type requested. // Key does not exist. An empty string is returned. string subtitle = container.getStringValue("Non-existent-key"); subtitle.equals(""); // Evaluates to true.
5. فشار دادن مقادیر به DataLayer
DataLayer نقشهای است که به اطلاعات زمان اجرا در مورد برنامه شما، مانند رویدادهای لمسی یا نماهای صفحه، امکان میدهد تا برای ماکروها و برچسبهای Tag Manager در یک ظرف در دسترس قرار گیرند.
به عنوان مثال، با فشار دادن اطلاعات مربوط به نماهای صفحه در نقشه DataLayer، میتوانید برچسبهایی را در رابط وب Tag Manager تنظیم کنید تا پیکسلهای تبدیل را فعال کرده و تماسها را در پاسخ به آن اسکریننماها بدون نیاز به کدگذاری سخت آنها در برنامه خود ردیابی کنید.
رویدادها با استفاده از push()
و روش کمکی DataLayer.mapOf()
به DataLayer فرستاده می شوند:
// // MainActivity.java // Pushing an openScreen event with a screen name into the data layer. // import com.google.tagmanager.TagManager; import com.google.tagmanager.DataLayer; import android.app.Activity; import android.os.Bundle; public MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // This screen becomes visible when Activity.onStart() is called. public void onStart() { super.onStart(); // The container should have already been opened, otherwise events pushed to // the DataLayer will not fire tags in that container. DataLayer dataLayer = TagManager.getInstance(this).getDataLayer(); dataLayer.push(DataLayer.mapOf("event", "openScreen", // The event type. This value should be used consistently for similar event types. "screenName", // Writes a key "screenName" to the dataLayer map. "Home Screen") // Writes a value "Home Screen" for the "screenName" key. ); } // Rest of the Activity implementation }
در رابط وب، اکنون میتوانید برچسبهایی (مانند برچسبهای Google Analytics) ایجاد کنید تا برای هر نمای صفحه با ایجاد این قانون فعال شوند: برابر است با "openScreen". برای ارسال نام صفحه به یکی از این تگ ها، یک ماکرو لایه داده ایجاد کنید که به کلید "screenName" در لایه داده ارجاع می دهد. همچنین میتوانید با ایجاد قاعدهای که در آن برابر «openScreen» و و برابر با «ConfirmationScreen» است، برچسبی (مانند پیکسل تبدیل Google Ads) ایجاد کنید تا فقط برای نماهای صفحه خاص فعال شود.
6. پیش نمایش و انتشار یک ظرف
مقادیر ماکرو همیشه با نسخه منتشر شده فعلی مطابقت دارد. قبل از انتشار آخرین نسخه یک کانتینر، میتوانید پیشنمایش کانتینر پیشنویس خود را مشاهده کنید.
برای پیشنمایش یک کانتینر، با انتخاب نسخه کانتینری که میخواهید پیشنمایش کنید، یک URL پیشنمایش در رابط وب Google Tag Manager ایجاد کنید و سپس Preview
انتخاب کنید. به این URL پیشنمایش بمانید زیرا در مراحل بعدی به آن نیاز خواهید داشت.
سپس، Activity زیر را به فایل AndroidManifest.xml
برنامه خود اضافه کنید:
<!-- Google Tag Manager Preview Activity --> <activity android:name="com.google.tagmanager.PreviewActivity" android:label="@string/app_name" android:noHistory="true" > <!-- Optional, removes the PreviewActivity from activity stack. --> <intent-filter> <data android:scheme="tagmanager.c.application_package_name" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity>
پیوند را در یک شبیهساز یا دستگاه فیزیکی باز کنید تا پیشنمایش محفظه پیشنویس در برنامهتان را مشاهده کنید.
وقتی آماده هستید که مقادیر پیکربندی پیش نویس خود را در دسترس برنامه خود قرار دهید، ظرف را منتشر کنید .
پیکربندی پیشرفته
Google Tag Manager for Mobile دارای تعدادی گزینه پیکربندی پیشرفته است که به شما امکان می دهد مقادیر را بر اساس شرایط زمان اجرا با استفاده از قوانین انتخاب کنید، ظرف را به صورت دستی تازه کنید و گزینه های اضافی برای باز کردن کانتینرها دریافت کنید. بخشهای زیر چندین مورد از رایجترین پیکربندیهای پیشرفته را نشان میدهند.
گزینه های پیشرفته برای باز کردن ظروف
Google Tag Manager SDK روشهای مختلفی را برای باز کردن کانتینرها ارائه میکند که میتواند کنترل بیشتری بر فرآیند بارگیری به شما بدهد:
TagManager.openContainer()
TagManager.openContainer()
پایین ترین سطح و انعطاف پذیرترین API برای باز کردن کانتینر است. اگر ظرف ذخیره شده ای وجود نداشته باشد، یا اگر کانتینر ذخیره شده تازه نباشد (بیش از 12 ساعت) بلافاصله با یک کانتینر پیش فرض برمی گردد و همچنین به صورت ناهمزمان یک ظرف را از دیسک یا شبکه بارگیری می کند.
mContainer = tagManager.openContainer(CONTAINER_ID, new Container.Callback() { // Called when a refresh is about to begin for the given refresh type. @Override public void containerRefreshBegin(Container container, RefreshType refreshType) { // Notify UI that the Container refresh is beginning. } // Called when a successful refresh occurred for the given refresh type. @Override public void containerRefreshSuccess(Container container, RefreshType refreshType]) { // Notify UI that Container is ready. } // Called when a refresh failed for the given refresh type. @Override public void containerRefreshFailure(Container container, RefreshType refreshType, RefreshFailure refreshFailure) { // Notify UI that the Container refresh has failed. }
در طول فرآیند بارگیری، TagManager.openContainer()
چندین تماس برگشتی از چرخه حیات صادر میکند تا کد شما بتواند بفهمد درخواست بارگیری چه زمانی شروع میشود، آیا و چرا شکست میخورد یا موفق میشود، و اینکه آیا ظرف در نهایت از دیسک یا شبکه بارگیری شده است.
مگر اینکه استفاده از مقادیر پیشفرض برای برنامه شما قابل قبول باشد، باید از این تماسهای برگشتی استفاده کنید تا بدانید چه زمانی یک ظرف ذخیره شده یا شبکه بارگیری شده است. توجه داشته باشید که اگر این اولین باری است که برنامه اجرا می شود و اتصال شبکه وجود ندارد، نمی توانید یک ظرف ذخیره شده یا شبکه را بارگیری کنید.
TagManager.openContainer()
مقادیر enum
زیر را به عنوان آرگومان برای این callback ها ارسال می کند:
RefreshType
ارزش | توضیحات |
---|---|
Container.Callback.SAVED | درخواست بازخوانی در حال بارگیری یک ظرف ذخیره شده محلی است. |
Container.Callback.NETWORK | درخواست بهروزرسانی در حال بارگیری یک کانتینر از طریق شبکه است. |
Refresh Failure
ارزش | توضیحات |
---|---|
Container.Callback.NO_SAVED_CONTAINER | ظرف ذخیره شده ای موجود نیست. |
Container.Callback.IO_ERROR | یک خطای ورودی/خروجی مانع از تازه کردن ظرف شد. |
Container.Callback.NO_NETWORK | هیچ اتصال شبکه ای در دسترس نیست. |
Container.Callback.NETWORK_ERROR | یک خطای شبکه رخ داده است. |
Container.Callback.SERVER_ERROR | خطایی در سرور رخ داده است. |
Container.Callback.UNKNOWN_ERROR | خطایی رخ داده است که قابل دسته بندی نیست. |
روش های باز کردن ظروف غیر پیش فرض و تازه
ContainerOpener
TagManager.openContainer()
را می پیچد و دو روش راحت برای باز کردن کانتینرها ارائه می دهد: ContainerOpener.openContainer(..., Notifier notifier)
و ContainerOpener.openContainer(..., Long timeoutInMillis)
.هر یک از این روش ها یک شمارش می کند که یک ظرف غیر پیش فرض یا تازه درخواست می کند.
OpenType.PREFER_NON_DEFAULT
برای اکثر برنامهها توصیه میشود و تلاش میکند تا اولین کانتینر غیر پیشفرض موجود را در یک بازه زمانی مشخص، از دیسک یا شبکه بازگرداند، حتی اگر آن ظرف بیش از 12 ساعت از عمر آن گذشته باشد. اگر یک کانتینر ذخیره شده قدیمی را برگرداند، یک درخواست شبکه ناهمزمان نیز برای یک کانتینر جدید ارسال می کند. هنگام استفاده از OpenType.PREFER_NON_DEFAULT
، اگر ظرف دیگری در دسترس نباشد، یا اگر مدت زمان بیش از آن باشد، یک ظرف پیشفرض برگردانده میشود.
OpenType.PREFER_FRESH
تلاش میکند ظرفی تازه را از هر دیسک یا شبکه در بازه زمانی معین بازگرداند. در صورتی که اتصال شبکه در دسترس نباشد و/یا مدت زمان بیش از حد مجاز باشد، ظرف ذخیره شده را برمی گرداند.
استفاده از OpenType.PREFER_FRESH
در مکانهایی که زمان درخواست طولانیتر ممکن است بهطور محسوسی بر تجربه کاربر تأثیر بگذارد، مانند پرچمهای رابط کاربری یا رشتههای نمایش، توصیه نمیشود. همچنین می توانید در هر زمان از Container.refresh()
برای اجبار درخواست کانتینر شبکه استفاده کنید.
هر دوی این روشهای راحت غیرمسدود هستند. ContainerOpener.openContainer(..., Long timeoutInMillis)
یک شی ContainerOpener.ContainerFuture
را برمی گرداند، که متد get
آن یک Container
به محض بارگیری برمی گرداند (اما تا آن زمان مسدود می شود). متد ContainerOpener.openContainer(..., Notifier notifier)
یک تماس پاسخ می گیرد که زمانی که کانتینر در دسترس باشد فراخوانی می شود که می تواند برای جلوگیری از مسدود شدن رشته اصلی استفاده شود. هر دو روش دارای بازه زمانی پیشفرض 2000
میلیثانیه هستند.
ارزیابی ماکروها در زمان اجرا با استفاده از قوانین
کانتینرها می توانند مقادیر را در زمان اجرا با استفاده از قوانین ارزیابی کنند. قوانین ممکن است بر اساس معیارهایی مانند زبان دستگاه، پلتفرم یا هر مقدار ماکرو دیگری باشد. به عنوان مثال، از قوانین می توان برای انتخاب رشته نمایش محلی بر اساس زبان دستگاه در زمان اجرا استفاده کرد. این را می توان با استفاده از قانون زیر پیکربندی کرد:
سپس می توانید ماکروهای مجموعه ارزش برای هر زبان ایجاد کنید و این قانون را به هر ماکرو اضافه کنید و کد زبان مناسب را وارد کنید. وقتی این کانتینر منتشر شد، برنامه شما میتواند رشتههای نمایش محلی را بسته به زبان دستگاه کاربر در زمان اجرا نمایش دهد.
توجه داشته باشید که اگر کانتینر پیش فرض شما به قوانین نیاز دارد، باید از یک فایل کانتینر باینری به عنوان کانتینر پیش فرض خود استفاده کنید.
درباره پیکربندی قوانین (مرکز راهنمایی) بیشتر بیاموزید.
فایلهای کانتینر پیشفرض باینری
کانتینرهای پیشفرض که به قوانین نیاز دارند باید بهجای فایل JSON بهعنوان محفظه پیشفرض از یک فایل کانتینر باینری استفاده کنند. کانتینرهای باینری برای تعیین مقادیر ماکرو در زمان اجرا با قوانین Google Tag Manager پشتیبانی میکنند، در حالی که فایلهای JSON این کار را نمیکنند.
فایلهای کانتینر باینری ممکن است از رابط وب Google Tag Manager دانلود شوند و باید به پوشه /assets/tagmanager/
پروژه شما اضافه شوند و از این الگو پیروی کنند: /assets/tagmanager/GTM-XXXX
، جایی که نام فایل نشاندهنده شناسه ظرف شما است.
در مواردی که یک فایل JSON و همچنین یک فایل کانتینر باینری وجود دارد، SDK از فایل کانتینر باینری به عنوان محفظه پیشفرض استفاده میکند.
استفاده از تابع فراخوانی ماکروها
تابع فراخوانی ماکروها ماکروهایی هستند که روی مقدار بازگشتی یک تابع مشخص شده در برنامه شما تنظیم می شوند. ماکروهای فراخوانی تابع را می توان برای ترکیب مقادیر زمان اجرا با قوانین Google Tag Manager خود استفاده کرد، مانند تعیین قیمت در زمان اجرا بر اساس زبان و واحد پول پیکربندی شده دستگاه.
برای پیکربندی یک ماکرو فراخوانی تابع:
- ماکرو فراخوانی تابع را در رابط وب Google Tag Manager تعریف کنید. آرگومان ها ممکن است به صورت اختیاری به عنوان جفت کلید-مقدار پیکربندی شوند.
- با استفاده از
Container.registerFunctionCallMacroHandler()
و نام تابعی که در رابط وب Google Tag Manager پیکربندی کردهاید، یکFunctionCallMacroHandler
را در برنامه خود ثبت کنید، و متدgetValue()
آن را لغو کنید:/** * Registers a function call macro handler. * * @param functionName The function name field, as defined in the Google Tag * Manager web interface. */ mContainer.registerFunctionCallMacroHandler(functionName, new FunctionCallMacroHandler() { /** * This code will execute when any custom macro's rule(s) evaluate to true. * The code should check the functionName and process accordingly. * * @param functionName Corresponds to the function name field defined * in the Google Tag Manager web interface. * @param parameters An optional map of parameters * as defined in the Google Tag Manager web interface. */ @Override public Object getValue(String functionName, Map<String, Object> parameters)) { if (functionName.equals("myConfiguredFunctionName")) { // Process and return the calculated value of this macro accordingly. return macro_value } return null; } });
استفاده از تگ های فراخوانی تابع
برچسبهای فراخوانی تابع، عملکردهای از پیش ثبتشده را قادر میسازند تا هر زمان که رویدادی به لایه داده فشار داده میشود و قوانین برچسب به true
ارزیابی میشوند، اجرا شوند.
برای پیکربندی تگ فراخوانی تابع:
- تگ فراخوانی تابع را در رابط وب Google Tag Manager تعریف کنید. آرگومان ها ممکن است به صورت اختیاری به عنوان جفت کلید-مقدار پیکربندی شوند.
- با استفاده از
Container.registerFunctionCallTagHandler()
یک کنترل کننده تگ فراخوانی تابع را در برنامه خود ثبت کنید:/** * Register a function call tag handler. * * @param functionName The function name, which corresponds to the function name field * Google Tag Manager web interface. */ mContainer.registerFunctionCallTagHandler(functionName, new FunctionCallTagHandler() { /** * This method will be called when any custom tag's rule(s) evaluates to true. * The code should check the functionName and process accordingly. * * @param functionName The functionName passed to the functionCallTagHandler. * @param parameters An optional map of parameters as defined in the Google * Tag Manager web interface. */ @Override public void execute(String functionName, Map<String, Object> parameters) { if (functionName.equals("myConfiguredFunctionName")) { // Process accordingly. } } });
تنظیم یک دوره تجدید سفارشی
اگر سن کانتینر کنونی از 12 ساعت بیشتر شود، Google Tag Manager SDK تلاش میکند یک ظرف تازه را بازیابی کند. برای تنظیم یک دوره بازخوانی کانتینر سفارشی، مانند مثال زیر از Timer
استفاده کنید:
timer.scheduleTask(new TimerTask() { @Override public void run() { mContainer.refresh(); } }, delay, <new_period_in milliseconds>);
اشکال زدایی با Logger
Google Tag Manager SDK خطاها و هشدارها را به صورت پیشفرض در گزارشها چاپ میکند. فعال کردن گزارش دقیق تر می تواند برای اشکال زدایی مفید باشد و با پیاده سازی Logger
خود با TagManager.setLogger
، مانند این مثال، امکان پذیر است:
TagManager tagManager = TagManager.getInstance(this); tagManager.setLogger(new Logger() { final String TAG = "myGtmLogger"; // Log output with verbosity level of DEBUG. @Override public void d(String arg0) { Log.d(TAG, arg0); } // Log exceptions when provided. @Override public void d(String arg0, Throwable arg1) { Log.d(TAG, arg0); arg1.printStackTrace(); } // Rest of the unimplemented Logger methods. });
یا، میتوانید LogLevel Logger موجود را با استفاده از TagManager.getLogger().setLogLevel(LogLevel)
تنظیم کنید، مانند این مثال:
// Change the LogLevel to INFO to enable logging at INFO and higher levels. TagManager tagManager = TagManager.getInstance(this); tagManager.getLogger().setLogLevel(LogLevel.INFO);