Skip to content

Commit d44b0d4

Browse files
committed
tdd post published, admob added and config, messaging updated
1 parent 94b51ab commit d44b0d4

File tree

7 files changed

+221
-27
lines changed

7 files changed

+221
-27
lines changed

_drafts/2019-04-15-remote_config.md

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ image: firebase/remote_config
77
github: firebase/tree/master/remote_config
88
description: "Firebase"
99
version: Firebase-Config 16.1
10-
keywords: "firebase, chmura, konfiguracja, ustawienia, zdalna, parametr, warunek, remote, config, settings, parameter, condition, android, programowanie, programming"
10+
keywords: "firebase, chmura, konfiguracja, ustawienia, zdalna, parametr, warunek, remote, config, settings, parameter, condition, testy a/b, testing a/b, predykcje, prognoza, predictions, android, programowanie, programming"
1111
---
1212

1313
## Wprowadzenie
@@ -37,32 +37,37 @@ Aby wykorzystać Remote Config w aplikacji należy dodać parametry i warunki w
3737
{% endhighlight %}
3838

3939
{% highlight kotlin %}
40-
//get instance
41-
val remoteConfig = FirebaseRemoteConfig.getInstance()
40+
fun startRemoteConfig() {
41+
//get instance
42+
val remoteConfig = FirebaseRemoteConfig.getInstance()
4243

43-
//set remote config singleton
44-
val configSettings = FirebaseRemoteConfigSettings.Builder()
45-
.setDeveloperModeEnabled(BuildConfig.DEBUG) //for developer purpose
46-
.build()
47-
remoteConfig.setConfigSettings(configSettings)
44+
//set remote config singleton
45+
val configSettings = FirebaseRemoteConfigSettings.Builder()
46+
.setDeveloperModeEnabled(BuildConfig.DEBUG) //for developer purpose
47+
.build()
48+
remoteConfig.setConfigSettings(configSettings)
4849

49-
//set defaults value from xml or Map object
50-
remoteConfig.setDefaults(R.xml.remote_config_default)
50+
//set defaults value from xml or Map object
51+
remoteConfig.setDefaults(R.xml.remote_config_default)
5152

52-
//fetch parameters from remote config and add some listeners
53-
remoteConfig.fetch(36000L) //cache expiration for 10h
54-
.addOnCompleteListener(this) { task ->
55-
if (task.isSuccessful) {
56-
remoteConfig.activateFetched() //active new data before use
57-
//do some action
58-
}
59-
else {
60-
//do some action
53+
//fetch parameters from remote config and add some listeners
54+
remoteConfig.fetch(36000L) //cache expiration for 10h
55+
.addOnCompleteListener(this) { task ->
56+
if (task.isSuccessful) {
57+
remoteConfig.activateFetched() //active new data before use
58+
//do some action
59+
}
60+
else {
61+
//do some action
62+
}
63+
64+
//get current values and use them in some variable, preferences etc
65+
val showTutorial = remoteConfig.getBoolean("show_tutorial")
66+
val skin = remoteConfig.getString("skin")
67+
//do something with fetched values
6168
}
69+
}
70+
{% endhighlight %}
6271

63-
//get current values and use them in some variable, preferences etc
64-
val showTutorial = remoteConfig.getBoolean("show_tutorial")
65-
val skin = remoteConfig.getString("skin")
66-
//do something with fetched values
67-
}
68-
{% endhighlight %}
72+
## Prognozy
73+
Usługa `Firebase Predictions` wykorzystuje `uczenie maszynowe` oparte o dane analityczne (pochodzące z `Firebase Analytics`) w celu tworzenia `dynamicznych segmentów` użytkowników na podstawie ich zachowań w aplikacji. Utworzone w ten sposób prognozy grupy użytkowników mogą być wykorzystane do wybierania odbiorców zdalnej konfiguracji (`Remote Config`), wiadomości i notyfikacji (`Cloud Messaging`, `In-App Messaging`) czy też testów A/B (`Testing A/B`). Dzięki temu zwiększenie liczby konwersji, kierowanie kampanii, dostosowanie treści i interfejsu użytkownika zgodnie z jego preferencjami i strategią marketingową staje się jeszcze prostsze. Dodatkowo testy A/B pozwalają na przeprowadzenie eksperymentów pod kątem optymalizacji zajścia pewnej akcji dla usług zdalnej konfiguracji oraz wiadomości i notyfikacji. W rezultacie zwracane są wyniki konwersji dla różnych wybranych wariantów co ułatwia testowanie i porównanie zmian w interfejsie użytkownika i kierowanych kampaniach oraz podjęcia decyzji o ich wprowadzeniu dla szerszej grupy odbiorców.

_drafts/2019-04-22-cloud_messaging.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ categories: ["Firebase"]
66
image: firebase/cloud_messaging
77
github: firebase/tree/master/cloud_messaging
88
description: "Firebase"
9-
version: Firebase-Messaging 17.3
10-
keywords: "firebase, chmura, cloud, message, notification, data, token, topic, send, receive, android, programowanie, programming"
9+
version: Firebase-Messaging 17.3, Firebase-InAppMessaging-Display 17.0
10+
keywords: "firebase, chmura, cloud, message, notification, data, token, topic, send, receive, in-app messaging, android, programowanie, programming"
1111
---
1212

1313
## Wiadomość
@@ -201,3 +201,6 @@ private fun unsubscribeFromTopic() {
201201
}
202202
}
203203
{% endhighlight %}
204+
205+
## Komunikaty w aplikacji
206+
Usługa `In-App Messaging` pozwala na przedstawianie ukierunkowanych wiadomości kontekstowych w aplikacji w postaci banerów dla aktualnie aktywnych użytkowników w celu zachęcenia ich do podjęcia dodatkowych działań czy odkrywania nowych obszarów i funkcjonalności. Aby rozpocząć wysyłanie komunikatów z poziomu `konsoli Firebase` wystarczy wskazać docelową grupę odbiorców (np. na podstawie prognoz czy testów A/B), skonfigurować wygląd wiadomości i wyzwalacze oraz podpiąć akcje w postaci `dynamicznych linków` (`Dynamic Links`) i dodać ich obsługę po stronie aplikacji. W przypadku modyfikacji sposobu wyświetlania wiadomości należy stworzyć i zarejestrować autorską implementację klasy rozszerzającej `FirebaseInAppMessagingDisplay`.

