This article will give step-by-step instructions on how to add software licensing (specifically, hardware-locked or node-locked licensing) to your Adobe AIR app. There's also a full example app that you can download and play with without needing to add licensing to your app.
By the end of this article you'll have working licensing integrated with your application, and thus the ability to sell individual copies of your software.
Before you can do anything, you need to login to your LimeLM account (or sign up). Then download TurboActivate for Windows, macOS (Mac OS X), or Linux. It contains the native library and source code examples needed to integrate hardware-locked licensing in your app:
We're going to walk you through each step you need to take in adding licensing, online activation, and timed-trials to your Adobe AIR app. There are lots of ways you can add licensing to your app, but there are 2 popular styles:
The first method (the separate versions method) is possible with TurboActivate, but we're not going to talk about it here because it's not very user friendly. Instead we'll talk about making your app a hybrid Full/Trial app. That is, your users will be able to use your app in "trial mode" until either the trial expires or they purchase a product key and use it to activate your app.
If you haven't already signed up for LimeLM then sign up now. All plans have a 30-day free trial. Or, if you're just putting your toes in the water, there's even a free plan that has no time limit and doesn't require a credit card.
After you've created your account download TurboActivate for Windows, Mac OS X, or Linux (or all 3 if you'll be releasing your app for all platforms). Once downloaded, extract them anywhere. Inside you'll find an "API" folder which contains a full Adobe AIR example.
Adding TurboActivate to your product involves a few steps.
Copy the "TurboActivate.as" and "TurboActivateEvent.as" files from the "API/Adobe AIR/src" folder you extracted earlier. You can copy these files to your app's "src" folder.
Now you need to copy the folder that inside the extracted "API/Adobe AIR/bin-debug" folder. That is, for the Windows version of TurboActivate you copy the "Windows" folder from inside the example project's "bin-debug" folder to your own "bin-debug" folder. For Mac OS X, copy the "Mac" folder, and for Linux copy the "Linux" folder.
Inside the folder you copied is a "systa" (or "systa.exe") file and a text file.
Now you need to copy the TurboActivate library into the "Windows", "Mac", or "Linux" folder you just copied.
If you haven't already created a new product in LimeLM, do it now. You can change any value later, so don't worry about making a mistake.
Go to your version page in LimeLM. Download the "TurboActivate.dat" file. Now copy this file to the "Windows", "Mac", or "Linux" folders you just copied moments ago. For instance, if you're programming on Windows, your "Windows" folder inside your "bin-debug" folder will contain:
Since TurboActivate runs natively on the operating system, you need to make a small change to your AIR app's "Application Descriptor File" (e.g. ProductName-app.xml). Add the following line anywhere inside the <application> block:
<supportedProfiles>extendedDesktop</supportedProfiles>
The first order of business is to add an "init()" function to your "WindowedApplication". First add an "applicationComplete" event handler:
<mx:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:mx="library://ns.adobe.com/flex/mx" applicationComplete="init()" ...
Then add the "init()" function to the script part of your *.mxml file:
<fx:Script>
<![CDATA
public function init():void
{
}
]]>
</fx:Script>
Now we can add a TurboActivate class to your code. This is the class that gives your app full control over all licensing, activation, and timed trial functions:
private var ta:TurboActivate = new TurboActivate("Paste GUID Here");
public function init():void
{
}
Replace the "Paste GUID Here" string with the Version GUID string your copied from your version page.
Before you continue, run your app. Your app should run just as it had before (because you haven't added the licensing code yet). If you get an error, read the error message carefully and fix it. Common errors include forgetting to add the "Windows", "Mac", or "Linux" folder to your "bin-debug" folder, or forgetting to add the <supportedProfiles>
element to your application descriptor file.
Now that you've included all the needed TurboActivate files with your app, you can start using the licensing. The code example will follow the example app included in the "API/Adobe AIR" folder you extracted earlier:
The example AIR app demonstrates using activation, deactivation, timed-trials, and trial extensions. Now I'll explain in detail how to use these TurboActivate functions.
The first thing you'll need to add to your app is event handlers for 3 functions. Add the event handler in the "init()" function you created earlier:
public function init():void
{
// these are TurboActivate event handlers that will be used at
// both the start of your program and throughout the use of your program
ta.addEventListener(TurboActivateEvent.IS_GENUINE_EX, onIsGenuineEx);
ta.addEventListener(TurboActivateEvent.USE_TRIAL, onUseTrial);
ta.addEventListener(TurboActivateEvent.TRIAL_DAYS_REMAINING, onTrialDaysRemaining);
}
private function onIsGenuineEx(evt:TurboActivateEvent):void
{
}
private function onUseTrial(evt:TurboActivateEvent):void
{
}
private function onTrialDaysRemaining(evt:TurboActivateEvent):void
{
}
Before I continue let me explain how functions are processed by TurboActivate. Due to the way Adobe AIR is designed function calls to TurboActivate are asynchronous to the response. That is, instead of getting the returned response immediately, instead an event is called a few milliseconds after you make a call.
Let's take the "IsGenuineEx()" function as an example. When you call "ta.IsGenuineEx(...)" the event listener for "TurboActivateEvent.IS_GENUINE_EX" is called. So, if you declare the event listener "onIsGenuineEx" like the code above, the function would be written like this:
public function init():void
{
...
ta.addEventListener(TurboActivateEvent.IS_GENUINE_EX, onIsGenuineEx);
...
// Check if we're activated, and every 90 days verify it with
// the activation servers. In this example we won't show an
// error if the activation was done offline
// (see the 3rd parameter of the IsGenuine() function)
ta.IsGenuineEx(90, 14, true);
}
private function onIsGenuineEx(evt:TurboActivateEvent):void
{
if (evt.ErrorObj == null)
{
isActivated = evt.uintResponse == TurboActivate.IGRet_Genuine ||
evt.uintResponse == TurboActivate.IGRet_GenuineFeaturesChanged ||
// an internet error means the user is activated but
// TurboActivate failed to contact the LimeLM servers
evt.uintResponse == TurboActivate.IGRet_InternetError;
if (evt.uintResponse == TurboActivate.IGRet_InternetError)
{
//TODO: give the user the option to retry the genuine checking
// immediately. For example a dialog box. In the dialog
// call IsGenuine() to retry immediately.
}
if (isActivated)
{
// is activated, reenable any features
EndLicensingCheck();
}
else
{
// not activated, disable any app features
ta.UseTrial();
}
}
else
{
// the function call failed, disable any features
isActivated = false;
EndLicensingCheck();
// in a real world app don't throw exceptions.
// This is for debugging only
throw evt.ErrorObj;
}
}
I encourage you to look at the example project in the "API/Adobe AIR" folder. Change the "VersionGUID" to your VersionGUID and run the app. Play with the buttons so you understand how you can use licensing and timed trials in your app. You can take the "TrialExtension" and "PKey" windows and include them with your app if you wish:
After you've added the licensing to your app, and you're ready to release your app to your user, you need to build your native installer. I'm going to show you how to do this using Adobe Flash Builder on Windows and Mac OS X. If you want to build a native installer on Linux (.deb or .rpm), or you're more comfortable using the AIR Developer Tool (ADT) then see the article "Packaging a desktop native installer".
In "Step 2" you added the "Windows" or "Mac" folders to your "bin-debug" folder. Now you can copy this folder ("Windows" or "Mac") to your "src" folder.
Now you're ready to build the native installer for Mac OS X and/or Windows. First, click the "Project -> Export Release Build..." menu in Adobe Flash Builder:
Click the "Export native installer" radio button. This will allow you to export a .dmg file on Mac, and an .exe on Windows:
After clicking the next button you'll be asked to sign your AIR application. Either using an existing certificate or click the "Create..." button to create a new one:
After clicking the next button you'll come to a page where you verify what files will be included in the native installer. In Windows make sure the "Windows" folder along with the "TurboActivate.dll", "TurboActivate.dat", and the "systa.exe" files are checked:
Similarly, in Mac OS X make sure the "Mac" folder along with the "libTurboActivate.dylib", "TurboActivate.dat", and the "systa" files are checked:
Then click "Finish" to make the installer.
Note: If you didn't see the "Windows" folder or "Mac" folder (depending on your platform), make sure you copied that folder into the "src" folder from the "bin-debug" folder.
If you get the exception "The NativeProcess could not be started." when you run your Adobe AIR app on either Linux or Mac OS X the most common cause is that the "systa" file does not have executable permission. You can verify this by opening a terminal and navigating to the folder that contains the "sysa" file, "TurboActivate.dat" file, and the "libTurboActivate.dylib" or "libTurboActivate.so" file depending on whether you're on Mac or Linux:
cd /path/to/your/app
Then type "ls -l
" in terminal and press enter. You'll see a list of permissions for every file in the directory:
... -rwxr-xr-x 1 wyatt staff 26396 Mar 21 02:18 systa ...
The "systa" file should have 3 "x" (executable) permissions. If it does not then you should type "chmod a+x systa
" in terminal and press enter. Then type "ls -l
" in terminal and press enter to confirm the "systa" file now has executable permission. Now when you run your app and build your native installer everything will work.