Code Monkey home page Code Monkey logo

aranalytics's Introduction

ARAnalytics v4 Build Status

ARAnalytics is to iOS what Analytical is to ruby, or Analytics.js is to javascript.

ARAnalytics is an analytics abstraction library offering a sane API for tracking events and user data. It currently supports on iOS: Mixpanel, Localytics, Flurry, GoogleAnalytics, KISSmetrics, Crittercism, Crashlytics, Fabric, Bugsnag, Countly, Helpshift, Tapstream, NewRelic, Amplitude, HockeyApp, HockeyAppLib, ParseAnalytics, HeapAnalytics, Chartbeat, UMengAnalytics, Librato, Segmentio, Swrve, YandexMobileMetrica, Adjust, AppsFlyer, Branch, Snowplow, Sentry, Intercom, Keen, Adobe and MobileAppTracker/Tune. And for OS X: KISSmetrics, Mixpanel and HockeyApp.

It does this by using CocoaPods subspecs to let you decide which libraries you'd like to use. You are free to also use the official API for any provider too. Also, it comes with an amazing DSL to clear up your methods.

Changelog

Integration

You shouldn't just use: pod "ARAnalytics". Since CocoaPods 0.36+ you should do something like:

  pod "ARAnalytics", :subspecs => ["Mixpanel", "Segmentio", "HockeyApp"]

Usage

Setup

Once you've pod installed'd the libraries you can either use the individual (for example) [ARAnalytics setupTestFlightWithTeamToken:@"TOKEN"] methods to start up each individual analytics platform or use the generic setupWithAnalytics with our constants.

  [ARAnalytics setupWithAnalytics:@{
      ARCrittercismAppID : @"KEY",
      ARKISSMetricsAPIKey : @"KEY",
      ARGoogleAnalyticsID : @"KEY"
   }];

Logging

Submit a console log that is stored online, for crash reporting this provides a great way to provide breadcrumbs. ARLog(@"Looked at Artwork (%@)", _artwork.name);

extern void ARLog (NSString *format, ...);

Event Tracking

/// Submit user events
+ (void)event:(NSString *)event;
+ (void)event:(NSString *)event withProperties:(NSDictionary *)properties;

// Add extra properties to get sent along with every event
+ (void)addEventSuperProperties:(NSDictionary *)superProperties;


/// Let ARAnalytics deal with the timing of an event
+ (void)startTimingEvent:(NSString *)event;
+ (void)finishTimingEvent:(NSString *)event;

Error Tracking

/// Submit errors to providers
+ (void)error:(NSError *)error;
+ (void)error:(NSError *)error withMessage:(NSString *)message;

User Properties

/// Set a per user property
+ (void)identifyUserWithID:(NSString *)userID andEmailAddress:(NSString *)email;
+ (void)setUserProperty:(NSString *)property toValue:(NSString *)value;
+ (void)incrementUserProperty:(NSString*)counterName byInt:(int)amount;

Page View Tracking

/// Monitor Navigation changes as page view
+ (void)pageView:(NSString *)pageTitle;
+ (void)monitorNavigationViewController:(UINavigationController *)controller;

On top of this you get access to use the original SDK. ARAnalytics provides a common API between lots of providers, so it will try to map most of the functionality between providers, but if you're doing complex things, expect to also use your provider's SDK.

Aspect-Oriented DSL

There is also a DSL-like setup constructor in the ARAnalytics/DSL subspec that lets you do all of your analytics setup at once. Example usage:

