Is it possible to use Fastlane on an iOS app with extensions? - ios

I am working on adding a Notification Service Extension to the app I'm working on, and I am having trouble reconfiguring my Fastlane setup to work with the extension.
The problem
I don't know how to properly configure my certificates to allow for the new extension.
The error message is as follows:
error: No profile for team 'TEAMID' matching 'App Provisioning Profile' found: Xcode couldn't find any provisioning profiles matching 'TEAMID/App Provisioning Profile'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the Signing & Capabilities tab of the target editor. (in target 'NotificationModifier' from project 'Yeshivat Torat Shraga')
What I've tried
I tried nuking the certs
and a lot of googling, but I'm pretty lost
Relevant code and outputs
Here is the Fastlane Summary:
+------+-----------------------------------------------------+-------------+
| fastlane summary |
+------+-----------------------------------------------------+-------------+
| Step | Action | Time (in s) |
+------+-----------------------------------------------------+-------------+
| 1 | default_platform | 0 |
| 2 | Switch to ios load_asc_api_key lane | 0 |
| 3 | app_store_connect_api_key | 0 |
| 4 | Switch to ios prepare_signing lane | 0 |
| 5 | create_keychain | 0 |
| 6 | match | 2 |
| 7 | Switch to ios fetch_and_increment_build_number lane | 0 |
| 8 | get_version_number | 0 |
| 9 | latest_testflight_build_number | 2 |
| 10 | increment_build_number | 5 |
| 11 | Switch to ios build_release lane <== Crashing lane | 0 |
| 12 | update_code_signing_settings | 0 |
| 💥 | gym | 262 |
+------+-----------------------------------------------------+-------------+
And here is my build_release lane:
desc "Build the iOS app for release"
lane :build_release do |options|
app_identifier = CredentialsManager::AppfileConfig.try_fetch_value(:app_identifier)
app_profile_name = "match AppStore " + app_identifier
profile_name = "App Provisioning Profile" # the name of the profile to use for the build
output_name = "YTS" # specify the name of the .ipa file to generate
export_method = "app-store" # specify the export method
compile_bitcode = true # specify whether to enable bitcode
# turn off automatic signing during build so correct code signing identity is guaranteed to be used
update_code_signing_settings(
use_automatic_signing: false,
targets: ["Yeshivat Torat Shraga", "NotificationModifier"], # specify which targets to update code signing settings for
code_sign_identity: "Apple Distribution", # replace with name of code signing identity if different
# bundle_identifier: app_identifier,
profile_name: profile_name,
build_configurations: ["Release"] # only toggle code signing settings for Release configurations
)
settings_to_override = {
:BUNDLE_IDENTIFIER => "com.appdevname.YTS",
:PROVISIONING_PROFILE_SPECIFIER => app_profile_name,
# Use BUILDCACHE override compiler paths to ensure that the correct compiler paths are used.
:CC => "clang",
:CPLUSPLUS => "clang++",
:LD => "clang",
:LDPLUSPLUS => "clang++",
}
# build the app
gym(
scheme: "Yeshivat Torat Shraga", # replace with name of your project's scheme
output_name: output_name,
configuration: "Release",
xcargs: settings_to_override,
export_options: {
method: export_method,
# provisioningProfiles: {
# app_identifier => app_profile_name
# },
compileBitcode: compile_bitcode
}
)
end
I think the root of the issue is that the certs that fastlane is using don't include the Notification Service Extension that I added, but I have no clue where to start fixing that.

I resolved this issue by removing any references to names of certificates and profiles, and let Fastlane handle the certs by itself. I am still having some issues with entitlements, and I will update this answer if I make progress on this.
Here is a link to the GitHub issue I opened regarding the remaining issue I am facing with certificates.

Related

Fastlane error: Xcode couldn't find any iOS App Development provisioning profiles matching '*'

