Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Google Analytics doesn't work in iOS

My configuration in Google Analytics account:

enter image description here

My code:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    GAI *gai = [GAI sharedInstance];
    //gai.optOut = YES;
    gai.trackUncaughtExceptions = YES;  // report uncaught exceptions
    gai.logger.logLevel = kGAILogLevelVerbose;  // remove before app release
    [[GAI sharedInstance] setDispatchInterval:10.0];
    [[GAI sharedInstance] trackerWithTrackingId:@"UA-xxxxxx-3"];

    return YES;
}

In view controller:

  • (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated];

    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    [tracker set:kGAIScreenName value:@"Detail Screen"];
    [[GAI sharedInstance].defaultTracker send:[[GAIDictionaryBuilder createScreenView] build]];
    

    }

It did shows in my console:

2015-06-24 15:03:36.592 GoogleAnalyticsDemoiOS[9540:264576] VERBOSE: GoogleAnalytics 3.12 +[GAITrackerModel initialize] (GAITrackerModel.m:88): idfa class missing, won't collect idfa
2015-06-24 15:03:36.619 GoogleAnalyticsDemoiOS[9540:264576] INFO: GoogleAnalytics 3.12 -[GAIReachabilityChecker reachabilityFlagsChanged:] (GAIReachabilityChecker.m:159): Reachability flags update: 0X000002
2015-06-24 15:03:36.644 GoogleAnalyticsDemoiOS[9540:264684] VERBOSE: GoogleAnalytics 3.12 -[GAIBatchingDispatcher persist:] (GAIBatchingDispatcher.m:517): Saved hit: {
    parameters =     {
        "&_crc" = 0;
        "&_s" = 1;
        "&_u" = ".etnoKo9L";
        "&_v" = "mi3.1.2";
        "&a" = 800078077;
        "&aid" = "com.mycompany.app";
        "&an" = GoogleAnalyticsDemoiOS;
        "&av" = "1.0";
        "&cd" = "Detail Screen";
        "&cid" = "caf03508-eba6-42f8-9600-3832ce042907";
        "&dm" = "x86_64";
        "&ds" = app;
        "&sr" = 750x1334;
        "&t" = screenview;
        "&tid" = "UA-xxxxxxxx-3";
        "&ul" = en;
        "&v" = 1;
        "&z" = 663648936779959001;
        gaiVersion = "3.12";
    };
    timestamp = "2015-06-24 07:03:36 +0000";
}
2015-06-24 15:03:36.644 GoogleAnalyticsDemoiOS[9540:264684] VERBOSE: GoogleAnalytics 3.12 __70-[GAIBatchingDispatcher checkIAdCampaignAttributionWithHitParameters:]_block_invoke (GAIBatchingDispatcher.m:749): iAd campaign tracking disabled because the iAd framework is not linked. See http://goo.gl/426NGa for instructions.
2015-06-24 15:03:46.642 GoogleAnalyticsDemoiOS[9540:264684] VERBOSE: GoogleAnalytics 3.12 -[GAIRequestBuilder requestGetUrl:payload:] (GAIRequestBuilder.m:195): building URLRequest for https://ssl.google-analytics.com/collect
2015-06-24 15:03:46.643 GoogleAnalyticsDemoiOS[9540:264684] VERBOSE: GoogleAnalytics 3.12 -[GAIBatchingDispatcher dispatchWithCompletionHandler:] (GAIBatchingDispatcher.m:632): Sending hit(s) GET: https://ssl.google-analytics.com/collect?av=1.0&cid=caf03508-eba6-42f8-9600-3832ce042907&tid=UA-64362429-3&a=800078077&dm=x86_64&cd=Detail+Screen&t=screenview&aid=com.wow.touch&ul=en&_u=.etnoKo9L&ds=app&sr=750x1334&v=1&_s=1&_crc=0&an=GoogleAnalyticsDemoiOS&_v=mi3.1.2&ht=1435129416641&qt=10001&z=663648936779959001
2015-06-24 15:03:46.710 GoogleAnalyticsDemoiOS[9540:264576] INFO: GoogleAnalytics 3.12 -[GAIBatchingDispatcher didSendHits:response:data:error:] (GAIBatchingDispatcher.m:226): Hit(s) dispatched: HTTP status -1
2015-06-24 15:03:46.710 GoogleAnalyticsDemoiOS[9540:264684] INFO: GoogleAnalytics 3.12 -[GAIBatchingDispatcher deleteHits:] (GAIBatchingDispatcher.m:529): hit(s) Successfully deleted
2015-06-24 15:03:46.711 GoogleAnalyticsDemoiOS[9540:264684] INFO: GoogleAnalytics 3.12 -[GAIBatchingDispatcher didSendHits:] (GAIBatchingDispatcher.m:237): 1 hit(s) sent

But in Realtime view, I always got 0 active users. Any idea? Thanks

like image 209
Bagusflyer Avatar asked Jun 24 '15 07:06

Bagusflyer


2 Answers

In the AppDElegate.m file :

