Use fastlane for iOS builds.

Signed-off-by: Igor Mandrigin <i@mandrigin.ru>
This commit is contained in:
Igor Mandrigin 2018-08-13 13:40:24 +02:00
parent 27f0e53bc1
commit 8f13d97b43
No known key found for this signature in database
GPG Key ID: 4A0EDDE26E66BC8B
11 changed files with 205 additions and 215 deletions

16
ci/Jenkinsfile vendored
View File

@ -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(
withCredentials([
string(
credentialsId: "slave-pass-${env.NODE_NAME}",
variable: 'password'
),
string(
credentialsId: 'fastlane-match-password',
variable:'KEYCHAIN_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'
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'

View File

@ -5,7 +5,7 @@ env.FASTLANE_DISABLE_COLORS=1
env.REALM_DISABLE_ANALYTICS=1
timeout(90) {
node ('macos'){
node ('fastlane'){
stage('Git & Dependencies'){

View File

@ -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)
}
}
}
}
}

View File

@ -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)
}
}

View File

@ -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

View File

@ -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

View File

@ -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(
stage('Build & TestFlight (iOS)') {
withCredentials([
string(
credentialsId: "slave-pass-${env.NODE_NAME}",
variable: 'password'
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"
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 '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'
}

1
fastlane/.env Normal file
View File

@ -0,0 +1 @@
RCT_NO_LAUNCH_PACKAGER=true

View File

@ -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

9
fastlane/Matchfile Normal file
View File

@ -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

View File

@ -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;