Currently, I am using the same process for building in XCode directly and in Fastlane. But while it is working perfectly in XCode (building and archiving both working fine), in Fastlane it throw an error and tells me ARCHIVE FAILED. It looks like the Fastlane is trying to find the iOS App Development provisioning profile while it only finds App Distribution profiles I assume. Is there a way to get around it, like if I can build the app with command line (without Fastlane) and use Fastlane to deploy the .ipa file I have created?
The error shown in Fastlane log:
+--------------------------------------+-----------------------------------------------------------+
| Summary for gym 2.208.0 |
+--------------------------------------+-----------------------------------------------------------+
| workspace | ./platforms/ios/myproject.xcworkspace |
| configuration | Release |
| scheme | myproject |
| output_directory | . |
| output_name | output |
| clean | true |
| export_method | app-store |
| skip_profile_detection | false |
| destination | generic/platform=iOS |
| silent | false |
| skip_package_ipa | false |
| skip_package_pkg | false |
| build_path | /Users/runner/Library/Developer/Xcode/Archives/2022-08-01 |
| result_bundle | false |
| buildlog_path | ~/Library/Logs/gym |
| xcodebuild_formatter | xcpretty |
| xcodebuild_command | xcodebuild |
| skip_package_dependencies_resolution | false |
| disable_package_automatic_updates | false |
| use_system_scm | false |
| xcode_path | /Applications/Xcode_13.2.1.app |
+--------------------------------------+-----------------------------------------------------------+
[20:25:28]: $ set -o pipefail && xcodebuild -workspace ./platforms/ios/myproject.xcworkspace -scheme myproject -configuration Release -destination 'generic/platform=iOS' -archivePath /Users/runner/Library/Developer/Xcode/Archives/2022-08-01/output\ 2022-08-01\ 20.25.28.xcarchive clean archive | tee /Users/runner/Library/Logs/gym/myproject-myproject.log | xcpretty
[20:25:35]: ▸ Clean Succeeded
[20:25:46]: ▸ ❌ error: No profiles for 'com.myprojectapp.myproject' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'com.myprojecttapp.myproject'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'myproject' from project 'myproject')
[20:25:46]: ▸ ** ARCHIVE FAILED **
Code signing settings:
+-----------------------+-------------------------------------+
| Summary for code signing settings |
+-----------------------+-------------------------------------+
| use_automatic_signing | true |
| path | ./platforms/ios/myproject.xcodeproj |
+-----------------------+-------------------------------------+
Seems that you don't have automatic signing disabled and you need to either enable it or go to your Xcode project and select the right provisioning profile for what you're trying to build via Fastlane by going to Your target>Signing & Capabilities and select the proper provisioning profiles and development teams

Missing provisional profile feature when building using fastlane/Jenkins

