iPhone Google Analytics SDK delegate and multiple accounts problem - iphone

I am implementing google Analytics SDK in my iPhone application. I had it working with following code:
AppDelegate .m :
[[GANTracker sharedTracker] startTrackerWithAccountID:#"UA-xxxxxxx-1"
dispatchPeriod:10
delegate:nil];
if (![[GANTracker sharedTracker] trackPageview:string withError:&error]) {
NSLog(#"Error happened with google analytics tracking 2, %#", error);
}else {
NSLog(#"OK");
}
In my analytics account I was getting the wanted results. Then I decided (don't ask me why) to try to send my tracking data to 2nd analytics account too. For curious ones: One account is used for web page and iPhone app stats and the other one is supposed to be just for iPhone.
My ingenious plan was to create 1st sharedTracker, dispatch it, stop it and do the same for the second one:
AppDelegate .h:
#interface AppDelegate : NSObject <UIApplicationDelegate, GANTrackerDelegate>
//implementation
AppDelegate .m:
//1st tracking account
[[GANTracker sharedTracker] startTrackerWithAccountID:#"UA-xxxxxxx-1"
dispatchPeriod:10
delegate:self];
if (![[GANTracker sharedTracker] trackPageview:string withError:&error]) {
NSLog(#"Error happened with google analytics tracking, %#", error);
}else {
NSLog(#"1. GAnalytics: OK");
}
[[GANTracker sharedTracker] stopTracker];
//2nd tracking account
[[GANTracker sharedTracker] startTrackerWithAccountID:#"UA-zzzzzzzz-1"
dispatchPeriod:10
delegate:self];
if (![[GANTracker sharedTracker] trackPageview:string withError:&error]) {
NSLog(#"Error happened with google analytics tracking, %#", error);
}else {
NSLog(#"2. GAnalytics: OK");
}
[[GANTracker sharedTracker] stopTracker];
- (void)trackerDispatchDidComplete:(GANTracker *)tracker
eventsDispatched:(NSUInteger)eventsDispatched
eventsFailedDispatch:(NSUInteger)eventsFailedDispatch{
NSLog(#"For the love of Got, why don't you say something?");
}
I added the delegate method in order to get some clue what's being dispatched, and to find out if SDK is making two different requests, but it seems I can't get my delegate method invoked!
Removing the second tracker's code doesn't help either
I also tried putting the dispatch period to 0 (and -1 with manual dispatch call) but I had no luck with this either…
So, my questions are:
how to implement 2 gAnalytics accounts and
how to make my delegate method do what it's supposed to do - get called after dispatch :)
Thanks in advance,
Luka

I started out exactly with the same requirement of being able to post pageviews, events etc onto two different Google Analytics accounts. But the problem is that, [GANTracker sharedTracker] is a singleton object and you always get the same or single instance of the object back, so you cannot really have two instances of the sharedTracker.
Also in your case, where you are trying to see whether the call back method is called, it will not be called because you are calling [[GANTracker sharedTracker] stopTracker] and this will prevent from dispatch of the events to happen. If you comment out that line, your callback method should get called.
If you look in the app directory under Documents, Google analytics stores all the data in a sqlite database called googleanalytics.sql. You can open it and see the tables in it. Go to that directory and type "sqlite3 googleanalytics.sql" and if you know sqlite commands, you can navigate the tables and stuff. None of the tables have a reference to the Account ID, so my guess is that, unless you do some really smart quirks, you cannot really post to two different Accounts.

Google has support for using multiple tracking accounts in the same application, in its iOS SDK v2
See this SO question and my answer there.

Related

Google Analytics Integration issues

I am not sure I fully understand the Google Analytics integration. At least, what I read on Google's SDK Page and what I see in reality are not the same.
I've setup the Tracker in my applicationDidFinishLaunching method, with my key.
[[GANTracker sharedTracker] startTrackerWithAccountID:#"UA-xxxxxxxx-1"
dispatchPeriod:30 // SENDS EACH 30 SECONDS.
delegate:self];
NSError *error;
if (![[GANTracker sharedTracker] setCustomVariableAtIndex:1
name:#"iPhone"
value:appVersion
withError:&error]) {
// Handle error here
ALog("Google Analytics Error: %#", error);
}
if (![[GANTracker sharedTracker] trackPageview:#"/app_did_finish_Launching"
withError:&error]) {
// Handle error here
ALog("Google Analytics Error:%#", error);
}
I am using a delegate to ensure that the dispatch is firing, and it is, and each time it says it is successful.
- (void)trackerDispatchDidComplete:(GANTracker *)tracker
eventsDispatched:(NSUInteger)eventsDispatched
eventsFailedDispatch:(NSUInteger)eventsFailedDispatch {
DLog(#"events dispatched: %d, events failed: %d", eventsDispatched, eventsFailedDispatch);
}
Question 1:
I am trying to see this over WIFI, with a proxy I've setup between my iPhone and the web. I see nothing that looks like Google analytics traffic. Should I expect to see anything?
Question 2:
Its been 24 hrs, and I don't see anything on the Google Analytics site. Should I see something? I've had success with this implementation only when I set the dispatchPeriod to 0, and manually call dispatch in the code.
BOOL success = [[GANTracker sharedTracker] dispatch];
But I really don't want to do this in a shipping app version.
What am I doing wrong? Do I need to call dispatch manually? The SDK implied you only call the dispatch if you want to send it manually (without batching the sends). Am I understanding this correctly?
Thanks for your help.
-Yenyi
Well, it takes a long time to update. More than 24 hrs. But it does update. In the end, decided to go with Flurry, the API was just cleaner.

How to verify google analytics when you don't have a site attached to an application on the iphone?

How can I verify my google analytics tracking code without having an actual website?
I'm just going to use it for my app tracking (pageviews/events).
If you don't have a website but instead what to track activity inside a mobile application you will need to use the Google Analytics Mobile SDK (http://code.google.com/mobile/analytics/docs/).
I would try creating test code that hits the API with your tracking ID and see if it shows up in the Google Analytics dashboard.
Make sure you init the library with your app's analytics id:
[[GANTracker sharedTracker] startTrackerWithAccountID:#"your-apps-google-analytics-id"
dispatchPeriod:15
delegate:nil];
#if DEBUG
NSLog(#"******* WARNING: ANALYTICS IN DRY RUN MODE! *******");
[[GANTracker sharedTracker] setDryRun:YES]; // DO NOT COLLECT ANALLYTICS
#endif
Track screen views as if they were page hits:
[[GANTracker sharedTracker] trackPageview:#"/Tutorial" withError:nil];
Track event/actions:
[[GANTracker sharedTracker] trackEvent:#"Registration"
action:#"Skipped"
label:nil
value:0
withError:nil];

iPhone App Google Analytics

I am having issues setting up Google Analytics for my iPhone Application. I have a website that I have sucesfully been using Google Analytics on, and so I am pretty familiar with how it works.
I set up a new fake domain with the following formation: myapp.mysite.com. I got the UA ID that was made and used that as shown below.
In my iPhone application's "didfinishlaunching" method, I have the following code:
[[GANTracker sharedTracker] startTrackerWithAccountID:#"UA-XXXXXXXX-X"
dispatchPeriod:kGANDispatchPeriodSec
delegate:nil];
NSError *error;
if (![[GANTracker sharedTracker] trackEvent:#"test" action:#"my_action" label:#"my_label" value:-1 withError:&error]) {
NSLog(#"error ocurred");
}
where UA-XXXXXXXX-X is filled in with my ID.
I install the application on my phone, run the app for over 20 minutes, and google analytics still states that "tracking is not installed."
What is wrong here?
Thanks!
Here are a few things to try:
First, try adding
BOOL success = [[GANTracker sharedTracker] dispatch];
to the end of your code and testing the value of success.
Second, I don't see kGANDispatchPeriodSec defined in GANTracker.h. Is this a const that you're creating? Pass in a 0 as the dispatchPeriod instead so dispatches are sent immediately instead of batched. (You'll want to change this before you submit your app.)
Finally, implement GANTrackerDelegate on your class and see what's happening in the trackerDispatchDidComplete:eventsDispatched:eventsFailedDispatch call. This will tell you if your dispatch calls are failing, but unfortunately won't tell you why.
See this link about adopting a protocol on your class. In your .m file, add the following:
#pragma mark GANTrackerDelegate
- (void)trackerDispatchDidComplete:(GANTracker *)tracker
eventsDispatched:(NSUInteger)eventsDispatched
eventsFailedDispatch:(NSUInteger)eventsFailedDispatch {
NSLog(#"events dispatched: %d, events failed: %d", eventsDispatched, eventsFailedDispatch);
}

iPhone In App Purchase - response.products are still empty?

Basically, I've tried to set up in app purchases on a test app before I implement them into a proper app that my company is working on. I've read the Store kit pdf and other snippets about a 1000 times, but the products are still being returned as empty. Here's exactly what I've done so far:
Setup test app and In App Purchase test items
I created a new app id for 'Test App One' on my company's developer portal in the iPhone Dev Centre. I made sure that the prefix was com.mycompany.testappone to ensure that in app purchases could be configured. Staying in the App IDs section, I configured in app purchases by ticking the 'Enable In App Purchase' option.
I created 'Test App One' in iTunes Connect and completed the usual procedure but selected 'upload binary later' and didn't submit for review as the app does nothing. Surely we don't have to submit the app to review for this to work?! I then clicked on manage in app purchases and created a new one with product id 'test1' and approved it so that it is cleared for sale.
Code
I set up a new project in XCode called TestAppOne and here are the only 2 classes I am using for now:
TestAppOneAppDelegate.h:
#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>
#interface TestAppOneAppDelegate : NSObject <UIApplicationDelegate, SKRequestDelegate, SKProductsRequestDelegate> {
UIWindow *window;
}
TestAppOneDelegate.m:
#import "TestAppOneAppDelegate.h"
static NSString *kMyFeatureIdentifier1 = #"com.mycompany.testappone.test1";
#implementation TestAppOneAppDelegate
#synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
if([SKPaymentQueue canMakePayments]) {
NSLog(#"IN-APP:can make payments");
}
else {
NSLog(#"IN-APP:can't make payments");
}
[self requestProductData];
[window makeKeyAndVisible];
}
- (void)requestProductData {
NSLog(#"IN-APP:requestProductData");
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers: [NSSet setWithObject:kMyFeatureIdentifier1]];
request.delegate = self;
[request start];
NSLog(#"IN-APP:requestProductData END");
}
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
NSLog(#"IN-APP:productsRequest");
NSArray *myProduct = response.products;
NSLog(#"IN-APP:array count: %i", [myProduct count]);
[request autorelease];
NSLog(#"IN-APP:productsRequest END");
}
- (void)dealloc {
[window release];
[super dealloc];
}
#end
Testing on the device
I created a sandbox test account and logged out of my iTunes account on the iPhone, but didn't log in with the test account as the documentation tells us to not do this until we are prompted at the purchasing stage. I then build the app and here is the log I'm getting:
IN-APP:can make payments
IN-APP:requestProductData
IN-APP:requestProductData END
IN-APP:productsRequest
IN-APP:array count: 0
IN-APP:productsRequest END
Can anyone please tell me if I have left any stages out or if there is anything that I'm doing wrong. Unfortunately there doesn't seem to be any example apps made by Apple.
Another important step that is often overlooked is you need to make sure you have an iOS Paid Applications Contract setup which is located under the "Contracts, Tax, and Banking" section of iTunes connect. First you have to click on the request button, then you have to click on the 3 Set Up buttons (Contact Info, Bank Info, Tax Info)
Actually I do think you have to submit the binary for this to work.
You can set the release date to the distant future.
Check whether there are invalid product id's.
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
for (NSString *invalidProductId in response.invalidProductIdentifiers)
{
NSLog(#"Invalid product id: %#" , invalidProductId);
}
}
If there are invalid product ids visit http://troybrant.net/blog/2010/01/invalid-product-ids/
It is a very comprehensive check-list for this problem.
Edit: (13/11/20)
Site seems to be down. I'm not sure whether it is a permanent problem but you can see the page from archive.org:
https://web.archive.org/web/20200212001158/http://troybrant.net/blog/2010/01/invalid-product-ids/
Check if your Bundle Identifier (e.g. com.company.appname) in XCode matches the one in iTunes Connect.
You do not have to submit the binary for it to work.
Just delete the application on your device, and start it again from XCode.
It fixed the problem for me.
No need to upload the binary, or wait for hours after creating the in-app purchase in iTunes Connect.
Thanks to alpere's answer I found out that I used the wrong product ID. It was not as I thought de.company.appname.PROFESSIONAL_LICENSE. Just using PROFESSIONAL_LICENSE in my case (without leading bundle id stuff) works :)
No need to upload binary for Sandbox testing of InAppPurchase. You just have to add InAppPurchase item in iTunesConnect and put it in "Ready to submit"(must) state only. If you submit it for review it will always give ou response.product empty.
Try to add a Free Subscription product. If it appears on the response then there is nothing wrong in your code. Since Free Subscription is the only type that doesn't require Agreements, Tax, and Banking and if it appears and the other types don't then it is a issue related to your contract.
In my case the reason was hosting of content by Apple turned on by mistake. The product was available only when I turned it off
In my case (MacOS) I was creating a test application (with the same bundle ID of main application). SKFetchRequest started returning product Ids for test application only after I set Bundle Name (Binary name) the same as in original application.

Cannot get Google Analytics API to register page views on iPhone

I would like to gather usage statistics for my iPhone app using Google Analytics so I'm trying to configure it using the following tutorial: http://code.google.com/intl/fr-FR/apis/analytics/docs/tracking/mobileAppsTracking.html
I think I did everything they indicate in the documentation, and I get no error on the iPhone side, but I don't see any visits in Google Analytics.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
[self initGoogleAnalytics];
//...
}
-(void)initGoogleAnalytics{
[[GANTracker sharedTracker] startTrackerWithAccountID:[[NSBundle mainBundle] objectForInfoDictionaryKey:#"GoogleAnalyticsCode"]
dispatchPeriod:-1
delegate:nil
NSError *error;
if(![[GANTracker sharedTracker] trackPageview:#"/home" withError:&error]){
NSLog(#"%#", [error localizedDescription], nil);
}
[[GANTracker sharedTracker] dispatch];
}
Any idea why this is not working?
this is the same answer that I put at: Problem dispatching with google mobile analytics for iphone
The Google Analytics stop sending data when you try to send a non formatted "URL", if it is not initiated with the "/" or contain some specific chars, it will start only returning errors.
The best thing to do is, verify that you are placing the "/" on the beginning of you URL and before sending, format your URL to avoid any problem, by doing:
NSString* pageURLString = [pageURL stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
Encoding it with NSASCIIStringEncoding, will format the URL properly. The same can be used when tracking an event.