[ARAnalytics setupWithAnalytics: @{ /* keys */ } configuration: @{
   ARAnalyticsTrackedScreens: @[ @{
      ARAnalyticsClass: UIViewController.class,
      ARAnalyticsDetails: @[ @{
          ARAnalyticsPageNameKeyPath: @"title",
      }]
  }],
   ARAnalyticsTrackedEvents: @[@{
      ARAnalyticsClass: MyViewController.class,
      ARAnalyticsDetails: @[ @{
          ARAnalyticsEventName: @"button pressed",
          ARAnalyticsSelectorName: NSStringFromSelector(@selector(buttonPressed:)),
      },
      @{
          ARAnalyticsEventName: @"switch switched",
          ARAnalyticsSelectorName: NSStringFromSelector(@selector(switchSwitched:)),
      }]
   },
   ...

The above configuration specifies that the "button pressed" event be sent whenever the selector buttonPressed: is invoked on any instance of MyViewController. Additionally, every view controller will send a page view with its title as the page name whenever viewDidAppear: is called. There are also advanced uses using blocks in the DSL to selectively disable certain events, provide custom page/event property dictionaries, or to provide dynamic page/event names.

[ARAnalytics setupWithAnalytics: @{ /* keys */ } configuration: @{
   ARAnalyticsTrackedScreens: @[ @{
      ARAnalyticsClass: UIViewController.class,
      ARAnalyticsDetails: @[ @{
          ARAnalyticsProperties: ^NSDictionary*(MyViewController *controller, NSArray *parameters) {
            return @{ /* Custom screen view properties */ };
          }, 
          ARAnalyticsPageNameBlock:  ^NSDictionary*(MyViewController *controller, NSArray *parameters, NSDictionary *customProperties) {
            return [NSString stringWithFormat:@"%@:%@:%@",controller.a, controller.b, controller.c];
          }
      }]
  }],
  ARAnalyticsTrackedEvents: @[ @{
    ARAnalyticsClass: MyViewController.class,
    ARAnalyticsDetails: @[ 
      @{
        ARAnalyticsSelectorName: NSStringFromSelector(@selector(buttonPressed:)),
        ARAnalyticsShouldFire: ^BOOL(MyViewController *controller, NSArray *parameters) {
          return /* some condition */;
        },
        ARAnalyticsProperties: ^NSDictionary*(MyViewController *controller, NSArray *parameters) {
          return @{ /* Custom properties */ };
        },
        ARAnalyticsEventNameBlock:  ^NSDictionary*(MyViewController *controller, NSArray *parameters, NSDictionary *customProperties) {
          return [NSString stringWithFormat:@"%@ pressed", [(UIButton*)parameters[0] titleLabel].text];
        }
      },
      /* more events for this class */
    ]
  },
  ...

Note that when using page tracking on UIViewControllers, all instances must have a non-nil value for their title property. If your app uses nested view controllers, that may not be the case. In this instance, use the ARAnalyticsShouldFire block to disable these view controllers from firing analytics events.

ARAnalyticsShouldFire: ^BOOL(MyViewController *controller, NSArray *parameters) {
  return controller.title != nil;
},

HockeyApp

Starting with HockeyApp version 3.7.0, the HockeyApp provider will automatically keep logs of events and include those in crash reports, thus adding ‘breadcrumbs’ to your report and hopefully providing helpful context for your crash reports. Any messages logged with ARLog() will also get included in the report.

Note, however, that on iOS syslogd will not keep logs around for a long time, as such you should only expect logs of people that re-start the application immediately after the application crashing.

Full list of subspecs

iOS: Mixpanel, Localytics, Flurry, GoogleAnalytics, Firebase, KISSmetrics, Crittercism, Countly, Bugsnag, Helpshift, Tapstream, NewRelic, Amplitude, HockeyApp, HockeyAppLib, ParseAnalytics, HeapAnalytics, Chartbeat, UMengAnalytics, Segmentio, Swrve, YandexMobileMetrica, Adjust, Intercom, Librato, Crashlytics, Fabric, AppsFlyer, Branch, Snowplow, Sentry, Keen, Adobe, MobileAppTracker, Leanplum & Appboy.

OSX: KISSmetricsOSX, HockeyAppOSX, MixpanelOSX & ParseAnalyticsOSX.

Contributing, or adding a new analytics provider

See Contributing

aranalytics's People

Contributors

alloy avatar amleszk avatar ashfurrow avatar bamx23 avatar benchr267 avatar briomusic avatar caiguo37 avatar cbowns avatar cdzombak avatar cemaleker avatar delebedev avatar dlackty avatar enriquez avatar fabiojgrocha avatar hungtruong avatar jhersh avatar jk avatar levigroker avatar orta avatar paramaggarwal avatar rais38 avatar rhodgkins avatar segiddins avatar sgtsquiggs avatar sodastsai avatar starikovvm avatar stel avatar tettoffensive avatar wzs avatar yoiang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aranalytics's Issues

Support User-Id tracking on Google Analytics

Currently there is a warning in GoogleAnalyticsProvider that Google doesn't support User tracking.

- (void)identifyUserWithID:(NSString *)userID andEmailAddress:(NSString *)email {
    // Not allowed in GA
    // https://developers.google.com/analytics/devguides/collection/ios/v3/customdimsmets#pii

    // The Google Analytics Terms of Service prohibit sending of any personally identifiable information (PII) to Google Analytics servers. For more information, please consult the Terms of Service.

    // Ideally we would put an assert here but if you have multiple providers that wouldn't make sense.
}

However on the latest documentation this does appear possible (although only by id) : https://developers.google.com/analytics/devguides/collection/ios/v3/user-id .

It would be great to support setting this on Google Analytics.

CrittercismSDK & HockeySDK PLCrashReporter conflict

This is really a question more than an issue with ARAnalytics. I'm running into problems using both CrittercismSDK and HockeySDK... it generates a duplicate symbol error:

duplicate symbol _OBJC_CLASS_$_PLCrashReport in:
    /Users/reinpk/dev/forex/Pods/CrittercismSDK/CrittercismSDK/libCrittercism_v3_5_1.a(libCrashReporter-iphonesimulator.a-i386-master.o)
    /Users/reinpk/dev/forex/Pods/HockeySDK/Vendor/CrashReporter.framework/CrashReporter(libCrashReporter-iphonesimulator.a-i386-master.o)

Is this the reason ARAnalytics currently doesn't support HockeyKit, QuincyKit or HockeyApp?

Thanks man :)

return "end" block for logTimingEvent:

I'm using GA directly, and one of the things I'm doing is recording each page view in seconds.

So the way I did it was to return a block that fires off in the controllers didDisappear.
The block would be a property on the superclass and fire in every superclass didDisappear.

Current timingEvents don't do properties (at least from the looks of the Readme)

Update README

More deprecated API calls now
Could do with a better getting setup guide

Clarify DSL use in README

The conversation in #123 raised a good point: not all view controllers, particularly those that are child view controllers, have a title. Clarify this in the README and suggest and alternative approach.

Google Analytics out of the box linking error

Hi,
I get this error just installing the lib with pod:

Undefined symbols for architecture armv7:
  "_kGAIScreenName", referenced from:
      -[GoogleAnalyticsProvider didShowNewPageView:] in libPods-Woo-iOS.a(GoogleAnalyticsProvider.o)
  "_OBJC_CLASS_$_GAIDictionaryBuilder", referenced from:
      objc-class-ref in libPods-Woo-iOS.a(GoogleAnalyticsProvider.o)
      objc-class-ref in libPods-Woo-iOS.a(ARAnalytics+GoogleAnalytics.o)
  "_OBJC_CLASS_$_GAI", referenced from:
      objc-class-ref in AppDelegate.o
      objc-class-ref in libPods-Woo-iOS.a(GoogleAnalyticsProvider.o)
      objc-class-ref in libPods-Woo-iOS.a(ARAnalytics+GoogleAnalytics.o)
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
    pod 'GoogleAnalytics-iOS-SDK', '3.0.9'

    # Analytics
    pod 'ARAnalytics/Localytics', '~> 2.8.0'
    pod 'ARAnalytics/Crashlytics', '~> 2.8.0'
    pod 'ARAnalytics/GoogleAnalytics', '~> 2.8.0'
    pod 'ARAnalytics/DSL', '~> 2.8.0'

Any advice?

Unable to remove a user property

The current API doesn't allow for removing of a user property, there is no remove method and setUserProperty:toValue: doesn't support this.

+ (void)setUserProperty:(NSString *)property toValue:(NSString *)value {
    if (value == nil) {
        NSLog(@"ARAnalytics: Value cannot be nil ( %@ ) ", property);
        return;
    }

    [_sharedAnalytics iterateThroughProviders:^(ARAnalyticalProvider *provider) {
        [provider setUserProperty:property toValue:value];
    }];
}

Is this down to certain providers not letting these be removed?

CocoaPod Installation Failure

As of very recently, the CocoaPod installation of ARAnalytics is failing.

Installing ARAnalytics (2.3.4)
[!] Pod::Executable fetch origin tags/2.3.4 2>&1
fatal: Couldn't find remote ref tags/2.3.4
fatal: The remote end hung up unexpectedly

My Podfile is pretty simple, only containing:

pod 'ARAnalytics/Mixpanel'

From GitHub releases, it appears that there isn't a release or tag named 2.3.4.

Crittercism provider: no known class method for `-setEmail`

Just dropped in ARAnalytics for my project and I'm getting a build error. It's using Crittercism v4.1.1.

- (void)identifyUserWithID:(NSString *)userID andEmailAddress:(NSString *)email {
    if (userID) {
        [Crittercism setUsername:userID];
    }

    if (email) {
        [Crittercism setEmail:email];
    }
}

It fails with no known class method for -setEmail — must have been taken out of the Crittercism SDK as of late.

Is it possible to keep this behavior just by using this instead (with email as key)?

[self setUserProperty:@"email" toValue:email];

Regardless… it's code I won't even be using because I don't pay extra for Crittercism Enterprise. Let me know if you'd like a PR. I'm more than happy to provide one!

Regarding Crashlytics Update Issue

Hello,

I have added the ARAnalytics for crashlytics. Added the API key of crashlytics as mentioned in the doc. For checking the crashlytics working or not with ARAnalytics I have crashed my app few times but it could not be updated on the crashlytics.

I am able to handle this directly with crashlytics own SDK and getting the expected crash report on crashlytics.

How can I do this with ARAnalytics ??

Waiting for your reply...

Thanks in advance ..

Integrating with CocoaPods triggers warning in Xcode 6 Beta

When ARAnalytics is installed with CocoaPods, 2 warnings are generated in Xcode by default.

Pods/Pods.xcodeproj Update to recommended settings
- Target 'Pods-ARAnalytics' - Remove Duplicate References in Build Phase
The Compile Sources build phase contains duplicate references for one or more files. This will remove the duplicate file references.
- Target 'Pods-ARAnalytics' - Remove Duplicate References in Build Phase
The Compile Sources build phase contains duplicate references for one or more files. This will remove the duplicate file references.

Apparently few files get included multiple times into compile sources, which are:

  • ARAnalyticalProvider.m
  • ARAnalytics.m
  • ARNavigationControllerDelegateProxy.m

Xcode will fix this for us, but having this fixed would be even better. I am assuming this happens only when two subspecs of Analytics are included, for example in my case:

pod 'ARAnalytics/Crashlytics'
pod 'ARAnalytics/GoogleAnalytics'
pod 'ARAnalytics/DSL'

Remove TestFlight events

TestFlight have removed FlightPath analytics since Apple bought them, there is no where on the website to view the analytics so I think it's time they are removed from ARAnalytics.

Do we want to remove TestFlight completely from ARAnalytics? Or just remove the events being sent (so you can still [TestFlight takeOff:identifier]).

Dropping iOS 6.0 support

I am working on integrating Intercom as an analytics provider but Intercom 2.0.5 pod needs iOS 7.0 or higher.

What do you think about dropping iOS 6 support from ARAnalytics?

Or is there a way to dynamically determine the deployment target in the podspec by looking at the required system version of each included supspec? Does that even make sense?

Add Default subspec

I have a pod that depends on ARAnalytics. I don't want to depend on 'ARAnalytics' because it will pull in every subspec. Is there a way to depend on ARAnalytics without requiring the entire library or a specific subspec?

Mac Analytics

from @chendo

Looks like this is an reasonable amount of effort.

Google: https://github.com/Coppertino/AnalyticEverything
Mixpanel: mixpanel/mixpanel-iphone#27
Kissmetrics: https://github.com/kissmetrics/KISSmetrics-iOS-Mac-OS-X-Library
Countly: https://github.com/mrballoon/countly-sdk-osx
Crittercism: iOS
Bugsnag: https://github.com/bugsnag/bugsnag-ios (OSS, could be forked, https://github.com/bugsnag/bugsnag-ios/issues/16)
Helpshift: ?
Crashlytics: Does what it wants...
Testflight: NO
DeskMetrics: ?

ARAnalytics/HockeyApp - CrashReporter/CrashReporter.h file not found

Hi there,

I've just started seeing this build error with 2.7.2. In the file BITCrashManager.h, it cannot find CrashReporter.framework.

Framework search paths in the project includes $(PROJECT_DIR)/Pods/HockeySDK/Vendor

Any help appreciated. I'll update this issue when I have more info.

Xcode 5.1.1, CP 0.33.1. Simulator and device build same result.

pod lib lint issues

key:

    - ERROR | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/AmplitudeProvider.m:33:16: error: no known class method for selector 'logEvent:withCustomProperties:'
    - ERROR | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/AmplitudeProvider.m:37:16: error: no known class method for selector 'setGlobalUserProperties:'

Perhaps an issue with Amplitude

  ARAnalytics   master ✘ ✖ ✹  pod lib lint                                                                                                                                                                                                                                                                    12:17:51

 -> ARAnalytics (2.4)
    - NOTE  | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Amplitude-iOS/Amplitude.m:480:57: warning: values of type 'NSUInteger' should not be used as format arguments; add an explicit cast to 'unsigned long' instead [-Wformat]
    - NOTE  | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Amplitude-iOS/Amplitude.m:520:71: warning: values of type 'NSInteger' should not be used as format arguments; add an explicit cast to 'long' instead [-Wformat]
    - NOTE  | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Amplitude-iOS/Amplitude.m:921:17: warning: implicit conversion loses integer precision: 'unsigned long' to 'CC_LONG' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/TestFlight, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  BPXLUUIDHandler/BPXLUUIDHandler.m:151:54: warning: values of type 'OSStatus' should not be used as format arguments; add an explicit cast to 'int' instead [-Wformat]
    - NOTE  | [ARAnalytics/TestFlight, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  BPXLUUIDHandler/BPXLUUIDHandler.m:185:59: warning: values of type 'OSStatus' should not be used as format arguments; add an explicit cast to 'int' instead [-Wformat]
    - NOTE  | [ARAnalytics/TestFlight, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  BPXLUUIDHandler/BPXLUUIDHandler.m:205:59: warning: values of type 'OSStatus' should not be used as format arguments; add an explicit cast to 'int' instead [-Wformat]
    - NOTE  | [ARAnalytics/TestFlight, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  BPXLUUIDHandler/BPXLUUIDHandler.m:249:56: warning: values of type 'OSStatus' should not be used as format arguments; add an explicit cast to 'int' instead [-Wformat]
    - NOTE  | [ARAnalytics/Localytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Localytics-iOS-Client/Localytics-iOS-Client-2.23.0.source/LocalyticsDatapointHelper.m:207:11: warning: incompatible pointer to integer conversion assigning to 'BOOL' (aka 'signed char') from 'id' [-Wint-conversion]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/Mixpanel.m:389:13: warning: unused variable 'k' [-Wunused-variable]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/Mixpanel.m:1472:13: warning: unused variable 'v' [-Wunused-variable]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/Mixpanel.m:1499:13: warning: unused variable 'v' [-Wunused-variable]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/UIImage+MPImageEffects.m:211:87: warning: implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/UIImage+MPImageEffects.m:211:95: warning: implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/UIImage+MPImageEffects.m:212:87: warning: implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/UIImage+MPImageEffects.m:212:95: warning: implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/UIImage+MPImageEffects.m:213:87: warning: implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Mixpanel, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Mixpanel/Mixpanel/UIImage+MPImageEffects.m:213:95: warning: implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'uint32_t' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:448:81: warning: incompatible pointer to integer conversion sending 'void *' to parameter of type 'NSRegularExpressionOptions' (aka 'enum NSRegularExpressionOptions') [-Wint-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSRegularExpression.h:37:111: note: passing argument to parameter 'options' here
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:454:97: warning: incompatible pointer to integer conversion sending 'void *' to parameter of type 'NSMatchingOptions' (aka 'enum NSMatchingOptions') [-Wint-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSRegularExpression.h:77:85: note: passing argument to parameter 'options' here
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:891:80: warning: incompatible integer to pointer conversion sending 'int' to parameter of type 'BOOL *' (aka 'signed char *') [-Wint-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:1007:71: note: passing argument to parameter 'allowLogAsDeveloperError' here
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:1032:60: warning: incompatible integer to pointer conversion sending 'BOOL' (aka 'signed char') to parameter of type 'BOOL *' (aka 'signed char *') [-Wint-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Cryptography/FBCrypto.m:35:17: warning: unused function 'FBReadIntBigEndian' [-Wunused-function]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Core/FBDataDiskCache.m:26:24: warning: unused variable 'kCacheInfoFile' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Network/FBGraphObject.m:48:24: warning: unused variable 'FBIsGraphObjectKey' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBInsights.m:62:12: warning: implicit conversion from enumeration type 'FBAppEventsFlushBehavior' (aka 'enum FBAppEventsFlushBehavior') to different enumeration type 'FBInsightsFlushBehavior' [-Wenum-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBInsights.m:66:35: warning: implicit conversion from enumeration type 'FBInsightsFlushBehavior' to different enumeration type 'FBAppEventsFlushBehavior' (aka 'enum FBAppEventsFlushBehavior') [-Wenum-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/DeviceAPI/FBNativeDialogs.m:44:21: warning: implicit conversion from enumeration type 'FBOSIntegratedShareDialogResult' to different enumeration type 'FBNativeDialogResult' [-Wenum-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Network/FBRequestConnection.m:61:18: warning: unused variable 'kRESTAPIAccessTokenErrorCode' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Network/FBRequestConnection.m:63:18: warning: unused variable 'kAPISessionNoLongerActiveErrorCode' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/FBSessionAppSwitchingLoginStategy.m:32:1: warning: no 'assign', 'retain', or 'copy' attribute is specified - 'assign' is assumed [-Wobjc-property-no-attribute]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/FBSessionAppSwitchingLoginStategy.m:32:1: warning: default property attribute 'assign' not appropriate for non-GC object [-Wobjc-property-no-attribute]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Login/FBTestSession.m:45:24: warning: unused variable 'FBLoginAuthTestUserURLPath' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Login/FBTestSession.m:47:24: warning: unused variable 'FBLoginTestUserClientID' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Login/FBTestSession.m:48:24: warning: unused variable 'FBLoginTestUserClientSecret' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Login/FBTestSession.m:49:24: warning: unused variable 'FBLoginTestUserGrantType' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Login/FBTestSession.m:50:24: warning: unused variable 'FBLoginTestUserGrantTypeClientCredentials' [-Wunused-const-variable]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:891:80: warning: incompatible integer to pointer conversion sending 'int' to parameter of type 'BOOL *' (aka 'bool *') [-Wint-conversion]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:970:60: warning: implicit conversion loses integer precision: 'long' to 'int' [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/ParseAnalytics, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Facebook-iOS-SDK/src/Insights/FBAppEvents.m:1032:60: warning: incompatible integer to pointer conversion sending 'BOOL' (aka 'bool') to parameter of type 'BOOL *' (aka 'bool *') [-Wint-conversion]
    - NOTE  | [ARAnalytics/Tapstream, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Tapstream/objc/Tapstream/TSPlatformImpl.m:224:26: warning: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'u_int' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Tapstream, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Tapstream/objc/Tapstream/TSPlatformImpl.m:241:26: warning: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'u_int' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Tapstream, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  Tapstream/objc/Tapstream/TSPlatformImpl.m:249:30: warning: implicit conversion loses integer precision: 'unsigned long' to 'int' [-Wshorten-64-to-32]
    - ERROR | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/AmplitudeProvider.m:33:16: error: no known class method for selector 'logEvent:withCustomProperties:'
    - ERROR | [ARAnalytics/Amplitude, ARAnalytics/no_clash_HockeyApp, ARAnalytics/no_clash_Crittercism, and more...] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/AmplitudeProvider.m:37:16: error: no known class method for selector 'setGlobalUserProperties:'
    - NOTE  | [ARAnalytics/CoreMac, ARAnalytics/KISSmetricsOSX, ARAnalytics/MixpanelOSX, and more...] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/ARNavigationControllerDelegateProxy.h:13:58: warning: cannot find protocol definition for 'UINavigationControllerDelegate'
    - NOTE  | [ARAnalytics/CoreMac, ARAnalytics/KISSmetricsOSX, ARAnalytics/MixpanelOSX, and more...] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/ARNavigationControllerDelegateProxy.m:21:24: warning: assigning to 'NSObject<UINavigationControllerDelegate> *__strong' from incompatible type '__strong id<UINavigationControllerDelegate>'
    - NOTE  | [OSX] [ARAnalytics/MixpanelOSX] [xcodebuild]  Mixpanel-OSX-Community/Mixpanel/Mixpanel.m:303:13: warning: unused variable 'k' [-Wunused-variable]
    - NOTE  | [OSX] [ARAnalytics/MixpanelOSX] [xcodebuild]  Mixpanel-OSX-Community/Mixpanel/Mixpanel.m:1171:13: warning: unused variable 'v' [-Wunused-variable]
    - NOTE  | [OSX] [ARAnalytics/MixpanelOSX] [xcodebuild]  Mixpanel-OSX-Community/Mixpanel/Library/ODIN/ODIN.m:77:4: warning: implicit conversion loses integer precision: 'CFIndex' (aka 'long') to 'CC_LONG' (aka 'unsigned int') [-Wshorten-64-to-32]
    - NOTE  | [ARAnalytics/Tapstream] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/TapstreamProvider.m:43:26: warning: 'addBooleanValue:forKey:' is deprecated [-Wdeprecated-declarations]
    - NOTE  | [ARAnalytics/Tapstream] [xcodebuild]  Tapstream/objc/Core/TSEvent.h:45:1: note: method 'addBooleanValue:forKey:' declared here
    - NOTE  | [ARAnalytics/Tapstream] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/TapstreamProvider.m:46:26: warning: 'addBooleanValue:forKey:' is deprecated [-Wdeprecated-declarations]
    - NOTE  | [ARAnalytics/Tapstream] [xcodebuild]  /Users/orta/dev/ios/ARAnalytics/Providers/TapstreamProvider.m:49:26: warning: 'addBooleanValue:forKey:' is deprecated [-Wdeprecated-declarations]

Failing CI

Looks like something might have changed in their SDK? I'm not familiar with it, but I can take a look. Let me know.

In file included from /Users/travis/build/orta/ARAnalytics/Providers/HockeyAppProvider.m:10:
In file included from /Users/travis/build/orta/ARAnalytics/Bootstrap/Pods/BuildHeaders/HockeySDK/HockeySDK.h:39:
/Users/travis/build/orta/ARAnalytics/Bootstrap/Pods/BuildHeaders/HockeySDK/BITCrashManager.h:39:9: fatal error: 'CrashReporter/CrashReporter.h' file not found
#import <CrashReporter/CrashReporter.h>

Cocoapod still on 2.9.1

The Cocoapod is still listing 2.9.1 as the latest, 2.9.2 isn't available. Also, is adopting Aspects 1.4.1 possible? ARAnalytics is currently locked to 1.3.

Crashlytics

I got my Crashlytics invitation tonight. It's pretty awesome.
Its Mac client integrates the Crashlytics.framework into my project in a very fancy way.
I also prefer install it via CocoaPods and ARAnalytics.
But what's the problem with CrashlyticsProvider? Can I do something?

No super properties for Mixpanel

Your Mixpanel provider doesn't seem to allow super properties, though I can see how this could be a problem since other providers wouldn't have that.

I'd like to give ARAnalytics a chance to try out the different providers, but I feel like I would be missing out on functionality that would make a particular provider stand out.

Any thoughts on how to mitigate this?

Make a @analyticsSelector() macro

So instead of defining NSStringFromSelector(@selector(buttonWasPressed:)) in the DSL, we have @analyticsSelector(buttonWasPressed:).

Can't set `prefix_header_contents' for subspecs.

Hi,

is the current podspec broken? It doesn't matter how I want to use your pod I always get the following error on pod install and pod update:

pod --version
0.16.4

pod install
Resolving dependencies of `./CocoaPods.podfile'
Updating spec repositories

Cocoapods 0.17.0.rc6 is available.

Resolving dependencies for target `default' (iOS 6.0)
[!] #<Pod::Specification for ARAnalytics/TestFlight (1.2)> Can't set `prefix_header_contents' for subspecs.

My CocoaPods.podfile looks like this:

platform :ios, '6.0'

inhibit_all_warnings!

pod 'Reachability', :head
pod 'AFNetworking'
pod 'ARAnalytics'
# pod 'ARAnalytics/Countly'
# pod 'ARAnalytics/Flurry'
pod 'DCIntrospect'
# ...

Is this a known issue? And why does it even bother about TestFlight, when I'm not using ARAnalytics in favor of something like ARAnalytics/Countly?

[question] In ARDSL, why require that every page has a name?

In our app, we configure some very coarse screen tracking via ARDSL with this code:

ARAnalyticsTrackedScreens: @[
    @{
        ARAnalyticsClass: UIViewController.class,
        ARAnalyticsDetails: @[
            @{ ARAnalyticsPageNameKeyPath: @"title", }
        ],
    }
]

I noticed today that while debugging (assertions are disabled in our release builds), the app crashes on the following assertion, from line 26 or ARDSL:

pageName = [instance valueForKeyPath:pageNameKeypath] ?: @"";
NSAssert(pageName, @"Value for Key on `%@` returned nil from instance of class: `%@`", pageNameKeypath, NSStringFromClass([instance class]));

Why is this assertion here? Not every view controller has a title; would it not be better to fallback to some sane behavior (perhaps an empty string, or not logging the event, coupled with a warning NSLog call) instead of asserting this here?

Analytics DSL

I was talking with steipete about ARAnlaytics, and he advised that we look at creating a generic Analytics DSL ( basically an NSDictionary ) that executes analytics calls at the end of methods after reading about it here: http://albertodebortoli.github.io/blog/2014/03/25/an-aspect-oriented-approach-programming-to-ios-analytics/

He also said RAC has some code that allows for arbitrary execution of blocks after a method has been ran, so maybe it could be added as a sub spec with a dep on RAC.

We should move ARAnalytics towards this kind of declarative method (for the simple ones), negates a lot of inline analytics code 👍

Google Analytics Provider ignores properties passed to event:withProperties:

Potential options:

  • dump the contents of properties into GA event's value
  • additional structured event: selector that accepts a category, label and/or value and automatically bundles these parameters in a dictionary for other providers
  • mapped keys within the properties dictionary for category, label, value
  • ?

I'd be happy to implement whatever solution people feel is most useful.

Edit:
Additionally Google Analytics v3 requires a category and action for an event as documented here: https://developers.google.com/analytics/devguides/collection/ios/v3/events, verified in account, as do timing events.

Add a provider that stores locally to defaults

If you want to store some of these analytics tools to disk or present them to the user "you've liked 5 artworks" / "you've opened the app 20 times" / "watched 500 hours of cartoons" then it makes sense to log that data locally as well as on the server.

/cc @confidencejuice

ARAnalytics/Flurry has wrong analytics version

Podfile tries to activate 'ARAnalytics/Flurry (= 2.3.3)', but already activated version '2.4.0' by Podfile and ARAnalytics/Mixpanel (2.4.0).

In my Podfile:

pod 'ARAnalytics/Mixpanel'
pod 'ARAnalytics/Flurry'
pod 'ARAnalytics/GoogleAnalytics'

HockeyApp dependency version

The JSON version of ARAnalytics 2.8.0's podspec has pinned the HockeyApp dependency to 3.5.4, as you can see here: https://github.com/CocoaPods/Specs/blob/master/Specs/ARAnalytics/2.8.0/ARAnalytics.podspec.json#L408

However nothing in the ARAnalytics spec seems to specify an exact version for HockeyApp: https://github.com/orta/ARAnalytics/blob/master/ARAnalytics.podspec

I would like to use the latest HockeyApp (3.6.1) but cannot because ARAnalytics is pinned to HockeyApp 3.5.4. I guess I have 2 questions:

From whence the 3.5.4 requirement? Is it possible that it's related to ARAnalytics 2.8.0 having been generated on Sep 1, with a previous version of CocoaPods?

How can I use the latest HockeyApp with ARAnalytics? Other dependencies in ARAnalytics do not seem to be pinned to exact versions. Hopefully it's as simple as pushing a new spec to trunk? Or should I use a local spec that's had the 3.5.4 version removed?

Move to RAC for DSL subspec

The Aspects library we're using now doesn't support multiple injections per class hierarchy. We've been using the ReactiveCocoa solution in production for six months – may as well move over to it in master.

Related to #120

Tapstream Provider is out of date

They just fixed a crash I reported and bumped it to 2.5.2. Current provider specifies an earlier version, though I couldn't figure out how to change it in the podspec file.

Can't install dependencies to work with the pod

Using Gemfile

gem 'cocoapods', :git => 'http://github.com/CocoaPods/CocoaPods', :branch => 'xcode-5-support'

gem 'xcodeproj', :git => 'http://github.com/CocoaPods/Xcodeproj', :branch => 'redacted-support'

[!] ARAnalytics/no_clash_HockeyApp (2.1.0) tries to activate ARAnalytics/Bugsnag (from../)', but already activated version2.1.0' by Podfile, ARAnalytics/KISSmetricsOSX (2.1.0), Podfile, ARAnalytics (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), ARAnalytics/TestFlight (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), ARAnalytics/Mixpanel (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), ARAnalytics/Localytics (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), ARAnalytics/Flurry (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), ARAnalytics/GoogleAnalytics (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), ARAnalytics/KISSmetrics (2.1.0), ARAnalytics/no_clash_HockeyApp (2.1.0), and ARAnalytics/Crashlytics (2.1.0)

DSL trackedScreens not tracking pages in Google Analytcs

Hi,
Google Analytics is not tracking pagenames in content and no live content is showed.
This is the configuration that I used, which is copied from the doc. Any of you could help?
thanks!

[ARAnalytics setupWithAnalytics:@{
                                      ARLocalyticsAppKey    : @"x",
                                      ARCrashlyticsAPIKey   : @"y",
                                      ARGoogleAnalyticsID   : @"z",}
                      configuration: @{
                                       ARAnalyticsTrackedScreens: @[ @{
                                                                         ARAnalyticsClass: UIViewController.class,
                                                                         ARAnalyticsDetails: @[ @{
                                                                                                    ARAnalyticsPageNameKeyPath: @"title",
                                                                                                    }]
                                                                         }]}

     ];

Tracking UIViewController ancestors fails via DSL

Hi!
I'm using sample code from your article.

[ARAnalytics setupWithAnalytics:@{
  /* keys */
} configuration:
@{
  ARAnalyticsTrackedScreens: @[
      @{
          ARAnalyticsClass: UIViewController.class,
          ARAnalyticsDetails: @[ // default selector on iOS is viewDidAppear:
              @{
                  ARAnalyticsPageNameKeyPath: @"title"
              }
          ]
      }
  ]
}];

However it fails on NSAssert'ing title property in UINavigationController, UITabBarController, even some UIInputWindowController.

Am I doing something wrong or just ignore asserts in DEBUG configuration?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.