Mixpanel не работает со свифтом

Cocoapods еще не готов для Swift. Когда я внедрил Mixpanel в свой проект iOS, использующий Swift, я получил несколько ошибок.

введите здесь описание изображения

Как решить эту проблему и заставить Mixpanel работать?


person Esqarrouth    schedule 18.01.2015    source источник


Ответы (5)


Добавьте эту строку кода в каждый файл, который выдает ошибку

#import <UIKit/UIKit.h>

Также необходимо добавить их в свои связанные фреймворки и библиотеки:

libicucore.dylib  
CFNetwork.framework  
Security.framework

Затем добавьте это в свой файл Bridging-Header.h:

#import "Mixpanel.h"

Затем добавьте этот фрагмент кода в свой appdelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    //other stuff here
    Mixpanel.sharedInstanceWithToken("yourtokennumbergoeshere")
    var mixPanel = Mixpanel.sharedInstance()

    mixPanel.track("Finished Launching", properties: ["name1":"property1","name2":"property2"])

    return true
}
person Esqarrouth    schedule 19.01.2015

Измените свой #import "mixpanel.h" на #import "Mixpanel/Mixpanel.h"

person Rupert    schedule 02.08.2015
comment
Рад, что смог помочь. - person Rupert; 09.08.2015
comment
Для быстрого проекта импорт должен быть таким: #import ‹Mixpanel/Mixpanel.h› (подробнее см. BuildingCocoaApps/MixandMatch.html" rel="nofollow noreferrer">developer.apple.com/library/ios/documentation/Swift/Conceptual/) - person Joosep Simm; 01.09.2015

Используйте этот неофициальный клиент Swift! Вероятно, не так хорошо, как настоящая вещь, но для базового отслеживания подойдет. https://github.com/soffes/Mixpanel

person Ignacio Valdivieso    schedule 12.05.2015

Заставить A/B-тестирование работать в Swift непросто, так как макрос не поддерживается. Не стесняйтесь использовать этот смысл:

https://gist.github.com/ohad7/8ce12a432773fe3b1bf3

import Foundation
import Mixpanel

public class Tweaks : NSObject, MPTweakObserver {

  public static let sharedInstance = Tweaks(tweaks: [ ExecuteDiskCleanup])

  public static let ExecuteDiskCleanup = Tweak.Booln(name: "Cleanup-Disk", defaultValue:false)

  private var values = [String:AnyObject]()
  private let tweaks: [Tweak]

  public init(tweaks: [Tweak]) {
    self.tweaks = tweaks
    let defaults = NSUserDefaults.standardUserDefaults()
    for tweak in tweaks {
      if let value: AnyObject = defaults.objectForKey(Tweaks.generateKey(tweak.name)) {
        self.values[tweak.name] = value
        println("Initialized Tweak \(tweak.name) with value: \(value)")
      }
    }
  }

  public func setup() {
    tweaks.foreach(){ tweak  in
      let theTweak = MPTweak(name: tweak.name, andEncoding: "UTF-8")
      theTweak.defaultValue = tweak.defaultValue
      theTweak.addObserver(self)
      MPTweakStore.sharedInstance().addTweak(theTweak)
    }

    Mixpanel.sharedInstance().checkForVariantsOnActive = true
    Mixpanel.sharedInstance().joinExperiments()
  }

  public func get(tweaks: [Tweak]) -> [String:AnyObject] {
    var result = [String:AnyObject]()
    synced(values) {
      tweaks.foreach(){ tweak in
        result[tweak.name] = self.values[tweak.name]
      }
    }
    return result
  }

  public func tweakDidChange(tweak: MPTweak) {
    println("tweakDidChange Tweak \(tweak.name) current value :\(tweak.currentValue)")
    synced(self.values) {
      let localTweak = self.tweaks.filter{ $0.name == tweak.name}.first
      if let localTweak = localTweak{
        switch (localTweak) {
        case .Booln:
          self.values[tweak.name] = Bool(tweak.currentValue as? Int == 1)
        default:
          self.values[tweak.name] = tweak.currentValue
        }
        println("Tweak \(localTweak.name) -> \(self.values[localTweak.name])")
        NSUserDefaults.standardUserDefaults().setObject(self.values[localTweak.name], forKey: Tweaks.generateKey(localTweak.name))
        NSUserDefaults.standardUserDefaults().synchronize()
      }
    }
  }

  private class func generateKey(key: String) -> String {
    return "mp_tweak_\(key)"
  }

}

public enum Tweak {
  case Str(name: String, defaultValue: String)
  case Booln(name: String, defaultValue: Bool)
  case Integer(name: String, defaultValue: Int)
  case Flt(name: String, defaultValue: Float)

  var name : String {
    switch (self) {
    case let .Str(n, d): return n
    case let .Booln(n, d): return n
    case let .Integer(n, d): return n
    case let .Flt(n, d): return n
    }
  }

  var defaultValue : AnyObject {
    switch (self) {
    case let .Str(n, d): return d
    case let .Booln(n, d): return d
    case let .Integer(n, d): return d
    case let .Flt(n, d): return d
    }
  }

  public func get<T>() -> T? {
    return get(self.defaultValue as? T)
  }

  public func get<T>(defaultValue: T?) -> T? {
    var value = synced(Tweaks.sharedInstance.values){
      return Tweaks.sharedInstance.values[self.name] as? T
    }
    return value != nil ? value : defaultValue
  }

}

//  Examples :
//  public static let SomeIntegerZero = Tweak.Integer(name: "SomeIntegerZero", defaultValue:0)
//  public static let SomeIntegerNonZero = Tweak.Integer(name: "SomeIntegerNonZero", defaultValue:6666)
//  public static let SomeBooleanFalse = Tweak.Booln(name: "SomeBooleanFalse", defaultValue:false)
//  public static let SomeBooleanTrue = Tweak.Booln(name: "SomeBooleanTrue", defaultValue:true)
//  public static let SomeStringEmpty = Tweak.Str(name: "SomeEmptyString", defaultValue:"")
//  public static let SomeStringFull = Tweak.Str(name: "SomeFullString", defaultValue:"full")


/*** Utilities - sync methods ***/
func synced<T>(lock: AnyObject, closure: () -> T) -> T {
  objc_sync_enter(lock)
  let result = closure()
  objc_sync_exit(lock)
  return result
}

func synced(lock: AnyObject, closure: () -> ()) {
  objc_sync_enter(lock)
  closure()
  objc_sync_exit(lock)
}
person ohad serfaty    schedule 27.06.2015
comment
Я не могу поверить, что эта суть все еще актуальна. Неужели они еще не решили эти проблемы? - person ohad serfaty; 13.03.2019

Похоже, Mixpanel опубликовал официальную документацию по этому поводу: https://mixpanel.com/blog/2015/08/17/community-tip-implement-mixpanel-in-swift-apps

У меня были проблемы с подфайлами и импортом связующих заголовков, но use_frameworks! предложенный в приведенной выше ссылке отлично работает для меня.

person Mike Lambert    schedule 24.09.2015