在Swift 2或3中发布谷歌分析

时间:2022-01-12 15:16:16

I have a problem with Swift 2 (Swift 3) and Google Analytics.

我对Swift 2 (Swift 3)和谷歌分析有问题。

This is the line with the problem:

这就是问题所在:

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

Xcode tell's me:

Xcode告诉我:

Cannot invoke 'send' with an argument list of type '(NSMutableDictionary!)'

不能使用类型为'(NSMutableDictionary!)的参数列表调用'send'

6 个解决方案

#1


64  

Update for Swift 3 (2016.10.19)

Swift 3更新(2016.10.19)

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

Still an ugly approach, let me know if there's an cleaner conversion.

仍然是一个丑陋的方法,让我知道是否有一个更清洁的转换。


Original

原始

Same here, struggling to resolve tons of errors.

这里也是一样,努力解决大量的错误。

What I did (deprecated):

我所做的(弃用):

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

Edit (2015)

编辑(2015)

Thanks to @George Poulos. . Recently they updated the options, now createAppView is deprecated, should use createScreenView instead.

感谢@George Poulos。最近他们更新了选项,现在createAppView被弃用了,应该使用createScreenView。

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

#2


10  

In addition to the accepted answer:

除了公认的答案之外:

Changed this:

改变:

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

To this:

:

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

#3


5  

This might be a bit of an overkill, but I prefer creating a short extension and not need to type the castings every time:

这可能有点过分,但我更喜欢创建一个短的扩展,而不是每次都需要输入铸件:

In any swift file, paste the following code:

在任何swift文件中,粘贴以下代码:

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

Then you can call buildSwiftCompatible() instead of the usual build():

然后可以调用buildSwiftCompatible()而不是通常的build():

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

Have fun.

玩得开心。

#4


0  

This is a solution I came up with.. Maybe it could help some of you. It's a struct you need to instantiate in every UIViewController, but it helps with the boilerplate.

这是我想出的一个解决办法。也许对你们有些人有帮助。它是一个你需要在每个UIViewController中实例化的结构体,但是它对样板很有帮助。

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()
    }
}

#5


-1  

For swift 3:

为迅速3:

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

.build让构建:NSObject = GAIDictionaryBuilder.createScreenView()()

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

跟踪器?。发送(建造![AnyHashable:任何])

#6


-2  

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

让build = GAIDictionaryBuilder.createScreenView().build() as [NSObject: AnyObject]

tracker?.send(build)

追踪? .send(建立)

#1


64  

Update for Swift 3 (2016.10.19)

Swift 3更新(2016.10.19)

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

Still an ugly approach, let me know if there's an cleaner conversion.

仍然是一个丑陋的方法,让我知道是否有一个更清洁的转换。


Original

原始

Same here, struggling to resolve tons of errors.

这里也是一样,努力解决大量的错误。

What I did (deprecated):

我所做的(弃用):

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

Edit (2015)

编辑(2015)

Thanks to @George Poulos. . Recently they updated the options, now createAppView is deprecated, should use createScreenView instead.

感谢@George Poulos。最近他们更新了选项,现在createAppView被弃用了,应该使用createScreenView。

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

#2


10  

In addition to the accepted answer:

除了公认的答案之外:

Changed this:

改变:

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

To this:

:

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

#3


5  

This might be a bit of an overkill, but I prefer creating a short extension and not need to type the castings every time:

这可能有点过分,但我更喜欢创建一个短的扩展,而不是每次都需要输入铸件:

In any swift file, paste the following code:

在任何swift文件中,粘贴以下代码:

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

Then you can call buildSwiftCompatible() instead of the usual build():

然后可以调用buildSwiftCompatible()而不是通常的build():

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

Have fun.

玩得开心。

#4


0  

This is a solution I came up with.. Maybe it could help some of you. It's a struct you need to instantiate in every UIViewController, but it helps with the boilerplate.

这是我想出的一个解决办法。也许对你们有些人有帮助。它是一个你需要在每个UIViewController中实例化的结构体,但是它对样板很有帮助。

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()
    }
}

#5


-1  

For swift 3:

为迅速3:

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

.build让构建:NSObject = GAIDictionaryBuilder.createScreenView()()

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

跟踪器?。发送(建造![AnyHashable:任何])

#6


-2  

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

让build = GAIDictionaryBuilder.createScreenView().build() as [NSObject: AnyObject]

tracker?.send(build)

追踪? .send(建立)