Performance issues on iOS

Hello Ionic Community,

I’m experiencing performance issues with my Ionic app that seem to be device-specific. The app runs smoothly on all Android devices and newer iPhones. However, on older iPhones and iPads (regardless of age), I’m facing significant performance challenges.
For the iPhones the issue mainly persists for devices that run iOS 15 and below. For the iPads the iOS version doesn’t make much of a difference.

The main problems are:

  • Animations are not smooth on iPads.
  • Navigation takes a long time due to slow data retrieval from the cache, causing the app to wait for the data to load.

I’ve narrowed down the issue to the animations and data loading processes, but I’m unsure how to proceed in optimizing for the affected devices.

Here is my package.json:
“dependencies”: {
@angular-devkit/schematics”: “^15.2.6”,
@angular/animations”: “^15.2.8”,
@angular/cdk”: “^15.2.8”,
@angular/common”: “^15.2.8”,
@angular/core”: “^15.2.8”,
@angular/fire”: “^7.5.0”,
@angular/forms”: “^15.2.8”,
@angular/localize”: “^15.2.8”,
@angular/material”: “^15.2.8”,
@angular/platform-browser”: “^15.2.8”,
@angular/platform-browser-dynamic”: “^15.2.8”,
@angular/router”: “^15.2.8”,
@aspnet/signalr”: “^1.1.4”,
@awesome-cordova-plugins/android-permissions”: “^5.43.0”,
@awesome-cordova-plugins/core”: “^5.40.0”,
@awesome-cordova-plugins/diagnostic”: “^5.40.0”,
@awesome-cordova-plugins/nfc”: “^5.43.0”,
@awesome-cordova-plugins/wifi-wizard-2”: “^5.40.0”,
@byteowls/capacitor-oauth2”: “^4.0.2”,
@capacitor-community/barcode-scanner”: “^3.0.3”,
@capacitor/android”: “^4.0.0”,
@capacitor/app”: “^4.0.0”,
@capacitor/browser”: “^4.0.0”,
@capacitor/core”: “^4.5.0”,
@capacitor/device”: “^4.0.0”,
@capacitor/filesystem”: “^4.0.0”,
@capacitor/ios”: “^4.0.0”,
@capacitor/keyboard”: “^4.0.0”,
@capacitor/local-notifications”: “^4.0.0”,
@capacitor/network”: “^4.0.0”,
@capacitor/preferences”: “^4.0.2”,
@capacitor/push-notifications”: “^4.0.0”,
@capacitor/splash-screen”: “^4.0.0”,
@capacitor/status-bar”: “^4.0.0”,
@ionic-native/android-full-screen”: “^5.29.0”,
@ionic-native/app-rate”: “^5.33.0”,
@ionic-native/app-version”: “^5.32.1”,
@ionic-native/autostart”: “^5.31.1”,
@ionic-native/badge”: “^5.36.0”,
@ionic-native/barcode-scanner”: “^5.34.0”,
@ionic-native/calendar”: “^5.33.1”,
@ionic-native/camera”: “^5.27.0”,
@ionic-native/core”: “^5.0.7”,
@ionic-native/date-picker”: “^5.34.0”,
@ionic-native/file”: “^5.36.0”,
@ionic-native/file-opener”: “^5.36.0”,
@ionic-native/http”: “^5.36.0”,
@ionic-native/in-app-browser”: “^5.33.0”,
@ionic-native/local-notifications”: “^5.27.0”,
@ionic-native/market”: “^5.34.0”,
@ionic-native/mobile-accessibility”: “^5.36.0”,
@ionic-native/native-storage”: “^5.27.0”,
@ionic-native/network”: “^5.30.0”,
@ionic-native/power-management”: “^5.31.1”,
@ionic-native/preview-any-file”: “^5.36.0”,
@ionic-native/screen-orientation”: “^5.34.0”,
@ionic-native/secure-storage”: “^5.31.1”,
@ionic-native/splash-screen”: “^5.0.0”,
@ionic-native/sqlite”: “^5.36.0”,
@ionic-native/sqlite-porter”: “^5.28.0”,
@ionic-native/status-bar”: “^5.0.0”,
@ionic-selectable/angular”: “^5.0.0-alpha.13”,
@ionic-super-tabs/angular”: “^7.0.8”,
@ionic/angular”: “^6.0.8”,
@ionic/cli”: “^6.17.1”,
@ionic/core”: “^6.0.9”,
@ionic/storage”: “^2.3.1”,
@ionic/storage-angular”: “^3.0.6”,
@microsoft/signalr”: “^7.0.5”,
@ngx-translate/core”: “^14.0.0”,
@ngx-translate/http-loader”: “^7.0.0”,
@progress/kendo-angular-buttons”: “^11.6.0”,
@progress/kendo-angular-common”: “^11.6.0”,
@progress/kendo-angular-dateinputs”: “^11.6.0”,
@progress/kendo-angular-dialog”: “^11.6.0”,
@progress/kendo-angular-dropdowns”: “^11.6.0”,
@progress/kendo-angular-inputs”: “^11.6.0”,
@progress/kendo-angular-intl”: “^11.6.0”,
@progress/kendo-angular-l10n”: “^11.6.0”,
@progress/kendo-angular-label”: “^11.6.0”,
@progress/kendo-angular-popup”: “^11.6.0”,
@progress/kendo-angular-scheduler”: “^11.6.0”,
@progress/kendo-data-query”: “^1.6.0”,
@progress/kendo-date-math”: “^1.5.10”,
@progress/kendo-drawing”: “^1.17.5”,
@progress/kendo-licensing”: “^1.3.0”,
@progress/kendo-recurrence”: “^1.0.3”,
@progress/kendo-theme-default”: “^6.3.0”,
@progress/kendo-theme-material”: “^6.3.0”,
@teamhive/lottie-player”: “^1.0.0”,
“angular-draggable-droppable”: “^8.0.0”,
“axios”: “^1.3.6”,
“capacitor-rate-app”: “^3.0.0”,
“capacitor-secure-storage-plugin”: “^0.8.1”,
“cocoapods”: “^0.0.0”,
“cordova-plugin-advanced-http”: “^2.5.1”,
“cordova-plugin-android-permissions”: “^1.1.3”,
“cordova-plugin-app-version”: “^0.1.12”,
“cordova-plugin-apprate”: “^1.7.2”,
“cordova-plugin-autostart”: “^2.3.0”,
“cordova-plugin-badge”: “^0.8.8”,
“cordova-plugin-calendar”: “^5.1.5”,
“cordova-plugin-camera”: “^4.1.0”,
“cordova-plugin-device”: “^2.0.3”,
“cordova-plugin-dialogs”: “^2.0.2”,
“cordova-plugin-doze-optimize”: “^0.5.4”,
“cordova-plugin-file”: “^6.0.2”,
“cordova-plugin-file-opener2”: “^3.0.5”,
“cordova-plugin-firebase-crashlytics”: “github:remosti/cordova-plugin-firebase-crashlytics”,
“cordova-plugin-fullscreen”: “^1.3.0”,
“cordova-plugin-inappbrowser”: “^5.0.0”,
“cordova-plugin-market”: “^1.2.0”,
“cordova-plugin-nativestorage”: “^2.3.2”,
“cordova-plugin-network-information”: “^2.0.2”,
“cordova-plugin-powermanagement-orig”: “github:remosti/cordova-plugin-powermanagement”,
“cordova-plugin-preview-any-file”: “^0.1.7”,
“cordova-plugin-screen-orientation”: “^3.0.2”,
“cordova-plugin-secure-storage-echo”: “^5.1.1”,
“cordova-plugin-wifiwizard2”: “^3.1.1”,
“cordova-res”: “^0.15.1”,
“cordova-sqlite-storage”: “^6.0.0”,
“cordova.plugins.diagnostic”: “^6.1.1”,
“es6-promise-plugin”: “^4.2.2”,
“firebase”: “^9.20.0”,
“i”: “^0.3.7”,
“install”: “^0.13.0”,
“ionic-cache”: “^5.2.0”,
“ionic-native-http-connection-backend”: “^8.0.0”,
“ionic-selectable”: “^4.8.0”,
“jquery”: “^3.6.4”,
“moment”: “^2.29.4”,
“ng-circle-progress”: “^1.7.1”,
“ng-otp-input”: “^1.8.5”,
“ngx-order-pipe”: “^2.2.0”,
“phonegap-nfc”: “github:somq/phonegap-nfc#fix/nfc-launch”,
“phonegap-plugin-mobile-accessibility”: “^1.0.5”,
“rxfire”: “^6.0.3”,
“rxjs”: “^7.8.0”,
“signalr”: “^2.4.3”,
“sweetalert2”: “^11.7.3”,
“ts-md5”: “^1.3.1”,
“tslib”: “^2.5.0”,
“typings”: “^2.1.1”,
“uk.co.workingedge.cordova.plugin.sqliteporter”: “^1.1.1”,
“zone.js”: “^0.13.0”
},
“devDependencies”: {
@angular-devkit/build-angular”: “^15.2.6”,
@angular/cli”: “15.2.6”,
@angular/compiler”: “^15.2.8”,
@angular/compiler-cli”: “^15.2.8”,
@angular/language-service”: “^15.2.8”,
@capacitor/cli”: “^4.0.0”,
@ionic/angular-toolkit”: “^9.0.0”,
@ionic/app-scripts”: “^3.2.4”,
@ionic/lab”: “3.1.7”,
@types/jasmine”: “~3.5.0”,
@types/jasminewd2”: “~2.0.3”,
@types/jquery”: “^3.5.0”,
@types/node”: “^12.11.1”,
@types/signalr”: “^2.2.36”,
“codelyzer”: “^5.1.2”,
“jasmine-core”: “~3.5.0”,
“jasmine-spec-reporter”: “~5.0.0”,
“jetifier”: “^1.6.8”,
“karma”: “~6.3.16”,
“karma-chrome-launcher”: “~3.1.0”,
“karma-coverage-istanbul-reporter”: “~3.0.2”,
“karma-jasmine”: “~4.0.0”,
“karma-jasmine-html-reporter”: “^1.5.0”,
“protractor”: “~7.0.0”,
“ts-node”: “~8.3.0”,
“tslint”: “~6.1.0”,
“typescript”: “^4.8.0”
}

