eas build --platform ios error

if you go to the apple developer portal, then identifiers, then find your app there and enable and disable capabilities is that possible for you?

On the ’ Edit your App ID Configuration’ page I can see Capabilities that are able to be enabled/disabled.

so you can click those checkboxes and toggle them on and off and it works?

I get a popup indicating the following when I click save after modifying one of the checkboxes. Is this ok to do? I’ve never messed with this stuff so don’t want to break anything.

Modify App Capabilities

Adding or removing any capabilities will invalidate any provisioning profiles that include this App ID and they must be regenerated for future use.

gotcha, ok you don’t need to do that. i just wanted to ensure that you had sufficient permissions.

what capabilities are enabled for your identifier? can you also share the output of expo config --type introspect? (feel free to redact anything that you would consider sensitive, i mostly care about the contents of the ios key)

workaround that you can use to unblock, but we should get to the bottom of this: to skip syncing capabilities you can use EXPO_NO_CAPABILITY_SYNC=1 to work around this for now, but you may have to enable capabilities manually on apple developer portal if you are using their associated entitlements and they aren’t yet enabled.

The following are enabled:

  • Access WiFi Information
  • Apple Pay Payment Processing
  • Associated Domains
  • AutoFill Credential Provider
  • Fonts
  • Push Notifications
  • Sign In with Apple

Output of expo --config type introspect

