Developer FAQ
Check these solutions first for a quick answer to your problem. If you have any questions that the SDK documentation, debugging tools, or frequently asked questions cannot answer, then contact your Big Fish Producer.
Any Other Questions? Feedback?
Don’t hesitate to reach out to us on Slack!
- Big Fish SDK Support: #bfg-client-support ↗️
- Developer Portal Feedback: #devportal-feedback ↗️
Common FAQs
(Unity) Why do I have two pairs of the bfgLib-release.aar, RaveSocial.aar, etc., for my Android game?
When you export your project to Android Studio, two separate modules depend on these AAR files.
- The first module is the bfgunityandroid module that binds Big Fish SDK API calls and thus requires the Big Fish and RaveSocial SDKs to be included in its dependency tree.
- The second module is the app-level module, where the master AndroidManifest.xml file is located. It also has dependencies on the Big Fish and RaveSocial SDKs.
Ensure both modules can depend on the same AAR files, two copies of the same AAR files are dropped into both the bfgunityandroid and the app-level Android modules.
(Unity) Why does the UnitySendMessage pass back a JSON string for the notification parameter instead of the Objective-C or Java notification object?
It is difficult to find a way to pass back an Objective-C or Java object back to C#. One of the best ways to pass information from these objects back to C# is to serialize the data to a JSON string of the data.
(Unity) I'm not receiving any of the callbacks I added in C#. What could be wrong?
There are three things you will need to check:
- Have you attached UnityMessageHandler.cs as a component to a Gameobject as early in the app's lifespan as possible?
- Is
UnitySendMessage()
firing before the observer was added for a specific notification? - Have you reviewed the ref_unity_sdk_features to ensure you correctly set up callbacks for a certain feature of the Big Fish SDK?
(Unity) How do I use the Rave Unity wrapper with my iOS game?
The BFG Unity SDK no longer wraps some general Rave functionality along with providing the rest of the third-party Rave Unity wrapper. Instead, the Big Fish Unity SDK provides all Rave functionality available in the bfgRave.cs
class reference. If a workaround is absolutely necessary, contact the Big Fish Development Integration Services team.
(Android) Can I use a specialized Activity type in my game?
Yes, you can have one of your activities or sub-activities inherit from a more specific type of Activity (e.g., CocosActivity, ActionBarActivity, etc.).
To create your own BFGActivity, you will also need to make the base activity a FragmentActivity.
Just ensure that you make calls to the Big Fish SDK during Activity Lifecycle events.
Here is an example of a bare-bones ActionBarActivity that includes the required calls to the Native Android SDK:
public class GameActivity extends NonBFGActivity {
private BroadcastReceiver mScreenReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bfgManager.activityCreated(this);
bfgManager.initializeWithActivity(this, savedInstanceState);
bfgPushManager.reportPush(this, getIntent().getExtras());
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
bfgPushManager.reportPush(this, intent.getExtras());
}
@Override
protected void onResume() {
super.onResume();
bfgManager.resume(this);
}
@Override
protected void onStart() {
super.onStart();
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
mScreenReceiver = new bfgScreenReceiver();
registerReceiver(mScreenReceiver, filter);
bfgManager.start(this);
}
@Override
protected void onPause() {
super.onPause();
bfgManager.pause(this);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(mScreenReceiver);
bfgManager.stop(this);
}
@Override
public void onBackPressed() {
super.onBackPressed();
bfgManager.activityFinished(this);
}
}
(Android) Why aren't my network calls succeeding?
If your application is targeting API 28 or higher, it may be that you need to include your own network_security_config.xml file.
For instructions, see Network Security with Android API Level 28 ↗️.
(Android) Why are features no longer working after upgrading the Big Fish Android SDK?
If you are updating a project for an existing game, you must remove earlier versions of the Big Fish Android SDK from your project.
- See the Android SDK Release Notes for details about what has changed with this release and any relevant upgrade instructions.
(Android) How do I handle hotfixes for the SDK?
Sometimes important fixes will be needed across all in-development games, regardless of the SDK version. In these cases, Big Fish will release a hotfix for all currently accepted SDK versions. Check with your Big Fish Producer; if a hotfix has been released for your SDK version, you will need to perform an SVN update to implement the changes.
How you update will vary depending on the client used. This is a basic SVN function that should always be available.
- Check out the latest revision of your project's trunk.
- The externally linked SDK folder will now appear in your working copy.
- Perform the SVN update function on this external folder to sync with the latest revision available for the SDK.
- Do a clean build on the lib to ensure you have all of the latest changes.
(Android) Why am I getting a Wifi Error?
If bfgPurchase.startUsingService()
is called before calling bfgManager.initializeWithActivity()
, an error will be generated. This results from the game checking for Wifi before the game has initialized bfgManager.
To check for this issue:
- Install the application you are troubleshooting.
- Launch the application when not on Wifi.
(iOS) After upgrading the Big Fish iOS SDK, feature(s) are no longer working?
If you are updating the SDK version for an existing game, you must remove earlier versions of the Big Fish iOS SDK from your project.
- For instructions, see Upgrading the Native iOS SDK.
- For details about what has changed with this release, see the Native iOS SDK Release Notes.
(iOS) Why was my game rejected by Apple?
A rejected game can be a result of several issues.
- If you are using an older version of the SDK, it may not include hotfixes to resolve known rejection issues.
- Contact your Big Fish Producer to find out the current approved SDK versions.
- Never reference a local copy of the SDK! If you are correctly referencing an external copy of the SDK, then your game will automatically be updated with any hotfixes.
- Your iPhone SKU does not support iPhone 5, 6, 6+ widescreen resolution.
- As of May 1st, 2013, Apple will not approve any new apps or app updates that access UDIDs. For more information, see Make Your Apps Look Great on the Retina Display and iPhone 5 ↗️.
- UDID capture is utilized by an API or SDK used during development.
- As of May 1st, 2013, Apple requires that all applications must support the 4-inch display on iPhone 5. For more information, see Using Identifers in Your Apps ↗️.
- The Big Fish iOS SDK and all SDKs Big Fish supports no longer track UDIDs
- Make sure that any additional APIs, SDKs, or libraries do not track UDIDs.
- A non-public API was used.
- Not 64-bit compatible.
- As of June 1st, 2015, all games are required to support 64-bit and include the arm64 architecture.
Resource FAQs
Why are the settings on the Mobile Admin Tool server not reflected by the client?
QA will bug the following incorrect ad behaviors relating to the Mobile Admin Tool server settings:
- With Wifi enabled, the Pause/Resume menu does not appear after 1 hour when the device sleeps or after a fast-app-switch (FAS).
- Big Fish has turned on/off the dashboard in the Mobile Admin Tool, but the client does not reflect this change.
Possible causes:
Most of these issues result from incorrect settings in your bfg_config.json file.
What is the correct Big Fish branding/splash screen?
The one brand can be used across all languages, and there is no need for localization.
EN the only language reporting in Xcode?
You might not have configured the supported languages for your game.
- Highlight the project in Xcode (not individual targets) and select the Info tab.
- Under Localizations, you will see a list of languages. Any languages not listed here are not reporting. This list should include all supported languages for your game.
- Select "+" to add a new language. Several languages have multiple options, so be sure the language selected matches the appropriate language code (in capital letters to the far right).
(iOS) Apple default UI elements appearing in random languages?
The Localizations key in your Info.plist should always include English as the primary language.
According to Apple's documentation:
"The list of languages supported by the app, as shown in the iTunes store screenshot you sent, is automatically determined by inspecting the submitted application bundle. Typically, this comes from the .lproj folders in a bundle, as the process (and iOS) use this to determine what languages the application can support.
However, it is also possible to provide your own localization support system in the application without using .lproj folders (although this is typically much more work) – in this scenario, the list of supported languages is specified in the application's Info.plist file, via the CFBundleLocalizations key."
For more information, see the Apple documentation, Core Foundation Keys ↗️.
Functionality FAQs
Purchase Issues
(Android) How do I test In-App Purchase functionality?
To test your In-App Purchase, you will need to create a "dummy app" (make sure you are using your primary company/developer account).
Also see amazon_android_iapTesting and google_android_iapTesting.
Your dummy apps must have a different title than the real game entry. Big Fish recommends adding "test". Never set up the production title or Big Fish will not be able to use this for the final shipped game title.
(Android) Google Acquire Product Information always returns null
When Acquiring Product Information, if you always receive null from the IAB Helper, ask your Big Fish Producer to verify that the application has been published to alpha, and is not in a "Draft in Alpha" state.
(Android) A "No token detected, contact your producer for token" error appears in the logcat for a Google IAB game
This error means the game is not published and not configured to have a Google IAB key in the Mobile Admin Tool. Contact your Big Fish Producer to set this up, and enable AndroidPurchaseGoogle.
(Android) Product ID not reported to the Big Fish server with the revenue event for purchase
Third-party developers are now required to use bfgPurchase.
When the bfgPurchase.acquireProductInformation
event is called, if a Product ID is not specified, it will not be tracked. Replace productID with the In-App Purchase ID for the Full Game Unlock.
If any bfgPurchase calls are made out of order, then the purchase may fail or the events may not track. For the correct order, see AndroidPurchaseGoogle
.
All revenue events are included in the bfgPurchase class. Using bfgPurchase requires no additional bfgGameReporting reporting calls.
Reporting
How is Rave Social supported in the SDK?
The Rave SDK is completely wrapped in the Big Fish Android SDK, and its configuration is required for all games.
Developers new to the Big Fish SDK should review the information at Rave and the Big Fish Android SDK before integrating the SDK into a game.
In its simplest form, Rave ties all authoritative authentication methods (Facebook and Big Fish ID) to a unique ID called the RaveID. When a user initializes an application with Rave integrated, a RaveID is created. Until it is linked to an authentication method, it is "anonymous" and associated only with the device it was created on.
When a user authenticates through any method, the unique ID that comes from that method is associated to the RaveID. If the user authenticates through multiple methods, all of those methods are linked to the RaveID. If the user runs the app (plays the game) on a different device prior to authenticating, they are not linked to any prior RaveID. They will be assigned a new ID. If they authenticate using a previous method, Rave sees that it is the same person and connects the new device to the first RaveID.
For example:
- User1 on Device1 gets RaveID1. When they authenticate using Facebook (FBID1) they have RaveID1 associated with FBID1.
- On Device2 they get RaveID2. When they authenticate to Facebook on Device2, Rave changes RaveID2 to RaveID1.
If you are integrating with Rave, you should report the RaveID to the SDK.
How is AppsFlyer supported in the SDK?
AppsFlyer is a mobile application tracking SDK that helps to ensure the maximum return through the Big Fish Games affiliate network.
The AppsFlyer SDK is completely wrapped in the Big Fish Android SDK, and the SDK handles all AppsFlyer reporting. Your Big Fish Producer will set up your game for AppsFlyer at the beginning of production.
For more information, see AppsFlyer.
How is Crashlytics supported in the SDK?
Crashlytics is an automated crash reporting system. The Crashlytics SDK is completely wrapped in the Big Fish Android SDK.
For more information, see Crashlytics.
Where can I find help with Product ID tracking and other revenue events?
For more information, see In-App Purchasing.
(iOS) Why is [bfgPurchase startService] always returning NO in my game?
HBI values are bundle ID specific. When testing In-App Purchases using a dummy app, contact your Big Fish Producer to request an HBI value to match your test bundle ID.
The application may not have a valid hbi key in its bfg_config.json file. Ensure that you have the appropriate key for hbi, provided by your Big Fish Producer. If you change the value of the key in bfg_config.json, you will need to delete the application from your device and reinstall it for the change to be registered. You may also wish to call bfgPurchase startService:**error
if you would like additional information regarding the failure of purchase to start.
(iOS) Why did my sandbox purchasing fail?
If you do not add an hbi value in the bfg_config.json file in the bfglib_gamespecific_resources, then purchasing will not work. Contact your Big Fish Producer for the correct hashed bundle ID for your game.
On startup, after bfgPurchase startService
is called, follow immediately with a bfgPurchase acquireProductInformation
call.
For more information, see In-App Purchasing.
(iOS) Purchase failed after turning wifi or airplane mode off/on?
The bfgPurchase canStartPurchase:
method should be used to ensure that the latest status is always acquired before initiating the purchase sequence. If the value is returned as Yes, continue with the bfgPurchase startPurchase
step.
For more information, see In-App Purchasing.
(iOS) Why did my restore failed for my games?
On startup, after calling bfgPurchase startService
, immediately call the bfgPurchase acquireProductInformation
method.
Call bfgPurchase restorePurchases and listen for the bfgPurchase notifications for restores:
NOTIFICATION_PURCHASE_SUCCEEDED
NOTIFICATION_PURCHASE_FAILED
The notification userInfo will contain a dictionary with a single bfgPurchaseObject. BFG_PURCHASE_OBJECT_USER_INFO_KEY will key to this object and contain all of the information about the purchase.
On success, unlock the game and persist the state of the game and purchase.
If you receive a failure, Apple could not be reached and you should indicate to the user that the restore could not be completed.
For more information, see In-App Purchasing.
Privacy & Security FAQs
(iOS) What happens if some 3rd party SDKs that I’m using in my app have not yet adopted a privacy manifest file?
Ask the 3rd party SDKs about their privacy practices and add them to your privacy manifest file. Apple has identified some 3rd party SDKs that have a high-impact on user privacy. These high-impact 3rd party SDKs are called Privacy-Impacting SDKs. A list is published for them here ↗️.
Apple mentions in WWDC23 video ↗️ “Apps that include the Privacy-impacting SDKs will be required to include a copy of the SDK with a privacy manifest.” These Privacy-Impacting SDKs will probably make an update to adopt a privacy manifest File. When you get this update, you don’t need to worry about this SDK. You can create your privacy manifest file for the rest of your code.
(iOS) What happens if there are some conflicts in the privacy manifest files in a project?
This won't cause a problem. Your responsibility is declaring all your purposes for the data you collect, providing all approved reasons for your Required-Reason API usage, and adding your tracking domains in your privacy manifest file. When you get the Privacy Report from your archive, reference this report when you provide your app’s privacy details in App Store Connect.
Telemetry FAQ
What is the difference between MTS and GTS?
Mobile Telemetry Services (MTS) and Game Telemetry Service (GTS) are both analytics gathering services created by Big Fish Games. They both capture game-specific data, such as install events, purchases, and session times, and can be expanded to capture custom events and other game-specific data, such as player level ups.
The only difference between MTS and GTS is the delivery method of this data. MTS is integrated into the BFG SDK and custom events are created using the SDK provided methods. GTS supports an independent server to server API where you make REST API calls to deliver the data in addition to the integrated methods in the BFG SDK.
You will use either MTS or GTS for your game, but not both.
MTS is a legacy telemetry service that is replaced by integrated telemetry methods in the BFG SDK.
How can I access telemetry data for my game?
All your telemetry data is available through Looker or Snowflake. To gain access to these applications, reach out to your Big Fish producer.
The data and events that are sent to the Big Fish telemetry service are available in the Event Viewer of the Publisher Portal ↗️. Note that you will need a Big Fish account to access the portal.
How is our telemetry data secured?
Telemetry data is sent to three services: Leanplum, Snowflake, and Looker. All telemetry data is sent via an API call that is secured by a privacy token. The token and any passwords are secured by Google's Secret Manager.
In Snowflake, there are different levels of access to the view and manage telemetry data:
- Admins can create, assign, and review roles of users and view all telemetry data.
- Users can view telemetry data based on permission levels set by your Big Fish account.
How long does Big Fish Games store our telemetry data?
All telemetry data collected is stored indefinitely.
Why are my custom telemetry events are failing?
There are a number of reasons you are not custom events are failing. Check for the following:
- Ensure your custom events do not contain any special characters, such as
\n
. - Ensure that the payload of the event is not too large. Payloads have a character limit of 10,000.
For more information on creating custom events, see Telemetry Events.