And here’s the output from the ionic info command:

Ionic CLI : 7.1.1 (C:\Users\joel.sahli\AppData\Roaming\npm\node_modules@ionic\cli)
Ionic Framework : @ionic/angular 7.2.0
@angular-devkit/build-angular : 16.1.5
@angular-devkit/schematics : 16.1.5
@angular/cli : 16.1.5
@ionic/angular-toolkit : 10.0.0

Capacitor:

Capacitor CLI : 5.2.2
@capacitor/android : 5.2.2
@capacitor/core : 5.2.2
@capacitor/ios : 5.2.2

Utility:

cordova-res : 0.15.4
native-run : 1.7.4

System:

NodeJS : v18.18.2 (C:\Program Files\nodejs\node.exe)
npm : 9.8.1
OS : Windows 10

I’ve tried various approaches to resolve these issues, including reviewing the caching logic and ensuring efficient data retrieval, but the problems persist. I would appreciate any insights or suggestions from the community on how to tackle these performance issues, especially on older iPhones and iPads. If I can provide any further information please let me know.

Thank you in advance for your help!

Hmmmm…not sure on performance. It kinda just sounds like you are trying to do too much at once where the device is slowing down. I think we would need some more info on how you are doing the “data retrieval from the cache” part.

A few other items that I noticed though.

  • You have a ton of native plugins installed, are you actually using all of them?
  • @ionic-native is dead and was replaced by @awesome-cordova-plugins - see A New Chapter for @ionic-native - Ionic Blog
  • You have duplicate plugins, like @ionic-native/local-notifications and @capacitor/local-notifications or @capacitor/splash-screen and @ionic-native/splash-screen
  • ionic info shows Capacitor 5 but yet your package.json is showing v4.

Also to add what @twestrick stated, you have Kendo UI components, SignalR…etc… all types of libs that need some attention to. Mix of ionic-native and awesome-cordova-plugins. Man this is a mess. Project needs to be fully cleaned up before looking into ANY performance fixes.

In my opinion, using an additional framework alongside an existing one (such as Ionic) can introduce inconsistent design patterns and functionality across the app that the user will find annoying.

1 Like

I also wanted to ask the same question, thank you for asking.