{
  owner: 'renovationtrust',
  name: 'RenovationTrust',
  slug: 'RenovationTrust',
  scheme: 'renovationtrust',
  description: 'Buyer and Contractor Protection. Funds Held in Trust Until Job is Done.',
  backgroundColor: '#040571',
  platforms: [
    'ios',
    'android',
    'web'
  ],
  version: '0.0.4',
  orientation: 'portrait',
  icon: './assets/img/icon.png',
  assetBundlePatterns: [
    '**/*'
  ],
  sdkVersion: '41.0.0',
  splash: {
    image: './assets/splash/splash.png',
    resizeMode: 'cover',
    backgroundColor: '#ffffff'
  },
  notification: {
    icon: './assets/img/push_icon.png'
  },
  updates: {
    fallbackToCacheTimeout: 0
  },
  ios: {
    icon: './assets/img/icon_ios.png',
    supportsTablet: true,
    bundleIdentifier: 'com.renovationtrust.app',
    buildNumber: '0.0.4',
    googleServicesFile: './GoogleService-Info.plist',
    usesIcloudStorage: true,
    requireFullScreen: true,
    associatedDomains: [
      'applinks:dev.renovationtrust.com',
      'applinks:www.renovationtrust.com'
    ],
    config: {
      googleSignIn: {
        reservedClientId: 'com.googleusercontent.apps.*******'
      }
    },
    infoPlist: {
      NSCalendarsUsageDescription: 'Allow Renovation Trust to access your calendar',
      NSCameraUsageDescription: 'Allow use of your camera for: IDs, avatars and other photos including: project, inspirational, progress, logos and more',
      NSContactsUsageDescription: 'Allow use of your contacts to import customers or contractors',
      NSLocationWhenInUseUsageDescription: 'Allow use of your location to improve the accuracy of location searches and better secure your account',
      NSMicrophoneUsageDescription: 'Allow Renovation Trust to access your microphone',
      NSMotionUsageDescription: 'Allow Renovation Trust to access your accelerometer',
      NSPhotoLibraryAddUsageDescription: 'Allow Renovation Trust to save photos',
      NSPhotoLibraryUsageDescription: 'Allow access to your photos to upload IDs, avatars and other photos including: projects, inspiration, progress, logos and more',
      NSRemindersUsageDescription: 'Allow Renovation Trust to access your reminders',
      NSFaceIDUsageDescription: 'Use Face ID or Touch ID to login, release payments and fund projects.',
      LSApplicationQueriesSchemes: [
        'comgooglemaps',
        'citymapper',
        'uber',
        'lyft',
        'waze'
      ],
      NSUserTrackingUsageDescription: 'This identifier will be used to deliver personalized ads to you.',
      SKAdNetworkItems: [
        {
          SKAdNetworkIdentifier: 'v9wttpbfk9.skadnetwork'
        },
        {
          SKAdNetworkIdentifier: 'n38lu8286q.skadnetwork'
        }
      ],
      NSLocationAlwaysAndWhenInUseUsageDescription: 'Allow $(PRODUCT_NAME) to access your location',
      NSLocationAlwaysUsageDescription: 'Allow $(PRODUCT_NAME) to access your location',
      CFBundleShortVersionString: '0.0.4',
      CFBundleVersion: '0.0.4',
      UIUserInterfaceStyle: 'Light',
      CFBundleURLTypes: [
        {
          CFBundleURLSchemes: [
            'renovationtrust',
            'com.renovationtrust.app'
          ]
        },
        {
          CFBundleURLSchemes: [
            'com.googleusercontent.apps.31548342916-955d9ftq10kr3kuaicf3k9qoj7pdigct'
          ]
        },
        {
          CFBundleTypeRole: 'Editor',
          CFBundleURLName: 'OAuthRedirect',
          CFBundleURLSchemes: [
            'com.renovationtrust.app'
          ]
        }
      ],
      UIRequiresFullScreen: true,
      UISupportedInterfaceOrientations: [
        'UIInterfaceOrientationPortrait',
        'UIInterfaceOrientationPortraitUpsideDown'
      ],
      CFBundleDisplayName: 'RenovationTrust'
    },
    entitlements: {
      'com.apple.developer.associated-domains': [
        'applinks:dev.renovationtrust.com',
        'applinks:www.renovationtrust.com'
      ],
      'aps-environment': 'development'
    }
  },
  android: {
    package: 'com.renovationtrust.app',
    versionCode: 4,
    googleServicesFile: './google-services.json',
    useNextNotificationsApi: true,
    intentFilters: [
      {
        action: 'VIEW',
        autoVerify: true,
        data: [
          {
            scheme: 'https',
            host: '*.renovationtrust.com',
            pathPrefix: '/app'
          }
        ],
        category: [
          'BROWSABLE',
          'DEFAULT'
        ]
      }
    ],
    permissions: [
      'android.permission.ACCESS_COARSE_LOCATION',
      'android.permission.ACCESS_FINE_LOCATION',
      'android.permission.READ_CONTACTS',
      'android.permission.WRITE_CONTACTS',
      'android.permission.RECORD_AUDIO',
      'android.permission.CAMERA',
      'android.permission.READ_EXTERNAL_STORAGE',
      'android.permission.WRITE_EXTERNAL_STORAGE',
      'android.permission.INTERNET',
      'android.permission.FOREGROUND_SERVICE',
      'android.permission.USE_BIOMETRIC',
      'android.permission.USE_FINGERPRINT'
    ]
  },
  web: {
    startUrl: 'login',
    config: {
      firebase: {
        apiKey: '*********',
        measurementId: 'G-5R6ERDH7WD',
        projectId: 'renovation-trust-dev',
        appId: '1:1049372345126:web:5ee91e2a87a91b4fad37e7'
      }
    }
  },
  _internal: {
    isDebug: false,
    projectRoot: '/Users/mofo/Documents/RenovationTrustApp/RenovationTrust',
    dynamicConfigPath: null,
    staticConfigPath: '/Users/mofo/Documents/RenovationTrustApp/RenovationTrust/app.json',
    packageJsonPath: '/Users/mofo/Documents/RenovationTrustApp/RenovationTrust/package.json',
    pluginHistory: {
      'react-native-maps': {
        name: 'react-native-maps',
        version: 'UNVERSIONED'
      },
      'expo-ads-admob': {
        name: 'expo-ads-admob',
        version: 'UNVERSIONED'
      },
      'expo-apple-authentication': {
        name: 'expo-apple-authentication',
        version: '3.1.0'
      },
      'expo-contacts': {
        name: 'expo-contacts',
        version: '9.1.2'
      },
      'expo-notifications': {
        name: 'expo-notifications',
        version: '0.11.6'
      },
      'expo-updates': {
        name: 'expo-updates',
        version: 'UNVERSIONED'
      },
      'expo-branch': {
        name: 'expo-branch',
        version: 'UNVERSIONED'
      },
      'expo-document-picker': {
        name: 'expo-document-picker',
        version: '9.1.2'
      },
      'expo-facebook': {
        name: 'expo-facebook',
        version: '11.0.5'
      },
      'expo-splash-screen': {
        name: 'expo-splash-screen',
        version: '0.10.2'
      },
      'expo-firebase-core': {
        name: 'expo-firebase-core',
        version: '3.0.0'
      },
      'expo-app-auth': {
        name: 'expo-app-auth',
        version: '10.1.2'
      },
      'expo-av': {
        name: 'expo-av',
        version: '9.1.2'
      },
      'expo-camera': {
        name: 'expo-camera',
        version: '11.0.3'
      },
      'expo-image-picker': {
        name: 'expo-image-picker',
        version: '10.1.4'
      },
      'expo-file-system': {
        name: 'expo-file-system',
        version: '11.0.2'
      },
      'expo-location': {
        name: 'expo-location',
        version: '12.0.4'
      },
      'expo-screen-orientation': {
        name: 'expo-screen-orientation',
        version: '3.1.0'
      },
      'expo-local-authentication': {
        name: 'expo-local-authentication',
        version: '11.0.2'
      }
    },
    modResults: {
      android: {
        gradleProperties: [],
        manifest: {
          manifest: {
            '$': {
              'xmlns:android': 'http://schemas.android.com/apk/res/android',
              package: 'com.renovationtrust.app'
            },
            'uses-permission': [
              {
                '$': {
                  'android:name': 'android.permission.INTERNET'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.ACCESS_COARSE_LOCATION'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.ACCESS_FINE_LOCATION'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.READ_CONTACTS'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.WRITE_CONTACTS'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.RECORD_AUDIO'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.CAMERA'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.READ_EXTERNAL_STORAGE'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.WRITE_EXTERNAL_STORAGE'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.FOREGROUND_SERVICE'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.USE_BIOMETRIC'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.USE_FINGERPRINT'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.ACCESS_NETWORK_STATE'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.SYSTEM_ALERT_WINDOW'
                }
              },
              {
                '$': {
                  'android:name': 'android.permission.WAKE_LOCK'
                }
              },
              {
                '$': {
                  'android:name': 'com.google.android.c2dm.permission.RECEIVE'
                }
              }
            ],
            application: [
              {
                '$': {
                  'android:name': '.MainApplication',
                  'android:label': '@string/app_name',
                  'android:icon': '@mipmap/ic_launcher',
                  'android:roundIcon': '@mipmap/ic_launcher_round',
                  'android:allowBackup': 'true',
                  'android:theme': '@style/AppTheme'
                },
                activity: [
                  {
                    '$': {
                      'android:name': '.MainActivity',
                      'android:label': '@string/app_name',
                      'android:configChanges': 'keyboard|keyboardHidden|orientation|screenSize|uiMode',
                      'android:launchMode': 'singleTask',
                      'android:windowSoftInputMode': 'adjustResize',
                      'android:theme': '@style/Theme.App.SplashScreen',
                      'android:screenOrientation': 'portrait'
                    },
                    'intent-filter': [
                      {
                        action: [
                          {
                            '$': {
                              'android:name': 'android.intent.action.MAIN'
                            }
                          }
                        ],
                        category: [
                          {
                            '$': {
                              'android:name': 'android.intent.category.LAUNCHER'
                            }
                          }
                        ]
                      },
                      {
                        action: [
                          {
                            '$': {
                              'android:name': 'android.intent.action.VIEW'
                            }
                          }
                        ],
                        category: [
                          {
                            '$': {
                              'android:name': 'android.intent.category.DEFAULT'
                            }
                          },
                          {
                            '$': {
                              'android:name': 'android.intent.category.BROWSABLE'
                            }
                          }
                        ],
                        data: [
                          {
                            '$': {
                              'android:scheme': 'renovationtrust'
                            }
                          },
                          {
                            '$': {
                              'android:scheme': 'com.renovationtrust.app'
                            }
                          }
                        ]
                      },
                      {
                        '$': {
                          'android:autoVerify': 'true'
                        },
                        data: [
                          {
                            '$': {
                              'android:scheme': 'https',
                              'android:host': '*.renovationtrust.com',
                              'android:pathPrefix': '/app'
                            }
                          }
                        ],
                        action: [
                          {
                            '$': {
                              'android:name': 'android.intent.action.VIEW'
                            }
                          }
                        ],
                        category: [
                          {
                            '$': {
                              'android:name': 'android.intent.category.BROWSABLE'
                            }
                          },
                          {
                            '$': {
                              'android:name': 'android.intent.category.DEFAULT'
                            }
                          }
                        ]
                      }
                    ]
                  },
                  {
                    '$': {
                      'android:name': 'com.facebook.react.devsupport.DevSettingsActivity'
                    }
                  },
                  {
                    '$': {
                      'android:name': 'com.theartofdev.edmodo.cropper.CropImageActivity',
                      'android:theme': '@style/Base.Theme.AppCompat'
                    }
                  }
                ],
                'meta-data': [
                  {
                    '$': {
                      'android:name': 'expo.modules.updates.ENABLED',
                      'android:value': 'true'
                    }
                  },
                  {
                    '$': {
                      'android:name': 'expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH',
                      'android:value': 'ALWAYS'
                    }
                  },
                  {
                    '$': {
                      'android:name': 'expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS',
                      'android:value': '0'
                    }
                  },
                  {
                    '$': {
                      'android:name': 'expo.modules.updates.EXPO_UPDATE_URL',
                      'android:value': 'https://exp.host/@renovationtrust/RenovationTrust'
                    }
                  },
                  {
                    '$': {
                      'android:name': 'expo.modules.updates.EXPO_SDK_VERSION',
                      'android:value': '41.0.0'
                    }
                  },
                  {
                    '$': {
                      'android:name': 'expo.modules.notifications.default_notification_icon',
                      'android:resource': '@drawable/notification_icon'
                    }
                  }
                ]
              }
            ]
          }
        },
        strings: {
          resources: {
            string: [
              {
                '$': {
                  name: 'app_name'
                },
                _: 'RenovationTrust'
              }
            ]
          }
        }
      },
      ios: {
        infoPlist: {
          NSCalendarsUsageDescription: 'Allow Renovation Trust to access your calendar',
          NSCameraUsageDescription: 'Allow use of your camera for: IDs, avatars and other photos including: project, inspirational, progress, logos and more',
          NSContactsUsageDescription: 'Allow use of your contacts to import customers or contractors',
          NSLocationWhenInUseUsageDescription: 'Allow use of your location to improve the accuracy of location searches and better secure your account',
          NSMicrophoneUsageDescription: 'Allow Renovation Trust to access your microphone',
          NSMotionUsageDescription: 'Allow Renovation Trust to access your accelerometer',
          NSPhotoLibraryAddUsageDescription: 'Allow Renovation Trust to save photos',
          NSPhotoLibraryUsageDescription: 'Allow access to your photos to upload IDs, avatars and other photos including: projects, inspiration, progress, logos and more',
          NSRemindersUsageDescription: 'Allow Renovation Trust to access your reminders',
          NSFaceIDUsageDescription: 'Use Face ID or Touch ID to login, release payments and fund projects.',
          LSApplicationQueriesSchemes: [
            'comgooglemaps',
            'citymapper',
            'uber',
            'lyft',
            'waze'
          ],
          NSUserTrackingUsageDescription: 'This identifier will be used to deliver personalized ads to you.',
          SKAdNetworkItems: [
            {
              SKAdNetworkIdentifier: 'v9wttpbfk9.skadnetwork'
            },
            {
              SKAdNetworkIdentifier: 'n38lu8286q.skadnetwork'
            }
          ],
          NSLocationAlwaysAndWhenInUseUsageDescription: 'Allow $(PRODUCT_NAME) to access your location',
          NSLocationAlwaysUsageDescription: 'Allow $(PRODUCT_NAME) to access your location',
          CFBundleShortVersionString: '0.0.4',
          CFBundleVersion: '0.0.4',
          UIUserInterfaceStyle: 'Light',
          CFBundleURLTypes: [
            {
              CFBundleURLSchemes: [
                'renovationtrust',
                'com.renovationtrust.app'
              ]
            },
            {
              CFBundleURLSchemes: [
                'com.googleusercontent.apps.31548342916-955d9ftq10kr3kuaicf3k9qoj7pdigct'
              ]
            },
            {
              CFBundleTypeRole: 'Editor',
              CFBundleURLName: 'OAuthRedirect',
              CFBundleURLSchemes: [
                'com.renovationtrust.app'
              ]
            }
          ],
          UIRequiresFullScreen: true,
          UISupportedInterfaceOrientations: [
            'UIInterfaceOrientationPortrait',
            'UIInterfaceOrientationPortraitUpsideDown'
          ],
          CFBundleDisplayName: 'RenovationTrust'
        },
        entitlements: {
          'com.apple.developer.associated-domains': [
            'applinks:dev.renovationtrust.com',
            'applinks:www.renovationtrust.com'
          ],
          'aps-environment': 'development'
        },
        expoPlist: {
          EXUpdatesEnabled: true,
          EXUpdatesCheckOnLaunch: 'ALWAYS',
          EXUpdatesLaunchWaitMs: 0,
          EXUpdatesURL: 'https://exp.host/@renovationtrust/RenovationTrust',
          EXUpdatesSDKVersion: '41.0.0'
        }
      }
    }
  },
  mods: {
    android: {
      manifest: [AsyncFunction: interceptingMod] {
        isProvider: true
      },
      strings: [AsyncFunction: interceptingMod] {
        isProvider: true
      },
      gradleProperties: [AsyncFunction: interceptingMod] {
        isProvider: true
      }
    },
    ios: {
      infoPlist: [AsyncFunction: interceptingMod] {
        isProvider: true
      },
      entitlements: [AsyncFunction: interceptingMod] {
        isProvider: true
      },
      expoPlist: [AsyncFunction: interceptingMod] {
        isProvider: true
      }
    }
  }
}

