From 8f13d97b43efb4e0802fed9c2e8dab9c4ac7712c Mon Sep 17 00:00:00 2001 From: Igor Mandrigin Date: Mon, 13 Aug 2018 13:40:24 +0200 Subject: [PATCH] Use fastlane for iOS builds. Signed-off-by: Igor Mandrigin --- ci/Jenkinsfile | 22 +++-- ci/Jenkinsfile.fastlane.clean | 2 +- ci/Jenkinsfile.nightly | 130 ------------------------- ci/Jenkinsfile.nightly_fastlane | 39 ++++---- ci/Jenkinsfile.parameters | 30 +++--- ci/Jenkinsfile.release | 27 +++-- ci/Jenkinsfile.upload_release_ios | 36 +++---- fastlane/.env | 1 + fastlane/Fastfile | 99 +++++++++++++++++-- fastlane/Matchfile | 9 ++ ios/StatusIm.xcodeproj/project.pbxproj | 25 ++++- 11 files changed, 205 insertions(+), 215 deletions(-) delete mode 100644 ci/Jenkinsfile.nightly create mode 100644 fastlane/.env create mode 100644 fastlane/Matchfile diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 362dfb12ea..ff22eceec4 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -24,7 +24,7 @@ def installJSDeps() { } timeout(90) { - node ('macos_pr') { + node ('fastlane') { def apkUrl = '' def ipaUrl = '' def testPassed = true @@ -87,20 +87,22 @@ timeout(90) { // iOS stage('Build (iOS)') { - withCredentials([string( - credentialsId: "slave-pass-${env.NODE_NAME}", - variable: 'password' - )]) { - env.RCT_NO_LAUNCH_PACKAGER = true - sh "security unlock-keychain -p ${password} login.keychain" - sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' + withCredentials([ + string( + credentialsId: "slave-pass-${env.NODE_NAME}", + variable: 'password' + ), + string( + credentialsId: 'fastlane-match-password', + variable:'KEYCHAIN_PASSWORD' + )]) { + sh 'fastlane ios adhoc' } } stage('Deploy (iOS)') { withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() + def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() def hash = 'null' for (int r = 0; r < 6 && hash == 'null'; r++) { sh 'sleep 10' diff --git a/ci/Jenkinsfile.fastlane.clean b/ci/Jenkinsfile.fastlane.clean index 58e660e00e..e496399db3 100644 --- a/ci/Jenkinsfile.fastlane.clean +++ b/ci/Jenkinsfile.fastlane.clean @@ -5,7 +5,7 @@ env.FASTLANE_DISABLE_COLORS=1 env.REALM_DISABLE_ANALYTICS=1 timeout(90) { - node ('macos'){ + node ('fastlane'){ stage('Git & Dependencies'){ diff --git a/ci/Jenkinsfile.nightly b/ci/Jenkinsfile.nightly deleted file mode 100644 index d4a253e333..0000000000 --- a/ci/Jenkinsfile.nightly +++ /dev/null @@ -1,130 +0,0 @@ -// We need nightly builds for users who want to test apps, diawi removes old builds and limits downloads, hence the need for Artifactory. -// To see env: echo sh(returnStdout: true, script: 'env') - -env.LANG="en_US.UTF-8" -env.LANGUAGE="en_US.UTF-8" -env.LC_ALL="en_US.UTF-8" -env.FASTLANE_DISABLE_COLORS=1 -env.REALM_DISABLE_ANALYTICS=1 - -def installJSDeps() { - def attempt = 1 - def maxAttempts = 10 - def installed = false - while (!installed && attempt <= maxAttempts) { - println "#${attempt} attempt to install npm deps" - sh 'scripts/prepare-for-platform.sh mobile' - sh 'npm install' - installed = fileExists('node_modules/web3/index.js') - attemp = attempt + 1 - } -} - -timeout(90) { - node ('macos'){ - def apkUrl = '' - def ipaUrl = '' - def testPassed = true - - load "$HOME/env.groovy" - - try { - - stage('Git & Dependencies') { - slackSend color: 'good', message: 'Nightly build started. ' + env.BUILD_URL - - checkout scm - - sh 'rm -rf node_modules' - sh 'cp .env.jenkins .env' - - installJSDeps() - - sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack' - sh 'cd ios && pod install && cd ..' - } - - stage('Tests') { - sh 'lein test-cljs' - } - - stage('Build') { - sh 'lein prod-build' - } - - stage('Build (Android)') { - sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease' - } - - stage('Build (iOS)') { - env.RCT_NO_LAUNCH_PACKAGER = true - sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' - } - - stage('Deploy (Android)') { - def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/' - println (artifact_dir + 'app-release.apk') - sh ('ls -la ' + artifact_dir) - def artifact = (artifact_dir + 'app-release.apk') - def server = Artifactory.server('artifacts') - def shortCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim().take(6) - def filename = 'im.status.ethereum-' + shortCommit + '-nightly' + '.apk' - def newArtifact = (artifact_dir + filename) - sh ('mv ' + artifact + ' ' + newArtifact) - def uploadSpec = '{ "files": [ { "pattern": "*apk/release/' + filename + '", "target": "nightlies-local" }]}' - def buildInfo = server.upload(uploadSpec) - apkUrl = 'http://artifacts.status.im:8081/artifactory/nightlies-local/' + filename - - sh ('echo ARTIFACT Android: ' + apkUrl) - } - - stage('Deploy (iOS)') { - withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() - sh 'sleep 10' - def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() - ipaUrl = 'https://i.diawi.com/' + hash - - sh ('echo ARTIFACT iOS: ' + ipaUrl) - } - } - } catch (e) { - slackSend color: 'bad', message: 'Nightly build (develop) failed to build. ' + env.BUILD_URL - throw e - } - - stage('Slack Notification') { - def c = (testPassed ? 'good' : 'warning' ) - slackSend color: c, message: 'Nightly build (develop) \nTests: ' + (testPassed ? ':+1:' : ':-1:') + ')\nAndroid: ' + apkUrl + '\n iOS: ' + ipaUrl - build( - job: 'misc/status-im.github.io-update_env', - parameters: [ - [$class: 'StringParameterValue', name: 'APK_URL', value: apkUrl], - [$class: 'StringParameterValue', name: 'IOS_URL', value: ipaUrl] - ] - ) - } - - stage('Build (Android) for e2e tests') { - sh 'cd android && mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/app-release.original.apk && ENVFILE=.env.e2e ./gradlew assembleRelease' - } - - stage('Upload apk for e2e tests') { - if (env.CHANGE_ID != null){ - withCredentials([string(credentialsId: 'SAUCE_ACCESS_KEY', variable: 'key'), string(credentialsId: 'SAUCE_USERNAME', variable: 'username')]){ - def apk_name = env.CHANGE_ID + '.apk' - sh('curl -u ' + username+ ':' + key + ' -X POST -H "Content-Type: application/octet-stream" https://saucelabs.com/rest/v1/storage/' + username + '/' + apk_name + '?overwrite=true --data-binary @android/app/build/outputs/apk/release/app-release.apk') - } - withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@android/app/build/outputs/apk/release/app-release.apk -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() - sh 'sleep 10' - def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() - apkUrl = 'https://i.diawi.com/' + hash - - sh ('echo ARTIFACT Android for e2e tests: ' + apkUrl) - } - } - } - } -} diff --git a/ci/Jenkinsfile.nightly_fastlane b/ci/Jenkinsfile.nightly_fastlane index b88ca2c091..9228937561 100644 --- a/ci/Jenkinsfile.nightly_fastlane +++ b/ci/Jenkinsfile.nightly_fastlane @@ -26,7 +26,7 @@ def installJSDeps() { } timeout(90) { - node ('macos'){ + node ('fastlane'){ def apkUrl = '' def ipaUrl = '' def testPassed = true @@ -80,21 +80,6 @@ timeout(90) { sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease' } - stage('Build (iOS)') { - withCredentials([string( - credentialsId: "slave-pass-${env.NODE_NAME}", - variable: 'password' - )]) { - sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" - sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" - env.RCT_NO_LAUNCH_PACKAGER = true - sh "security unlock-keychain -p ${password} login.keychain" - sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status_appstore -archivePath status.xcarchive -exportOptionsPlist ios/archive-release.plist' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' - } - } - stage('Deploy (Android)') { def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/' println (artifact_dir + 'app-release.apk') @@ -112,14 +97,30 @@ timeout(90) { sh ('echo ARTIFACT Android: ' + apkUrl) } - stage('Deploy (iOS)') { + stage('Build & TestFlight (iOS)') { + withCredentials([ + string( + credentialsId: "slave-pass-${env.NODE_NAME}", + variable: 'KEYCHAIN_PASSWORD' + ), + string( + credentialsId: 'fastlane-match-password', + variable:'MATCH_PASSWORD' + )]) { + + sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" + sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" + sh 'fastlane ios nightly' + } + } + + stage('Deploy diawi (iOS)') { withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() + def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() sh 'sleep 10' def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() ipaUrl = 'https://i.diawi.com/' + hash - sh ('bundle exec fastlane ios nightly') sh ('echo ARTIFACT iOS: ' + ipaUrl) } } diff --git a/ci/Jenkinsfile.parameters b/ci/Jenkinsfile.parameters index f664dded3c..66890dabf3 100644 --- a/ci/Jenkinsfile.parameters +++ b/ci/Jenkinsfile.parameters @@ -18,7 +18,7 @@ def installJSDeps() { } timeout(90) { - node ('macos') { + node ('fastlane') { def apkUrl = '' def ipaUrl = '' def testPassed = true @@ -84,26 +84,24 @@ timeout(90) { } } - // try { - // stage('Test (Android)') { - // sauce('b9aded57-5cc1-4f6b-b5ea-42d989987852') { - // sh 'cd test/appium && mvn -DapkUrl=' + apkUrl + ' test' - // saucePublisher() - // } - // } - // } catch(e) { - // testPassed = false - // } - // iOS stage('Build (iOS)') { - env.RCT_NO_LAUNCH_PACKAGER = true - sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' + withCredentials([ + string( + credentialsId: "slave-pass-${env.NODE_NAME}", + variable: 'KEYCHAIN_PASSWORD' + ), + string( + credentialsId: 'fastlane-match-password', + variable:'MATCH_PASSWORD' + )]) { + + sh 'fastlane ios adhoc' + } } stage('Deploy (iOS)') { withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() + def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() sh 'sleep 10' def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() ipaUrl = 'https://i.diawi.com/' + hash diff --git a/ci/Jenkinsfile.release b/ci/Jenkinsfile.release index 99ebaae8e2..81f1868a84 100644 --- a/ci/Jenkinsfile.release +++ b/ci/Jenkinsfile.release @@ -20,7 +20,7 @@ def installJSDeps() { } timeout(90) { - node ('macos'){ + node ('fastlane'){ def apkUrl = '' def ipaUrl = '' def testPassed = true @@ -75,14 +75,6 @@ timeout(90) { sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease -PreleaseVersion=' + version } - stage('Build (iOS)') { - sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" - sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" - env.RCT_NO_LAUNCH_PACKAGER = true - sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' - } - stage('Deploy (Android)') { def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/' println (artifact_dir + 'app-release.apk') @@ -100,9 +92,24 @@ timeout(90) { sh ('echo ARTIFACT Android: ' + apkUrl) } + stage('Build (iOS)') { + withCredentials([ + string( + credentialsId: "slave-pass-${env.NODE_NAME}", + variable: 'KEYCHAIN_PASSWORD' + ), + string( + credentialsId: 'fastlane-match-password', + variable:'MATCH_PASSWORD' + )]) { + sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" + sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" + sh 'fastlane ios adhoc' + } + stage('Deploy (iOS)') { withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() + def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status-adhoc/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() sh 'sleep 10' def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() ipaUrl = 'https://i.diawi.com/' + hash diff --git a/ci/Jenkinsfile.upload_release_ios b/ci/Jenkinsfile.upload_release_ios index fc405a0160..bb86be7a3b 100644 --- a/ci/Jenkinsfile.upload_release_ios +++ b/ci/Jenkinsfile.upload_release_ios @@ -20,7 +20,7 @@ def installJSDeps() { } timeout(90) { - node ('macos'){ + node ('fastlane'){ def apkUrl = '' def ipaUrl = '' def testPassed = true @@ -74,28 +74,24 @@ timeout(90) { sh 'lein prod-build' } - stage('Build (iOS)') { - withCredentials([string( - credentialsId: "slave-pass-${env.NODE_NAME}", - variable: 'password' - )]) { - sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" - sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" - env.RCT_NO_LAUNCH_PACKAGER = true - sh "security unlock-keychain -p ${password} login.keychain" - sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status_appstore -archivePath status.xcarchive -exportOptionsPlist ios/archive-release.plist' + stage('Build & TestFlight (iOS)') { + withCredentials([ + string( + credentialsId: "slave-pass-${env.NODE_NAME}", + variable: 'KEYCHAIN_PASSWORD' + ), + string( + credentialsId: 'fastlane-match-password', + variable:'MATCH_PASSWORD' + )]) { + + + sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" + sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" + sh 'fastlane ios release' } } - stage('Deploy (iOS)') { - sh ('bundle exec fastlane ios release') - } - } catch (e) { - slackSend color: 'bad', message: 'Release build failed uploading to iTunes Connect. ' + env.BUILD_URL - throw e - } - stage('Slack Notification') { slackSend color: 'good', message: 'Release build ' + version + ' succesfully aploade to iTunes Connect' } diff --git a/fastlane/.env b/fastlane/.env new file mode 100644 index 0000000000..055dffbdba --- /dev/null +++ b/fastlane/.env @@ -0,0 +1 @@ +RCT_NO_LAUNCH_PACKAGER=true diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 40fe85d425..a5a06267f4 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -6,25 +6,112 @@ # https://docs.fastlane.tools/actions # -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane +# There are a few env variables defined in the .env file in +# this directory (fastlane/.env) + + +# unlocks keychain if KEYCHAIN_PASSWORD variable is present +# (to be used on CI machines) +def unlock_keychain_if_needed + if ENV["KEYCHAIN_PASSWORD"] + unlock_keychain( + path:"login.keychain", + password:ENV["password"], + set_default: true) + end +end + + +# builds an ios app with ad-hoc configuration and put it +# to "status-adhoc" output folder +def build_ios_adhoc + match( + type: "adhoc", + force_for_new_devices: true, + readonly: true, + keychain_name: "login.keychain" + ) + build_ios_app( + scheme: "StatusIm", + workspace: "ios/StatusIm.xcworkspace", + configuration: "Release", + clean: true, + export_method: "ad-hoc", + output_directory: "status-adhoc" + ) +end platform :ios do - desc "Deploy a new internal build to iTunes Connect" + desc "`fastlane ios adhoc` - ad-hoc lane for iOS." + desc "This lane is used PRs, Releases, etc." + desc "It creates an .ipa that can be used by a list of devices, registeded in the App Store Connect." + desc "This .ipa is ready to be distibuted through diawi.com" + lane :adhoc do + unlock_keychain_if_needed + build_ios_adhoc + end + + desc "`fastlane ios nightly` - makes a new nightly in TestFlight" + desc "This lane builds a new nightly and uploads it to TestFlight" + desc "It also leaves an .ipa that is ad-hoc signed (can be uploaded to diawi)" lane :nightly do + unlock_keychain_if_needed + + match( + type: "appstore", + force_for_new_devices: true, + readonly: true, + keychain_name: "login.keychain" + ) + build_ios_app( + scheme: "StatusIm", + workspace: "ios/StatusIm.xcworkspace", + configuration: "Release", + clean: true, + export_method: "app-store", + output_directory: "status_appstore" + ) upload_to_testflight( ipa: "status_appstore/StatusIm.ipa" ) - slack(message: "New nightly build uploaded to iTunes Connect") + slack(message: "New nightly build uploaded to TestFlight") + + # additional .ipa is for diawi + # we have to re-build it because it uses different config + build_ios_adhoc end + + desc "`fastlane ios release` builds a release & uploads it to TestFlight" lane :release do + match( + type: "appstore", + force_for_new_devices: true, + readonly: true, + keychain_name: "login.keychain" + ) + build_ios_app( + scheme: "StatusIm", + workspace: "ios/StatusIm.xcworkspace", + configuration: "Release", + clean: true, + export_method: "app-store", + output_directory: "status_appstore", + export_options: { + "combileBitcode": true, + "uploadBitcode": false, + "ITSAppUsesNonExemptEncryption": false + } + ) upload_to_testflight( ipa: "status_appstore/StatusIm.ipa" ) - slack(message: "New release build uploaded to iTunes Connect") + slack(message: "New release build uploaded to TestFlight") end - desc "Remove inactive TestFlight users" + + desc "`fastlane ios clean` - remove inactive TestFlight users" + desc "uses custom plugin, installed via" + desc "`sudo get install fastlane-plugin-clean_testflight_testers`" lane :clean do clean_testflight_testers end diff --git a/fastlane/Matchfile b/fastlane/Matchfile new file mode 100644 index 0000000000..faf6f52f89 --- /dev/null +++ b/fastlane/Matchfile @@ -0,0 +1,9 @@ +git_url("git@github.com:status-im/ios-certificates.git") + +type("development") # The default type, can be: appstore, adhoc, enterprise or development + +# app_identifier(["tools.fastlane.app", "tools.fastlane.app2"]) +username("support@status.im") # Your Apple Developer Portal username + +# For all available options run `fastlane match --help` +# Remove the # in the beginning of the line to enable the other options diff --git a/ios/StatusIm.xcodeproj/project.pbxproj b/ios/StatusIm.xcodeproj/project.pbxproj index 4c252bb21b..fd2d852a7d 100644 --- a/ios/StatusIm.xcodeproj/project.pbxproj +++ b/ios/StatusIm.xcodeproj/project.pbxproj @@ -1186,11 +1186,12 @@ 00E356ED1AD99517003FC87E = { CreatedOnToolsVersion = 6.2; DevelopmentTeam = DTX7Z4U3YA; + ProvisioningStyle = Manual; TestTargetID = 13B07F861A680F5B00A75B9A; }; 13B07F861A680F5B00A75B9A = { DevelopmentTeam = DTX7Z4U3YA; - ProvisioningStyle = Automatic; + ProvisioningStyle = Manual; SystemCapabilities = { com.apple.BackgroundModes = { enabled = 1; @@ -1911,6 +1912,7 @@ buildSettings = { BUNDLE_ID_SUFFIX = .debug; BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "iPhone Developer"; DEVELOPMENT_TEAM = DTX7Z4U3YA; FRAMEWORK_SEARCH_PATHS = ( "$(SDKROOT)/Developer/Library/Frameworks", @@ -1949,6 +1951,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm"; }; name = Debug; @@ -1959,6 +1963,7 @@ buildSettings = { BUNDLE_ID_SUFFIX = ""; BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = DTX7Z4U3YA; FRAMEWORK_SEARCH_PATHS = ( @@ -1994,6 +1999,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/StatusIm.app/StatusIm"; }; name = Release; @@ -2005,7 +2012,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)"; BUNDLE_ID_SUFFIX = .debug; CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; CUSTOM_PRODUCT_NAME = "Status Debug"; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = DTX7Z4U3YA; @@ -2057,6 +2066,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum; PRODUCT_NAME = StatusIm; + PROVISIONING_PROFILE = "9da75626-9594-43d9-a827-0f6d43c28f54"; + PROVISIONING_PROFILE_SPECIFIER = "match Development im.status.ethereum"; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "arm64 armv7 armv7s"; }; @@ -2069,7 +2080,9 @@ ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon$(BUNDLE_ID_SUFFIX)"; BUNDLE_ID_SUFFIX = ""; CODE_SIGN_ENTITLEMENTS = StatusIm/StatusIm.entitlements; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; CUSTOM_PRODUCT_NAME = Status; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = DTX7Z4U3YA; @@ -2121,6 +2134,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = im.status.ethereum; PRODUCT_NAME = StatusIm; + PROVISIONING_PROFILE = "e2202b12-7a66-4ff7-af3c-a52e35f32dc1"; + PROVISIONING_PROFILE_SPECIFIER = "match AdHoc im.status.ethereum"; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "armv7 armv7s arm64"; }; @@ -2145,7 +2160,9 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = DTX7Z4U3YA; ENABLE_BITCODE = NO; @@ -2212,7 +2229,9 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; COPY_PHASE_STRIP = YES; DEVELOPMENT_TEAM = DTX7Z4U3YA; ENABLE_BITCODE = NO;