Skip to content

Commit

Permalink
Merge pull request #47 from adjust/development
Browse files Browse the repository at this point in the history
Web App integration
  • Loading branch information
nonelse committed May 27, 2014
2 parents 2d57ada + 1f2d632 commit c3da2ec
Show file tree
Hide file tree
Showing 17 changed files with 1,089 additions and 34 deletions.
4 changes: 2 additions & 2 deletions Adjust.podspec
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
Pod::Spec.new do |s|
s.name = "Adjust"
s.version = "3.3.1"
s.version = "3.3.2"
s.summary = "This is the iOS SDK of Adjust. You can read more about it at http://adjust.io."
s.homepage = "http://adjust.io"
s.license = { :type => 'MIT', :file => 'MIT-LICENSE' }
s.author = { "Christian Wellenbrock" => "welle@adjust.com" }
s.source = { :git => "https://github.com/adeven/adjust_ios_sdk.git", :tag => "v3.3.1" }
s.source = { :git => "https://github.com/adeven/adjust_ios_sdk.git", :tag => "v3.3.2" }
s.platform = :ios, '4.3'
s.framework = 'SystemConfiguration'
s.weak_framework = 'AdSupport', 'iAd'
Expand Down
32 changes: 32 additions & 0 deletions Adjust.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
9679922018BBAE2800394606 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679921018BBAE2800394606 /* Foundation.framework */; };
9679922218BBAE2800394606 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679922118BBAE2800394606 /* UIKit.framework */; };
9679922518BBAE2800394606 /* libAdjust.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9679920D18BBAE2800394606 /* libAdjust.a */; };
96CD4478192A546F0029A1AA /* AdjustBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 96CD4473192A546F0029A1AA /* AdjustBridge.m */; };
96CD4479192A546F0029A1AA /* WebViewJavascriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 96CD4477192A546F0029A1AA /* WebViewJavascriptBridge.m */; };
96E5E38118BBB48A008E7B30 /* Adjust.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E34D18BBB48A008E7B30 /* Adjust.m */; };
96E5E38B18BBB48A008E7B30 /* AIActivityHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36318BBB48A008E7B30 /* AIActivityHandler.m */; };
96E5E38C18BBB48A008E7B30 /* AIActivityKind.m in Sources */ = {isa = PBXBuildFile; fileRef = 96E5E36518BBB48A008E7B30 /* AIActivityKind.m */; };
Expand Down Expand Up @@ -78,6 +80,12 @@
9679921D18BBAE2800394606 /* AdjustTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AdjustTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
9679921E18BBAE2800394606 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
9679922118BBAE2800394606 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
96ADB109192E0175006E1D9D /* AdjustBridge.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = AdjustBridge.js.txt; sourceTree = "<group>"; };
96CD4472192A546F0029A1AA /* AdjustBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AdjustBridge.h; sourceTree = "<group>"; };
96CD4473192A546F0029A1AA /* AdjustBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AdjustBridge.m; sourceTree = "<group>"; };
96CD4475192A546F0029A1AA /* WebViewJavascriptBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebViewJavascriptBridge.h; sourceTree = "<group>"; };
96CD4476192A546F0029A1AA /* WebViewJavascriptBridge.js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebViewJavascriptBridge.js.txt; sourceTree = "<group>"; };
96CD4477192A546F0029A1AA /* WebViewJavascriptBridge.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WebViewJavascriptBridge.m; sourceTree = "<group>"; };
96E5E34C18BBB48A008E7B30 /* Adjust.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Adjust.h; sourceTree = "<group>"; };
96E5E34D18BBB48A008E7B30 /* Adjust.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Adjust.m; sourceTree = "<group>"; };
96E5E36218BBB48A008E7B30 /* AIActivityHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AIActivityHandler.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -161,6 +169,7 @@
9679920418BBAE2800394606 = {
isa = PBXGroup;
children = (
96CD4471192A546F0029A1AA /* AdjustBridge */,
96E5E39A18BBB49E008E7B30 /* AdjustTests */,
96E5E34B18BBB48A008E7B30 /* Adjust */,
9679920F18BBAE2800394606 /* Frameworks */,
Expand Down Expand Up @@ -189,6 +198,27 @@
name = Frameworks;
sourceTree = "<group>";
};
96CD4471192A546F0029A1AA /* AdjustBridge */ = {
isa = PBXGroup;
children = (
96ADB109192E0175006E1D9D /* AdjustBridge.js.txt */,
96CD4472192A546F0029A1AA /* AdjustBridge.h */,
96CD4473192A546F0029A1AA /* AdjustBridge.m */,
96CD4474192A546F0029A1AA /* WebViewJavascriptBridge */,
);
path = AdjustBridge;
sourceTree = "<group>";
};
96CD4474192A546F0029A1AA /* WebViewJavascriptBridge */ = {
isa = PBXGroup;
children = (
96CD4475192A546F0029A1AA /* WebViewJavascriptBridge.h */,
96CD4476192A546F0029A1AA /* WebViewJavascriptBridge.js.txt */,
96CD4477192A546F0029A1AA /* WebViewJavascriptBridge.m */,
);
path = WebViewJavascriptBridge;
sourceTree = "<group>";
};
96E5E34B18BBB48A008E7B30 /* Adjust */ = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -343,6 +373,7 @@
buildActionMask = 2147483647;
files = (
96E5E38118BBB48A008E7B30 /* Adjust.m in Sources */,
96CD4479192A546F0029A1AA /* WebViewJavascriptBridge.m in Sources */,
96E5E38B18BBB48A008E7B30 /* AIActivityHandler.m in Sources */,
96E5E39618BBB48A008E7B30 /* AIRequestHandler.m in Sources */,
96E5E39918BBB48A008E7B30 /* AIUtil.m in Sources */,
Expand All @@ -358,6 +389,7 @@
96E5E39318BBB48A008E7B30 /* AILogger.m in Sources */,
96E5E39418BBB48A008E7B30 /* AIPackageBuilder.m in Sources */,
96E5E39218BBB48A008E7B30 /* AIAdjustFactory.m in Sources */,
96CD4478192A546F0029A1AA /* AdjustBridge.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
3 changes: 3 additions & 0 deletions Adjust/AILogger.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,7 @@ typedef enum {
@end

@interface AILogger : NSObject <AILogger>

+ (AILogLevel) LogLevelFromString: (NSString *) logLevelString;

@end
23 changes: 23 additions & 0 deletions Adjust/AILogger.m
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,27 @@ - (void)logLevel:(NSString *)logLevel format:(NSString *)format parameters:(va_l
}
}

+ (AILogLevel)LogLevelFromString:(NSString *)logLevelString {
if ([logLevelString isEqualToString:@"verbose"])
return AILogLevelVerbose;

if ([logLevelString isEqualToString:@"debug"])
return AILogLevelDebug;

if ([logLevelString isEqualToString:@"info"])
return AILogLevelInfo;

if ([logLevelString isEqualToString:@"warn"])
return AILogLevelWarn;

if ([logLevelString isEqualToString:@"error"])
return AILogLevelError;

if ([logLevelString isEqualToString:@"assert"])
return AILogLevelAssert;

// default value if string does not match
return AILogLevelInfo;
}

@end
2 changes: 1 addition & 1 deletion Adjust/AIUtil.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#include <sys/xattr.h>

static NSString * const kBaseUrl = @"https://app.adjust.io";
static NSString * const kClientSdk = @"ios3.3.1";
static NSString * const kClientSdk = @"ios3.3.2";

static NSString * const kDateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'Z";
static NSDateFormatter * dateFormat;
Expand Down
4 changes: 2 additions & 2 deletions Adjust/Adjust.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,8 +135,8 @@ static NSString * const AIEnvironmentProduction = @"production";
*/
+ (void)setMacMd5TrackingEnabled:(BOOL)enabled;

// Special method used by SDK wrappers such as Adobe Air SDK.
+ (void)setSdkPrefix:(NSString *)sdkPrefix __attribute__((deprecated));
// Special method used by wrapper JS bridge. Do not call directly.
+ (void)setSdkPrefix:(NSString *)sdkPrefix;

/**
* Tell adjust that the application resumed.
Expand Down
20 changes: 20 additions & 0 deletions AdjustBridge/AdjustBridge.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// AdjustBridge.h
// Adjust
//
// Created by Pedro Filipe on 19/05/14.
// Copyright (c) 2014 adjust. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Adjust.h"
#import <UIKit/UIKit.h>

@interface AdjustBridge : NSObject<AdjustDelegate>

- (void)adjustFinishedTrackingWithResponse:(AIResponseData *)responseData;

+ (void)loadBridge:(NSObject<UIWebViewDelegate> *) webViewDelegate
webView:(UIWebView *) webView;

@end
55 changes: 55 additions & 0 deletions AdjustBridge/AdjustBridge.js.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
window.AdjustBridge = (function () {

var bridge = {};

var adjustPrefix = 'adjust_';

function setBridgePrivate(bridgeParam) {
bridge = bridgeParam;
bridge.init(function(message, callback) { });
}

function trackEventPrivate (eventToken, parameters) {
bridge.callHandler(adjustPrefix + 'trackEvent',
{'eventToken': eventToken, 'parameters': parameters},
function(response) {})
};

function trackRevenuePrivate (amountInCents, eventToken, parameters) {
bridge.callHandler(adjustPrefix + 'trackRevenue',
{'amountInCents': amountInCents, 'eventToken': eventToken, 'parameters': parameters},
function(response) {})
};

function setResponseDelegatePrivate(responseDelegate) {
bridge.callHandler(adjustPrefix + 'setResponseDelegate', {}, function(response) {});

bridge.registerHandler('responseDelegate', function(data, responseCallback) {
responseDelegate(data)
});
};

function setEnabledPrivate(enabled) {
bridge.callHandler(adjustPrefix + 'setEnabled', {'enabled': enabled}, function(response) { });
};

function isEnabledPrivate(isEnabledReturnCallBack) {
bridge.callHandler(adjustPrefix + 'isEnabled', {}, function(isEnabledString) {
isEnabledReturnCallBack(isEnabledString)
});
};

function openUrlPrivate(url) {
bridge.callHandler(adjustPrefix + 'openUrl', {'url': url}, function(response) { });
};

return {
setBridge: setBridgePrivate,
trackEvent: trackEventPrivate,
trackRevenue: trackRevenuePrivate,
setResponseDelegate: setResponseDelegatePrivate,
setEnabled: setEnabledPrivate,
isEnabled: isEnabledPrivate,
openUrl: openUrlPrivate
};
})();
104 changes: 104 additions & 0 deletions AdjustBridge/AdjustBridge.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
//
// AdjustBridge.m
// Adjust
//
// Created by Pedro Filipe on 19/05/14.
// Copyright (c) 2014 adjust. All rights reserved.
//

#import "AdjustBridge.h"
#import "WebViewJavascriptBridge.h"

static NSString * const kAdjustJsPrefix = @"adjust_";

static WebViewJavascriptBridge* _AdjustBridge = nil;
static id<AdjustDelegate> adjustBridgeInstance = nil;

@implementation AdjustBridge

- (id) init {
self = [super init];
return self;
}

+ (void) loadBridge:(NSObject<UIWebViewDelegate> *) webViewDelegate
webView:(UIWebView *) webView {
if (_AdjustBridge) { return; }

_AdjustBridge = [WebViewJavascriptBridge bridgeForWebView:webView webViewDelegate:webViewDelegate handler:^(id data, WVJBResponseCallback responseCallback) {
}];

[_AdjustBridge registerHandler:[NSString stringWithFormat:@"%@trackEvent", kAdjustJsPrefix] handler:^(id data, WVJBResponseCallback responseCallback) {

NSString* eventToken = [data objectForKey:@"eventToken"];
NSDictionary* parameters = [data objectForKey:@"parameters"];

if (parameters != nil) {
[Adjust trackEvent:eventToken withParameters:parameters];
} else {
[Adjust trackEvent:eventToken];
}
}];

[_AdjustBridge registerHandler:[NSString stringWithFormat:@"%@trackRevenue", kAdjustJsPrefix] handler:^(id data, WVJBResponseCallback responseCallback) {

NSString* eventToken = [data objectForKey:@"eventToken"];
NSDictionary* parameters = [data objectForKey:@"parameters"];
double amountInCents = [[data objectForKey:@"amountInCents"] doubleValue];

if (parameters != nil) {
[Adjust trackRevenue:amountInCents forEvent:eventToken withParameters:parameters];
} else if (eventToken != nil) {
[Adjust trackRevenue:amountInCents forEvent:eventToken];
} else {
[Adjust trackRevenue:amountInCents];
}
}];

[_AdjustBridge registerHandler:[NSString stringWithFormat:@"%@setResponseDelegate", kAdjustJsPrefix] handler:^(id data, WVJBResponseCallback responseCallback) {

adjustBridgeInstance = [[AdjustBridge alloc] init];
[Adjust setDelegate:adjustBridgeInstance];
}];

[_AdjustBridge registerHandler:[NSString stringWithFormat:@"%@setEnabled", kAdjustJsPrefix] handler:^(id data, WVJBResponseCallback responseCallback) {

BOOL enabled = [[data objectForKey:@"enabled"] boolValue];
[Adjust setEnabled:enabled];
}];

[_AdjustBridge registerHandler:[NSString stringWithFormat:@"%@isEnabled", kAdjustJsPrefix] handler:^(id data, WVJBResponseCallback responseCallback) {

BOOL isEnabled = [Adjust isEnabled];

responseCallback([NSNumber numberWithBool:isEnabled]);
}];

[_AdjustBridge registerHandler:[NSString stringWithFormat:@"%@openUrl", kAdjustJsPrefix] handler:^(id data, WVJBResponseCallback responseCallback) {

NSURL* url = [[NSURL alloc] initWithString:[data objectForKey:@"url"]];
[Adjust appWillOpenUrl:url];
}];

if (![[webView stringByEvaluatingJavaScriptFromString:@"typeof AdjustBridge == 'object'"] isEqualToString:@"true"]) {
NSBundle *bundle = [NSBundle mainBundle];
NSString *filePath = [bundle pathForResource:@"AdjustBridge.js" ofType:@"txt"];
NSString *js = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[webView stringByEvaluatingJavaScriptFromString:js];
}

[Adjust setSdkPrefix:@"bridge"];
}

- (void)adjustFinishedTrackingWithResponse:(AIResponseData *)responseData {
NSMutableDictionary* dicResponseData = (NSMutableDictionary*) [responseData dictionary];

[dicResponseData removeObjectForKey:@"success"];
[dicResponseData setObject:[NSNumber numberWithBool:responseData.success] forKey:@"success"];

[dicResponseData removeObjectForKey:@"willRetry"];
[dicResponseData setObject:[NSNumber numberWithBool:responseData.willRetry] forKey:@"willRetry"];

[_AdjustBridge callHandler:@"responseDelegate" data:dicResponseData responseCallback:^(id response) {}];
}
@end
44 changes: 44 additions & 0 deletions AdjustBridge/WebViewJavascriptBridge/WebViewJavascriptBridge.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// WebViewJavascriptBridge.h
// ExampleApp-iOS
//
// Created by Marcus Westin on 6/14/13.
// Copyright (c) 2013 Marcus Westin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#define kCustomProtocolScheme @"wvjbscheme"
#define kQueueHasMessage @"__WVJB_QUEUE_MESSAGE__"

#if defined __MAC_OS_X_VERSION_MAX_ALLOWED
#import <WebKit/WebKit.h>
#define WVJB_PLATFORM_OSX
#define WVJB_WEBVIEW_TYPE WebView
#define WVJB_WEBVIEW_DELEGATE_TYPE NSObject
#elif defined __IPHONE_OS_VERSION_MAX_ALLOWED
#define WVJB_PLATFORM_IOS
#define WVJB_WEBVIEW_TYPE UIWebView
#define WVJB_WEBVIEW_DELEGATE_TYPE NSObject<UIWebViewDelegate>
#endif

typedef void (^WVJBResponseCallback)(id responseData);
typedef void (^WVJBHandler)(id data, WVJBResponseCallback responseCallback);

@interface WebViewJavascriptBridge : WVJB_WEBVIEW_DELEGATE_TYPE

+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView handler:(WVJBHandler)handler;
+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)handler;
+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView webViewDelegate:(WVJB_WEBVIEW_DELEGATE_TYPE*)webViewDelegate handler:(WVJBHandler)handler resourceBundle:(NSBundle*)bundle;
+ (void)enableLogging;

- (void)send:(id)message;
- (void)send:(id)message responseCallback:(WVJBResponseCallback)responseCallback;
- (void)registerHandler:(NSString*)handlerName handler:(WVJBHandler)handler;
- (void)callHandler:(NSString*)handlerName;
- (void)callHandler:(NSString*)handlerName data:(id)data;
- (void)callHandler:(NSString*)handlerName data:(id)data responseCallback:(WVJBResponseCallback)responseCallback;
- (void)reset;

@end
Loading

0 comments on commit c3da2ec

Please sign in to comment.