From d09053e765b6988342d9420b094280d5629d8ee8 Mon Sep 17 00:00:00 2001 From: Davit Ohanyan Date: Fri, 16 Oct 2015 15:12:24 +0200 Subject: [PATCH 1/6] Adds trademobs plugin --- doc/trademob_plugin.md | 78 ++++++++++++++++ plugin/Trademob/ADJTrademob.h | 43 +++++++++ plugin/Trademob/ADJTrademob.m | 162 ++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+) create mode 100644 doc/trademob_plugin.md create mode 100644 plugin/Trademob/ADJTrademob.h create mode 100644 plugin/Trademob/ADJTrademob.m diff --git a/doc/trademob_plugin.md b/doc/trademob_plugin.md new file mode 100644 index 000000000..7c4059df3 --- /dev/null +++ b/doc/trademob_plugin.md @@ -0,0 +1,78 @@ +## Trademob plugin + +Integrate adjust with Trademob events by following these steps: + +1. Locate the `plugin/Trademob` folder inside the downloaded archive from our [releases page](https://github.com/adjust/ios_sdk/releases). + +2. Drag the `ADJTrademob.h` and `ADJTrademob.m` files into the `Adjust` folder inside your project. + +3. In the dialog `Choose options for adding these files` make sure to check the checkbox +to `Copy items if needed` and select the radio button to `Create groups`. + +You can now use Trademob events in the following ways: + +### View Listing + +```objc +#import "ADJTrademob.h" + +ADJEvent *event = [ADJEvent eventWithEventToken:@"{viewListingEventToken}"]; + +NSArray *itemIds = @[@"itemId1", @"itemId2", @"itemId3"]; + +NSDictionary *metaData = @{@"info1":@"value1", @"info2":@"value2"}; + +[ADJTrademob injectViewListingIntoEvent:event itemIds:itemIds metadata:metadata]; + +[Adjust trackEvent:event]; +``` + +### View Item + +```objc +#import "ADJTrademob.h" + +ADJEvent *event = [ADJEvent eventWithEventToken:@"{viewItemEventToken}"]; + +NSDictionary *metadata = @{@"info1":@"value1", @"info2":@"value2"}; + +[ADJTrademob injectViewItemIntoEvent:event itemId:@"itemId" metadata:metadata]; + +[Adjust trackEvent:event]; +``` + +### Add to Basket + +```objc +#import "ADJTrademob.h" + +ADJEvent *event = [ADJEvent eventWithEventToken:@"{addToBasketEventToken}"]; + +ADJTrademobItem *item1 = [[ADJTrademobItem alloc] initWithId:@"itemId1" price:120.4 quantity:1]; +ADJTrademobItem *item2 = [[ADJTrademobItem alloc] initWithId:@"itemId2" price:20.1 quantity:4]; + +NSArray *items = @[item1, item2]; + +[ADJTrademob injectAddToBusketIntoEvent:event items:items metadata:nil]; + +[Adjust trackEvent:event]; +``` + +### Checkout + +```objc +#import "ADJTrademob.h" + +ADJEvent *event = [ADJEvent eventWithEventToken:@"{checkoutEventToken}"]; + +ADJTrademobItem *item1 = [[ADJTrademobItem alloc] initWithId:@"itemId1" price:120.4 quantity:1]; +ADJTrademobItem *item2 = [[ADJTrademobItem alloc] initWithId:@"itemId2" price:20.1 quantity:4]; + +NSArray *items = @[item1, item2]; + +NSDictionary *metadata = @{@"info1":@"value1", @"info2":@"value2"}; + +[ADJTrademob injectCheckoutIntoEvent:event items:items metadata:metadata]; + +[Adjust trackEvent:event]; +``` diff --git a/plugin/Trademob/ADJTrademob.h b/plugin/Trademob/ADJTrademob.h new file mode 100644 index 000000000..535d6bb0f --- /dev/null +++ b/plugin/Trademob/ADJTrademob.h @@ -0,0 +1,43 @@ + // +// ADJTrademob.h +// Adjust +// +// Created by Davit Ohanyan on 9/14/15. +// Copyright © 2015 adjust GmbH. All rights reserved. +// + +#import +#import "ADJEvent.h" + +@interface ADJTrademobItem : NSObject + +@property (nonatomic, assign) float price; +@property (nonatomic, assign) NSUInteger quantity; +@property (nonatomic, copy) NSString *itemId; + +- (instancetype) initWithId:(NSString *)itemId + price:(float)price + quantity:(NSUInteger)quantity; + +@end + +@interface ADJTrademob : NSObject + ++ (void)injectViewListingIntoEvent:(ADJEvent *)event + itemIds:(NSArray *)itemIds + metadata:(NSDictionary *)metadata; + ++ (void)injectViewItemIntoEvent:(ADJEvent *)event + itemId:(NSString *)itemId + metadata:(NSDictionary *)metadata; + + ++ (void)injectAddToBasketIntoEvent:(ADJEvent *)event + items:(NSArray *)items + metadata:(NSDictionary *)metadata; + ++ (void)injectCheckoutIntoEvent:(ADJEvent *)event + items:(NSArray *)items + metadata:(NSDictionary *)metadata; + +@end diff --git a/plugin/Trademob/ADJTrademob.m b/plugin/Trademob/ADJTrademob.m new file mode 100644 index 000000000..a077bb67c --- /dev/null +++ b/plugin/Trademob/ADJTrademob.m @@ -0,0 +1,162 @@ +// +// ADJTrademob.m +// Adjust +// +// Created by Davit Ohanyan on 9/14/15. +// Copyright © 2015 Trademob GmbH. All rights reserved. +// + +#import "ADJTrademob.h" +#import "ADJAdjustFactory.h" + +static const NSUInteger MAX_LISTING_ITEMS_COUNT = 5; + + +@implementation ADJTrademobItem + +- (instancetype) initWithId:(NSString *)itemId + price:(float)price + quantity:(NSUInteger)quantity { + + self = [super init]; + + if (self) { + self.itemId = itemId; + self.price = price; + self.quantity = quantity; + } + + return self; +} + ++ (NSDictionary *)dictionaryFromItem: (ADJTrademobItem *)item { + return @{@"itemId": item.itemId, @"price": + [NSNumber numberWithFloat:item.price], + @"quantity":[NSNumber numberWithUnsignedInteger:item.quantity]}; +} + +@end + +@implementation ADJTrademob + + ++ (void)injectViewListingIntoEvent:(ADJEvent *)event + itemIds:(NSArray *)itemIds + metadata:(NSDictionary *)metadata { + [event addPartnerParameter:@"tm_item" value:[ADJTrademob stringifyItemIds:itemIds]]; + [event addPartnerParameter:@"tm_md" value:[ADJTrademob stringifyMetadata:metadata]]; +} + ++ (void)injectViewItemIntoEvent:(ADJEvent *)event + itemId:(NSString *)itemId + metadata:(NSDictionary *)metadata { + [event addPartnerParameter:@"tm_item" value:itemId]; + [event addPartnerParameter:@"tm_md" value:[ADJTrademob stringifyMetadata:metadata]]; +} + ++ (void)injectAddToBasketIntoEvent:(ADJEvent *)event + items:(NSArray *)items + metadata:(NSDictionary *)metadata { + [event addPartnerParameter:@"tm_item" value:[ADJTrademob stringifyItems:items]]; + [event addPartnerParameter:@"tm_md" value:[ADJTrademob stringifyMetadata:metadata]]; +} + ++ (void)injectCheckoutIntoEvent:(ADJEvent *)event + items:(NSArray *)items + metadata:(NSDictionary *)metadata { + [event addPartnerParameter:@"tm_item" value:[ADJTrademob stringifyItems:items]]; + [event addPartnerParameter:@"tm_md" value:[ADJTrademob stringifyMetadata:metadata]]; +} + + +# pragma private helper functions + + ++ (NSString *)stringifyItemIds:(NSArray *)itemIds { + + NSUInteger length = [itemIds count]; + + NSMutableArray *filteredArray = [NSMutableArray array]; + + for (NSUInteger index = 0; index < length; ++index) { + if (index >= MAX_LISTING_ITEMS_COUNT) { + break; + } + + NSObject *currentId = itemIds[index]; + if ([currentId isKindOfClass:[NSString class]] && ![(NSString *)currentId isEqualToString:@""]) { + [filteredArray addObject:currentId]; + } + } + + NSString* tmItemIds = [ADJTrademob stringify:filteredArray]; + + if (nil == tmItemIds) { + tmItemIds = @"[]"; + } + + return [tmItemIds stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; +} + ++ (NSString *)stringifyItems:(NSArray *)items { + NSUInteger length = [items count]; + + NSMutableArray *filteredItems = [NSMutableArray array]; + + for (NSUInteger index = 0; index < length; ++index) { + + if (index >= MAX_LISTING_ITEMS_COUNT) { + break; + } + ADJTrademobItem* currentItem = items[index]; + if ([currentItem isKindOfClass:[ADJTrademobItem class]]) { + NSDictionary* dict = [ADJTrademobItem dictionaryFromItem:currentItem]; + [filteredItems addObject:dict]; + } + } + + NSString *tmItemIds = [ADJTrademob stringify:filteredItems]; + + if (nil == tmItemIds) { + tmItemIds = @"[]"; + } + + return [tmItemIds stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; +} + ++ (NSString *)stringifyMetadata: (NSDictionary *)metadata { + NSMutableDictionary *filteredData = [NSMutableDictionary dictionary]; + + [metadata enumerateKeysAndObjectsUsingBlock: + ^(NSString *key, id value, BOOL* stop){ + if ([value isKindOfClass:[NSString class]]) { + filteredData[key] = value; + } + }]; + + NSString *jsonMetaData = [ADJTrademob stringify:filteredData]; + + if (nil == jsonMetaData) { + jsonMetaData = @"{}"; + } + + return [jsonMetaData stringByReplacingOccurrencesOfString:@"\\/" withString:@"/"]; +} + ++ (NSString *)stringify:(NSObject *)object { + if ( nil == object ) { + return nil; + } + + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error]; + + if ( !jsonData || error ) { + [ADJAdjustFactory.logger error:@"%@", [error debugDescription]]; + return nil; + } else{ + return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } +} + +@end From 8c997cc6ef2f11964df07a753292fa1e0645a6f7 Mon Sep 17 00:00:00 2001 From: Davit Ohanyan Date: Mon, 19 Oct 2015 16:55:20 +0200 Subject: [PATCH 2/6] Changes function name --- doc/trademob_plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/trademob_plugin.md b/doc/trademob_plugin.md index 7c4059df3..7c9e1f70c 100644 --- a/doc/trademob_plugin.md +++ b/doc/trademob_plugin.md @@ -53,7 +53,7 @@ ADJTrademobItem *item2 = [[ADJTrademobItem alloc] initWithId:@"itemId2" price:20 NSArray *items = @[item1, item2]; -[ADJTrademob injectAddToBusketIntoEvent:event items:items metadata:nil]; +[ADJTrademob injectAddToBasketIntoEvent:event items:items metadata:nil]; [Adjust trackEvent:event]; ``` From 85415f9ff5af6d5e7cba2b34449a938089be9427 Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 13 Nov 2015 14:03:43 +0100 Subject: [PATCH 3/6] Change var in doc --- doc/trademob_plugin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/trademob_plugin.md b/doc/trademob_plugin.md index 7c9e1f70c..c21eada0b 100644 --- a/doc/trademob_plugin.md +++ b/doc/trademob_plugin.md @@ -20,7 +20,7 @@ ADJEvent *event = [ADJEvent eventWithEventToken:@"{viewListingEventToken}"]; NSArray *itemIds = @[@"itemId1", @"itemId2", @"itemId3"]; -NSDictionary *metaData = @{@"info1":@"value1", @"info2":@"value2"}; +NSDictionary *metadata = @{@"info1":@"value1", @"info2":@"value2"}; [ADJTrademob injectViewListingIntoEvent:event itemIds:itemIds metadata:metadata]; From f264bf8faf878c0126d54ba0f3d4d95d12f7e680 Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 13 Nov 2015 14:05:35 +0100 Subject: [PATCH 4/6] New version v4.4.3 --- Adjust.podspec | 4 ++-- Adjust/ADJUtil.m | 2 +- AdjustTests/ADJPackageFields.m | 2 +- README.md | 2 +- VERSION | 2 +- doc/migrate.md | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Adjust.podspec b/Adjust.podspec index a485d938d..e8e6c8662 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -1,11 +1,11 @@ Pod::Spec.new do |s| s.name = "Adjust" - s.version = "4.4.2" + s.version = "4.4.3" s.summary = "This is the iOS SDK of adjust. You can read more about it at http://adjust.com." s.homepage = "http://adjust.com" s.license = { :type => 'MIT', :file => 'MIT-LICENSE' } s.author = { "Christian Wellenbrock" => "welle@adjust.com" } - s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.4.2" } + s.source = { :git => "https://github.com/adjust/ios_sdk.git", :tag => "v4.4.3" } s.ios.deployment_target = '5.0' s.tvos.deployment_target = '9.0' s.framework = 'SystemConfiguration' diff --git a/Adjust/ADJUtil.m b/Adjust/ADJUtil.m index 248e3d08b..623f475d4 100644 --- a/Adjust/ADJUtil.m +++ b/Adjust/ADJUtil.m @@ -16,7 +16,7 @@ #include static NSString * const kBaseUrl = @"https://app.adjust.com"; -static NSString * const kClientSdk = @"ios4.4.2"; +static NSString * const kClientSdk = @"ios4.4.3"; static NSString * const kDateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'Z"; static NSDateFormatter *dateFormat; diff --git a/AdjustTests/ADJPackageFields.m b/AdjustTests/ADJPackageFields.m index dd7ffb6e6..0a93a83de 100644 --- a/AdjustTests/ADJPackageFields.m +++ b/AdjustTests/ADJPackageFields.m @@ -16,7 +16,7 @@ - (id) init { // default values self.appToken = @"123456789012"; - self.clientSdk = @"ios4.4.2"; + self.clientSdk = @"ios4.4.3"; self.suffix = @""; self.environment = @"sandbox"; diff --git a/README.md b/README.md index 2573996c9..a6586c9cf 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ If you're using [CocoaPods][cocoapods] for `iOs` or `tvOS`, you can add the foll `Podfile` and continue with [step 4](#step4): ```ruby -pod 'Adjust', :git => 'git://github.com/adjust/ios_sdk.git', :tag => 'v4.4.2' +pod 'Adjust', :git => 'git://github.com/adjust/ios_sdk.git', :tag => 'v4.4.3' ``` ### 1. Get the SDK diff --git a/VERSION b/VERSION index 1d068c6ec..9e3a93350 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.4.2 +4.4.3 diff --git a/doc/migrate.md b/doc/migrate.md index ad50ddf8a..ffca7b9d5 100644 --- a/doc/migrate.md +++ b/doc/migrate.md @@ -1,4 +1,4 @@ -## Migrate your adjust SDK for iOS to v4.4.2 from v3.4.0 +## Migrate your adjust SDK for iOS to v4.4.3 from v3.4.0 ### Initial setup From 83944ba8210dc24418d955cb39057c19236c127b Mon Sep 17 00:00:00 2001 From: Pedro Date: Fri, 13 Nov 2015 14:07:48 +0100 Subject: [PATCH 5/6] Add trademob to plugin --- Adjust.podspec | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Adjust.podspec b/Adjust.podspec index e8e6c8662..8fb5c9c03 100644 --- a/Adjust.podspec +++ b/Adjust.podspec @@ -27,4 +27,9 @@ Pod::Spec.new do |s| cr.source_files = 'plugin/Criteo/*.{h,m}' cr.dependency 'Adjust/Core' end + + s.subspec 'Trademob' do |tm| + tm.source_files = 'plugin/Trademob/*.{h,m}' + tm.dependency 'Adjust/Core' + end end From 1c0690266e99d105da81ff694993a2496043df74 Mon Sep 17 00:00:00 2001 From: Pedro Filipe Date: Mon, 16 Nov 2015 11:15:35 +0100 Subject: [PATCH 6/6] Add trademob contact --- doc/trademob_plugin.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/trademob_plugin.md b/doc/trademob_plugin.md index c21eada0b..6905ff5b4 100644 --- a/doc/trademob_plugin.md +++ b/doc/trademob_plugin.md @@ -9,6 +9,8 @@ Integrate adjust with Trademob events by following these steps: 3. In the dialog `Choose options for adding these files` make sure to check the checkbox to `Copy items if needed` and select the radio button to `Create groups`. +For questions regarding this plugin, please reach out to `eugenio.warglien@trademob.com` + You can now use Trademob events in the following ways: ### View Listing