Skip to content

Commit e9731a0

Browse files
committed
Update iOS custom metrics/dimensions methods
Bug was causing values to be set on all iOS hits, corrected so hit based custom metrics and dimensions are only sent once.
1 parent 3a95af9 commit e9731a0

File tree

3 files changed

+88
-46
lines changed

3 files changed

+88
-46
lines changed

googleanalyticsv3.unitypackage

150 Bytes
Binary file not shown.

source/Plugins/GoogleAnalyticsV3/GAIHandler.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,81 +123,81 @@ public void _dispatchHits(){
123123
[DllImport("__Internal")]
124124
private static extern void sendAppView(string screenName);
125125
public void _sendAppView(AppViewHitBuilder builder){
126-
_setCustomDimensionOnTracker(builder);
127-
_setCustomMetricOnTracker(builder);
126+
_buildCustomMetricsDictionary(builder);
127+
_buildCustomDimensionsDictionary(builder);
128128
_buildCampaignParametersDictionary(builder);
129129
sendAppView(builder.GetScreenName());
130130
}
131131

132132
[DllImport("__Internal")]
133133
private static extern void sendEvent(string category, string action, string label, long value);
134134
public void _sendEvent(EventHitBuilder builder){
135-
_setCustomDimensionOnTracker(builder);
136-
_setCustomMetricOnTracker(builder);
135+
_buildCustomMetricsDictionary(builder);
136+
_buildCustomDimensionsDictionary(builder);
137137
_buildCampaignParametersDictionary(builder);
138138
sendEvent(builder.GetEventCategory(), builder.GetEventAction(), builder.GetEventLabel(), builder.GetEventValue());
139139
}
140140

141141
[DllImport("__Internal")]
142142
private static extern void sendTransaction(string transactionID, string affiliation, double revenue, double tax, double shipping, string currencyCode);
143143
public void _sendTransaction(TransactionHitBuilder builder){
144-
_setCustomDimensionOnTracker(builder);
145-
_setCustomMetricOnTracker(builder);
144+
_buildCustomMetricsDictionary(builder);
145+
_buildCustomDimensionsDictionary(builder);
146146
_buildCampaignParametersDictionary(builder);
147147
sendTransaction(builder.GetTransactionID(), builder.GetAffiliation(), builder.GetRevenue(), builder.GetTax(), builder.GetShipping(), builder.GetCurrencyCode());
148148
}
149149

150150
[DllImport("__Internal")]
151151
private static extern void sendItemWithTransaction(string transactionID, string name, string sku, string category, double price, long quantity, string currencyCode);
152152
public void _sendItemWithTransaction(ItemHitBuilder builder){
153-
_setCustomDimensionOnTracker(builder);
154-
_setCustomMetricOnTracker(builder);
153+
_buildCustomMetricsDictionary(builder);
154+
_buildCustomDimensionsDictionary(builder);
155155
_buildCampaignParametersDictionary(builder);
156156
sendItemWithTransaction(builder.GetTransactionID(), builder.GetName(), builder.GetSKU(), builder.GetCategory(), builder.GetPrice(), builder.GetQuantity(),builder.GetCurrencyCode());
157157
}
158158

159159
[DllImport("__Internal")]
160160
private static extern void sendException(string exceptionDescription, bool isFatal);
161161
public void _sendException(ExceptionHitBuilder builder){
162-
_setCustomDimensionOnTracker(builder);
163-
_setCustomMetricOnTracker(builder);
162+
_buildCustomMetricsDictionary(builder);
163+
_buildCustomDimensionsDictionary(builder);
164164
_buildCampaignParametersDictionary(builder);
165165
sendException(builder.GetExceptionDescription(), builder.IsFatal());
166166
}
167167

168168
[DllImport("__Internal")]
169169
private static extern void sendSocial(string socialNetwork, string socialAction, string targetUrl);
170170
public void _sendSocial(SocialHitBuilder builder){
171-
_setCustomDimensionOnTracker(builder);
172-
_setCustomMetricOnTracker(builder);
171+
_buildCustomMetricsDictionary(builder);
172+
_buildCustomDimensionsDictionary(builder);
173173
_buildCampaignParametersDictionary(builder);
174174
sendSocial(builder.GetSocialNetwork(), builder.GetSocialAction(), builder.GetSocialTarget());
175175
}
176176

177177
[DllImport("__Internal")]
178178
private static extern void sendTiming(string timingCategory,long timingInterval, string timingName, string timingLabel);
179179
public void _sendTiming(TimingHitBuilder builder){
180-
_setCustomDimensionOnTracker(builder);
181-
_setCustomMetricOnTracker(builder);
180+
_buildCustomMetricsDictionary(builder);
181+
_buildCustomDimensionsDictionary(builder);
182182
_buildCampaignParametersDictionary(builder);
183183
sendTiming(builder.GetTimingCategory(), builder.GetTimingInterval(), builder.GetTimingName(), builder.GetTimingLabel());
184184
}
185185

186186
[DllImport("__Internal")]
187-
private static extern void setCustomDimensionOnTracker(int index, string value);
188-
public void _setCustomDimensionOnTracker<T>(HitBuilder<T> builder){
187+
private static extern void addCustomDimensionToDictionary(int key, string value);
188+
public void _buildCustomDimensionsDictionary<T>(HitBuilder<T> builder){
189189
foreach(KeyValuePair<int, string> entry in builder.GetCustomDimensions())
190190
{
191-
setCustomDimensionOnTracker(entry.Key, entry.Value);
191+
addCustomDimensionToDictionary(entry.Key, entry.Value);
192192
}
193193
}
194194

195195
[DllImport("__Internal")]
196-
private static extern void setCustomMetricOnTracker(int index, string value);
197-
public void _setCustomMetricOnTracker<T>(HitBuilder<T> builder){
196+
private static extern void addCustomMetricToDictionary(int key, string value);
197+
public void _buildCustomMetricsDictionary<T>(HitBuilder<T> builder){
198198
foreach(KeyValuePair<int, string> entry in builder.GetCustomMetrics())
199199
{
200-
setCustomMetricOnTracker(entry.Key, entry.Value);
200+
addCustomMetricToDictionary(entry.Key, entry.Value);
201201
}
202202
}
203203

source/Plugins/iOS/GAIHandler.m

Lines changed: 68 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313
See the License for the specific language governing permissions and
1414
limitations under the License.
15-
*/
15+
*/
1616

1717
#import "GAIHandler.h"
1818
#import "GAI.h"
@@ -27,6 +27,8 @@ @implementation GAIHandler
2727
bool startSessionOnNextHit = false;
2828
bool endSessionOnNextHit = false;
2929
NSDictionary *campaignData;
30+
NSMutableDictionary *customMetrics = nil;
31+
NSMutableDictionary *customDimensions= nil;
3032

3133
GAI* shared_instance() {
3234
return [GAI sharedInstance];
@@ -106,35 +108,55 @@ void setBool(const char * parameterName, const BOOL isValue) {
106108

107109
void set(const char * parameterName, const char * value ) {
108110
id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
109-
111+
110112
[tracker set:[NSString stringWithUTF8String:parameterName]
111-
value:[NSString stringWithUTF8String:value ]];
113+
value:[NSString stringWithUTF8String:value ]];
112114
}
113115

114116
NSString* get(const char * parameterName) {
115117
id tracker = [[GAI sharedInstance] defaultTracker];
116118
return [tracker get:[NSString stringWithUTF8String:parameterName]];
117119
}
118120

119-
void setCustomDimensionOnTracker(int index, char * value) {
120-
id tracker = [[GAI sharedInstance] defaultTracker];
121-
[tracker set:[GAIFields customDimensionForIndex:index]
122-
value:[NSString stringWithUTF8String:value]];
121+
void addCustomDimensionToDictionary(int index, char * value){
122+
if (!customDimensions) {
123+
customDimensions = [[NSMutableDictionary alloc] initWithCapacity:20];
124+
}
125+
customDimensions[@(index)] = @(value);
123126
}
124127

125-
void setCustomMetricOnTracker(int index, char * value) {
126-
id tracker = [[GAI sharedInstance] defaultTracker];
127-
[tracker set:[GAIFields customMetricForIndex:index]
128-
value:[NSString stringWithUTF8String:value]];
128+
void addCustomMetricToDictionary(int index, char * value){
129+
if (!customMetrics) {
130+
customMetrics = [[NSMutableDictionary alloc] initWithCapacity:20];
131+
}
132+
customMetrics[@(index)] = @(value);
133+
}
134+
135+
+ (void) setCustomDimensionsOnBuilder: (GAIDictionaryBuilder*)builder {
136+
for(id key in customDimensions) {
137+
NSString * string = [customDimensions objectForKey:key];
138+
[builder set:string
139+
forKey:[GAIFields customDimensionForIndex:[key intValue]]];
140+
}
141+
customDimensions = nil;
142+
}
143+
144+
+ (void) setCustomMetricsOnBuilder: (GAIDictionaryBuilder*)builder {
145+
for(id key in customMetrics) {
146+
NSString * string = [customMetrics objectForKey:key];
147+
[builder set:string
148+
forKey:[GAIFields customMetricForIndex:[key intValue]]];
149+
}
150+
customMetrics = nil;
129151
}
130152

131153
void buildCampaignParametersDictionary(const char * source, const char * medium, const char * name, const char * content, const char * keyword) {
132154
campaignData = [NSDictionary dictionaryWithObjectsAndKeys:
133-
[NSString stringWithUTF8String:source], kGAICampaignSource,
134-
[NSString stringWithUTF8String:medium], kGAICampaignMedium,
135-
[NSString stringWithUTF8String:name], kGAICampaignName,
136-
[NSString stringWithUTF8String:content], kGAICampaignContent,
137-
[NSString stringWithUTF8String:keyword], kGAICampaignKeyword, nil];
155+
[NSString stringWithUTF8String:source], kGAICampaignSource,
156+
[NSString stringWithUTF8String:medium], kGAICampaignMedium,
157+
[NSString stringWithUTF8String:name], kGAICampaignName,
158+
[NSString stringWithUTF8String:content], kGAICampaignContent,
159+
[NSString stringWithUTF8String:keyword], kGAICampaignKeyword, nil];
138160
hasCampaignParameters = true;
139161
}
140162

@@ -150,7 +172,7 @@ + (void) addAdditionalParametersToBuilder: (GAIDictionaryBuilder*)builder {
150172
endSessionOnNextHit = false;
151173
[builder set:@"end" forKey:kGAISessionControl];
152174
}
153-
175+
154176
}
155177

156178
void sendAppView(const char * value) {
@@ -161,18 +183,23 @@ void sendAppView(const char * value) {
161183
value:[NSString stringWithUTF8String:value]];
162184

163185
[GAIHandler addAdditionalParametersToBuilder:builder];
186+
[GAIHandler setCustomDimensionsOnBuilder:builder];
187+
[GAIHandler setCustomMetricsOnBuilder:builder];
164188

165189
[tracker send:[builder build]];
166190
}
167-
191+
168192
void sendEvent(const char * category, const char * action, const char * label, const long long value) {
169193
id tracker = [[GAI sharedInstance] defaultTracker];
170-
194+
171195
GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createEventWithCategory:[NSString stringWithUTF8String:category]
172-
action:[NSString stringWithUTF8String:action]
196+
action:[NSString stringWithUTF8String:action]
173197
label:[NSString stringWithUTF8String:label]
174198
value:[NSNumber numberWithLongLong:value]];
175199
[GAIHandler addAdditionalParametersToBuilder:builder];
200+
[GAIHandler setCustomDimensionsOnBuilder:builder];
201+
[GAIHandler setCustomMetricsOnBuilder:builder];
202+
176203
[tracker send:[builder build]];
177204
}
178205

@@ -186,21 +213,27 @@ void sendTransaction( const char * transactionID, const char* affiliation, const
186213
shipping:[NSNumber numberWithDouble:shipping]
187214
currencyCode:[NSString stringWithUTF8String:currencyCode]];
188215
[GAIHandler addAdditionalParametersToBuilder:builder];
216+
[GAIHandler setCustomDimensionsOnBuilder:builder];
217+
[GAIHandler setCustomMetricsOnBuilder:builder];
218+
189219
[tracker send:[builder build]];
190220
}
191221

192222
void sendItemWithTransaction(const char * transactionID, const char * name, const char * sku, const char * category, const double price, const long long quantity, const char * currencyCode) {
193223
id tracker = [[GAI sharedInstance] defaultTracker];
194224

195225
GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createItemWithTransactionId:[NSString stringWithUTF8String:transactionID]
196-
name:[NSString stringWithUTF8String:name]
197-
sku:[NSString stringWithUTF8String:sku]
198-
category:[NSString stringWithUTF8String:category]
199-
price:[NSNumber numberWithDouble:price]
200-
quantity:[NSNumber numberWithLongLong:quantity]
201-
currencyCode:[NSString stringWithUTF8String:currencyCode]];
226+
name:[NSString stringWithUTF8String:name]
227+
sku:[NSString stringWithUTF8String:sku]
228+
category:[NSString stringWithUTF8String:category]
229+
price:[NSNumber numberWithDouble:price]
230+
quantity:[NSNumber numberWithLongLong:quantity]
231+
currencyCode:[NSString stringWithUTF8String:currencyCode]];
202232

203233
[GAIHandler addAdditionalParametersToBuilder:builder];
234+
[GAIHandler setCustomDimensionsOnBuilder:builder];
235+
[GAIHandler setCustomMetricsOnBuilder:builder];
236+
204237
[tracker send:[builder build]];
205238
}
206239

