在iOS Swift中实现Google Analytics

13

我正在遵循Analytics for iOS(developers.google.com/analytics/devguides/collection/ios/v3/?ver=swift)指南,但我的Swift代码项目中存在无法修复的错误。 我正在使用XCode 6.4、Swift和iOS Deployment Target 8.1。

步骤1

首先,我使用CocoaPods安装了Google SDK。 运行pod install命令后,这是控制台的结果:

Updating local specs repositories

CocoaPods 1.0.0.beta.2 is available.
To update use: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Analyzing dependencies
Downloading dependencies
Using Google (1.0.7)
Using GoogleAnalytics (3.14.0)
Using GoogleNetworkingUtilities (1.0.0)
Using GoogleSymbolUtilities (1.0.3)
Using GoogleUtilities (1.1.0)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the
Podfile and 5 total pods installed.

步骤 2

按照指南所说,打开我的应用程序的 Project .xcworkspace 文件。

我的 Podfile 如下:

# Uncomment this line to define a global platform for your project
# platform :ios, '8.0'
# Uncomment this line if you're using Swift
# use_frameworks!

target 'XXXXXX' do

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.1'
pod 'Google/Analytics', '~> 1.0.0'

end

target 'XXXXXXTests' do

pod 'Google/Analytics', '~> 1.0.0'

end

其中XXXXXX是我的项目名称。

第三步

我获取了配置文件GoogleService-Info.plist,并将其添加到项目中的所有目标(我的项目中有2个目标)。

第四步

我通过选择文件>新建>文件>iOS>源代码>头文件来创建了一个BridgingHeader文件。 我将它命名为BridgingHeader.h,并且放在我的项目根目录下。 该文件的内容如下:

#ifndef XXXXX_BridgingHeader_h
#define XXXXX_BridgingHeader_h

#import "Google/Analytics.h"
#import <Google/Analytics.h>
#include "GAI.h"

#import <CoreData/CoreData.h>
#import <SystemConfiguration/SystemConfiguration.h>

#import "Libraries/GoogleAnalytics/GAI.h"
#import "Libraries/GoogleAnalytics/GAIFields.h"
#import "Libraries/GoogleAnalytics/GAILogger.h"
#import "Libraries/GoogleAnalytics/GAITracker.h"
#import "Libraries/GoogleAnalytics/GAIDictionaryBuilder.h"

#endif

其中“XXXXX”是我的项目名称。

步骤5

现在有些问题: 我尝试将Google Analytics包含/导入到我的AppDelegate.swift中,但无法做到。出现了这个错误:

AppDelegate.swift import Google Analytics

我还尝试过import "Google/Analytics.h" 但是另一个错误出现了:Expected identifier in import declaration

  • 我该怎么解决这个问题,使XCode不会给我出错?
  • BridgingHeader是否有误?我是否需要以某种方式指向它来识别其内部头文件?
  • 除了目前缺少的Google Analytics配置外,我是否还需要配置其他内容?

非常感谢。

5个回答

34

使用CocoaPods实现Google Analytics有两种选择:

  1. pod 'Google/Analytics'
  2. pod 'GoogleAnalytics'

它们之间有优缺点。

pod 'Google/Analytics'

  • 需要Google配置文件(GoogleService-Info.plist)
  • 简单的桥接头文件。只需在桥接头文件中添加#import <Google/Analytics.h>
  • 在想要实现Google Analytics的每个文件中添加import Google

pod 'GoogleAnalytics'

  • 无需Google配置文件(GoogleService-Info.plist)
  • 桥接头文件更复杂。

我更喜欢使用pod 'GoogleAnalytics',但我将解释如何使用pod 'Google/Analytics'解决此问题,因为Google官方网站推荐使用pod 'Google/Analytics'。

  1. 桥接头文件

只需一行代码即可实现Google Analytics。

#import <Google/Analytics.h>

不要忘记为Objective-C桥接头文件设置目标构建设置。 您必须提供正确的路径才能启用Objective-C桥接头文件。

设置目标构建设置-Objective-C桥接头文件 $(SRCROOT)/$(PRODUCT_NAME)/projectName_Bridging_Header.h

  1. AppDelegate.swift
import Google

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?)
-> Bool { self.setupGoogleAnalytics()
..
     self.setupGoogleAnalytics()
..
 }

