2015-01-18 2 views
1

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

enter image description here

Как решить эту проблему и сделать mixpanel работать?

ответ

3

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

#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 
} 
1

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

0

Получение 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) 
} 
2

изменить вашу #import "mixpanel.h" к #import "Mixpanel/Mixpanel.h"

+0

Спасибо, сэр. – Lapidus

+0

Рад, что я мог бы помочь. –

+0

Для быстрого проекта импорт должен выглядеть следующим образом: #import (подробности см. На странице https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch. HTML) –

0

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

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

Смежные вопросы