@@ -212,6 +245,9 @@ void sendException(const char * errorDescription, const bool isFatal) {
212245
withFatal:isFatal ? @YES : @NO];
213246

214247
[GAIHandler addAdditionalParametersToBuilder:builder];
248+
[GAIHandler setCustomDimensionsOnBuilder:builder];
249+
[GAIHandler setCustomMetricsOnBuilder:builder];
250+
215251
[tracker send:[builder build]];
216252

217253
}
@@ -224,6 +260,9 @@ void sendSocial(const char * socialNetwork, const char * socialAction, const cha
224260
target:[NSString stringWithUTF8String:targetUrl]];
225261

226262
[GAIHandler addAdditionalParametersToBuilder:builder];
263+
[GAIHandler setCustomDimensionsOnBuilder:builder];
264+
[GAIHandler setCustomMetricsOnBuilder:builder];
265+
227266
[tracker send:[builder build]];
228267
}
229268

@@ -235,6 +274,9 @@ void sendTiming(const char * timingCategory, const long long timingInterval, con
235274
name:[NSString stringWithUTF8String:name]
236275
label:[NSString stringWithUTF8String:label]];
237276
[GAIHandler addAdditionalParametersToBuilder:builder];
277+
[GAIHandler setCustomDimensionsOnBuilder:builder];
278+
[GAIHandler setCustomMetricsOnBuilder:builder];
279+
238280
[tracker send:[builder build]];
239281
}
240282

0 commit comments

Comments
 (0)