【问题标题】:viewController.title is nil after init of Google analytics谷歌分析初始化后 viewController.title 为 nil
【发布时间】:2016-02-05 17:49:35
【问题描述】:

我关注了 Google Analytics 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()
}

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

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 不为零?

【问题讨论】:

    标签: ios swift google-analytics


    【解决方案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
    

    通过setScreenNameviewDidAppear 调用谷歌分析的简单方法。

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

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,发现 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
          } 
      

      我的项目环境

      • 播客文件

      pod 'GoogleAnalytics'

      • Bridging-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>
      

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

      【讨论】:

        【解决方案3】:

        使用时

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

        为了您的跟踪,请确保您在代码或界面生成器中设置了视图控制器标题:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多