-1015, -21XX (SDK Authentication Errors)
This document is a machine-translated draft and is currently undergoing review. Some content may be inaccurate or differ from the original Korean version. For the most precise information, refer to the Korean documentation.
Initialization method by platform
Android and iOS differ in their SDK initialization APIs and error checking approaches. Since the causes and solutions also vary by platform, confirm the target platform before beginning your investigation.
| Item | Android | iOS |
|---|---|---|
| Initialization method | setCertification(key, expireDate, isTablet) | Set storage.applicationKey / applicationBundleID / applicationExpireDate, then call start() |
| Error checking method | Check the return value of getErrorCode() (synchronous) | Exception thrown when start() is called (try/catch approach) |
| Authentication identifier | App package name (applicationId) extracted automatically | Bundle ID (CFBundleIdentifier) entered explicitly |
| Additional parameter | isTablet (value to distinguish mobile and tablet) | None |
| Device binding | Requires a separate call to setDevice(path, isTablet) | Handled internally and automatically when start() is executed |
-2103
- Error code: -2103
- Type: Constant name differs by platform
- iOS:
ERROR_INCORRECT_BUNDLE_ID - Android:
ERROR_INCORRECT_PACKAGE_NAME
- iOS:
- Summary: The authentication information (key, expiration date, Bundle ID, or package name) provided during SDK initialization does not match the issuance record
Cause
| Cause | Platform | Description |
|---|---|---|
| Bundle ID mismatch | iOS | The value set in storage.applicationBundleID in the source code differs from the actual CFBundleIdentifier value defined in the project's Info.plist. |
| Package name mismatch | Android | The package name automatically extracted by the SDK does not match the package name (applicationId) registered when the license was issued. |
| Debug/Release build mix-up | Android, iOS | Identifiers are configured differently per build configuration (Variant/Target), and license keys have been cross-copied and mixed between configurations. |
| Development/production app mix-up | Android, iOS | An app built with a development (Debug) key is run in a production environment, or conversely, a production (Release) key is tested in a development environment. |
Even if the SDK key string and expiration date are correct, a -2103 error will occur if the Android package name or iOS Bundle ID does not match the registered information.
Diagnosis (Android)
- Open the
build.gradlefile of the module where the initialization code is called and check theapplicationIdvalue. - If you are using a multi-module structure or build variants (Build Flavors/Product Flavors), check the final
applicationIdstring for the currently built variant. - Verify that the package name automatically extracted internally by the SDK exactly matches the package name registered when the license was issued.
Diagnosis (iOS)
- Check the value defined at [Target] > [General] > [Identity] > [Bundle Identifier] in the Xcode project settings.
- Verify that the string assigned to
storage.applicationBundleIDin the source code exactly matches theCFBundleIdentifiervalue in Xcode, including case.storage.applicationBundleID = "com.example.myapp" // Must exactly match the CFBundleIdentifier in Info.plist. - If the Bundle ID differs between build configurations (Debug/Release), verify that branching logic is in place to ensure the correct
applicationBundleIDand SDK key are matched for each build environment.
Solution
Fix the mismatched identifier found through diagnosis and rebuild.
- If the identifier (Bundle ID/package name) itself must be completely changed, the existing key cannot be used. Contact Technical Support(tech_support@kollus.com) to request a new key.
-2104
- Error code: -2104
- Type:
ERROR_EXPIRED_AUTH_DATE - Summary: SDK license validity period has expired
Cause
| Cause | Description |
|---|---|
| License expiration date passed | Occurs when the license expiration date registered at the time of SDK issuance has already passed relative to the current time. |
| Incorrect device time | The system time on the user's device is set to a future time, causing the license validity check to fail. |
| Japanese calendar (和暦) in use | If the operating system calendar setting on a device in the Japanese region is set to the Japanese calendar (Reiwa, Heisei, etc.), a date calculation error may cause the license to be falsely detected as expired. |
Diagnosis
- Confirm the exact expiration date of the issued license. (This can be verified through the issuance records of your Account Manager or Technical Support.)
- Check in the device's date and time settings menu that network time synchronization (automatic setting) is enabled.
- Android: [Settings] > [System] > [Date & time] > [Set time automatically]
- iOS: [Settings] > [General] > [Date & Time] > [Set Automatically]
- For devices used by Japanese users, verify that the operating system calendar setting is configured to use the Gregorian calendar (西暦).
Solution
A expired license will prevent the SDK from functioning until a new license is issued and applied to the app.
- License reissuance: Contact Technical Support(tech_support@kollus.com) to obtain a renewed key.
- Expiration warning notice: A notification email is sent before the license expires, but for the stability of your service, it is safest for the customer to manage the expiration date independently. Record and manage both the app's release cycle and the SDK expiration date together.
-2106
- Error code: -2106
- Type:
ERROR_INCORRECT_AUTH_KEY - Summary: SDK authentication key mismatch
Cause
| Cause | Platform | Description |
|---|---|---|
| SDK key mismatch | Android, iOS | The key string entered in the source code differs from the original issued key. |
| Expiration date format error | Android, iOS | The date delimiter format was entered incorrectly using a format other than "YYYY/MM/DD" (e.g., YYYY-MM-DD, YYYYMMDD). |
| Development/production app mix-up | Android, iOS | An app built with a development (Debug) key is run in a production environment, or conversely, a production (Release) key is tested in a development environment. |
isTablet mismatch | Android | The isTablet argument value in the setCertification(..., isTablet) initialization method does not match the device type (mobile/tablet) specified when the license was issued. |
Diagnosis (Android)
1. Validate the initialization code.
// Verify that ApplicationContext is used instead of Activity context when calling getInstance to prevent memory leaks.
mMultiStorage = MultiKollusStorage.getInstance(getApplicationContext());
boolean isTablet = Utils.getDeviceType(this) == Utils.DEVICE_TYPE.DEVICE_TABLET;
mMultiStorage.setCertification(
"SDK_Key", // Verify that this exactly matches the original key issued by Catenoid.
"YYYY/MM/DD", // Must use slash (/) as delimiter; hyphens (-) and dots (.) are not allowed.
isTablet // Must match the device type registered when the license was issued.
);
2. Check the error code return method.
Unlike iOS, the Android environment requires you to check the return value of the getErrorCode() method synchronously rather than using exception handling (try/catch).
int nRet = mMultiStorage.getErrorCode();
if (nRet != ErrorCodes.ERROR_OK) {
if (nRet == ErrorCodes.ERROR_INCORRECT_AUTH_KEY) {
// The app key has expired or the authentication information does not match.
// Update the app to the latest version or contact tech_support@kollus.com.
}
// Do not attempt playback or downloads while an error is present.
return;
}
3. Perform self-diagnosis in the following order.
- Check whether there are any unnecessary spaces or newline characters on the left or right side of the entered app key string.
- Verify that the
applicationIdvalue set in thebuild.gradlefile exactly matches the package name registered when applying for the SDK key. - Confirm that the expiration date format entered in the code uses the
"YYYY/MM/DD"format. - Verify that the
isTabletvalue matches the device type specified when the license was issued.
Diagnosis (iOS)
1. Validate the initialization code.
- Be sure to explicitly specify the calendar identifier as
gregorianto prevent false date detection on devices using the Japanese calendar setting.
storage.applicationKey = "SDK_Key"
storage.applicationBundleID = "com.example.myapp" // Must exactly match the CFBundleIdentifier in Info.plist.
let formatter = DateFormatter()
formatter.dateFormat = "YYYY/MM/DD"
formatter.calendar = Calendar(identifier: .gregorian) // Required to prevent recognition errors caused by Japanese calendar settings.
storage.applicationExpireDate = formatter.date(from: "2030/12/31")
2. Check the exception handling structure.
Unlike Android, the iOS environment requires wrapping the storage.start() or startWithCheck() method in a try/catch block, as errors are thrown.
do {
try storage.start() // or startWithCheck()
} catch {
// Extract and check the error code using (error as NSError).code.
// If the returned error code is -2106, review the applicationKey, applicationBundleID, and applicationExpireDate settings again.
}
3. Perform self-diagnosis in the following order.
- Verify that the value registered at [General] > [Identity] > [Bundle Identifier] in the Xcode project target settings exactly matches
applicationBundleIDin the source code, including case. - If the Bundle ID differs between build configurations (Debug/Release), verify that the correct SDK key is mapped for each build environment.
- Check whether the
formatter.calendar = Calendar(identifier: .gregorian)line is missing, which could cause the expiration date to be incorrectly detected on Japanese devices.
Solution
- Fix the mismatched parameters found through self-diagnosis and rebuild the app.
- If the package name (Android) or Bundle ID (iOS) has changed and a new license key is required, contact Technical Support(tech_support@kollus.com).
-1015 (Android SDK)
- Error code: -1015
- Type:
ERROR_UNSUPPORTED_DEVICE - Summary: Error occurring at the time of
setDevice()method call or during DRM compatibility verification (Android only)
Cause
| Cause | Description |
|---|---|
null passed as argument | null is passed as the device path parameter when calling the setDevice(path, isTablet) method. |
| DRM-unsupported device | The hardware does not support Widevine, or an attempt is made to play DRM content on a rooted device. |
| Emulator | An attempt is made to play DRM content in an AVD (Android Virtual Device) environment. |
Diagnosis
Validate based on the implementation code below to ensure that null is not being passed as the parameter value at the point where setDevice() is called in the source code.
// Correct setDevice implementation
storage.setDevice(
Build.MANUFACTURER + "/" + Build.Model, // Use the actual device model name as the identifier. (null is not allowed)
isTablet
);
Solution
Correct the code so that an actual device identification string is passed to the setDevice() parameter instead of null.