_drafts/2019-04-29-admob.md

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
---
2+
layout: post
3+
title: "AdMob"
4+
date: 2019-04-29
5+
categories: ["Firebase"]
6+
image: firebase/admob
7+
github: firebase/tree/master/admob
8+
description: "Firebase"
9+
version: Firebase-Ads 17.1
10+
keywords: "firebase, admob, reklama, reklamy, ad, ads, baner, wideo, pełen ekran, natywna, banner, video, fullscreen, native, android, programowanie, programming"
11+
---
12+
13+
## Wprowadzenie
14+
`Google AdMob` jest mobilną platformą reklamową, która umożliwia wyświetlanie ukierunkowanych reklam w aplikacji co przekłada się na generowanie przychodów. Reklamy pochodzą od milionów reklamodawców `Google` w czasie rzeczywistym i dzięki współpracy z usługą `Analytics` pozwalają na maksymalizowanie zysków poprzez automatyczny wybór dopasowanej treści dla danego użytkownika. Reklamy mogą być wyświetlane jako banery reklamowe, reklamy pełnoekranowe, reklamy wideo czy reklamy natywne.
15+
16+
## Konfiguracja
17+
Aby wykorzystać możliwości `AdMob` należy stworzyć `konto AdMob` (lub użyć konta testowego) oraz dodać wpis z kluczem `AdMob App ID` w pliku `AndroidManifest`. Następnie dokonać inicjalizacji usługi w aplikacji poprzez wywołanie metody `MobileAds.initialize` i wybrać format reklamy oraz jego miejsce w widoku.
18+
19+
{% highlight xml %}
20+
<!-- The value below is for testing purpose -->
21+
<meta-data
22+
android:name="com.google.android.gms.ads.APPLICATION_ID"
23+
android:value="ca-app-pub-3940256099942544~3347511713"/>
24+
{% endhighlight %}
25+
26+
{% highlight kotlin %}
27+
override fun onCreate(savedInstanceState: Bundle?) {
28+
super.onCreate(savedInstanceState)
29+
//start once e.g. when app launch
30+
MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713") //testing key
31+
}
32+
{% endhighlight %}
33+
34+
## Baner reklamowy
35+
Banery reklamowe (`banner ads`) są prostokatnymi graficznymi lub tekstowymi reklamami zajmującymi część widoku aplikacji. Pozostają na ekranie, gdy użytkownik wchodzi w interakcje z aplikacją i odświeżają się automatycznie po pewnym czasie. Aby dodać reklamę banerową do aplikacji należy umieścić widok `AdView` w docelowym układzie oraz załadować reklamę oraz opcjonalnie dodać obiektu słuchacza `AdListener` w kodzie.
36+
37+
{% highlight xml %}
38+
<!-- choose adSize from one of: BANNER, LARGE_BANNER, MEDIUM_RECTANGLE,
39+
FULL_BANNER, LEADERBOARD, SMART_BANNER or define custom size
40+
adUnitId as below is for developer testing purpose -->
41+
<com.google.android.gms.ads.AdView
42+
xmlns:ads="http://schemas.android.com/apk/res-auto"
43+
android:id="@+id/adView"
44+
android:layout_width="wrap_content"
45+
android:layout_height="wrap_content"
46+
ads:adSize="BANNER"
47+
ads:adUnitId="ca-app-pub-3940256099942544/6300978111">
48+
</com.google.android.gms.ads.AdView>
49+
{% endhighlight %}
50+
51+
{% highlight kotlin %}
52+
class AdViewActivity : AppCompatActivity() {
53+
54+
private lateinit var adView: AdView
55+
56+
override fun onCreate(savedInstanceState: Bundle?) {
57+
super.onCreate(savedInstanceState)
58+
setContentView(R.layout.activity_adview)
59+
MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713")
60+
61+
setAdView()
62+
}
63+
64+
private fun setAdView() {
65+
adView = findViewById<AdView>(R.id.adView)
66+
val adRequest = AdRequest.Builder().build()
67+
adView.loadAd(adRequest)
68+
69+
//setup listener methods
70+
adView.adListener = object: AdListener() {
71+
override fun onAdLoaded() {
72+
//some additional action when ad loaded
73+
}
74+
override fun onAdFailedToLoad(errorCode: Int) {}
75+
override fun onAdOpened() {}
76+
override fun onAdLeftApplication() {}
77+
override fun onAdClosed() {}
78+
}
79+
}
80+
}
81+
{% endhighlight %}
82+
83+
## Reklama pełnoekranowa
84+
Reklamy pełnoekranowe (`inerstitial ads`) obejmują cały układ widoku i przeważnie wyświetlane są w ekranach przejścia przepływu akcji między czynnościami lub naturalnymi przerwami (np. po ukończeniu zadania) tam gdzie użytkownik spodziewa się przerwy w działaniu. Użytkownik może wybrać reklamę przechodząc do miejsca docelowego lub zamknąć i powrócić do bieżącej akcji. Zanim reklamy pełnoekranowe zostaną użyte w aplikacji należy zastanowić się czy są właściwym typem reklam dla aplikacji i czy nie zakłócają jej działania oraz w przypadku implementacji zadbać o zwolnienie i wznowienie zasobów oraz akcji. Aby dodać reklamę pełnoekranową należy stworzyć obiekt `InterstitialAd`, załadować i wywołać reklamę oraz opcjonalnie dodać obiekt słuchacza `AdListener`.
85+
86+
{% highlight kotlin %}
87+
class InterstitialAdActivity : AppCompatActivity() {
88+
89+
private lateinit var interstitialAd: InterstitialAd
90+
91+
override fun onCreate(savedInstanceState: Bundle?) {
92+
super.onCreate(savedInstanceState)
93+
setContentView(R.layout.activity_interstitial_ad)
94+
MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713")
95+
96+
setInterstitialAd()
97+
setButtonClickListener()
98+
}
99+
100+
private fun setInterstitialAd() {
101+
interstitialAd = InterstitialAd(this)
102+
interstitialAd.adUnitId = "ca-app-pub-3940256099942544/1033173712"
103+
interstitialAd.loadAd(AdRequest.Builder().build())
104+
105+
//setup listener methods
106+
interstitialAd.adListener = object: AdListener() {
107+
override fun onAdClosed() {
108+
//reload new one
109+
interstitialAd.loadAd(AdRequest.Builder().build())
110+
//start action from point where was paused
111+
}
112+
override fun onAdOpened() {
113+
//pause some action
114+
}
115+
}
116+
}
117+
118+
private fun setButtonClickListener() {
119+
//show ad on some action like click finish button
120+
finishButton.setOnClickListener {
121+
if (interstitialAd.isLoaded) {
122+
interstitialAd.show()
123+
}
124+
else {
125+
//ad still not loaded
126+
}
127+
}
128+
}
129+
{% endhighlight %}
130+
131+
## Reklama wideo
132+
Reklamy wideo (`video ads`) wyświetlane są w trybie pełnoekranowym i w ramach obejrzenia całości przyznają użytkownikowi pewien profit w aplikacji. Aby dodać reklamę wideo należy pobrać instancję typu `RewarderVideoAd`, zaimplementować obiekt słuchacza `RewarderVideoAdListener` oraz zadbać o właściwe zarządzanie obiektem reklam w cyklu życia komponentu.
133+
134+
{% highlight kotlin %}
135+
class RewarderVideoAdActivity : AppCompatActivity(), RewardedVideoAdListener {
136+
137+
private lateinit var rewardedVideoAd: RewardedVideoAd
138+
139+
override fun onCreate(savedInstanceState: Bundle?) {
140+
super.onCreate(savedInstanceState)
141+
setContentView(R.layout.activity_rewarder_video_ad)
142+
MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713")
143+
setRewarderVideoAd()
144+
}
145+
146+
private fun setRewarderVideoAd() {
147+
rewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this)
148+
rewardedVideoAd.rewardedVideoAdListener = this
149+
rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917", AdRequest.Builder().build())
150+
}
151+
152+
//setup RewarderVideoAd instance in lifecycle methods
153+
override fun onPause() {
154+
super.onPause()
155+
rewardedVideoAd.pause(this)
156+
}
157+
158+
override fun onResume() {
159+
super.onResume()
160+
rewardedVideoAd.resume(this)
161+
}
162+
163+
override fun onDestroy() {
164+
super.onDestroy()
165+
rewardedVideoAd.destroy(this)
166+
}
167+
168+
//implement RewardedVideoAdListener methods
169+
override fun onRewarded(reward: RewardItem) {
170+
//reward user based on RewardItem instance
171+
}
172+
override fun onRewardedVideoAdLeftApplication() {}
173+
override fun onRewardedVideoAdClosed() {
174+
//reload new one
175+
rewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917", AdRequest.Builder().build())
176+
}
177+
override fun onRewardedVideoAdFailedToLoad(errorCode: Int) {}
178+
override fun onRewardedVideoAdLoaded() {}
179+
override fun onRewardedVideoAdOpened() {}
180+
override fun onRewardedVideoStarted() {}
181+
override fun onRewardedVideoCompleted() {}
182+
}
183+
{% endhighlight %}
184+
185+
## Reklama natywna
186+
//TODO
File renamed without changes.
782 KB
Loading
23.2 KB
Loading
72.8 KB
Loading

0 commit comments

Comments
 (0)