“Cannot read property toLowerCase of undefined” on ionic build ios

I get “Cannot read property toLowerCase of undefined” error if I try to build ios in Ionic3 with the following command: ionic cordova build ios .

Here the log with --verbose:

> ionic-app-scripts build --target cordova --platform ios
[12:09:39]  ionic-app-scripts 3.1.11 
[12:09:39]  build dev started ... 
[12:09:39]  clean started ... 
[12:09:39]  clean finished in 4 ms 
[12:09:39]  copy started ... 
[12:09:39]  deeplinks started ... 
[12:09:40]  deeplinks finished in 104 ms 
[12:09:40]  transpile started ... 
[12:09:43]  transpile finished in 3.15 s 
[12:09:43]  preprocess started ... 
[12:09:43]  preprocess finished in less than 1 ms 
[12:09:43]  webpack started ... 
[12:09:43]  copy finished in 3.42 s 
[12:09:55]  webpack finished in 11.83 s 
[12:09:55]  sass started ... 
Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning.
[12:09:57]  sass finished in 2.10 s 
[12:09:57]  postprocess started ... 
[12:09:57]  postprocess finished in 9 ms 
[12:09:57]  lint started ... 
[12:09:57]  build dev finished in 17.38 s 
[12:10:02]  tslint: src/pages/lastname/lastname.ts, line: 43 
            'NameCollection' is declared but its value is never read. 

      L42:  private AccountDoc: AngularFirestoreDocument<Account>;
      L43:  private NameCollection: AngularFirestoreCollection<Name>;
      L44:  private NameDoc: AngularFirestoreDocument<Name>;

            Property 'iap' is declared but its value is never read. 

[12:10:02]  tslint: src/pages/lastname/lastname.ts, line: 56 
      L56:  e http: HttpClient, private platform: Platform, private iap: InAppPurchase, private storage: Storage, privat

            Property 'translateService' is declared but its value is never read. 

