Our Experience w/ an Apple Kids App

Our game is directed at children and has been in the Kids category on the App Store for over five years. We have been using third-party advertising and analytics for several years, but Apple’s policy updates caused them to reject our recent build. Apple told us that our build was violating section 1.3 but would not give specifics.

It took 30 days to get our game update approved, with the majority of that time stuck waiting for Apple to respond. We share our experience hoping to help others avoid something similar. Unity was fantastic in assisting us, and it would have taken much longer without their help. Huge thanks to Il Hwan, Rasmuss, Henry, Desse, Shazad, and others :slight_smile:

To get the game updated as quickly as possible, we decided to temporarily pull all third-party advertising and analytics. We plan on re-enabling advertising and analytics after the build is approved. We will update this post when we attempt to re-add advertising and analytics.

Here is what we changed to get the build approved.

  • Manually patched DeviceSettings.mm. Because we’re using a version of Unity older than 2019.3.4, we needed to manually patch DeviceSettings.mm
  • Removed Unity Ads SDK
  • Removed SuperAwesome Ads SDK
  • Removed Kidoz Ads SDK
  • Removed AppsFlyer SDK
  • Removed Unity TutorialManager plugin
  • Disabled Unity Cloud Diagnostic service in the Services Window
  • Upgraded Unity IAP to version 1.23.4 to get [this fix]( Unity IAP package 4.12.2 is now available page-2):SystemInfo.deviceUniqueIdentifier collection and sharing with ecommerce.iap.unity3d.com server
  • Disabled Unity Analytics at runtime. Because we use Unity IAP, UA must be disabled at runtime (instead of in the Services Window). We accomplished this by attaching the following script to a GameObject in the startup Scene:
using UnityEngine.Analytics;
using UnityEngine;

public class UnityAnalyticsDisabler : MonoBehaviour
{
    // Disables analytics before any code runs that sends analytic events
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    public static void OnRuntimeMethodBeforeSceneLoad()
    {
        Analytics.enabled = false;
        Analytics.deviceStatsEnabled = false;
        Analytics.initializeOnStartup = false;
        Analytics.limitUserTracking = true;
        PerformanceReporting.enabled = false;
    }
}

We used Charles to inspect our game’s traffic, allowing us to find all third-party plugins and SDKs that sent network calls.

After making the above code/config changes, our build was rejected two more times due to Apple’s incompetence or misunderstanding. We answered No to all the questions about advertising and analytics, repeated all the answers in the review notes, and Apple still failed the build by asking if we use advertising and analytics.

8 days after replying to the in the Resolution Center telling them (for the fourth time) that the game does not have advertising and analytics, we got a phone call from Apple, finally approving the build. The Apple representative told us we “did everything right” but there was a misunderstanding on their side that took them 2.5 weeks to figure out.

Thanks again to the Unity team for being available and interested in helping. If only every company cared about its developers as Unity does. <3

2 Likes

We removed UnityEngine.Analytics and all other Analytics features.Apple still rejected us.
Then we had a phone call, and apple tech look into our code. Some days later, apple told us some problems in unity, ask us to contact unity official to resolve it.
I am sure we removed all maybe against guideline 1.3.
Do you mean we should try summit app for apple review?

Can you elaborate on the “some problems in Unity”? And I don’t follow “I am sure we removed all maybe against guideline 1.3” thanks

Which third party stuff are you using? In my case Apples was throwing the issues into Unity, but in the end it was Firebase who was including those Unity APIs in the build (and removing Firebase completely solved for me)

First of all, we do Not use Firebase. the third part framework we use, I check them all with the code “grep -r advertisingIdentifier” , and make sure they don’t contain advertising and tracking, they are all base tools.
“grep -r advertisingIdentifier” shows some string in unity files.
After I tried solutions from the forum, and all rejected. I request a phone call support from apple.
Then apple called me, I told him what I have done, and ask him how to resolve this. He told me maybe they misunderstanded our app, he will let tech engineer look into the app. At last he called me again, they still found advertising identifier or tracking in unity. I said I have delete all code about ad or tracking, but I can not do anything with unity source code. Then he said I should ask Unity3d official for some help. That is all.
It seems in a infinite loop…

Hello! We have AppsFlayer and Firebase Crashlytics stuff in our kids project, but was approved for the AppStore. Also we did nothing with patching DeviceSettings.mm file.

From my point of view, there are only two main things:

  1. Don’t use Unity services, just keep it turned off, so nothing will be needed to be fixed or patched.
  2. Ask your company lawyer for help. Yeah, it is a surprise suppose :slight_smile: We created nice Privacy Policy and Terms Of Use documents with explanations about using different analytics stuff, and it worked.

