{"id":13479134,"url":"https://github.com/pagopa/io-app","last_synced_at":"2026-05-29T01:01:46.232Z","repository":{"id":36962001,"uuid":"87916228","full_name":"pagopa/io-app","owner":"pagopa","description":"IO, l'app dei servizi pubblici","archived":false,"fork":false,"pushed_at":"2026-05-26T15:01:02.000Z","size":193824,"stargazers_count":695,"open_issues_count":46,"forks_count":119,"subscribers_count":22,"default_branch":"master","last_synced_at":"2026-05-26T16:31:15.305Z","etag":null,"topics":["android","cie","io-app","ios","react-native","spid"],"latest_commit_sha":null,"homepage":"https://ioapp.it","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"eupl-1.2","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pagopa.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":"publiccode.yml","codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2017-04-11T09:34:46.000Z","updated_at":"2026-05-26T15:02:43.000Z","dependencies_parsed_at":"2023-09-26T14:30:54.038Z","dependency_job_id":"66d51930-697d-4483-be2b-d364d1ce5517","html_url":"https://github.com/pagopa/io-app","commit_stats":null,"previous_names":[],"tags_count":1035,"template":false,"template_full_name":null,"purl":"pkg:github/pagopa/io-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagopa%2Fio-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagopa%2Fio-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagopa%2Fio-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagopa%2Fio-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pagopa","download_url":"https://codeload.github.com/pagopa/io-app/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pagopa%2Fio-app/sbom","scorecard":{"id":364075,"data":{"date":"2025-08-11","repo":{"name":"github.com/pagopa/io-app","commit":"0de3492cc67f98d39350cbca7256583e76767a31"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"name":"Code-Review","score":8,"reason":"Found 25/30 approved changesets -- score normalized to 8","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Dangerous-Workflow","score":0,"reason":"dangerous workflow patterns detected","details":["Warn: script injection with untrusted input ' github.event.pull_request.title ': .github/workflows/pr-title-conventional-commit-linter.yml:94","Warn: script injection with untrusted input ' github.event.pull_request.title ': .github/workflows/pr-title-linter-and-linker.yml:81"],"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: European Union Public License 1.2: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/distribute-beta.yml:1","Warn: no topLevel permission defined: .github/workflows/nightly-jobs.yml:1","Warn: no topLevel permission defined: .github/workflows/pr-title-conventional-commit-linter.yml:1","Warn: no topLevel permission defined: .github/workflows/pr-title-linter-and-linker.yml:1","Warn: no topLevel permission defined: .github/workflows/publiccode-validation.yml:1","Warn: no topLevel permission defined: .github/workflows/release-canary.yml:1","Warn: no topLevel permission defined: .github/workflows/release-new-cycle.yml:1","Warn: no topLevel permission defined: .github/workflows/release-nightly.yml:1","Warn: no topLevel permission defined: .github/workflows/stale.yml:1","Warn: no topLevel permission defined: .github/workflows/staticcheck.yaml:1","Warn: no topLevel permission defined: .github/workflows/weekly-jobs.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Branch-Protection","score":5,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: 'stale review dismissal' is disabled on branch 'master'","Warn: required approving review count is 1 on branch 'master'","Info: codeowner review is required on branch 'master'","Warn: 'last push approval' is disabled on branch 'master'","Info: 'up-to-date branches' is required to merge on branch 'master'","Info: status check found to merge onto on branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 3.12.0-rc.2 not signed: https://api.github.com/repos/pagopa/io-app/releases/238450202","Warn: release artifact 3.12.0-rc.1 not signed: https://api.github.com/repos/pagopa/io-app/releases/238340511","Warn: release artifact 3.12.0-rc.0 not signed: https://api.github.com/repos/pagopa/io-app/releases/238179571","Warn: release artifact 3.11.0-rc.4 not signed: https://api.github.com/repos/pagopa/io-app/releases/236948483","Warn: release artifact 3.11.0-rc.3 not signed: https://api.github.com/repos/pagopa/io-app/releases/236719521","Warn: release artifact 3.12.0-rc.2 does not have provenance: https://api.github.com/repos/pagopa/io-app/releases/238450202","Warn: release artifact 3.12.0-rc.1 does not have provenance: https://api.github.com/repos/pagopa/io-app/releases/238340511","Warn: release artifact 3.12.0-rc.0 does not have provenance: https://api.github.com/repos/pagopa/io-app/releases/238179571","Warn: release artifact 3.11.0-rc.4 does not have provenance: https://api.github.com/repos/pagopa/io-app/releases/236948483","Warn: release artifact 3.11.0-rc.3 does not have provenance: https://api.github.com/repos/pagopa/io-app/releases/236719521"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Binary-Artifacts","score":7,"reason":"binaries present in source code","details":["Warn: binary detected: android/gradle/wrapper/gradle-wrapper.jar:1","Warn: binary detected: ios/fastlane/metadata/primary_category.txt:1","Warn: binary detected: ios/fastlane/metadata/secondary_category.txt:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: all commits (25) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":8,"reason":"dependency not pinned by hash detected -- score normalized to 8","details":["Warn: downloadThenRun not pinned by hash: scripts/pagopa_api_check.sh:29","Warn: downloadThenRun not pinned by hash: scripts/pagopa_api_check.sh:33","Warn: pipCommand not pinned by hash: .github/workflows/nightly-jobs.yml:33","Warn: pipCommand not pinned by hash: .github/workflows/nightly-jobs.yml:50","Info:  77 out of  77 GitHub-owned GitHubAction dependencies pinned","Info:  13 out of  13 third-party GitHubAction dependencies pinned","Info:   0 out of   2 downloadThenRun dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":0,"reason":"61 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-230 / GHSA-248v-346w-9cwc","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2024-24 / GHSA-5h86-8mv2-jq9f","Warn: Project is vulnerable to: GHSA-5m98-qgg9-wh84","Warn: Project is vulnerable to: GHSA-7gpw-8wmc-pm8g","Warn: Project is vulnerable to: GHSA-8495-4g3g-x7pr","Warn: Project is vulnerable to: PYSEC-2024-26 / GHSA-8qpw-xqxj-h4r2","Warn: Project is vulnerable to: GHSA-9548-qrrj-x5pj","Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-r92x-f52r-x54g","Warn: Project is vulnerable to: GHSA-r9w3-g83q-m6hq","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-ghr5-ch3p-vcr6","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-m5qc-5hw7-8vg7","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-hhhv-q57g-882q","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-6vfc-qv3f-vr6c","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-cchq-frgv-rjh5","Warn: Project is vulnerable to: GHSA-g644-9gfx-q4q4","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-f9xv-q969-pqx4"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T11:27:52.784Z","repository_id":36962001,"created_at":"2025-08-18T11:27:52.785Z","updated_at":"2025-08-18T11:27:52.785Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33632271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","cie","io-app","ios","react-native","spid"],"created_at":"2024-07-31T16:02:10.145Z","updated_at":"2026-05-29T01:01:46.211Z","avatar_url":"https://github.com/pagopa.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"img/io-app-icon.png\" width=\"100\" style=\"display: block\" /\u003e\u003c/br\u003e\n  \u003ch3 align=\"center\"\u003eIO - The public services app\u003c/h3\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/pagopa/io-app/actions/workflows/publish-app-build-nightly.yml\"\u003e\n        \u003cimg src=\"https://github.com/pagopa/io-app/actions/workflows/publish-app-build-nightly.yml/badge.svg?branch=master\" /\u003e\n    \u003c/a\u003e\n    \u003c!-- \u003ca href=\"https://github.com/pagopa/io-app/actions/workflows/test-e2e.yml\"\u003e\n        \u003cimg src=\"https://github.com/pagopa/io-app/actions/workflows/test-e2e.yml/badge.svg?branch=master\" /\u003e\n    \u003c/a\u003e --\u003e\n    \u003ca href=\"https://codecov.io/gh/pagopa/io-app\"\u003e\n        \u003cimg src=\"https://codecov.io/gh/pagopa/io-app/branch/master/graph/badge.svg\" /\u003e\n    \u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/github/contributors-anon/pagopa/io-app\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/repo-size/pagopa/io-app\" /\u003e\n\u003c/p\u003e\n\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://apps.apple.com/it/app/io/id1501681835\"\u003e\n        \u003cimg height=\"50\" src=\"img/badges/app-store-badge.png\" alt=\"Download on the App Store\" /\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://play.google.com/store/apps/details?id=it.pagopa.io.app\"\u003e\n        \u003cimg height=\"50\" src=\"img/badges/google-play-badge.png\" alt=\"Get it on Google Play\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n# The mobile app of the Digital Citizenship project\n\n- [FAQ](#faq)\n  - [What is the Digital Citizenship project?](#what-is-the-digital-citizenship-project)\n  - [What is the Digital Citizenship mobile app?](#what-is-the-digital-citizenship-mobile-app)\n  - [Who develops the app?](#who-develops-the-app)\n  - [Can I use the app?](#can-i-use-the-app)\n  - [How can I help you?](#how-can-i-help-you)\n  - [What permissions are used by the IO app?](#what-permissions-are-used-by-the-io-app)\n- [Getting started](#getting-started)\n  - [Prerequisites](#prerequisites)\n  - [Build the app](#build-the-app)\n  - [Environment variables](#environment-variables)\n  - [Run the app](#run-the-app)\n  - [Troubleshooting](#troubleshooting)\n- [Architecture](#architecture)\n  - [Main technologies used](#main-technologies-used)\n  - [SPID Authentication](#spid-authentication)\n  - [Deep linking](#deep-linking)\n  - [Design System](#design-system)\n- Appendix\n  - [Internationalization](locales/README.md)\n  - [End to end test](e2e/README.md)\n\n# FAQ\n\n## What is the Digital Citizenship project?\n\nDigital Citizenship aims at bringing citizens to the center of the Italian public administrations services.\n\nThe project comprises two main components:\n\n* a platform made of elements that enable the development of citizen-centric digital services;\n* an interface for citizens to manage their data and their digital citizen profiles.\n\n## What is the Digital Citizenship mobile app?\n\nThe Digital Citizenship mobile app is a native mobile application for iOS and Android with a dual purpose:\n\n* to be an interface for citizens to manage their data and their digital citizen profile;\n* to act as _reference implementation_ of the integrations with the Digital Citizenship platform.\n\n## Who develops the app?\n\nThe development of the app is carried out by several contributors:\n\n* [PagoPA S.p.A.](https://www.pagopa.it);\n* volunteers who support the project.\n\n## Can I use the app?\n\nSure! However you will need a [SPID account](https://www.agid.gov.it/en/platforms/spid) or have a [CIE](https://www.cartaidentita.interno.gov.it) to login to the app.\n\n## How can I help you?\n\n[Reporting bugs](https://github.com/pagopa/io-app/issues), bug fixes, [translations](locales/README.md) and generally any improvement is welcome! [Send us a Pull Request](https://github.com/pagopa/io-app/pulls)!\n\n## What permissions are used by the IO app?\n\nBecause different platforms have different types of Permissions below we have two sections about permissions requested by the IO app for both environments (iOS and Android). Some permissions may be defined but not used. Their presence is due to dependencies with third-party modules or because they are required by the target store.\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eAndroid\u003c/b\u003e\u003c/summary\u003e\n  \u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePermission (android.permission.*)\u003c/td\u003e\n        \u003ctd\u003eUsage / Meaning\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eINTERNET\u003c/td\u003e\n        \u003ctd\u003eAllows the app to open network sockets (e.g. simple internet connectivity)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eACCESS_NETWORK_STATE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access information about networks (e.g. details about connection quality/state)\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eCAMERA\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access device camera to scan QR codes\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNFC\u003c/td\u003e\n        \u003ctd\u003eAllows the app to perform I/O operations over NFC\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eRECEIVE_BOOT_COMPLETED\u003c/td\u003e\n        \u003ctd\u003eAllows the app to receive the Intent.ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. Used for push notification.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eVIBRATE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the vibration motor. This allow the application to emit vibration.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eWAKE_LOCK\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use PowerManager WakeLocks to keep processor from sleeping or screen from dimming. Used for push notification.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eREAD_APP_BADGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to show notification badges on its icon.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eREAD_CALENDAR\u003c/td\u003e\n        \u003ctd\u003eAllows the app to read the user\u0026#39;s calendar data.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eWRITE_CALENDAR\u003c/td\u003e\n        \u003ctd\u003eAllows the app to write the user\u0026#39;s calendar data. Used to automatically set reminders.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eREAD_EXTERNAL_STORAGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to read from external storage. Used to pick images from gallery with payment QRCode.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eWRITE_EXTERNAL_STORAGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to write to external storage. Used to store images, certificates, etc.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eUSE_FINGERPRINT\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use fingerprint hardware for biometric identification required from API level 23 until API level 28\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eUSE_BIOMETRIC\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use device\u0026#39;s available biometric identification system (Face unlock, Iris unlock, Fingerprint) required from API Level 28.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eSCHEDULE_EXACT_ALARM\u003c/td\u003e\n      \u003ctd\u003eAllows the app to send local notifications.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003eDOWNLOAD_WITHOUT_NOTIFICATION\u003c/td\u003e\n      \u003ctd\u003eAllows the app to download files in background without promping a notification.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003ePOST_NOTIFICATIONS\u003c/td\u003e\n      \u003ctd\u003eAllows the app to post notifications. Used for push notification.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e                                     \n\nBelow there are the permissions required by the main android hardware manufacturers. Mainly used to manage notification badge icons.\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePermission (manufacturer)\u003c/td\u003e\n        \u003ctd\u003eUsage / Meaning\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.google.android.c2dm.permission.RECEIVE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to receive a broadcast from a GCM server that contains a GCM message. Used for push notification.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to recognize where the app was installed from. Used for Firebase.\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n        \u003ctd\u003ecom.anddoes.launcher.permission.UPDATE_COUNT\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.htc.launcher.permission.READ_SETTINGS\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.htc.launcher.permission.UPDATE_SHORTCUT\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.huawei.android.launcher.permission.CHANGE_BADGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.huawei.android.launcher.permission.READ_SETTINGS\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.huawei.android.launcher.permission.WRITE_SETTINGS\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.majeur.launcher.permission.UPDATE_BADGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.oppo.launcher.permission.READ_SETTINGS\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.oppo.launcher.permission.WRITE_SETTINGS\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badgee.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.sec.android.provider.badge.permission.READ\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.sec.android.provider.badge.permission.WRITE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.sonyericsson.home.permission.BROADCAST_BADGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecom.sonymobile.home.permission.PROVIDER_INSERT_BADGE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eme.everything.badger.permission.BADGE_COUNT_READ\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eme.everything.badger.permission.BADGE_COUNT_WRITE\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use notification badges.\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n      \u003ctd\u003ecom.android.vending.CHECK_LICENSE\u003c/td\u003e\n      \u003ctd\u003eAllows the app to access Google Play Licensing.\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n      \u003ctd\u003ecom.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY\u003c/td\u003e\n      \u003ctd\u003eAllows the app to use the Samsung Developer SDK. Used for Samsung biometric identification.\u003c/td\u003e\n    \u003c/tr\u003e\n     \u003ctr\u003e\n      \u003ctd\u003ecom.fingerprints.service.ACCESS_FINGERPRINT_MANAGER\u003c/td\u003e\n      \u003ctd\u003eAllows the app to access the fingerprint hardware for biometric identification.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n   \u003csummary\u003e\u003cb\u003eiOS\u003c/b\u003e\u003c/summary\u003e\n    \u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ePermission\u003c/td\u003e\n        \u003ctd\u003eUsage / Meaning\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSAppleMusicUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the user’s media library.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSBluetoothAlwaysUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use the device’s Bluetooth interface.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSBluetoothPeripheralUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access Bluetooth peripherals and has a deployment target earlier than iOS 13.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSContactsUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access contacts to let you add them in calendar events.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSLocationAlwaysUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the user’s location at all times and deploys to targets earlier than iOS 11.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSLocationUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the user’s location information.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSLocationWhenInUseUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the user’s location information while the app is in use.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSMicrophoneUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use the microphone in case you want to leave a voice note. Used in the assistance flow.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSMotionUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the device’s motion data.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSCalendarsUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the calendar to add event reminders.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSCameraUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use the camera to scan QR codes.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSFaceIDUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use Face ID for biometric identification.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSPhotoLibraryAddUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the user’s photo library.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSPhotoLibraryUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to access the photo library to scan QR codes.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNSSpeechRecognitionUsageDescription\u003c/td\u003e\n        \u003ctd\u003eAllows the app to send user data to Apple’s speech recognition servers. Used in the assistance flow.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eRemote  Notification\u003c/td\u003e\n        \u003ctd\u003eAllows the app to receive remote push notification.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eNFC (Near Field Communication Tag Reading)\u003c/td\u003e\n        \u003ctd\u003eAllows the app to use the NFC.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/table\u003e\n\u003c/details\u003e\n\n# Getting started\n\nThe following sections provide instructions to build and run the app for development purposes.\n\n## Prerequisites\n\n### NodeJS and Ruby\nTo run the project you need to install the correct version of NodeJS and Ruby.\nWe recommend the use of a virtual environment of your choice. For ease of use, this guide adopts [nodenv](https://github.com/nodenv/nodenv) for NodeJS, [rbenv](https://github.com/rbenv/rbenv) for Ruby.\n\nThe node version used in this project is stored in [.node-version](.node-version), \nwhile the version of Ruby is stored in [.ruby-version](.ruby-version).\n\n### React Native\nFollow the [official tutorial](https://reactnative.dev/docs/environment-setup?guide=native) for installing the `React Native CLI` for your operating system.\n\nIf you have a macOS system, you can follow both the tutorial for iOS and for Android. If you have a Linux or Windows system, you need only to install the development environment for Android.\n\n## Build the app\nIn order to build the app, we use [pnpm](https://pnpm.io/) for managing javascript dependencies. \nAs stated [previously](#nodejs-and-ruby), we also use `nodenv` and `rbenv` for managing the environment:\n```bash\n# Clone the repository\n$ git clone https://github.com/pagopa/io-app\n\n# CD into the repository\n$ cd io-app\n\n# Install NodeJS with nodenv, the returned version should match the one in the .node-version file\n$ nodenv install \u0026\u0026 nodenv version\n\n# Install Ruby with rbenv, the returned version should match the one in the .ruby-version file\n$ rbenv install \u0026\u0026 rbenv version\n\n# Enable corepack and prepare pnpm\n$ corepack enable\n$ corepack prepare --activate\n\n# Install bundle\n$ gem install bundle\n\n# Install the required Gems from the Gemfile\n# Run this only during the first setup and when Gems dependencies change\n$ bundle install\n\n# Install dependencies \n# Run this only during the first setup and when JS dependencies change\n$ pnpm install\n\n# Install podfiles when targeting iOS (ignore this step for Android)\n# Run this only during the first setup and when Pods dependencies change\n$ pnpm dev:pod-install\n\n# Generate the definitions from the OpenAPI specs and from the YAML translations\n# Run this only during the first setup and when specs/translations change\n$ pnpm generate\n```\n\n## Environment variables\n\n### Production\nYou can target the production server by copying the included `.env.production` file to `.env`:\n\n```bash\n$ cp .env.production .env\n```\n\n\u003e [!NOTE]\n\u003e The sample configuration sets the app to interface with our test environment, on which we work continuously; therefore, it may occur that some features are not always available or fully working. Check the comments in the file for more informations about environment variables.\n\n### io-dev-api-server\nYou can also target the [io-dev-api-server](https://github.com/pagopa/io-dev-api-server) for development purposes by copying the included `.env.local` file to `.env`:\n\n```bash\n$ cp .env.local .env\n```\n\n## Run the app\n### Android Emulator\nAn Android Emulator must be [created and launched manually](https://developer.android.com/studio/run/managing-avds).\n\nAn additional step is necessary because the Android emulator doesn't support the hardware-backed keystore. We've included a script in our `package.json` to comment out this check:\n```bash\n# Disable hardware-backed keystore check before running the emulator\npnpm lollipop_checks:comment\n```\n\n\u003e[!CAUTION] \n\u003e Always remember to run `pnpm lollipop_checks:uncomment` or discard the changes before opening a PR.\n\u003e To automatically revert the changes, run the following command:\n\u003e ```bash\n\u003e # Re-enable hardware-backed keystore check before committing\n\u003e pnpm lollipop_checks:uncomment\n\u003e ```\n\u003e This is an important check that must be kept enabled.\n\u003e A double check is done by tests in the CI pipeline.\n\nThen, from your command line, run these commands:\n```bash\n# Perform the port forwarding\n$ adb reverse tcp:8081 tcp:8081;adb reverse tcp:3000 tcp:3000;adb reverse tcp:9090 tcp:9090\n\n# Run Android build\n$ pnpm dev:run-android\n```\n\n### iOS Simulator\n```bash\n# Run iOS build\n$ pnpm run-ios\n```\n\n### Physical devices\nThe React Native documentation provides a [useful guide](https://reactnative.dev/docs/running-on-device) for running projects on physical devices.\n\u003e [!IMPORTANT]  \n\u003e For building the app on an iOS physical device, a few additional steps are necessary:\n\u003e - If you're not part of the PagoPA S.p.A. organization then you must change the `Bundle Identifier` to something unique. This adjustment can be made in the `Signing (Debug)`\n\u003e section of Xcode;\n\u003e - In order to test the CIE authentication flow, run `pnpm cie-ios:prod` before building the app. The process can be reverted by running `pnpm cie-ios:dev`.\n\n\n\n## Troubleshooting\nThis section lists possible solutions to problems you might encounter while building the app.\n\u003cdetails\u003e\n\u003csummary\u003eiOS build\u003c/summary\u003e\n\n-   ```\n    error: redefinition of module 'YogaKit' build Failed\n    ```\n    Restart your machine to fix the issue.\n\n    ---\n\n-   ```\n    error No simulator available with name \"iPhone 13\".\n    ```\n    This happens because new versions of Xcode do not automatically create a simulator for the iPhone 13. \n    To fix the issue you can either create a new simulator and name it `iPhone 13` or run the command `pnpm run-ios --simulator='a valid simulator name'`.\n\n    ---\n\n-   ```\n    Application launch for 'it.pagopa.app.io' did not return a valid pid nor a launch error. Domain: NSPOSIXErrorDomain Code: 3 Failure Reason: No such process User Info: { DVTErrorCreationDateKey = \"2022-01-25 12:02:41 +0000\"; IDERunOperationFailingWorker = IDELaunchiPhoneSimulatorLauncher; }\n    ```\n    This happens on Apple Silicon CPUs because some `Pods` do not implement the `XCFramework` yet. Install `Rosetta` by running `softwareupdate --install-rosetta` to fix the issue.\n\n    ---\n\u003c/details\u003e\n\n# Architecture\n\n## Main technologies used\n\n* [TypeScript](https://www.typescriptlang.org/)\n* [React Native](https://facebook.github.io/react-native)\n* [Redux](http://redux.js.org/)\n* [Redux Saga](https://redux-saga.js.org/)\n\n\n## SPID Authentication\n\nThe application relies on a [backend](https://github.com/pagopa/io-backend) for the authentication through SPID (the Public System for Digital Identity) and for interacting with the other components and APIs that are part of the [digital citizenship project](https://github.com/teamdigitale/digital-citizenship).\n\nThe backend implements a SAML2 Service Provider that deals with user authentication with the SPID Identity Providers (IdP).\n\nThe authentication between the application and the backend takes place via a session token, generated by the backend at the time of the authentication with the SPID IdP.\n\nOnce the backend communicates the session token to the application, it is used for all subsequent calls that the application makes to the API exposed by the backend.\n\nThe authentication flow is as follows:\n\n1. The user selects the IdP;\n1. The app opens a webview on the SAML SP authentication endpoint implemented in the backend, which specifies: the entity ID of the IdP selected by the user and, as returns URL, the URL of the endpoint that generates a new session token.\n1. The SAML SP logic takes over the authentication process by redirecting the user to the chosen IdP.\n1. After the authentication, a redirect is made from the IdP to the backend endpoint that deals with the generation of a new session token.\n1. The endpoint that generates a new token receives the SPID attributes via the HTTP header; then, it generates a new random session token and returns to the webview an HTTP redirect to an URL well-known containing the session token.\n1. The app, which monitors the webview, intercepts this URL before the HTTP request is made, extracts the session token and ends the authentication flow by closing the webview.\n1. Next, the session token is used by the app to make calls to the backend API.\n\n## Deep linking\n\n\u003e [!note]\n\u003e For an improved user experience, we recommend using the App/Universal Link `https://continua.io.pagopa.it` instead of the custom scheme `ioit://`.\n\nThe application is able to manage _deep links_. [Deep linking](https://reactnavigation.org/docs/5.x/deep-linking) allows opening the app or a specific screen once a user clicks on specific URL. The URL scheme for io-app is: `ioit://`.\n\u003cdetails\u003e\n    \u003csummary\u003eSupported URLs\u003c/summary\u003e\n    \u003ch3\u003emain\u003c/h3\u003e\n    \u003ctable\u003e\n         \u003ctr\u003e\n            \u003ctd\u003eioit://main/messages\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://main/services\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/table\u003e\n    \u003ch3\u003ewallet\u003c/h3\u003e\n    \u003ctable\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://wallet\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://wallet/payments-history\u003c/td\u003e\n        \u003ctr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://wallet/card-onboarding-attempts\u003c/td\u003e\n        \u003ctr\u003e\n    \u003c/table\u003e\n    \u003ch3\u003eservices\u003c/h3\u003e\n    \u003ctable\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://services/service-detail?serviceId=:id\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/table\u003e\n    \u003ch3\u003eprofile\u003c/h3\u003e\n    \u003ctable\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://profile \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://profile/preferences \u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://profile/privacy\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://profile/privacy-main\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/table\u003e\n    \u003ch3\u003efci\u003c/h3\u003e\n    \u003ctable\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://fci/main?signatureRequestId=:id\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://fci/signature-requests\u003c/td\u003e\n        \u003c/tr\u003e\n        \u003ctr\u003e\n            \u003ctd\u003eioit://cgn-details/categories-merchant/:category\u003c/td\u003e\n        \u003c/tr\u003e\n    \u003c/table\u003e\n\u003c/details\u003e\n\n## Design System\nThe entire app is built using custom components included in the external [`io-app-design-system`](https://github.com/pagopa/io-app-design-system/) library. This library uses the latest React Native APIs and is tailored to our specific needs.\n\n### Frequently Asked Questions\n\n#### Why is the app not optimized for high refresh rate devices (90-120 Hz and above)?\n\nWe're committed to providing a faster and more satisfying experience for our citizens, but because we didn't build the app using fully native APIs, this goal is not easy to achieve. For iOS, we have already enabled the full range of refresh rates by setting `CADisableMinimumFrameDurationOnPhone` to `true`, as recommended by Apple [in their documentation](https://developer.apple.com/documentation/quartzcore/optimizing-promotion-refresh-rates-for-iphone-13-pro-and-ipad-pro).\n\nThe perception of slowness is mainly due to the navigation architecture, which is actually handled by the `react-navigation` library. Our internal testing has shown that there's a pretty obvious difference between the default `Stack` navigation and the `NativeStack`, which uses native APIs underneath. The latter is currently only enabled in the **Design System** section, which isn't accessible to everyone because it's only visible when developer mode is enabled.\n\n---\n\nIf you want to improve the `io-app-design-system` library, feel free to contribute by opening an issue with your suggestions or by directly opening a PR. Criticism is welcome and appreciated.\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpagopa%2Fio-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpagopa%2Fio-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpagopa%2Fio-app/lists"}