web-dev-qa-db-fra.com

Problème avec Google Analytics dans Swift 2 ou 3

J'ai un problème avec Swift 2 (Swift 3) et Google Analytics.

C'est la ligne avec le problème:

tracker.send(GAIDictionaryBuilder.createScreenView().build())

Xcode me dit:

Impossible d'appeler 'send' avec une liste d'arguments de type '(NSMutableDictionary!)'

36
BilalReffas

Mise à jour pour Swift 3 (2016.10.19)

let tracker = GAI.sharedInstance().defaultTracker
let build = (GAIDictionaryBuilder.createScreenView().build() as NSDictionary) as! [AnyHashable: Any]
tracker?.send(build)

Toujours une approche laide, laissez-moi savoir s'il y a une conversion plus propre.


Original

Idem ici, luttant pour résoudre des tonnes d'erreurs.

Ce que j'ai fait (obsolète):

var build = GAIDictionaryBuilder.createAppView().build() as [NSObject : AnyObject]
tracker.send(build)

Modifier (2015)

Merci à George Poulos. . Récemment, ils ont mis à jour les options, maintenant createAppView est obsolète, devrait utiliser createScreenView à la place.

var build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]
tracker.send(build)
64
Shali Liu

En plus de la réponse acceptée:

Changé ceci: 

tracker.send(GAIDictionaryBuilder.createEventWithCategory("UX", action: "User sign in", label: nil, value: nil).build())

Pour ça: 

tracker.send(GAIDictionaryBuilder.createEventWithCategory("UX", action: "User sign in", label: nil, value: nil).build()  as [NSObject : AnyObject])
10
Esqarrouth

Cela peut paraître un peu exagéré, mais je préfère créer une extension courte et ne pas avoir besoin de taper les castings à chaque fois:

Dans n'importe quel fichier Swift, collez le code suivant:

extension GAIDictionaryBuilder
{
    func buildSwiftCompatible() -> [NSObject:AnyObject]
    {
        return self.build() as [NSObject:AnyObject]
    }
}

Ensuite, vous pouvez appeler buildSwiftCompatible () à la place de la méthode habituelle build ():

tracker.send(GAIDictionaryBuilder.createScreenView().buildSwiftCompatible())

S'amuser.

5
Uzaak

C’est une solution que j’ai trouvée… Peut-être que cela pourrait aider certains d’entre vous. C'est une structure que vous devez instancier dans chaque UIViewController, mais cela aide avec le passe-partout.

import UIKit

struct Analytics {
    fileprivate let viewController: UIViewController
    fileprivate let tracker = GAI.sharedInstance().defaultTracker

    init (forScreen viewController: UIViewController) {
        self.viewController = viewController
    }

    func startTracking () {
        let screenView = GAIDictionaryBuilder.createScreenView().build() as NSDictionary
        guard
            let tracker = tracker,
            let build = screenView as? [AnyHashable: Any]
        else { return }

        tracker.set(kGAIScreenName, value: String(describing: viewController))
        tracker.send(build)
    }
}

class HomeViewController: UIViewController {

    lazy var analytics: Analytics = {
        return Analytics(forScreen: self)
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewWillAppear() {
        super.viewWillAppear()
        analytics.startTracking()
    }
}
0
Quaggie