it-swarm.com.de

Problem mit Google Analytics in Swift 2 oder 3

Ich habe ein Problem mit Swift 2 (Swift 3) und Google Analytics.

Dies ist die Zeile mit dem Problem:

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

Xcode sagt's mir:

'Send' kann nicht mit einer Argumentliste vom Typ '(NSMutableDictionary!)' Aufgerufen werden

36
BilalReffas

Update für Swift 3 (2016.10.19)

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

Immer noch ein hässlicher Ansatz, lassen Sie mich wissen, ob es eine sauberere Konversion gibt.


Original

Gleiches gilt für das Problem, viele Fehler zu beheben.

Was ich getan habe (veraltet):

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

Bearbeiten (2015)

Danke an @George Poulos. . Kürzlich haben sie die Optionen aktualisiert. Jetzt ist createAppView veraltet. Stattdessen sollte es createScreenView verwenden.

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

Zusätzlich zur akzeptierten Antwort:

Das geändert: 

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

Zu diesem: 

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

Dies mag ein wenig übertrieben sein, aber ich bevorzuge eine kurze Erweiterung und muss die Castings nicht jedes Mal neu eingeben:

Fügen Sie in einer beliebigen Swift-Datei den folgenden Code ein:

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

Dann können Sie buildSwiftCompatible () anstelle des üblichen Build () aufrufen:

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

Habe Spaß.

5
Uzaak

Dies ist eine Lösung, die ich mir ausgedacht habe. Vielleicht könnte sie einigen von Ihnen helfen. Es ist eine Struktur, die Sie in jedem UIViewController instanziieren müssen, aber es hilft bei der Boilerplate.

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