This document explains how to set up the necessary secrets for the GitHub Actions mobile build workflow (.github/workflows/cd.yml).
group.com.robinhood_options_mobile).| Secret Name | Description |
|---|---|
IOS_DISTRIBUTION_CERTIFICATE_BASE64 |
Base64 encoded .p12 distribution certificate. |
IOS_DISTRIBUTION_CERTIFICATE_PASSWORD |
The password for the .p12 certificate. |
IOS_PROVISIONING_PROFILE_BASE64 |
Base64 encoded .mobileprovision for the Main App. |
IOS_WIDGET_PROVISIONING_PROFILE_BASE64 |
Base64 encoded .mobileprovision for the Widget Extension. |
IOS_EXPORT_OPTIONS_PLIST |
The raw content of your ExportOptions.plist. |
Run these commands on your macOS machine:
# Main App Provisioning Profile
base64 -i <path_to_app_profile>.mobileprovision | pbcopy
# Widget Extension Provisioning Profile
base64 -i <path_to_widget_profile>.mobileprovision | pbcopy
# Distribution Certificate
base64 -i <path_to_certificate>.p12 | pbcopy
ExportOptions.plistThe easiest way for Flutter developers to generate a valid ExportOptions.plist is to run a local release build:
src/robinhood_options_mobile directory:
flutter build ipa --release
build/ios/ipa/ExportOptions.plistIOS_EXPORT_OPTIONS_PLIST GitHub Secret.key.properties file containing the keystore details.| Secret Name | Description |
|---|---|
ANDROID_KEY_PROPERTIES |
The full content of your android/key.properties file. |
ANDROID_KEYSTORE_BASE64 |
Base64 encoded upload-keystore.jks file. |
PLAY_STORE_UPLOAD_SERVICE_ACCOUNT_JSON |
The raw JSON key for the Google Play service account. |
Run this command on your machine to encode the keystore:
# Upload Keystore
base64 -i <path_to_keystore>.jks | pbcopy
key.properties TemplateYour ANDROID_KEY_PROPERTIES secret should follow this format:
storePassword=your_keystore_password
keyPassword=your_key_password
keyAlias=upload
storeFile=upload-keystore.jks
Provisioning profile "..." doesn't include the App Groups capability.
This usually means the profile created in the Apple Developer Portal does not have the App Groups capability enabled.
group.com.robinhood_options_mobile) is associated.PortfolioWidgetExtension has conflicting provisioning settings... switching to manual signing in the Signing & Capabilities editor.
This happens when CI forces manual signing for the project but the extension target is still set to “Automatic”. The cd.yml workflow now automatically handles this by patching the pbxproj for both the main app and the extension, provided you have set the IOS_WIDGET_PROVISIONING_PROFILE_BASE64 secret.
Ensure the keyAlias and passwords in ANDROID_KEY_PROPERTIES exactly match those used when creating the keystore.