Swift 2 veya 3’te Google Analytics’le sorun

Swift 2 (Swift 3) ve Google Analytics ile ilgili bir sorunum var.

Sorun şu ki çizgi:

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

Xcode söyle bana:

'(NSMutableDictionary!)' türündeki bir argüman listesiyle 'send' çağrılamaz.

36

6 cevap

Swift 3 Güncellemesi (2016.10.19)

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

Yine de çirkin bir yaklaşım, daha temiz bir dönüşüm olup olmadığını bana bildirin.


Orijinal

Burada aynı, tonlarca hatayı çözmek için mücadele etmek.

Yaptıklarım (onaylanmadı):

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

Düzenle (2015)

@ George Poulos'a teşekkürler. . Son zamanlarda seçenekleri güncellediler, şimdi createAppView kullanımdan kaldırıldı, bunun yerine createScreenView kullanmalısınız.

var build = GAIDictionaryBuilder.createScreenView().build() as [NSObject : AnyObject]
tracker.send(build)
64
katma
Teşekkür ederim ! Mükemmel çalışıyor :)
katma yazar BilalReffas, kaynak
@ShaliLiu gerçek şeyler!
katma yazar BilalReffas, kaynak
Ne acı ama bu işe yarıyor. Teşekkür ederim.
katma yazar John Bushnell, kaynak
@John biliyorum. 5 saat sonra nihayet tekrar uygulama arayüzümü görün. Bu işlevi en son Swift sözdizimine dönüştürmek için kullandım, yine de diğer 400 hatayı manuel olarak çözmek zorunda kaldım.
katma yazar Shali Liu, kaynak
Bir yıldan uzun bir süre sonra tekrar burada, ancak daha temiz bir alternatifin gerekliliğini görünce lütfen aşağıdaki cevabımı kontrol edin. Daha temiz bir çözüm için GAIDictionaryBuilder'ı genişletir.
katma yazar Uzaak, kaynak

Kabul edilen cevaba ek olarak:

Bunu değiştirdim:

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

Buna:

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

Bu biraz fazladan olabilir, ancak kısa bir uzantı oluşturmayı tercih ediyorum ve her zaman dökümleri yazmak zorunda değilim:

Herhangi bir hızlı dosyaya aşağıdaki kodu yapıştırın:

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

Sonra normal build() yerine buildSwiftCompatible() yöntemini çağırabilirsiniz:

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

İyi eğlenceler.

5
katma

let build = GAIDictionaryBuilder.createScreenView (). build() [NSObject: AnyObject] olarak

izci? `s (build)

2
katma
Lütfen cevabınıza biraz açıklama yapın.
katma yazar Arti, kaynak

Hızlı 3 için:

let build: NSObject = GAIDictionaryBuilder.createScreenView (). build ()

tracker? .send (olarak inşa! [AnyHashable: Any])

1
katma

Bu benim geldiğim bir çözüm. Belki bazılarınıza yardımcı olabilir. Her UIViewController'da somutlaştırmanız gereken bir yapıdır, ancak kazan plakasında yardımcı olur.

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
katma