Documentation

Support

Manual Integration

Integrate Tapjoy Offerwall into your iOS app by manually adding the SDK and configuring your project to enable Offerwall features.
Read time 4 minutesLast updated 3 hours ago

Download SDK

The first step in integrating with your app is to download the iOS SDK itself.

Add the SDK to Your Project

After unzipping the SDK, you find docs, libraries and the TapjoyEasyApp. The “TapjoyEasyApp” is a sample project that demonstrates the Tapjoy integration. You do not need it for integrating Tapjoy into your own application but it is a useful reference. To add the files to your project, choose ‘File’ and ‘Add files to Project’. Navigate to the "Libraries" folder and select the
Tapjoy.xcframework
. Make sure to select ‘copy items if needed’ in the dialog and then click ‘Add’.
Then, navigate to
Other Linker Flags (OTHER_LDFLAGS)
in your build settings and add the
-ObjC
flag.

Add Required Frameworks

The next step is to add the required frameworks to your project. To do this, click on your project icon in the Project Navigator, then select "Build Phases", expand "Link Binary With Libraries", and click the "+" symbol in the lower left of the section. Frameworks are listed alphabetically and you can hold the CMD key to select multiple frameworks, allowing you to add them in one step. Add all of the following frameworks to your project:
  • AdSupport
  • CFNetwork
  • CoreTelephony
  • StoreKit
  • SystemConfiguration
  • UIKit
  • WebKit
  • libc++
  • libz

Request App Tracking Transparency authorization

If your application is designed to use App Tracking Transparency, to display the dialog to request permission for accessing the IDFA, update your Info.plist by including the
NSUserTrackingUsageDescription
key along with a custom message to describe this permission to use IDFA in your application.
For example:
<key>NSUserTrackingUsageDescription</key>
<string>This allows us to deliver personalized ads for you.</string>
Information property list that includes the NSUserTrackingUsageDescription key
The usage description text will then appear as part of the App Tracking Transparency permission dialog, as shown in the screenshot below:
iOS App Tracking Transparency permission dialog
Add the
AppTrackingTransparency
framework to your project, and then call
requestTrackingAuthorizationWithCompletionHandler:
to display the authorization prompt. As a best practice, we recommend that you wait for the
requestTrackingAuthorization
completion handler before connecting to Tapjoy so that we can be assured we are using the expected IDFA value in all requests.
#import <AppTrackingTransparency/AppTrackingTransparency.h>
...
- (void)fetchTrackingAuthorization {
  [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    // Call the Offerwall connect function here.
  }];
}
import AppTrackingTransparency
...
func fetchTrackingAuthorization() {
  ATTrackingManager.requestTrackingAuthorization(completionHandler: { status in
    // Call the Offerwall connect function here.
  })
}

Connect to Tapjoy

The next step is to add the Tapjoy connect code to your application. This key bit of code "turns on" the Offerwall SDK in your application. To implement the Tapjoy connect call, you will need your Offerwall SDK Key for the application you are integrating. To find this, navigate to your application in the Tapjoy dashboard, and click the "Settings" button on the top navigation bar. Navigate to "App Settings" and you will find the SDK Key at the bottom of the page. Now, place the following snippet of code into the
application:didFinishLaunchingWithOptions
method in your application’s app delegate file:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectSuccess:) name:TJC_CONNECT_SUCCESS object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectFail:) name:TJC_CONNECT_FAILED object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tjcConnectWarning:) name:TJC_CONNECT_WARNING object:nil];

    //Turn on Tapjoy debug mode
    [Tapjoy setLoggingLevel:TJLoggerLevelDebug]; //Only enable debug mode for development. Disable it before publishing your app.

    //If you are using Self-Managed currency, you need to set a user ID using the connect flags.
    NSDictionary *connectFlags = @{TJC_OPTION_USER_ID : @"<USER_ID_HERE>"};
    [Tapjoy connect:@"SDK_KEY_GOES_HERE" options:connectFlags];
    
    //If you are not using connect flags, you can omit them
    [Tapjoy connect:@"SDK_KEY_GOES_HERE"];

    return YES;
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.tjcConnectSuccess(notif:)), name: NSNotification.Name(rawValue: TJC_CONNECT_SUCCESS), object: nil)
    
    NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.tjcConnectFail(notif:)), name: NSNotification.Name(rawValue: TJC_CONNECT_FAILED), object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(AppDelegate.tjcConnectWarning(notif:)), name: NSNotification.Name(rawValue: TJC_CONNECT_WARNING), object: nil)

    //Turn on Tapjoy debug mode
    Tapjoy.loggingLevel = .debug //Only enable debug mode for development. Disable it before publishing your app.
    
    //If you are using Self-Managed currency, you need to set a user ID using the connect flags.
    let connectFlags = [TJC_OPTION_USER_ID : "<USER_ID_HERE>"]
    Tapjoy.connect("SDK_KEY_GOES_HERE", options: connectFlags)
    
    //If you are not using connect flags, you can omit them
    Tapjoy.connect("SDK_KEY_GOES_HERE")
    
    return true
}
The method
setLoggingLevel
should be defined before the connect call. We recommend setting a user ID by using the connect flags. This allows for the AppLaunch placement to retrieve the correct user ID when called.
More information can be found in our SDK references: Objective C and C++.

Connect Notifications

To receive a notification when Tapjoy has finished connecting, connected with a warning, or failed to connect you need to implement the methods we previously set as selectors. The
connectWarning
callback will fire when there is a non-blocking issue during connect (and
connectSuccess
will also fire after). Currently this feature will only detect issues with UserId when sent in ConnectFlags.
- (void)tjcConnectSuccess:(NSNotification *)notifyObj 
{
    NSLog(@"Tapjoy connect succeeded");
}

- (void)tjcConnectFail:(NSNotification *)notifyObj 
{
    NSLog(@"Tapjoy connect failed");
}

- (void)tjcConnectWarning:(NSNotification *)notifyObj 
{
    NSError *error = notifyObj.userInfo[TJC_CONNECT_USER_INFO_ERROR];
    NSError *underlyingError = error.userInfo[NSUnderlyingErrorKey];
}
@objc func tjcConnectSuccess(notif: NSNotification) {
    NSLog("Tapjoy connect succeeded")
}

@objc func tjcConnectFail(notif: NSNotification) {
    NSLog("Tapjoy connect failed")
}

@objc func tjcConnectWarning(notif: NSNotification) {
    var message = "Tapjoy Connect Warning"
    if let error = notif.userInfo?[TJC_CONNECT_USER_INFO_ERROR] as? NSError {
        message.append("\nError: \(error.code) - \(error.localizedDescription)")
        if let underlyingError = error.userInfo[NSUnderlyingErrorKey] as? NSError {
            message.append("\nUnderlying Error: \(underlyingError.code) - \(underlyingError.localizedDescription)")
        }
    }
}
Now compile and run your application. If you have done everything correctly, output on the console log will display that looks similar to the following:
2020-01-29 16:01:55.422 Storyteller Roller[25869:1433019] [TJLog level: 4] Connect success with type:0
In the Tapjoy Dashboard, if you click on "Analytics" in the top navigation bar and then the "Real-time" tab in the navigation bar on the left, activity from your application will display soon after you run it.