Digital Citizenship aims at bringing citizens to the center of the Italian public administrations services.
The project comprises two main components:
The Digital Citizenship mobile app is a native mobile application for iOS and Android with a dual purpose:
The development of the app is carried out by several contributors:
Sure! However you will need a SPID account or have a CIE to login to the app.
Reporting bugs, bug fixes, translations and generally any improvement is welcome! Send us a Pull Request!
Because 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.
Permission (android.permission.*) | Usage / Meaning |
INTERNET | Allows the app to open network sockets (e.g. simple internet connectivity) |
ACCESS_NETWORK_STATE | Allows the app to access information about networks (e.g. details about connection quality/state) |
CAMERA | Allows the app to access device camera to scan QR codes |
NFC | Allows the app to perform I/O operations over NFC |
RECEIVE_BOOT_COMPLETED | Allows the app to receive the Intent.ACTION_BOOT_COMPLETED that is broadcast after the system finishes booting. Used for push notification. |
VIBRATE | Allows the app to access the vibration motor. This allow the application to emit vibration. |
WAKE_LOCK | Allows the app to use PowerManager WakeLocks to keep processor from sleeping or screen from dimming. Used for push notification. |
READ_APP_BADGE | Allows the app to show notification badges on its icon. |
READ_CALENDAR | Allows the app to read the user's calendar data. |
WRITE_CALENDAR | Allows the app to write the user's calendar data. Used to automatically set reminders. |
READ_EXTERNAL_STORAGE | Allows the app to read from external storage. Used to pick images from gallery with payment QRCode. |
WRITE_EXTERNAL_STORAGE | Allows the app to write to external storage. Used to store images, certificates, etc. |
USE_FINGERPRINT | Allows the app to use fingerprint hardware for biometric identification required from API level 23 until API level 28 |
USE_BIOMETRIC | Allows the app to use device's available biometric identification system (Face unlock, Iris unlock, Fingerprint) required from API Level 28. |
SCHEDULE_EXACT_ALARM | Allows the app to send local notifications. |
DOWNLOAD_WITHOUT_NOTIFICATION | Allows the app to download files in background without promping a notification. |
POST_NOTIFICATIONS | Allows the app to post notifications. Used for push notification. |
Permission (manufacturer) | Usage / Meaning |
com.google.android.c2dm.permission.RECEIVE | Allows the app to receive a broadcast from a GCM server that contains a GCM message. Used for push notification. |
com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE | Allows the app to recognize where the app was installed from. Used for Firebase. |
com.anddoes.launcher.permission.UPDATE_COUNT | Allows the app to use notification badges. |
com.htc.launcher.permission.READ_SETTINGS | Allows the app to use notification badges. |
com.htc.launcher.permission.UPDATE_SHORTCUT | Allows the app to use notification badges. |
com.huawei.android.launcher.permission.CHANGE_BADGE | Allows the app to use notification badges. |
com.huawei.android.launcher.permission.READ_SETTINGS | Allows the app to use notification badges. |
com.huawei.android.launcher.permission.WRITE_SETTINGS | Allows the app to use notification badges. |
com.majeur.launcher.permission.UPDATE_BADGE | Allows the app to use notification badges. |
com.oppo.launcher.permission.READ_SETTINGS | Allows the app to use notification badges. |
com.oppo.launcher.permission.WRITE_SETTINGS | Allows the app to use notification badgee. |
com.sec.android.provider.badge.permission.READ | Allows the app to use notification badges. |
com.sec.android.provider.badge.permission.WRITE | Allows the app to use notification badges. |
com.sonyericsson.home.permission.BROADCAST_BADGE | Allows the app to use notification badges. |
com.sonymobile.home.permission.PROVIDER_INSERT_BADGE | Allows the app to use notification badges. |
me.everything.badger.permission.BADGE_COUNT_READ | Allows the app to use notification badges. |
me.everything.badger.permission.BADGE_COUNT_WRITE | Allows the app to use notification badges. |
com.android.vending.CHECK_LICENSE | Allows the app to access Google Play Licensing. |
com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY | Allows the app to use the Samsung Developer SDK. Used for Samsung biometric identification. |
com.fingerprints.service.ACCESS_FINGERPRINT_MANAGER | Allows the app to access the fingerprint hardware for biometric identification. |
Permission | Usage / Meaning |
NSAppleMusicUsageDescription | Allows the app to access the user’s media library. |
NSBluetoothAlwaysUsageDescription | Allows the app to use the device’s Bluetooth interface. |
NSBluetoothPeripheralUsageDescription | Allows the app to access Bluetooth peripherals and has a deployment target earlier than iOS 13. |
NSContactsUsageDescription | Allows the app to access contacts to let you add them in calendar events. |
NSLocationAlwaysUsageDescription | Allows the app to access the user’s location at all times and deploys to targets earlier than iOS 11. |
NSLocationUsageDescription | Allows the app to access the user’s location information. |
NSLocationWhenInUseUsageDescription | Allows the app to access the user’s location information while the app is in use. |
NSMicrophoneUsageDescription | Allows the app to use the microphone in case you want to leave a voice note. Used in the assistance flow. |
NSMotionUsageDescription | Allows the app to access the device’s motion data. |
NSCalendarsUsageDescription | Allows the app to access the calendar to add event reminders. |
NSCameraUsageDescription | Allows the app to use the camera to scan QR codes. |
NSFaceIDUsageDescription | Allows the app to use Face ID for biometric identification. |
NSPhotoLibraryAddUsageDescription | Allows the app to access the user’s photo library. |
NSPhotoLibraryUsageDescription | Allows the app to access the photo library to scan QR codes. |
NSSpeechRecognitionUsageDescription | Allows the app to send user data to Apple’s speech recognition servers. Used in the assistance flow. |
Remote Notification | Allows the app to receive remote push notification. |
NFC (Near Field Communication Tag Reading) | Allows the app to use the NFC. |
The following sections provide instructions to build and run the app for development purposes.
To run the project you need to install the correct version of NodeJS and Ruby. We recommend the use of a virtual environment of your choice. For ease of use, this guide adopts nodenv for NodeJS, rbenv for Ruby.
The node version used in this project is stored in .node-version, while the version of Ruby is stored in .ruby-version.
Follow the official tutorial for installing the React Native CLI
for your operating system.
If 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.
In order to build the app, we use yarn for managing javascript dependencies.
As stated previously, we also use nodenv
and rbenv
for managing the environment:
# Clone the repository
$ git clone https://github.com/pagopa/io-app
# CD into the repository
$ cd io-app
# Install NodeJS with nodenv, the returned version should match the one in the .node-version file
$ nodenv install && nodenv version
# Install Ruby with rbenv, the returned version should match the one in the .ruby-version file
$ rbenv install && rbenv version
# Install yarn and rehash to install shims
$ npm install -g yarn && nodenv rehash
# Install bundle
$ gem install bundle
# Install the required Gems from the Gemfile
# Run this only during the first setup and when Gems dependencies change
$ bundle install
# Install dependencies
# Run this only during the first setup and when JS dependencies change
$ yarn install
# Install podfiles when targeting iOS (ignore this step for Android)
# Run this only during the first setup and when Pods dependencies change
$ cd iOS && bundle exec pod install && cd ..
# Generate the definitions from the OpenAPI specs and from the YAML translations
# Run this only during the first setup and when specs/translations change
$ yarn generate
You can target the production server by copying the included .env.production
file to .env
:
$ cp .env.production .env
[!NOTE] 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.
You can also target the io-dev-api-server for development purposes by copying the included .env.local
file to .env
:
$ cp .env.local .env
An Android Emulator must be created and launched manually.
An 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:
# Disable hardware-backed keystore check before running the emulator
yarn lollipop_checks:comment
[!CAUTION] Always remember to run
yarn lollipop_checks:uncomment
or discard the changes before opening a PR. To automatically revert the changes, run the following command:# Re-enable hardware-backed keystore check before committing yarn lollipop_checks:uncomment
This is an important check that must be kept enabled. A double check is done by tests in the CI pipeline.
Then, from your command line, run these commands:
# Perform the port forwarding
$ adb reverse tcp:8081 tcp:8081;adb reverse tcp:3000 tcp:3000;adb reverse tcp:9090 tcp:9090
# Run Android build
$ yarn run-android
# Run iOS build
$ yarn run-ios
The React Native documentation provides a useful guide for running projects on physical devices.
[!IMPORTANT]
For building the app on an iOS physical device, a few additional steps are necessary:
- Navigate to
Build Phases
in Xcode and expandBundle React Native code and images
. Update theNODE_BINARY
variable with the path to your Node.js environment. You can find the correct path by runningwhich node
in a terminal from the app's root directory;- 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 theSigning (Debug)
section of Xcode;- In order to test the CIE authentication flow, run
yarn cie-ios:prod
before building the app. The process can be reverted by runningyarn cie-ios:dev
.
This section lists possible solutions to problems you might encounter while building the app.
The application relies on a 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.
The backend implements a SAML2 Service Provider that deals with user authentication with the SPID Identity Providers (IdP).
The 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.
Once 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.
The authentication flow is as follows:
The application is able to manage deep links. 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://
.
ioit://main/messages |
ioit://main/services |
ioit://main/profile |
ioit://wallet |
ioit://wallet/payments-history |
ioit://wallet/card-onboarding-attempts |
ioit://services/service-detail?serviceId=:id |
ioit://profile |
ioit://profile/preferences |
ioit://profile/privacy |
ioit://profile/privacy-main |
ioit://fci/main?signatureRequestId=:id |
ioit://fci/signature-requests |
ioit://cgn-details/categories-merchant/:category |
We have been gradually rolling out a new library of custom components since Q1 2023. This library uses the latest React Native APIs and replaces the legacy native-base
library, which was stuck at v2.x
.
You can access the new library through the external io-app-design-system
package.