在初始化Google Analytics后,viewController.title为零

时间:2016-02-05 17:49:36

标签: ios swift google-analytics

我按照Google分析doc将其添加到我的swift应用

我已经完成了那里所说的一切, 然而我的代码在运行时失败了。

这是我在AppDelegate中的代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
    loadGoogleAnalytics()
    chooseAndLuanchStoryboard()
    initMembersAfterViewControllerInit()
    return true
}

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

    // Optional: configure GAI options.
    let gai = GAI.sharedInstance()
    gai.trackUncaughtExceptions = true  // report uncaught exceptions
    gai.logger.logLevel = GAILogLevel.Error
}

这是我在ViewController中的代码:

override public func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)

    let name = "Pattern~\(self.title!)"

    // The UA-XXXXX-Y tracker ID is loaded automatically from the
    // GoogleService-Info.plist by the `GGLContext` in the AppDelegate.
    // If you're copying this to an app just using Analytics, you'll
    // need to configure your tracking ID here.
    // [START screen_view_hit_swift]
    let tracker = GAI.sharedInstance().defaultTracker
    tracker.set(kGAIScreenName, value: name)

    let builder = GAIDictionaryBuilder.createScreenView()
    tracker.send(builder.build() as [NSObject : AnyObject])
    // [END screen_view_hit_swift]
}

override public func viewWillDisappear(animated: Bool) {
    keyboardManager.deregisterFromKeyboardNotifications()
    stopRefreshTimer()
}

我收到此运行时错误,因为self.title中的let name = "Pattern~\(self.title!)"为nil

2016-02-05 19:44:44.377 Inline[95803:3750273] The configuration file 'GoogleService-Info.plist' is for another bundle identifier ('com.Inline.inline-ios'). Using this file the services may not be configured correctly. To continue with this configuration file, you may change your app's bundle identifier to 'com.Inline.inline-ios'. Or you can download a new configuration file that matches your bundle identifier from https://developers.google.com/mobile/add and replace the current one.
2016-02-05 19:44:44.383 Inline[95803:] <GMR/INFO> App measurement v.1302000 started
2016-02-05 19:44:44.384 Inline[95803:] <GMR/INFO> To enable debug logging set the following application argument: -GMRDebugEnabled (see http://goo.gl/Y0Yjwu)
2016-02-05 19:44:45.999 Inline[95803:] <GMR/INFO> App measurement enabled
2016-02-05 19:44:46.034 Inline[95803:3750273] Unknown class logo in Interface Builder file.
2016-02-05 19:44:46.048 Inline[95803:3750273] Failed to set (keyPath) user defined inspected property on (UIView): [<UIView 0x7faf9a079730> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.
2016-02-05 19:44:46.048 Inline[95803:3750273] Failed to set (keyPath) user defined inspected property on (UIView): [<UIView 0x7faf9a0729a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.
2016-02-05 19:44:46.048 Inline[95803:3750273] Failed to set (keyPath) user defined inspected property on (UIView): [<UIView 0x7faf9a07f8b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key keyPath.
2016-02-05 19:44:46.051 Inline[95803:3750273] Device ID: (null)
2016-02-05 19:44:46.051 Inline[95803:3750273] RegisterDevice RPC request
scanning for beacons
fatal error: unexpectedly found nil while unwrapping an Optional value

如何让self.title成为非零?

3 个答案:

答案 0 :(得分:1)

初始于didFinishLaunchingWithOptions

let gai = GAI.sharedInstance()
let id = "UA-ID"
gai.trackerWithTrackingId(id)
gai.trackUncaughtExceptions = true
gai.logger.logLevel = GAILogLevel.Warning
gai.defaultTracker.allowIDFACollection = false

通过setScreenName上的viewDidAppear致电谷歌分析的简便方法。

extension UIViewController {
    func setScreeName(name: String) {
        self.title = name
        self.sendScreenView()
    }

    func sendScreenView() {
        let tracker = GAI.sharedInstance().defaultTracker
        tracker.set(kGAIScreenName, value: self.title)
        let builder = GAIDictionaryBuilder.createScreenView()
        tracker.send(builder.build() as [NSObject : AnyObject])
    }

    func trackEvent(category: String, action: String, label: String, value: NSNumber?) {
        let tracker = GAI.sharedInstance().defaultTracker
        let trackDictionary = GAIDictionaryBuilder.createEventWithCategory(category, action: action, label: label, value: value)
        tracker.send(trackDictionary.build() as [NSObject : AnyObject])
    }
}

答案 1 :(得分:0)

我有同样的问题,发现defaultTracker属性会造成麻烦。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(true)

    // I called trackerWithTrackingId method in AppDelegate, 
    // but defaultTracker value could be nil.
    // So, you got a error message like this :
    // fatal error: unexpectedly found nil while unwrapping an Optional value
    // According to google analytics documents, trackerWithTrackingId has an
    // initial value with nil, and then will be set with return value
    // from trackerWithTrackingId method call. 
    // But it doesn't look work well sometimes.

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

            print("default tracker")

        #endif
    }

    // Instead of defaultTracker, use trackerWithTrackingId method
    // it will return a new tracker(=create) or the existing tracker  
    let tracker = GAI.sharedInstance().trackerWithTrackingId("tracking-ID")
    tracker.set(kGAIScreenName, value: "ViewController")

    let builder = GAIDictionaryBuilder.createScreenView()
    tracker.send(builder.build() as [NSObject : AnyObject])
}

有趣的是,默认跟踪器在AppDelegate中运行良好。

    let tracker = GAI.sharedInstance().trackerWithTrackingId("tracking-ID")
    GAI.sharedInstance().trackUncaughtExceptions = true;
    GAI.sharedInstance().dispatchInterval = 20
    GAI.sharedInstance().logger.logLevel = .Warning //.Verbose


    let firstTracker = GAI.sharedInstance().defaultTracker

    if tracker.isEqual(firstTracker) {
        #if DEBUG

            print("same Tracker")

        #endif
    } 

我的项目环境

  • Podfile

pod&#39; GoogleAnalytics&#39;

  • 桥接-Header.h
#import <GoogleAnalytics/GAI.h>
#import <GoogleAnalytics/GAIFields.h>
#import <GoogleAnalytics/GAILogger.h>
#import <GoogleAnalytics/GAIDictionaryBuilder.h>
#import <GoogleAnalytics/GAITrackedViewController.h>
#import <GoogleAnalytics/GAITracker.h>

我将Google Analytics与CocoaPods一起使用,但无法按照google analytics for swift中的说明操作。因为我不想在我的项目中添加GoogleService-Info.plist。

答案 2 :(得分:0)

使用时

let name = "Pattern~\(self.title!)"

为了跟踪,请确保在代码或Interface Builder中设置了View Controller Title:

Set View Controller Title