[12:10:02]  tslint: src/app/app.component.ts, line: 28 
      L28:  reen, private storage: Storage, private afs: AngularFirestore, private translateService: TranslateService) {
      L29:      platform.ready().then(() => {

[12:10:02]  tslint: src/app/app.component.ts, line: 13 
            All imports on this line are unused. 

      L12:  import 'rxjs/add/operator/take';
      L13:  import { take } from 'rxjs/operators/take'

[12:10:02]  lint finished in 5.36 s 
> cordova build ios
[iOS] Setting main language to: English
[iOS] Setting also additional languagees to: it,de,en
Error: Cannot read property 'toLowerCase' of undefined
[ERROR] An error occurred while running subprocess cordova.

        cordova build ios exited with exit code 1.

        Re-running this command with the --verbose flag may provide more information.
➜  originjw git:(master) ✗ ionic cordova build ios --verbose                  
  ionic:cli-utils Terminal info: { tty: true, ci: false } +0ms
  ionic:cli-utils CLI global options: { _: [ 'cordova', 'build', 'ios' ], help: null, h: null, verbose: true, quiet: null, interactive: true, color: true, confirm: null, json: null, project: null, '--': [] } +3ms
  ionic:cli-utils:lib:project Project type from config: Ionic Angular 3 (ionic-angular) +0ms
  ionic:cli-utils Project name: undefined +285ms
  ionic:cli Context: { binPath: '/usr/local/lib/node_modules/ionic/bin/ionic', libPath: '/usr/local/lib/node_modules/ionic', execPath: '/Users/Daniele/Berufliches/JW Projects/OriginJW/originjw', version: '4.1.0' } +0ms
  ionic:cli-utils:lib:integrations:cordova:config Using config.xml: /Users/Daniele/Berufliches/JW Projects/OriginJW/originjw/config.xml +0ms
  ionic:cli-utils:lib:hooks Looking for ionic:build:before npm script. +0ms
  ionic:cli-utils:lib:project:ionic-angular:build Looking for ionic:build npm script. +0ms
  ionic:cli-utils:lib:project:ionic-angular:build Found ionic:build, but it is the default. Not running. +11ms
> ionic-app-scripts build --target cordova --platform ios
[12:10:31]  ionic-app-scripts 3.1.11 
[12:10:31]  build dev started ... 
[12:10:31]  clean started ... 
[12:10:31]  clean finished in 6 ms 
[12:10:31]  copy started ... 
[12:10:31]  deeplinks started ... 
[12:10:31]  deeplinks finished in 116 ms 
[12:10:31]  transpile started ... 
[12:10:35]  transpile finished in 3.27 s 
[12:10:35]  preprocess started ... 
[12:10:35]  preprocess finished in less than 1 ms 
[12:10:35]  webpack started ... 
[12:10:35]  copy finished in 3.63 s 
[12:10:47]  webpack finished in 12.26 s 
[12:10:47]  sass started ... 
Without `from` option PostCSS could generate wrong source map and will not find Browserslist config. Set it to CSS file path or to `undefined` to prevent this warning.
[12:10:49]  sass finished in 1.74 s 
[12:10:49]  postprocess started ... 
[12:10:49]  postprocess finished in 10 ms 
[12:10:49]  lint started ... 
[12:10:49]  build dev finished in 17.66 s 
[12:10:53]  tslint: src/pages/lastname/lastname.ts, line: 43 
            'NameCollection' is declared but its value is never read. 

      L42:  private AccountDoc: AngularFirestoreDocument<Account>;
      L43:  private NameCollection: AngularFirestoreCollection<Name>;
      L44:  private NameDoc: AngularFirestoreDocument<Name>;

            Property 'iap' is declared but its value is never read. 

[12:10:53]  tslint: src/pages/lastname/lastname.ts, line: 56 
      L56:  e http: HttpClient, private platform: Platform, private iap: InAppPurchase, private storage: Storage, privat

            Property 'translateService' is declared but its value is never read. 

[12:10:53]  tslint: src/app/app.component.ts, line: 28 
      L28:  reen, private storage: Storage, private afs: AngularFirestore, private translateService: TranslateService) {
      L29:      platform.ready().then(() => {

[12:10:53]  tslint: src/app/app.component.ts, line: 13 
            All imports on this line are unused. 

      L12:  import 'rxjs/add/operator/take';
      L13:  import { take } from 'rxjs/operators/take'

[12:10:53]  lint finished in 4.32 s 
  ionic:cli-utils:lib:hooks Looking for ionic:build:after npm script. +25s
> cordova build ios --verbose
No scripts found for hook "before_build".
No scripts found for hook "before_prepare".
Checking config.xml and package.json for saved platforms that haven't been added to the project
Config.xml and package.json platforms are the same. No pkg.json modification.
Package.json and config.xml platforms are different. Updating config.xml with most current list of platforms.
PlatformApi successfully found for platform ios
Checking config.xml for saved plugins that haven't been added to the project
Checking for any plugins added to the project that have not been installed in ios platform
No differences found between plugins added to project and installed in ios platform. Continuing...
Generating platform-specific config.xml from defaults for iOS at /Users/Daniele/Berufliches/JW Projects/OriginJW/originjw/platforms/ios/OriginJW/config.xml
Merging project's config.xml into platform-specific iOS config.xml
Merging and updating files from [www, platforms/ios/platform_www] to platforms/ios/www
  copy  www/assets/fonts/ionicons.eot platforms/ios/www/assets/fonts/ionicons.eot (updated file)
  copy  www/assets/fonts/ionicons.scss platforms/ios/www/assets/fonts/ionicons.scss (updated file)
  copy  www/assets/fonts/ionicons.svg platforms/ios/www/assets/fonts/ionicons.svg (updated file)
  copy  www/assets/fonts/ionicons.ttf platforms/ios/www/assets/fonts/ionicons.ttf (updated file)
  copy  www/assets/fonts/ionicons.woff platforms/ios/www/assets/fonts/ionicons.woff (updated file)
  copy  www/assets/fonts/ionicons.woff2 platforms/ios/www/assets/fonts/ionicons.woff2 (updated file)
  copy  www/assets/fonts/noto-sans-bold.ttf platforms/ios/www/assets/fonts/noto-sans-bold.ttf (updated file)
  copy  www/assets/fonts/noto-sans-bold.woff platforms/ios/www/assets/fonts/noto-sans-bold.woff (updated file)
  copy  www/assets/fonts/noto-sans-regular.ttf platforms/ios/www/assets/fonts/noto-sans-regular.ttf (updated file)
  copy  www/assets/fonts/noto-sans-regular.woff platforms/ios/www/assets/fonts/noto-sans-regular.woff (updated file)
  copy  www/assets/fonts/noto-sans.scss platforms/ios/www/assets/fonts/noto-sans.scss (updated file)
  copy  www/assets/fonts/roboto-bold.ttf platforms/ios/www/assets/fonts/roboto-bold.ttf (updated file)
  copy  www/assets/fonts/roboto-bold.woff platforms/ios/www/assets/fonts/roboto-bold.woff (updated file)
  copy  www/assets/fonts/roboto-bold.woff2 platforms/ios/www/assets/fonts/roboto-bold.woff2 (updated file)
  copy  www/assets/fonts/roboto-light.ttf platforms/ios/www/assets/fonts/roboto-light.ttf (updated file)
  copy  www/assets/fonts/roboto-light.woff platforms/ios/www/assets/fonts/roboto-light.woff (updated file)
  copy  www/assets/fonts/roboto-light.woff2 platforms/ios/www/assets/fonts/roboto-light.woff2 (updated file)
  copy  www/assets/fonts/roboto-medium.ttf platforms/ios/www/assets/fonts/roboto-medium.ttf (updated file)
  copy  www/assets/fonts/roboto-medium.woff platforms/ios/www/assets/fonts/roboto-medium.woff (updated file)
  copy  www/assets/fonts/roboto-medium.woff2 platforms/ios/www/assets/fonts/roboto-medium.woff2 (updated file)
  copy  www/assets/fonts/roboto-regular.ttf platforms/ios/www/assets/fonts/roboto-regular.ttf (updated file)
  copy  www/assets/fonts/roboto-regular.woff platforms/ios/www/assets/fonts/roboto-regular.woff (updated file)
  copy  www/assets/fonts/roboto-regular.woff2 platforms/ios/www/assets/fonts/roboto-regular.woff2 (updated file)
  copy  www/assets/fonts/roboto.scss platforms/ios/www/assets/fonts/roboto.scss (updated file)
  copy  www/assets/i18n/de.json platforms/ios/www/assets/i18n/de.json (updated file)
  copy  www/assets/i18n/en.json platforms/ios/www/assets/i18n/en.json (updated file)
  copy  www/assets/i18n/it.json platforms/ios/www/assets/i18n/it.json (updated file)
  copy  www/assets/icon/favicon.ico platforms/ios/www/assets/icon/favicon.ico (updated file)
  copy  www/assets/imgs/JW-Round.png platforms/ios/www/assets/imgs/JW-Round.png (updated file)
  copy  www/assets/imgs/logo.png platforms/ios/www/assets/imgs/logo.png (updated file)
  copy  www/assets/imgs/ministryjwlogo.png platforms/ios/www/assets/imgs/ministryjwlogo.png (updated file)
  copy  www/assets/imgs/tracts/bible.jpg platforms/ios/www/assets/imgs/tracts/bible.jpg (updated file)
  copy  www/assets/imgs/tracts/dead.jpg platforms/ios/www/assets/imgs/tracts/dead.jpg (updated file)
  copy  www/assets/imgs/tracts/family.jpg platforms/ios/www/assets/imgs/tracts/family.jpg (updated file)
  copy  www/assets/imgs/tracts/future.jpg platforms/ios/www/assets/imgs/tracts/future.jpg (updated file)
  copy  www/assets/imgs/tracts/kingdom.jpg platforms/ios/www/assets/imgs/tracts/kingdom.jpg (updated file)
  copy  www/assets/imgs/tracts/suffering.jpg platforms/ios/www/assets/imgs/tracts/suffering.jpg (updated file)
  copy  www/assets/imgs/tracts/website.jpg platforms/ios/www/assets/imgs/tracts/website.jpg (updated file)
  copy  www/assets/imgs/tracts/world.jpg platforms/ios/www/assets/imgs/tracts/world.jpg (updated file)
  copy  www/build/main.css platforms/ios/www/build/main.css (updated file)
  copy  www/build/main.css.map platforms/ios/www/build/main.css.map (updated file)
  copy  www/build/main.js platforms/ios/www/build/main.js (updated file)
  copy  www/build/main.js.map platforms/ios/www/build/main.js.map (updated file)
  copy  www/build/polyfills.js platforms/ios/www/build/polyfills.js (updated file)
  copy  www/build/sw-toolbox.js platforms/ios/www/build/sw-toolbox.js (updated file)
  copy  www/build/vendor.js platforms/ios/www/build/vendor.js (updated file)
  copy  www/build/vendor.js.map platforms/ios/www/build/vendor.js.map (updated file)
  copy  www/index.html platforms/ios/www/index.html (updated file)
  copy  www/manifest.json platforms/ios/www/manifest.json (updated file)
  copy  www/service-worker.js platforms/ios/www/service-worker.js (updated file)
Current launch storyboard CDVLaunchScreen
Not changing launch storyboard setting in info plist.
Wrote out iOS Bundle Identifier "com.ministryjw.originjw" and iOS Bundle Version "1.1.2" to /Users/Daniele/Berufliches/JW Projects/OriginJW/originjw/platforms/ios/OriginJW/OriginJW-Info.plist
No need to update build settings for launch storyboard support.
iOS Product Name has not changed (still "OriginJW")
Updating icons at platforms/ios/OriginJW/Images.xcassets/AppIcon.appiconset/
Updating splash screens at platforms/ios/OriginJW/Images.xcassets/LaunchImage.launchimage/
Updating launch storyboard images at platforms/ios/OriginJW/Images.xcassets/LaunchStoryboard.imageset/
Updating Storyboard image set contents.json
This app does not have additional resource files defined
Prepared iOS project successfully
Executing script found in plugin cordova-plugin-ios-localized-strings for hook "after_prepare": plugins/cordova-plugin-ios-localized-strings/scripts/add_supported_languages.js
Resolving module name for cordova-common => cordova-common
[iOS] Setting main language to: English
[iOS] Setting also additional languagees to: it,de,en
No scripts found for hook "before_compile".
Error: Cannot read property 'toLowerCase' of undefined
[ERROR] An error occurred while running subprocess cordova.

        cordova build ios --verbose exited with exit code 1.

        Re-running this command with the --verbose flag may provide more information.
  ionic:cli-framework:utils:process onBeforeExit handler: process.exit received +0ms
  ionic:cli-framework:utils:process onBeforeExit handler: running 2 queued functions +0ms
  ionic:cli-framework:utils:process onBeforeExit handler: exiting (exit code 1) +68ms

In my code everything is okay - I can start the app well with ionic serve . Do you have an idea what´s the issue?

1 Like

toLowerCase is used in plugins/cordova-plugin-ios-localized-strings/scripts/add_supported_languages.js? if yes, there the value is undefined

No, toLowerCase is not used in this file… :confused:

#!/usr/bin/env node
'use strict';

// Add supported languages for App Store (iTunes)
// v1.0.6
// Automatically adds supported languages to your iOS app
// within the info.plist file after the `prepare` command.

const fs = require('fs');
const path = require('path');
const plist = require('plist');

module.exports = context => {
  const ConfigParser = context.requireCordovaModule('cordova-common').ConfigParser;

  return new Promise((resolve, reject) => {
    let mainConfig = new ConfigParser(path.resolve(context.opts.projectRoot, 'config.xml'));
    let name = mainConfig.name();
    let config = new ConfigParser(path.resolve(context.opts.projectRoot, 'platforms', 'ios', name, 'config.xml'));
    let MAIN_LANGUAGE = config.getGlobalPreference('MAIN_LANGUAGE');
    let ADDITIONAL_LANGUAGES = config.getGlobalPreference('ADDITIONAL_LANGUAGES');
    let plistPath = path.join(context.opts.projectRoot, 'platforms', 'ios', name, `${name}-Info.plist`);

    fs.readFile(plistPath, 'utf-8', (err, data) => {
      if (err) return reject(err);
      let infoPlist = plist.parse(data);

      process.stdout.write('[iOS] Setting main language to: ' + MAIN_LANGUAGE + '\n');
      infoPlist.CFBundleDevelopmentRegion = MAIN_LANGUAGE;

      process.stdout.write('[iOS] Setting also additional languagees to: ' + ADDITIONAL_LANGUAGES.split(',') + '\n');
      infoPlist.CFBundleLocalizations = ADDITIONAL_LANGUAGES.split(',');

      fs.writeFile(plistPath, plist.build(infoPlist), err => {
        if (err) return reject();
        resolve();
      });
    });
  });
};

Freak that would have been to easy :frowning:

Maybe you could give a try running ionic build --prod

If you face an error -> the problem is in your code
If you face no error -> the problem happens when cordova is bundling your app

If that last option, maybe you could give a try removing and adding your platform again

Just spontaneous ideas…

First of all: Thanks for your help :slight_smile: ionic build --prod works well, so it´s an cordova problem…and strangly I have this problem in all my apps… I tried already to remove and readding the platform. Still the same error… also I tried to delete the plugin above the error message…still the same error…

I have no more ideas…

If you’ve got the problem in all your apps, that means something is weird with the global setup

Which node version are you using?
Which cordova version are you using?

Node: 8.7.0
Cordova: 7.1.0

Sounds correct

Maybe the cmd? ‘ionic cordova build ios --prod’ gives the same result?

Yes - this gives the same result :confused:

I created a custom “build.json” in the root of the project with this content:

{
    "ios": {
        "debug": {
            "buildFlag": [
                "-UseModernBuildSystem=0"
            ]
        },
        "release": {
            "buildFlag": [
                "-UseModernBuildSystem=0"
            ]
        }
    }
}

Could this be the issue? But I deleted this file and still the error…

Honestly I’ve got no other ideas sorry :frowning:

Maybe something there https://github.com/apache/cordova-ios/issues/427 ?

Now build is successfull after editing this: https://github.com/apache/cordova-ios/issues/427#issuecomment-431862412 Thank you!

But another problem exists… -.- If I build with ionic cordova build ios everything works fine on device! But when I´m using flags --prod --release the app freezes on splash screen. Why? :smiley:

This is the log from xCode:

2018-10-28 10:40:22.826145+0200 MinistryJW[6924:574557] Apache Cordova native platform version 4.5.5 is starting.
2018-10-28 10:40:22.826918+0200 MinistryJW[6924:574557] Multi-tasking -> Device: YES, App: YES
2018-10-28 10:40:22.831866+0200 MinistryJW[6924:574557] 

Started backup to iCloud! Please be careful.
Your application might be rejected by Apple if you store too much data.
For more information please read "iOS Data Storage Guidelines" at:
https://developer.apple.com/icloud/documentation/data-storage/
To disable web storage backup to iCloud, set the BackupWebStorage preference to "local" in the Cordova config.xml file
2018-10-28 10:40:22.836139+0200 MinistryJW[6924:574557] CDVWKWebViewEngine: trying to inject XHR polyfill
2018-10-28 10:40:22.893862+0200 MinistryJW[6924:574557] CDVWKWebViewEngine will reload WKWebView if required on resume
2018-10-28 10:40:22.893905+0200 MinistryJW[6924:574557] Using Ionic WKWebView
2018-10-28 10:40:22.894161+0200 MinistryJW[6924:574557] [CDVTimer][console] 0.050068ms
2018-10-28 10:40:22.894254+0200 MinistryJW[6924:574557] [CDVTimer][handleopenurl] 0.061035ms
2018-10-28 10:40:22.895406+0200 MinistryJW[6924:574557] Unlimited access to network resources
2018-10-28 10:40:22.895446+0200 MinistryJW[6924:574557] [CDVTimer][intentandnavigationfilter] 1.169920ms
2018-10-28 10:40:22.895503+0200 MinistryJW[6924:574557] [CDVTimer][gesturehandler] 0.038028ms
2018-10-28 10:40:22.897228+0200 MinistryJW[6924:574557] [CDVTimer][file] 1.698017ms
2018-10-28 10:40:22.901060+0200 MinistryJW[6924:574557] [CDVTimer][splashscreen] 3.808022ms
2018-10-28 10:40:22.905349+0200 MinistryJW[6924:574557] [CDVTimer][statusbar] 4.253983ms
2018-10-28 10:40:22.905723+0200 MinistryJW[6924:574557] [CDVTimer][socialsharing] 0.349045ms
2018-10-28 10:40:22.906736+0200 MinistryJW[6924:574557] [CDVTimer][keyboard] 0.964046ms
2018-10-28 10:40:22.906775+0200 MinistryJW[6924:574557] [CDVTimer][TotalPluginStartup] 12.676001ms
2018-10-28 10:40:23.368641+0200 MinistryJW[6924:574557] Ionic Native: deviceready event fired after 175 ms
2018-10-28 10:40:23.368723+0200 MinistryJW[6924:574557] DEVICE READY FIRED AFTER 115 ms

Cool to hear you found the solution. For --release I guess it’s because you use Xcode 10 and that you maybe didn’t reinfected -UseModernBuildSystem=0?

Give a try, if it works cool, if not, maybe you should open a separate issue

Yea, I set the setting for the old build system directly in xCode. I created a new post :slight_smile:

1 Like

Found this interesting thread: https://github.com/apache/cordova-ios/issues/427

Try this
replace following code inside platfrom/ios/cordova/lib/list-emulator-build-targets

current code-------

if (device.name === deviceType.name.replace(/-inch/g, ’ inch’) &&
device.availability.toLowerCase().indexOf(‘unavailable’) < 0) {
availAcc.push(device);
}

new code-----------

if(device.name === deviceType.name || device.name === deviceType.name.replace(/-inch/g, ’ inch’))
{
if (device.isAvailable ||(device.availability && device.availability.toLowerCase().indexOf(‘unavailable’)<0)) {
availAcc.push(device);
}
}

1 Like