{"id":246,"date":"2026-10-16T06:39:06","date_gmt":"2026-10-16T05:39:06","guid":{"rendered":"https:\/\/arrowlancer.ma\/blog\/?p=246"},"modified":"2026-10-16T06:39:06","modified_gmt":"2026-10-16T05:39:06","slug":"mobile-app-cndp-compliance-morocco-2026","status":"publish","type":"post","link":"https:\/\/arrowlancer.ma\/blog\/en\/mobile-app-cndp-compliance-morocco-2026\/","title":{"rendered":"Mobile app CNDP compliance Morocco 2026: permissions, SDKs"},"content":{"rendered":"<p>A delivery app built for a Casablanca SME asks for five permissions on first launch: background location, contacts, camera, notifications, storage. The code is clean and the build passes Apple review on the first attempt. When the client&#8217;s compliance lead asks who receives that data and on what basis, nobody on the project team can answer precisely.<\/p>\n<p>That gap is the norm rather than the exception. A mobile app structurally collects more personal data than a website, because it reaches sensors and identifiers a browser never exposes. And most of those outbound flows do not come from the code you commissioned: they come from the third-party libraries your team added to move faster.<\/p>\n<p>Law 09-08 draws no line between a website and an app. The moment personal data is processed, CNDP formalities apply, and some categories require prior authorisation rather than a simple declaration. Mobile app CNDP compliance is therefore not settled by pasting the website privacy policy into the app. It is settled permission by permission and SDK by SDK.<\/p>\n<h2>What each permission really reveals about your users<\/h2>\n<p>The system dialog users see (&#8220;Allow access to your location?&#8221;) grants technical access to a device resource. It says nothing about the exact purpose, the recipients or how long the data is kept. That is the first thing to look at in an audit, because the gap between what the app asks for and what it actually uses is almost always there.<\/p>\n<p>The mobile app permissions that raise the most CNDP questions in Morocco:<\/p>\n<ul>\n<li><strong>Precise and background location.<\/strong> A fix every thirty seconds for six months is a movement history: home, workplace, habits, who you visit. Plenty of apps request background access when while-in-use would be enough.<\/li>\n<li><strong>Address book.<\/strong> Reading contacts means collecting data about people who never installed your app and consented to nothing. It is the hardest permission to justify, and the one I most often recommend dropping.<\/li>\n<li><strong>Camera and photo library.<\/strong> A national ID card photographed during onboarding becomes an identity document stored somewhere. Where, encrypted how, deleted when?<\/li>\n<li><strong>Microphone.<\/strong> Rarely needed outside voice messaging, often inherited from a template or a plugin nobody reviewed.<\/li>\n<li><strong>Advertising identifier (IDFA on iOS, AAID on Android).<\/strong> A unique identifier that a third party can attach to a profile. Personal data, even without a name or an email.<\/li>\n<li><strong>Bluetooth and Wi-Fi scanning.<\/strong> Also used for indoor positioning, which the permission prompt never mentions.<\/li>\n<\/ul>\n<p>Ask your provider for a one-line-per-permission table: what it is for, in which screen, what data it produces, where that data goes. Any permission still sitting in the Android manifest or the Info.plist without an active use should be removed before publication, for compliance reasons and for acceptance rates.<\/p>\n<h2>Third-party SDKs: Firebase, Analytics, Facebook SDK, where the data goes<\/h2>\n<p>A mid-sized Flutter or React Native app easily carries fifteen to forty dependencies, a handful of which open network connections to the outside world. The business code you paid for is sometimes the smallest share of outbound traffic.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/arrowlancer-prod.firebasestorage.app\/blog-ma\/cndp-application-mobile-maroc-permissions-sdk-2026\/1.jpg\" alt=\"Mobile app CNDP compliance Morocco 2026: permissions, SDKs\" loading=\"lazy\" \/><\/p>\n<p>Firebase Analytics records automatic events by default, along with device model, OS version, a coarse location derived from the IP address and a pseudonymous installation identifier. Crashlytics uploads stack traces containing exactly what your developers logged, and I have seen email addresses and order numbers surface in crash reports. Cloud Messaging stores the device token. The Facebook SDK logs app events automatically as soon as it initialises, often before any consent screen appears, and matches them against an existing Meta account. Attribution SDKs such as AppsFlyer or Adjust exist precisely to build an installation fingerprint.<\/p>\n<p>All of this leaves Morocco. A cross-border transfer of personal data is not something you improvise: it has to appear in your filing and rest on a framework the CNDP accepts, and the SDK vendor is your processor, which implies a contract and security commitments. The rules evolve, so check the applicable procedure on the CNDP website rather than reusing an old filing template.<\/p>\n<p>Third-party SDKs and personal data is a question you verify, not one you take on trust: run the binary behind an inspection proxy and look at the domains contacted on the very first launch. Note too that the technical stack changes the list you have to audit, since a <a href=\"https:\/\/arrowlancer.ma\/blog\/en\/native-vs-flutter-morocco-mobile-app-2026\/\">Flutter or native project<\/a> pulls in a very different dependency tree, and community plugins rarely get a security read.<\/p>\n<h2>The push token, the personal data nobody declares<\/h2>\n<p>To send a notification, the app registers with Firebase Cloud Messaging or APNs and receives a token. That token identifies one installation on one device. As soon as you store it next to a customer ID, a phone number or an order history, it stops being an abstract string: you are holding an identifier tied to a person.<\/p>\n<p>What happens in practice is always the same. The token table grows, nobody prunes it, and it ends up holding installations uninstalled two years ago along with the profile attached to them. Retention logic here is no different from any other dataset, and the <a href=\"https:\/\/arrowlancer.ma\/blog\/en\/data-retention-cndp-morocco-2026\/\">retention periods the CNDP expects<\/a> apply to the table nobody looks at as much as to your customer database.<\/p>\n<p>Three fixes usually cover it: delete the token on logout and on account deletion, purge the tokens FCM reports as invalid, and separate service notifications (order shipped, appointment confirmed) from marketing notifications, which rest on consent and must be switchable inside the app itself, not only in the phone settings.<\/p>\n<h2>Biometrics and continuous location: the strictest regime<\/h2>\n<p>Two things that quotes routinely conflate deserve to be pulled apart. Using Face ID or a fingerprint through the system API to unlock the app asks the operating system for a yes or no: the template never leaves the device&#8217;s secure enclave and you never receive it. Building your own facial recognition, for instance a selfie compared against the photo on a national ID card, means collecting and processing a biometric template on your servers.<\/p>\n<p>The second case changes category. Biometrics under Law 09-08 sit in prior-authorisation territory rather than ordinary declaration, with a review that covers purpose, security measures, how long the template is kept and what alternative you offer users who refuse. Continuous location tracking of employees or couriers calls for comparable care, with labour law added on top. Before costing that kind of feature, check the current form and processing times on the CNDP website, because this is the line item that most often moves a launch date.<\/p>\n<h2>What the stores already require, and what goes well beyond their forms<\/h2>\n<p>Apple requires an App Privacy card, Google Play a Data safety form, and both demand a reachable privacy policy URL. Google additionally expects a prominent disclosure screen for background location, and both stores now require an account deletion path accessible from inside the app. These forms remain self-declared: nobody checks line by line what your SDKs actually transmit.<\/p>\n<p>What they do not cover at all: the CNDP formality itself, the basis for each processing activity, retention periods, the identity of the controller, how users exercise access, rectification and objection rights, and your processor contracts. Filling in the Apple card properly is a useful mapping exercise, but treating it as Moroccan compliance is a common mistake. <a href=\"https:\/\/arrowlancer.ma\/blog\/en\/publish-mobile-app-morocco-app-store-play-store\/\">Preparing a store submission<\/a> and preparing a CNDP filing are two parallel tracks, validated by different people.<\/p>\n<h2>What a mobile app CNDP compliance audit covers before launch<\/h2>\n<p>On a reasonably sized app the work takes between half a day and two days. The order of the steps matters more than the tooling.<\/p>\n<ol>\n<li>Extract the real permission list from the Android manifest and the iOS Info.plist, then tie each one to a specific screen. Anything without a screen leaves the project.<\/li>\n<li>List dependencies with their versions and isolate the ones that open network connections.<\/li>\n<li>Run the app behind an inspection proxy and record the domains contacted on first launch, before the user has agreed to anything. This is the step that surprises development teams most.<\/li>\n<li>Build the map: data collected, purpose, basis, recipient, hosting country, retention period.<\/li>\n<li>Derive the applicable regime, declaration or prior authorisation, from the nature of the data and the transfers involved.<\/li>\n<li>Write the in-app disclosure and consent screens, in French and Arabic if your audience justifies it, rather than relying on a privacy policy behind an external link.<\/li>\n<\/ol>\n<p>The reasoning mirrors <a href=\"https:\/\/arrowlancer.ma\/blog\/en\/website-cndp-compliance-morocco-2026\/\">website CNDP compliance<\/a>, with two differences: there are far more collection points, and a good share of them are invisible from the interface.<\/p>\n<h2>The checklist to put in the contract before you sign<\/h2>\n<p>These points are negotiated at quote stage, not at acceptance testing. Including them in the initial scope costs almost nothing; adding them afterwards is paid for in development days.<\/p>\n<ul>\n<li>The list of requested permissions, each with a written justification, annexed to the specification.<\/li>\n<li>An inventory of planned third-party SDKs, named in the quote, plus a clause forbidding new ones without your written approval.<\/li>\n<li>A network capture report delivered before store submission.<\/li>\n<li>The processing map handed over at project close, in a format you can maintain yourself.<\/li>\n<li>Who drafts and files the CNDP paperwork, and whether that work is included or billed separately.<\/li>\n<li>Account deletion with genuine erasure in the database, including push tokens and backups.<\/li>\n<li>Ownership of the Apple and Google developer accounts, the Firebase project and the signing keys.<\/li>\n<li>Security commitments: encryption in transit and at rest, API key rotation, no secrets hard-coded in the binary.<\/li>\n<\/ul>\n<h2>Frequently asked questions<\/h2>\n<h3>Does the app need its own CNDP filing if the website is already declared?<\/h3>\n<p>In most cases yes, because the formality covers a processing activity and its purposes, not a channel. If the app creates new collection points (location, notifications, biometrics) or new recipients, your existing receipt does not cover them. Reread the exact scope of what you declared before concluding otherwise.<\/p>\n<h3>Is the consent shown by iOS or Android enough?<\/h3>\n<p>No. The system dialog grants technical access to a device resource. Law 09-08 also expects clear information about the purpose, the recipients, the retention period and the user&#8217;s rights, plus a way to change their mind. In practice that means an explanation screen shown just before the permission prompt.<\/p>\n<h3>Can a Moroccan app use Firebase?<\/h3>\n<p>Many Moroccan apps do. It means hosting outside Morocco, so a cross-border transfer to handle in your filing, a processor contract with the vendor, and a deliberately reduced configuration: switch off automatic event collection you have no use for, and never allow direct identifiers into crash logs.<\/p>\n<h3>When should the audit happen?<\/h3>\n<p>At scoping, not at acceptance. Removing an attribution SDK or reworking a biometric flow after development costs several days, and the fix always lands at the worst possible moment, right before store submission.<\/p>\n<h2>Where this audit sits in a mobile project<\/h2>\n<p>At Arrowlancer, mapping permissions, third-party SDKs and location or biometric flows is part of the scoping phase for every iOS, Android, Flutter or React Native app we build, before the integrations are locked in. You can see the scope of the mobile practice among <a href=\"https:\/\/arrowlancer.ma\/en\/#services\">our services<\/a>. If you are preparing a launch or a rebuild, <a href=\"https:\/\/arrowlancer.ma\/en\/#contact\">send us a note<\/a> with the list of permissions your app currently requests: it is the most useful starting point for the conversation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>System permissions, Firebase and Facebook SDKs, push tokens: where your mobile app&#8217;s data actually goes, and what Law 09-08 requires before launch.<\/p>\n","protected":false},"author":0,"featured_media":247,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[63,273,279,222,109,934],"class_list":["post-246","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech_et_development","tag-cndp-en","tag-compliance-en","tag-law-09-08-en","tag-mobile-app-en","tag-morocco-en","tag-third-party-sdks-en"],"_links":{"self":[{"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/posts\/246","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/comments?post=246"}],"version-history":[{"count":1,"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/posts\/246\/revisions"}],"predecessor-version":[{"id":249,"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/posts\/246\/revisions\/249"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/media\/247"}],"wp:attachment":[{"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/media?parent=246"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/categories?post=246"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arrowlancer.ma\/blog\/wp-json\/wp\/v2\/tags?post=246"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}