đź› In order for us to provide optimal support, we would kindly ask you to submit any issues to [email protected]
*When submitting an issue please specify your AppsFlyer sign-up (account) email , your app ID , production steps, logs, code snippets and any additional relevant information.
- This Module is Built for
- Adding The Connector To Your Project
- Basic Integration Of The Connector
- Testing the implementation in Sandbox
- Full Code Examples
- StoreKit SDK v1.
- iOS version 9 and higher.
- iOS AppsFlyer SDK 6.8.0 and higher.
*IMPORTNANT NOTE: Please, be sure to check Purchase Connector and AppsFlyerFramework version compatability table and use corresponding versions to avoid unexpected behaviour *
PurchaseConnector | AppsFlyerSDK |
---|---|
6.8.0 | 6.8.0 - 6.9.2 |
6.8.1 | 6.8.0 - 6.9.2 |
6.10.0 | 6.10.0 |
6.10.1 | 6.10.1 |
6.12.2 | 6.12.2 |
6.12.3 | 6.12.2 |
Add to your Podfile and run pod install
:
// for statically linked dependency
pod 'PurchaseConnector'
// for dynamically linked dependency
pod 'PurchaseConnector/Dynamic'
// for statically linked Strict dependency (disabled IDFA collection)
pod 'PurchaseConnector/Strict'
Go to the Carthage
folder in the root of the repository. Open purchase-connector-dynamic.json
or purchase-connector-static.json
, click raw, copy and paste the URL of the file to your Cartfile
:
binary "https://raw.githubusercontent.com/AppsFlyerSDK/appsflyer-apple-purchase-connector/main/Carthage/purchase-connector-dynamic.json" == BIINARY_VERSION
binary "https://raw.githubusercontent.com/AppsFlyerSDK/AppsFlyerFramework/master/Carthage/appsflyer-ios.json" ~> 6.10.0
Then open project folder in the terminal and use command carthage update --use-xcframeworks
, then, drag and drop PurchaseConnector.xcframework binary and AppsFlyerLib.framework (from Carthage/Build/iOS folder).
More reference on Carthage binary artifacts integration here.
Please, follow standard SPM dependency manager instructions.
Note: This repository contains statically linked
PurchaseConnector.xcframework
. If you want to use dynamic .xcframework, please integrate it for SPM from this repository: https://github.com/AppsFlyerSDK/PurchaseConnector-Dynamic
Note: as PurchaseConnector has a dependency on AppsFlyerLib framework, please, make sure to integrate it as well for Carthage and SPM.
Note: before the implementation of the Purchase connector, please make sure to set up AppsFlyer
appId
anddevKey
- Swift
// Import the library
import AppsFlyerLib
import StoreKit
import PurchaseConnector
// Default SDK Implementation
AppsFlyerLib.shared().appsFlyerDevKey = "DEV_KEY"
AppsFlyerLib.shared().appleAppID = "APPLE_APP_ID"
//AppsFlyerLib.shared().isDebug = true
// Purchase connector implementation
PurchaseConnector.shared().purchaseRevenueDelegate = self
PurchaseConnector.shared().purchaseRevenueDataSource = self
- Objective-C
// Import the library
#import "AppDelegate.h"
#import <AppsFlyerLib/AppsFLyerLib.h>
#import <PurchaseConnector/PurchaseConnector.h>
// Default SDK implementation
[[AppsFlyerLib shared] setAppleAppID:@"APPLE_APP_ID"];
[[AppsFlyerLib shared] setAppsFlyerDevKey:@"DEV_KEY"];
//[[AppsFlyerLib shared] setIsDebug:YES];
// Purchase Connecor implementation
[[PurchaseConnector shared] setPurchaseRevenueDelegate:self];
[[PurchaseConnector shared] setPurchaseRevenueDataSource:self];
Enables automatic logging of In-App purchases and Auto-renewable subscriptions.
- Swift
PurchaseConnector.shared().autoLogPurchaseRevenue = [.autoRenewableSubscriptions, .inAppPurchases]
- Objective-C
[[PurchaseConnector shared] setAutoLogPurchaseRevenue:AFSDKAutoLogPurchaseRevenueOptionsRenewable | AFSDKAutoLogPurchaseRevenueOptionsInAppPurchases];
Note: if
autoLogPurchaseRevenue
has not been set, it is disabled by default. The value is an option set, so you can choose what kind of user purchases you want to observe.
- In order to receive purchase validation event callbacks, you should conform to and implement
PurchaseRevenueDelegate
(Swift) orAppsFlyerPurchaseRevenueDelegate
(Objc-C) protocol. - To be able to add your custom parameters to the purchase event, that Connector sends, please conform to and implement
PurchaseRevenueDataSource
(Swift) orAppsFlyerPurchaseRevenueDataSource
(Obj-C) protocol.
- Swift
extension AppDelegate: PurchaseRevenueDataSource, PurchaseRevenueDelegate {
// PurchaseRevenueDelegate method implementation
func didReceivePurchaseRevenueValidationInfo(_ validationInfo: [AnyHashable : Any]?, error: Error?) {
print("PurchaseRevenueDelegate: \(validationInfo)")
print("PurchaseRevenueDelegate: \(error)")
// process validationInfo here
}
// PurchaseRevenueDataSource method implementation
func purchaseRevenueAdditionalParameters(for products: Set<SKProduct>, transactions: Set<SKPaymentTransaction>?) -> [AnyHashable : Any]? {
// Add additional parameters for SKTransactions here.
return ["additionalParameters":["param1":"value1", "param2":"value2"]];
}
}
- Objective-C
@interface AppDelegate () <AppsFlyerPurchaseRevenueDelegate, AppsFlyerPurchaseRevenueDataSource>
@end
@implementation AppDelegate
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[AppsFlyerLib shared] start];
[[PurchaseConnector shared] startObservingTransactions];
}
- (void)didReceivePurchaseRevenueValidationInfo:(NSDictionary *)validationInfo error:(NSError *)error {
NSLog(@"Validation info: %@", validationInfo);
NSLog(@"Error: %@", error);
// Process validation info
}
- (NSDictionary *)purchaseRevenueAdditionalParametersForProducts:(NSSet<SKProduct *> *)products transactions:(NSSet<SKPaymentTransaction *> *)transactions {
return @{@"key1" : @"param1"};
}
@end
startObservingTransactions
should be called to start observing transactions.
Note: This should be called right after the AppsFlyer iOS SDK's start method..
- Swift
PurchaseConnector.shared().startObservingTransactions()
- Objective-C
[[PurchaseConnector shared] startObservingTransactions];
To stop observing transactions, you need to call stopObservingTransactions
.
- Swift
PurchaseConnector.shared().stopObservingTransactions()
- Objective-C
[[PurchaseConnector shared] stopObservingTransactions];
Note: if you called
stopObservingTransactions
API, you should setautoLogPurchaseRevenue
value before you callstartObservingTransactions
next time.
In order to test purchases in Xcode environment on a real device with TestFlight sandbox account, you need to set isSandbox
to true.
- Swift
PurchaseConnector.shared().isSandbox = true
- Objective-C
[[PurchaseConnector shared] setIsSandbox:YES];
*IMPORTANT NOTE: Before releasing your app to production please be sure to remove
isSandbox
or set it tofalse
. If the production purchase event will be sent in sandbox mode, your event will not be validated properly! *
import AppsFlyerLib
import StoreKit
import PurchaseConnector
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ _: UIApplication, didFinishLaunchingWithOptions _: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Default SDK Implementation
AppsFlyerLib.shared().appsFlyerDevKey = "DEV_KEY"
AppsFlyerLib.shared().appleAppID = "APLE_APP_ID"
// AppsFlyerLib.shared().isDebug = true
// Purchase Connector implementation
PurchaseConnector.shared().purchaseRevenueDelegate = self
PurchaseConnector.shared().purchaseRevenueDataSource = self
PurchaseConnector.shared().autoLogPurchaseRevenue = .autoRenewableSubscriptions
}
func applicationDidBecomeActive(_ application: UIApplication) {
AppsFlyerLib.shared().start()
PurchaseConnector.shared().startObservingTransactions()
}
}
extension AppDelegate: PurchaseRevenueDataSource, PurchaseRevenueDelegate {
// PurchaseRevenueDelegate method implementation
func didReceivePurchaseRevenueValidationInfo(_ validationInfo: [AnyHashable : Any]?, error: Error?) {
print("PurchaseRevenueDelegate: \(validationInfo)")
print("PurchaseRevenueDelegate: \(error)")
// process validationInfo here
}
// PurchaseRevenueDataSource method implementation
func purchaseRevenueAdditionalParameters(for products: Set<SKProduct>, transactions: Set<SKPaymentTransaction>?) -> [AnyHashable : Any]? {
// Add additional parameters for SKTransactions here.
return ["additionalParameters":["param1":"value1", "param2":"value2"]];
}
}
#import "AppDelegate.h"
#import <PurchaseConnector/PurchaseConnector.h>
#import <AppsFlyerLib/AppsFLyerLib.h>
@interface AppDelegate () <AppsFlyerPurchaseRevenueDelegate, AppsFlyerPurchaseRevenueDataSource>
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Set up AppsFlyerLib first
[[AppsFlyerLib shared] setAppleAppID:@"APPLE_APP_ID"];
[[AppsFlyerLib shared] setAppsFlyerDevKey:@"DEV_KEY"];
// [[AppsFlyerLib shared] setIsDebug:YES];
// Set up PurchaseConnector
[[PurchaseConnector shared] setPurchaseRevenueDelegate:self];
[[PurchaseConnector shared] setPurchaseRevenueDataSource:self];
[[PurchaseConnector shared] setAutoLogPurchaseRevenue:AFSDKAutoLogPurchaseRevenueOptionsAutoRenewableSubscriptions];
return YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[AppsFlyerLib shared] start];
[[PurchaseConnector shared] startObservingTransactions];
}
- (void)didReceivePurchaseRevenueValidationInfo:(NSDictionary *)validationInfo error:(NSError *)error {
NSLog(@"Validation info: %@", validationInfo);
NSLog(@"Error: %@", error);
// Process validation info
}
- (NSDictionary *)purchaseRevenueAdditionalParametersForProducts:(NSSet<SKProduct *> *)products transactions:(NSSet<SKPaymentTransaction *> *)transactions {
return @{@"key1" : @"param1"};
}
@end