#import "AppDelegate.h"
#import "GAI.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

   [GAI sharedInstance].trackUncaughtExceptions  = YES;

   [GAI sharedInstance].dispatchInterval = 1;

   [[[GAI sharedInstance] logger]setLogLevel:kGAILogLevelVerbose];

   id<GAITracker> tracker = [[GAI sharedInstance] trackerWithTrackingId:@"TrackingId"];

   [GAI sharedInstance].defaultTracker = tracker;

   return YES;
}

In ViewController.h

#import <UIKit/UIKit.h>
#import "GAITrackedViewController.h"

@interface FirstViewController : GAITrackedViewController


@end

In ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    self.screenName = @"RED Screen";
}

Try it. This worked for me just fine. I tried it more than three apps. And All are working for realtime. If your account for your app is new then you might have to wait for 24h or more to see the result. Sometimes it take time to display realtime data without any reason.

like image 24
Rubaiyat Jahan Mumu Avatar answered Sep 20 '22 17:09

Rubaiyat Jahan Mumu


--- UPDATED ---

Here is how I fixed :

1 - add this properties and #define directive (if you don't have in your application) in AppDelegate :

#define IS_IOS7_AND_UP                      ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0)

@interface AppDelegate ()

// Used for sending Google Analytics traffic in the background.
@property (nonatomic, assign)   BOOL okToWait;
@property (nonatomic, copy)     void (^dispatchHandler)(GAIDispatchResult result);

@end

2- in viewDidLoad I use dispatchInterval as 20 and Initialize the tracker shared instance :

[GAI sharedInstance].dispatchInterval = 20;
//[[[GAI sharedInstance] logger] setLogLevel:kGAILogLevelVerbose];
// Initialize tracker.
[[GAI sharedInstance] trackerWithTrackingId:MY_GoogleAnalyticsID];

3 - add this method for your AppDelegate :

// This method sends hits in the background until either we're told to stop background processing,
// we run into an error, or we run out of hits.  We use this to send any pending Google Analytics
// data since the app won't get a chance once it's in the background.
- (void)sendHitsInBackground {
    self.okToWait = YES;
    __weak AppDelegate *weakSelf = self;
    __block UIBackgroundTaskIdentifier backgroundTaskId =
    [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        weakSelf.okToWait = NO;
    }];

    if (backgroundTaskId == UIBackgroundTaskInvalid) {
        return;
    }

    self.dispatchHandler = ^(GAIDispatchResult result) {
        // If the last dispatch succeeded, and we're still OK to stay in the background then kick off
        // again.
        if (result == kGAIDispatchGood && weakSelf.okToWait ) {
            [[GAI sharedInstance] dispatchWithCompletionHandler:weakSelf.dispatchHandler];
        } else {
            [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskId];
        }
    };
    [[GAI sharedInstance] dispatchWithCompletionHandler:self.dispatchHandler];
}

4- in the end of applicationDidEnterBackground call sendHitsInBackground method :

- (void)applicationDidEnterBackground:(UIApplication *)application {
    //
    // . . .
    //
    if (IS_IOS7_AND_UP)
        [self sendHitsInBackground];
}

5 - Add performFetchWithCompletionHandler method and call sendHitsInBackground :

// In case the app was sent into the background when there was no network connection, we will use
// the background data fetching mechanism to send any pending Google Analytics data.  Note that
// this app has turned on background data fetching in the capabilities section of the project.
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {

    if (IS_IOS7_AND_UP)
        [self sendHitsInBackground];

    completionHandler(UIBackgroundFetchResultNewData);
}

and Google Analytics will start working after this effort. I try this in more than one application. If you have any question, please let me know.

Anyway, I don't trust only 1 analytic tool, need some alternatives. I suggest you use Flurry and/or Crashlytics (Fabric). Flurry acquired by Yahoo, Crashlytics acquired by Twitter. Why Fabric, because it has so many features that you'll fall in love with!

Here you can try them :

Fabric : https://fabric.io

Flurry : http://www.flurry.com

You can call them in

didFinishLaunchingWithOptions ...

  [self yourAnalyticServices];

And your code looks like this :

- (void)yourAnalyticServices {
    //Flurry Analytics
    [Flurry setAppVersion:kAppVersion];
    [Flurry startSession:kFlurryAnalyticsID];
//    [Flurry setCrashReportingEnabled:NO];
    [Flurry setUserID:[NSString stringWithFormat:@"%@", kUserUUID]];


    //Google Analytics
    // Optional: automatically send uncaught exceptions to Google Analytics.
    //[GAI sharedInstance].trackUncaughtExceptions = YES;
    // Optional: set Google Analytics dispatch interval to e.g. 20 seconds.
    [GAI sharedInstance].dispatchInterval = 20;
    // Optional: set Logger to VERBOSE for debug information.
    //[[[GAI sharedInstance] logger] setLogLevel:kGAILogLevelVerbose];
    // Initialize tracker.
    [[GAI sharedInstance] trackerWithTrackingId:MY_GoogleAnalyticsID];

    //Crashlytics
    [Fabric with:@[CrashlyticsKit]];
}
like image 170
mgyky Avatar answered Sep 22 '22 17:09

mgyky