looking at your entitlements configuration, it doesn’t match up with the capabilities you have enabled. as far as i know, those won’t actually do anything without the associated entitlements being added to the app, and your app only appears to use push notifications and associated domains entitlements. someone else on your team might have context on why they were enabled. you could try manually disabling everything except push notifications and associated domains on the apple developer portal for your identifier and re-running the build. it will invalidate your profile but eas build will re-generate the profile when you run another build.

Ok, we have disabled everything but ‘Associated Domains’, ‘Push Notifications’ and ‘Sign In with Apple’. The ‘Sign In with Apple’ capability is giving that initial error I posted about when trying to disable it.

There is a problem with the request entity - The bundle ‘K3PHV8M3R9’ cannot be deleted. Delete all the Apps related to this bundle to proceed

does your app use sign in with apple? it’s not in your entitlements so i suspect it doesn’t

following up - if you don’t use sign in with apple, can you try disabling it manually and then building and let me know if that works for you?

We are using Sign in with Apple, and it was working locally without having the right configuration in app.json. I added the “usesAppleSignIn” key for iOS in app.json. We ended up clearing out most things in the developer account and used a different identifier and I was able to successfully build an .ipa file.

Thank you very much for your time and help :grinning:

2 Likes

My issue was finally fixed not by updating code or Apple developer console config, but by updating my eas-cli :expressionless:

great! keep in mind that during eas feature preview you should always try to use the latest version of eas-cli. we are updating it rapidly and there are sometimes breaking changes

1 Like

I also had to use your suggested hack EXPO_NO_CAPABILITY_SYNC=1. Not sure what the implications of this are, but I was not able to find a fix via solutions in this thread.

1 Like

i would say it’s not necessarily a hack but rather a workaround should you encounter a situation where our capability syncing system isn’t able to handle your case, for some reason. you can manually toggle capabilities in the apple developer portal for your identifier if that’s the case.

Thank you!!! I’ve added SignInWithApple and got this error. Adding usesAppleSignIn definitely fixed the issue!

PS: If you manually add a new capabilities to your Apple App ID, you’ll need to modify ios.entitlements in app.json

Example for adding Sign In with Apple capability:

      ...
      "entitlements": {
        "com.apple.developer.applesignin": [
          "Default"
        ]
      }
1 Like

I resolve this intalling expo-apple-authentication, and add to the plugin area em app.json like plugins: [
[“expo-apple-authentication”],
]
and finally adding in app.json ios: { “usesAppleSignIn”: true, }.
The problens start when I mark ‘login with apple’ in the apple store.