func setupGoogleAnalytics() {

    // Configure tracker from GoogleService-Info.plist.
    let configureError:NSError?
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(configureError)")

    let gai = GAI.sharedInstance()
    gai.trackUncaughtExceptions = true  // report uncaught exceptions
    gai.logger.logLevel = GAILogLevel.Verbose  // remove before app release
}
  1. 一些视图控制器.swift
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)

    if let default_tracker = GAI.sharedInstance().defaultTracker {
        #if DEBUG

            print("default tracker")

        #endif
    }

    //        let tracker = GAI.sharedInstance().defaultTracker
    let tracker = GAI.sharedInstance().trackerWithTrackingId("tracking_ID")
    tracker.set(kGAIScreenName, value: screenName)
    let builder = GAIDictionaryBuilder.createScreenView()
    tracker.send(builder.build() as [NSObject : AnyObject])

}

为什么我使用 trackerWithTrackingId 方法而不是 defaultTracker 属性?如果你使用 defaultTracker,可能会出现以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

defaultTracker 属性的初始值为 nil,但它将在调用 trackerWithTrackingId 方法后设置。但有时它无法完美地工作。为了避免这个问题,我建议直接使用 trackerWithTrackingId 方法。

我使用 pod 'GoogleAnalytics' 制作了示例项目。你可以从中得到一些想法。祝你好运。

测试环境

GoogleAnalytics 3.14

Xcode 7.2.1


我想在我的框架目标中使用GoogleAnalytics。问题是框架目标不支持桥接头文件,上面两个Pod对我都不起作用。你有什么建议让它能够工作吗? - user1615898
1
@user1615898,我认为你有两个选择:1)使用Firebase分析。它不需要创建桥接头文件。2)您可以使用Google Analytics服务SDK手动设置Google Analytics。 更多信息和说明在这里: https://developers.google.com/analytics/devguides/collection/ios/v3/sdk-download - sangjoon moon

9
Podfile中:
pod 'Google/Analytics'

在您的项目名称 - Bridging-Header.h 文件中:
#import "Google/Analytics.h"

你不需要这个

GGLContext.sharedInstance().configureWithError(&configureError)

您需要一个合适的“追踪器”。
let gai = GAI.sharedInstance()
let tracker = gai.tracker(withTrackingId: "UA-12345678-1")

若要在GA仪表板中使用实时视图,您必须使用GAIDictionaryBuilder跟踪屏幕,并使用正确的关键字kGAIScreenName

tracker.set(kGAIScreenName, value: "this is my screen")
let event = GAIDictionaryBuilder.createScreenView()
tracker?.send(event!.build() as! [NSObject: Any])

同样地,要跟踪事件,您需要使用GAIDictionaryBuilder,因为它将创建带有正确GA键的字典,并且GA喜欢正确的键。

let event = GAIDictionaryBuilder.createEvent(withCategory: "category", action: "action", label: "level", value: NSNumber(value: 120))
tracker?.send(event!.build() as! [NSObject: Any])

仿真器上似乎也能正常工作


8
我遇到了同样的问题。我无法导入“Google/Analytics.h”头文件,因为Xcode会生成错误。这是因为“Google/Analytics.h”头文件在Google官方页面中提到的“Google Analytics SDK”中不可用。
因此,我只使用了以下代码:
#import "GAI.h"

希望它能够完美运行。 环境 Xcode:8.2 iOS:10.2


我也无法使用import GoogleAnalytics,所以使用了import GoogleToolboxForMac。 - Lee Probert
请问您把 #import "GAI.h" 粘贴到哪里了? - Daniel Kabu Asare
我使用了 import "GAI.h",而不是 import "Google/Analytics.h"。 - Rubaiyat Jahan Mumu

3

针对 Swift 3:

    var configureError:NSError? = nil
    GGLContext.sharedInstance().configureWithError(&configureError)
    assert(configureError == nil, "Error configuring Google services: \(configureError)")
    let gai = GAI.sharedInstance()
    gai?.trackUncaughtExceptions = true
    gai?.logger.logLevel = GAILogLevel.verbose

1

我认为将错误发送到Crashlytics,但继续执行应用程序会更好:

func configureGoogleAnalytics() {
    var configureError: NSError? = nil
    GGLContext.sharedInstance().configureWithError(&configureError)
    if configureError != nil {
        Crashlytics.sharedInstance().recordError(configureError!)
    }
}

同时查看this的答案,了解添加分析的最新方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接