Advanced Google Analytics for iOS - How to not kill your SEO

26
ZAAWANSOWANE GOOGLE ANALYTICS DLA IOS, CZYLI JAK NIE ZABIĆ SWOJEGO SEO MICHAŁ MYNARSKI 1

Transcript of Advanced Google Analytics for iOS - How to not kill your SEO

ZAAWANSOWANE GOOGLE ANALYTICS DLA IOS, CZYLI JAK NIE ZABIĆ SWOJEGO SEO

MICHAŁ MYNARSKI

1

PO CO?

2

FIREBASE

GOOGLE TAG MANAGER

SEGMENT

MIXPANELANSWERS

ADJUST

FLURRYGOOGLE ANALYTICS

3

APLIKACJA

4

FIRST COMMIT

5

23.10.2012

6

GŁÓWNY WIDOK

7

3 000 LINII

8

SŁOWEM

9

10

11

LET SWIFT 3

KORPO.APP-LET-SWIFT

▸ wsparcie dla kilku języków,

▸ każdy język z innym UA,

▸ zmiana języka (wraz z UA) on-the-fly

KORPO.APP-LET-SWIFT-2

▸ wsparcie dla kilku języków,

▸ każdy język z innym UA,

▸ zmiana języka (wraz z UA) on-the-fly

12

LET SWIFT 3

IMPLEMENTACJA - PODS

def letSwiftPods() pod 'Google/Analytics' end target 'let_swift-GA' do letSwiftPods() end target 'let_swift-GA copy' do letSwiftPods() end

▸ 7 kolejnych zależności pobranych,

▸ 27,3 MB samych plików źródłowych po instalacji

13

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA

GA

LSANALYTICSMANAGER

14

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - INICJALIZACJA

LSAnalyticsManager.sharedInstance

// Configure tracker from GoogleService-Info.plist. var configureError:NSError? GGLContext.sharedInstance().configureWithError(&configureError) assert(configureError == nil, "Error configuring Google services: \(configureError)") // Optional: configure GAI options. let gai = GAI.sharedInstance() gai.trackUncaughtExceptions = true // report uncaught exceptions gai.logger.logLevel = GAILogLevel.Verbose // remove before app release

15

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - STAŁE

screenTrackNameProperty = GAStrings.ScreenTrackNames.kFirstViewController

Objective-C: #define kGoogleAnalyticsScreenTrackStoreDetails @"store-details"

Swift: struct GAStrings { struct ScreenTrackNames { static let kFirstViewController = "FirstView" static let kSecondViewController = "SecondView" } }

16

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - SCREENTRACK

class FirstViewController: UIViewController { override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) let tracker = GAI.sharedInstance().defaultTracker tracker.set(kGAIScreenName, value: „FirstViewControllerName”) let builder = GAIDictionaryBuilder.createScreenView() tracker.send(builder.build() as [NSObject : AnyObject]) } }

17

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - SCREENTRACK

VC

LSVIEWCONTROLLER

GA

18

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - SCREENTRACK

class LSAnalyticsManager { … func trackScreenAppearanceWithName(name :String?){ guard let name = name else { return } let tracker = GAI.sharedInstance().defaultTracker tracker.set(kGAIScreenName, value: name) let builder = GAIDictionaryBuilder.createScreenView() tracker.send(builder.build() as [NSObject : AnyObject]) } }

19

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - SCREENTRACK

class LSViewController: UIViewController{ @IBInspectable var screenTrackNameInspectable: String? var screenTrackNameProperty: String? override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated)

LSAnalyticsManager.sharedInstance. trackScreenAppearanceWithName(screenTrackNameInspectable)

} }

class FirstViewController: LSViewController { override func viewDidLoad() { super.viewDidLoad() screenTrackNameProperty = GAStrings.ScreenTrackNames.kFirstViewController }

20

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - EVENTS

▸ 4 parametry: category (String), event (String), label (String), value (String),

class LSAnalyticsManager { … func trackEvent(withCategoryAndName category: String?, name: String?){ let tracker = GAI.sharedInstance().defaultTracker let builder = GAIDictionaryBuilder.createEventWithCategory(category,

action: name, label: nil, value: nil) tracker.send(builder.build() as [NSObject :AnyObject]) } }

21

LET SWIFT 3

IMPLEMENTACJA - ARCHITEKTURA - EVENTS

class LSAnalyticsManager { … func trackShopEvent(withNameAdvertisementsAndPrice name: String?, adEnabled: Bool,

price: NSNumber?){ let tracker = GAI.sharedInstance().defaultTracker var label : String if adEnabled { label = GAStrings.EventLabels.kAdvertisementsEnabled }else{ label = GAStrings.EventLabels.kAdvertisementsDisabled } let builder =

GAIDictionaryBuilder.createEventWithCategory(GAStrings.EventCategories.kBuyNowFlow, action: name,

label: label, value: price) tracker.send(builder.build() as [NSObject :AnyObject]) } }

22

LET SWIFT 3

IMPLEMENTACJA - ZMIANA UA

class LSCountryObject: NSObject{ var countryName: String? var countryCode: String? var countryImageName: String? var countryUA: String? }

let country = LSCountryObject() country.countryName = "LetSwift" country.countryCode = "LS" country.countryUA = "UA-66017211-7" LSAnalyticsManager.sharedInstance.endGASession() LSAnalyticsManager.sharedInstance.startSession(WithCountry: country)

23

LET SWIFT 3

IMPLEMENTACJA - ZMIANA UA

class LSAnalyticsManager{ … func endGASession(){ let tracker = GAI.sharedInstance().defaultTracker let builder = GAIDictionaryBuilder.createScreenView() builder.set("end", forKey: kGAISessionControl) tracker.send(builder.build() as [NSObject :AnyObject]) }

func startSession(withCountry country: LSCountryObject?){ guard let country = country else { return } let tracker = GAI.sharedInstance().trackerWithTrackingId(country.countryUA) GAI.sharedInstance().defaultTracker = tracker; let builder =

GAIDictionaryBuilder.createEventWithCategory(GAStrings.EventNames.kCountryChanged, action: nil, label: nil, value: nil)

builder.set("start", forKey: kGAISessionControl) tracker.send(builder.build() as [NSObject: AnyObject]) }

}

24

TEKST

IMPLEMENTACJA - CONFIGURATION FILE

LET SWIFT 3

├── FirstViewController.swift ├── Info.plist ├── Resources │   ├── let-swift-GA │   │   └── GoogleService-Info.plist │   └── let-swift-GA-copy │   └── GoogleService-Info.plist

▸ wygenerowanie dwóch plików konfiguracyjnych

▸ umieszczenie ich w osobnych folderach

25

LET SWIFT 3

TESTOWANIE ORAZ WSPÓŁPRACA

▸ paczkowanie i opóźnienia,

▸ strefy czasowe!,

▸ MitM,

▸ tłumaczyć!,

26