I modify the DeviceSetting,mm file. And remove Unity Analytics service. Do you mean not removing it, only disable it, make it ‘false’?

If you don’t use Analytics, you don’t need to disable it. You can confirm what your app is sending by using Charles Proxy, it’s invaluable to troubleshoot these types of issues https://support.unity3d.com/hc/en-us/articles/115002917683-Using-Charles-Proxy-with-Unity

I have used Charles Proxy, and no request connect to unity3d.com or unity.com.
The most requests’ host is our own server. Because we use IAP, apple.com is also a host.
Nothing maybe about analytics is shown.

Share your capture here, or send it in a private message. They may also be inspecting the binary itself and not necessarily looking at the runtime behavior, we are still trying to find out.

I’ve disabled it in the Services window and removed all relative packages about ads/iap and etc. And that’s all. Charles Proxy doesn’t solve the issue, Apple doesn’t like Unity Analytics libraries, not the internet traffic.

Also I’m really serious about powerful EULA/Privacy docs. We referenced to these guys to substantiate AppsFlyer analytics using and any other stuff Apple can find.

We have been consulted with different kids apps developers, they also solve this issue with EULA/Privacy. You even can use Unity Analytics/Unity IAP too.

I must note that the human factor also plays a role.

1 Like

update: attached file 'charles.png' is a capture of Charles for about 1 minute running.

red rects are our server domain, ip addresses are our server supplier's.

I uploaded 2 images below.
'screenshot1' is the Charles screenshot. They are during starting app and running for several minutes.
red rect is our own server domain

'screenshot2' is a screenshot after I run the command to scan my source code.
grep -r advertisingIdentifier . try to find some code match 'advertisingIdentifier'

Please look into them, maybe give me some ideas.
Our app was rejected again yesterday. Still the same reason.

6288059--695414--screenshot1.png
100000001045506--692049--screenshot3.png
6288059--696002--charles.png

@restauranttttt Please attach your Charles capture

I have updated my last post with a new Charles capture. Is it correct?
Anything other I can provide for you ?

You are correct, your app is not contacting any Unity servers.

Would it be possible to get a hint on what should be in the EULA/Privacy to get approved? We have payed a service to create our EULA/Privacy to comply with Apple guidelines but still get rejected for this reason. Here are our Terms and Conditions and EULA in case you want/can check:

https://www.twinforce.es/en/terms-and-conditions
https://grunt.twinforce.es/

Ours:
https://magickids.me/privacy
https://magickids.me/terms

And there is an example how we answer Apple’s standard questions (I send this note with every build)

We know that you will have the next questions:

• Does your app include third-party analytics?
Yes, but just to create a GREAT user experience under the privacy policy. For example we collect: Game access status, Subscription Information (ID, Order ID, Renewal Status, Start and Till dates, Price, Status, Currency and Cancellation reason) Cancellation reason, Marketing campaign type, Application media source, Product ID and Language.
We use this information for understanding and analyzing trends in connection with the usage of our services, gathering demographic information about our user base, data about where applications were downloaded from.
We may also create reports and analyses for the purposes of research or business intelligence, for example to track potential problems or trends with our applications and services, or to test our new game features and content.
Please check this in our privacy policy which we created together with US lawyers from New York: magickids.me/privacy

• Does your app include third-party advertising?
No.

• Will the data be shared with any third parties?
No.

• Is your app collecting any user or device data for purposes beyond third-party analytics or third-party advertising?
No.

So, we have NO Unity Analytics, IAP and Ads packages, but still using AppsFlyer and Crashlytics. I’ve added Voxel IAP asset for purchases and implemented Firebase back-end for receipt validation.

P.S. I’m shocked Unity and Apple still have no easy decision for developers. However we were told that using Unity’s stuff is possible with the help of the documents above, but I can’t confirm this personally.

Thank you so very much! Will give a try and see what’s different with ours docs and see to add info if something is missing.

Hello,

I have a small question about Unity Analytics / iOS for kids apps. Since January we deactivated Unity Analytics manually in Unity and with the manual xcode modifications (and we get approved without any issues). We use the IAP Unity package.

Although, we do have some Unity custom events in our project that we can only run on Android devices. Is there currently any way to reactive the Unity Analytics for iOS (and not track the device identifiers so Apple allows it)?.

We do use Remote Settings, Funnels and A/B Testings for improving using experience and it would really help us to track apple’s users (with no personal data involved). Also, so we could track MAU unifying Android and iOS users. Is that possible?

Thank you very much for your help,

You could use #IFDEF conditionals to execute code for Android only, see IAPDemo.cs for examples.