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!)'
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)
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])
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.
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()
}
}