I'm trying to setup automated iOS builds using Jenking/fastlane. The codesigning was set up using fastlane match. However when Jenkins runs the job and invokes xcodebuild I'm getting:
[16:06:09]: [36m$ set -o pipefail && xcodebuild -workspace ./Runner.xcworkspace -scheme dev -configuration Release-dev -destination 'generic/platform=iOS' -archivePath /Users/Shared/Jenkins/Library/Developer/Xcode/Archives/2020-04-14/Runner\ 2020-04-14\ 16.06.09.xcarchive archive | tee /Users/Shared/Jenkins/Library/Logs/gym/Runner-dev.log | xcpretty[0m
[16:06:23]: ▸ [35m[31m❌ error: "Runner" requires a provisioning profile with the Push Notifications feature. Select a provisioning profile in the Signing & Capabilities editor. (in target 'Runner' from project 'Runner')[0m
[16:06:23]: ▸ [35m** ARCHIVE FAILED **[0m
Needless to say the profiles used does contain said feature (I've checked in Developers portal).
My Fastfile (relevant section):
private_lane :build_qa do
UI.message("Building qa build...")
sync_code_signing
sync_code_signing(type: "adhoc", readonly: true)
update_code_signing_settings(
use_automatic_signing: false,
path: "Runner.xcodeproj"
)
sh("cd ../..;
flutter build ios --release --flavor dev --no-codesign"
)
build_ios_app(
scheme: "dev",
configuration: "Release-dev",
output_name: "Runner.ipa"
)
update_code_signing_settings(
use_automatic_signing: true,
path: "Runner.xcodeproj"
)
end
Summary of match:
+-------------------------------------------------------------------------+-------------------------------------------------------------------+
| [32mSummary for gym 2.145.0[0m |
+-------------------------------------------------------------------------+-------------------------------------------------------------------+
| scheme | dev |
| configuration | Release-dev |
| output_name | Runner |
| catalyst_platform | ios |
| export_method | ad-hoc |
| export_options.provisioningProfiles.com.flutter.example.track.dev | match AdHoc com.flutter.example.track.dev |
| export_options.provisioningProfiles.com.flutter.example.track.prod | match AdHoc com.flutter.example.track.prod |
| workspace | ./Runner.xcworkspace |
| destination | generic/platform=iOS |
| build_path | /Users/Shared/Jenkins/Library/Developer/Xcode/Archives/2020-05-05 |
| clean | false |
| output_directory | . |
| silent | false |
| skip_package_ipa | false |
| result_bundle | false |
| buildlog_path | ~/Library/Logs/gym |
| skip_profile_detection | false |
| skip_package_pkg | false |
| xcode_path | /Applications/Xcode.app |
+-------------------------------------------------------------------------+-------------------------------------------------------------------+
maybe I'm a little bit late but here there is my working solution:
# Initial considerations: we want to have all the control over project settings,
# in particular
# - code signing
# - provisioning
# - team
# - app identifier
platform :ios do
lane :build do |values|
# All params should be dynamically passed with ENV vars
# Disable automatic code signing must be set BEFORE match
disable_automatic_code_signing(
path: PROJECT_PATH,
team_id: TEAM_ID
)
# match action...
# In my case app_store_connect_api_key + sync_code_signing
# Provisioning update
# NOTE: PROFILE_PATH_ENV_VAR, based on match type, is the provisioning profile path previously generated from match
# I.e. for development match type: sigh_[appBundleId]_development_profile-path
# Check https://docs.fastlane.tools/codesigning/xcode-project/#set-using-environment-variable for more info
update_project_provisioning(
xcodeproj: XCODE_PROJECT_PATH,
target_filter: TARGET_NAME,
profile: ENV["PROFILE_PATH_ENV_VAR"],
build_configuration: "Release"
)
# Project team update
update_project_team(
path: XCODE_PROJECT_PATH,
teamid: TEAM_ID
)
# App identifier update
update_app_identifier(
xcodeproj: XCODE_PROJECT_PATH,
plist_path: PLIST_PATH,
app_identifier: BUNDLE_ID
)
gym(
# ... Every custom param you need
...
codesigning_identity: CERTIFICATE_NAME,
export_options: {
compileBitcode: false,
provisioningProfiles: ENV['MATCH_PROVISIONING_PROFILE_MAPPING'], # ENV var generated from match
# http://docs.fastlane.tools/actions/sync_code_signing/#lane-variables
signingStyle: "manual"
}
)
end
end
If you use match to manage the provisioning profiles you can force them in gym/build_ios_app with export_options like these:
gym(
scheme: "dev",
configuration: "Release-dev",
output_name: "Runner.ipa"
export_options: {
compileBitcode: false,
provisioningProfiles: ENV['MATCH_PROVISIONING_PROFILE_MAPPING']
},
codesigning_identity: "Certificate name, if you want to override it as well"
)

Fastlane finish with error "The request could not be completed because: Unauthorized Access" in iOS

I'm new in Fastlane and install it throw the official document. Now I want to create an app using Fastlane and try to run the basic command "bundle exec fastlane create_app" where "create_app" is a lane created in my Fastfile in my project directory. After that, it is giving me the error:
"Unauthorized Access"
I didn't understand why this is happening? I'm giving the output log below.
***#iOS-MAC-15 TryFastlane % bundle exec fastlane create_app
[✔] 🚀
[10:27:24]: ------------------------------
[10:27:24]: --- Step: default_platform ---
[10:27:24]: ------------------------------
[10:27:24]: Driving the lane 'ios create_app' 🚀
[10:27:24]: ---------------------
[10:27:24]: --- Step: produce ---
[10:27:24]: ---------------------
+----------------+--------------------------------+
| Summary for produce 2.137.0 |
+----------------+--------------------------------+
| username | *** |
| app_identifier | com.***.*** |
| sku | 1576643244 |
| platform | ios |
| language | English |
| skip_itc | false |
| skip_devcenter | false |
+----------------+--------------------------------+
Two-factor Authentication (6 digits code) is enabled for account '***'
More information about Two-factor Authentication: https://support.apple.com/en-us/HT204915
If you're running this in a non-interactive session (e.g. server or CI)
check out https://github.com/fastlane/fastlane/tree/master/spaceship#2-step-verification
Environment variable `SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER` is set, automatically requesting 2FA token via SMS to that number
SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER = ***
Successfully requested text message to ***
Please enter the 6 digit code you received at ***:
999822
Requesting session...
+------------------+----------------+
| Lane Context |
+------------------+----------------+
| DEFAULT_PLATFORM | ios |
| PLATFORM_NAME | ios |
| LANE_NAME | ios create_app |
+------------------+----------------+
[10:37:21]: Unauthorized Access
+------+------------------+-------------+
| fastlane summary |
+------+------------------+-------------+
| Step | Action | Time (in s) |
+------+------------------+-------------+
| 1 | default_platform | 0 |
| 💥 | produce | 597 |
+------+------------------+-------------+
[10:37:21]: fastlane finished with errors
Looking for related GitHub issues on fastlane/fastlane...
➡️ The request could not be completed because: Unauthorized Access
https://github.com/fastlane/fastlane/issues/15411 [closed] 21 💬
3 weeks ago
➡️ Unauthorized Access when I use Fastlane pilot upload
https://github.com/fastlane/fastlane/issues/15125 [closed] 6 💬
5 weeks ago
➡️ The request could not be completed because:Unauthorized Access
https://github.com/fastlane/fastlane/issues/13923 [closed] 14 💬
31 Jul 2019
and 15 more at: https://github.com/fastlane/fastlane/search?q=The%20request%20could%20not%20be%20completed%20because%3A%0A%09Unauthorized%20Access&type=Issues&utf8=✓
🔗 You can ⌘ + double-click on links to open them directly in your browser.
[!] The request could not be completed because:
Unauthorized Access
Appfile Details:
app_identifier "com.***.***"
apple_id "***"
Fastfile Details:
default_platform(:ios)
platform :ios do
before_all do
ENV["SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER"] = "***"
ENV["FASTLANE_USER"] = "***"
ENV["FASTLANE_PASSWORD"] = "***"
end
# 1
desc "Create app on Apple Developer and App Store Connect sites"
# 2
lane :create_app do
# 3
​ produce
end
end
I have solved the issue it is 2FA in CLI. First, remove the credential by
fastlane fastlane-credentials remove --username appleID, Second, create apple application password on AppleID and use it as environment variable in fastlane "FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD" .finally, run the lane.
The Fastfile after added that variable looks like this.
default_platform(:ios)
platform :ios do
before_all do
ENV["SPACESHIP_2FA_SMS_DEFAULT_PHONE_NUMBER"] = "***"
ENV["FASTLANE_USER"] = "***"
ENV["FASTLANE_PASSWORD"] = "***"
ENV["FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"] = "***"
end
# 1
desc "Create app on Apple Developer and App Store Connect sites"
# 2
lane :create_app do
# 3
​ produce
end
end
I solved the issue by following steps:
Updating the fastlane to latest version (2.205.1 in my case)
run this command to update fastlane : bundle update fastlane
signing in to my apple account from my browser.
Creating app specific password from https://appleid.apple.com/account/manage and adding it to fastFile like this:
default_platform(:ios)
platform :ios do
ENV["FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD"] = "YOUR-APP-SPECIFIC_PASS"
desc "Push a new beta build to TestFlight"
lane :beta do
increment_build_number(xcodeproj: "Runner.xcodeproj")
build_app(workspace: "Runner.xcworkspace", scheme: "Runner")
upload_to_testflight(skip_waiting_for_build_processing: true)
end
end
running : fastlane ios beta to upload my app to appStore

fastlane finished with errors Unauthorized Access

While sending my application to the testflight via fastlane, I faced with this error:
Unauthorized Access
**FastLanelane summary**
| 1 | opt_out_usage | 0 |
| 2 | default_platform | 0 |
| 3 | update_fastlane | 0 |
| 4 | clear_derived_data | 0 |
| 5 | cocoapods | 3 |
| 6 | gym | 87 |
| 💥 | pilot | 3 |
ERROR [2019-03-01 15:51:34.03]: fastlane finished with errors
Looking for related GitHub issues on fastlane/fastlane... Search
query: The request could not be completed because: Unauthorized
Access
Here is my Fasfile:
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
update_fastlane
clear_derived_data
cocoapods(clean: true, use_bundle_exec: false)
# Build
gym(clean: true, suppress_xcode_output: true, workspace: "com.xxxx.xcworkspace", scheme: "com.xxxx")
# Submit to iTunes Connect (upload_to_testflight)
pilot(skip_submission: true, skip_waiting_for_build_processing: true)
upload_symbols_to_crashlytics # Upload dSYM symbolication files to Crashlytics
end
end
Common Case
be sure that your role permission should be at least the App Manager!
In My Case
I noticed that I entered the two-factor Authentication (6-digit code) code incorrectly.
Remember that, starting on February 27, 2019 Apple requiring all developers to have two-factor authentication enabled for their Apple IDs, with two-factor necessary for signing into Developer accounts after that date. Means it's necessary for our fastlane flows too.

Fastlane match build adhoc and appstore

I'm using Fastlane match and gym for building and distributing my app from a CI (Bitrise) to Fabric. My Xcode settings are set to manual with a Release configuration using the AdHoc profile as described in the Fastlane docs
Now I want to distribute to the Appstore from the CI but it fails because Xcode Release config is set to use the AdHoc profile and Match installed the AppStore profile.
+---------------------------------------------------------------+-----------------------------------------------------------------------------+
| Summary for gym 2.112.0 |
+---------------------------------------------------------------+-----------------------------------------------------------------------------+
| scheme | AeroNavMap |
| export_method | app-store |
| export_xcargs | -allowProvisioningUpdates |
| export_options.provisioningProfiles.net.tequilaapps.airnavmap | match AppStore net.tequilaapps.airnavmap |
| workspace | ./PEMap.xcworkspace |
| destination | generic/platform=iOS |
| output_name | AeroNavMap |
| build_path | /Users/vagrant/Library/Developer/Xcode/Archives/2019-01-06 |
| clean | false |
| output_directory | . |
| silent | false |
| skip_package_ipa | false |
| result_bundle | false |
| buildlog_path | /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/fastlane_logs957341986/gym |
| skip_profile_detection | false |
| xcode_path | /Applications/Xcode.app |
+---------------------------------------------------------------+-----------------------------------------------------------------------------+
[13:47:38]: $ set -o pipefail && xcodebuild -workspace ./PEMap.xcworkspace -scheme AeroNavMap -destination 'generic/platform=iOS' -archivePath /Users/vagrant/Library/Developer/Xcode/Archives/2019-01-06/AeroNavMap\ 2019-01-06\ 13.47.38.xcarchive archive | tee /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/fastlane_logs957341986/gym/AeroNavMap-AeroNavMap.log | xcpretty
[13:47:42]: ▸ ❌ error: No profile for team 'XXXXXXXX' matching 'match AdHoc net.tequilaapps.airnavmap' found: Xcode couldn't find any provisioning profiles matching 'G9MA9G2SST/match AdHoc net.tequilaapps.airnavmap'. Install the profile (by dragging and dropping it onto Xcode's dock item) or select a different one in the General tab of the target editor. (in target 'AeroNavMap')
[13:47:42]: ▸ ** ARCHIVE FAILED *
This all makes sense but the question is how am I supposed to setup Xcode so that I can have two Fastlane lanes, one for building for AppStore, the other for AdHoc.
I could create a new Xcode config AppStore where I'd set the AppStore provisioning profile but this rises an other issue where my custom Frameworks don't build. Similar to this question. I have many custom Frameworks and I would need to create that same AppStore configuration in their Xcode project as well but that is too much of a hack solution.
I tried forcing gym to use the AppStore profile as follows but that does not help. The AdHoc profile set in Xcode is still being used.
desc "Builds the app for the AppStore"
lane :build_appstore do
match(type: "appstore", readonly: true)
build_app(
scheme: "AeroNavMap",
export_method: "app-store",
skip_profile_detection: true,
export_options: { provisioningProfiles: { "net.tequilaapps.airnavmap" => "match AppStore net.tequilaapps.airnavmap"}}
)
end
My current solution is to manually update the xcodeproj just before building but this is also not very clean
lane :build_appstore do
match(type: "appstore", readonly: true)
if Helper.ci?
UI.message "Patching Xcode proj to use AppStore profile"
`sed -i.bak -e 's/match AdHoc net.tequilaapps.airnavmap/match AppStore net.tequilaapps.airnavmap/g' ../PEMap/PEMap.xcodeproj/project.pbxproj`
end
build_app(scheme: "AeroNavMap", export_method: "app-store")
end
There are two code signing phases when you archive a build (using Xcode or gym): the code signing identity used when building (in Xcode that's what set in the build settings of your target) and the one used when exporting the archive (the one you select in the export dialog from the organizer when exporting the archive via Xcode manually)
What we do in our Fastfiles is set both to the same value when invoking gym. We override the build settings using xcargs and use there the same signing as the one we set in export_options:
MY_APP_ID = "com.foo.bar"
MY_PROFILE = "match AppStore com.foo.bar"
MY_TEAM = …
match(
app_identifier: MY_APP_ID,
type: "appstore",
readonly: true
)
settings_to_override = {
:BUNDLE_IDENTIFIER => MY_APP_ID,
:PROVISIONING_PROFILE_SPECIFIER => MY_PROFILE,
:DEVELOPMENT_TEAM => MY_TEAM
}
gym(
workspace: WORKSPACE_PATH,
scheme: "Foo",
configuration: "Production",
xcargs: settings_to_override,
export_method: "app-store",
export_options: {
provisioningProfiles: {
MY_APP_ID => MY_PROFILE
}
}
)
Credit to https://github.com/AliSoftware

Resources