2015-04-09 35 views
36

Ho un problema con Swift 2 (Swift 3) e Google Analytics.Problema con Google Analytics in Swift 2 o 3

Questa è la linea con il problema:

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

Xcode mi dica che è:

non può invocare 'inviare' con una lista di argomenti di tipo '(! NSMutableDictionary)'

risposta

64

Aggiornamento per Swift 3 (2016.10.19)

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

Ancora un approccio brutto, fammi sapere se c'è una conversione più pulita.


originale

Stesso qui, lottando per risolvere tonnellate di errori.

Quello che ho fatto (deprecato):

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

Edit (2015)

Grazie a @George Poulos. . Recentemente hanno aggiornato le opzioni, ora createAppView è deprecato, dovrebbe invece utilizzare createScreenView.

var build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject] 
tracker.send(build) 
+0

Grazie! lavoro è perfettamente :) – BilalReffas

+0

Che dolore, ma questo funziona. Grazie. –

+1

@John lo so. Dopo 5 ore, vedi di nuovo l'interfaccia dell'app. Ho usato la funzione per convertire l'ultima sintassi Swift, ma ho dovuto risolvere altri 400 errori manualmente. –

10

In aggiunta alla risposta accettata:

Modificato questo:

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

A tal:

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

Questo potrebbe essere un po 'di esagerazione, ma preferisco creare una breve estensione e non è necessario digitare i castings ogni volta:

In ogni file di rapido, incollare il seguente codice:

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

Poi si può chiamare buildSwiftCompatible() invece del solito build():

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

Buon divertimento.

-2

fece costruire = GAIDictionaryBuilder.createScreenView() costruire() come [NSObject: ANYOBJECT].

inseguitore Trasmettami (build)

+2

Fornire alcune spiegazioni alla risposta. – Arti

-1

per SWIFT 3:?

fece costruire: NSObject = GAIDictionaryBuilder.createScreenView(). Build()

tracker? .send (build as![AnyHashable: Any])

0

Questa è una soluzione che ho trovato .. Forse potrebbe aiutare alcuni di voi. È una struttura che è necessario istanziare in ogni UIViewController, ma aiuta con il 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() 
    } 
}