Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 12 additions & 35 deletions .github/workflows/ci_cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,45 +24,18 @@ jobs:

build:
name: CI/CD
runs-on: macos-15 # is not the macos-latest, which should be by the end of August 2025
runs-on: macos-latest

steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4

- name: Install the Apple certificate and provisioning profile
- name: Install App Store Connect API key
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.APPLE_BUILD_CERT_PASSWORD }}
GENERIC_APP_PROVISION_PROFILE: ${{ secrets.APPLE_GENERIC_APP_PROVISION_PROFILE_BASE64 }}
NOTIFICATION_SERVICE_PROVISION_PROFILE: ${{ secrets.APPLE_NOTIFICATION_SERVICE_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
APP_STORE_CONNECT_PRIVATE_KEY: ${{ secrets.APP_STORE_CONNECT_PRIVATE_KEY }}
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision
NOTIDICATION_SERVICE_PP_PATH=$RUNNER_TEMP/notification_service_pp.mobileprovision
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db

# import certificate and provisioning profile from secrets
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
echo -n "$GENERIC_APP_PROVISION_PROFILE" | base64 --decode -o $PP_PATH
echo -n "$NOTIFICATION_SERVICE_PROVISION_PROFILE" | base64 --decode -o $NOTIDICATION_SERVICE_PP_PATH

# create temporary keychain
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH

# import certificate to keychain
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH

# apply provisioning profile
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
cp $NOTIDICATION_SERVICE_PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles
mkdir -p ~/private_keys
echo -n "$APP_STORE_CONNECT_PRIVATE_KEY" > ~/private_keys/AuthKey_${{ secrets.APP_STORE_CONNECT_KEY_ID }}.p8

- name: Swift Package Manager cache
uses: actions/cache@d4323d4df104b026a6aa633fdb11d772146be0bf # v4
Expand All @@ -79,20 +52,24 @@ jobs:
-sdk iphoneos \
-configuration Release \
-destination generic/platform=iOS \
clean archive
-allowProvisioningUpdates \
-authenticationKeyPath ~/private_keys/AuthKey_${{ secrets.APP_STORE_CONNECT_KEY_ID }}.p8 \
-authenticationKeyID ${{ secrets.APP_STORE_CONNECT_KEY_ID }} \
-authenticationKeyIssuerID ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }} \
clean archive

# - name: Export IPA
# env:
# EXPORT_OPTIONS_PLIST: ${{ secrets.APPLE_EXPORT_OPTIONS_PLIST }}
# run: |
# EXPORT_OPTS_PATH=$RUNNER_TEMP/ExportOptions.plist
# echo -n "$EXPORT_OPTIONS_PLIST" | base64 --decode -o $EXPORT_OPTS_PATH
# xcodebuild -exportArchive -archivePath $RUNNER_TEMP/genericapp.xcarchive -exportOptionsPlist $EXPORT_OPTS_PATH -exportPath $RUNNER_TEMP/build
# xcodebuild -exportArchive -archivePath $RUNNER_TEMP/genericapp.xcarchive -exportOptionsPlist $EXPORT_OPTS_PATH -exportPath $RUNNER_TEMP/build

# - name: Upload IPAs
# if: success()
# uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4
# with:
# name: ipas
# path: |
# **/*.ipa
# **/*.ipa
14 changes: 9 additions & 5 deletions GenericApp/GenericApp/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,15 @@ class AppDelegate: UIResponder, UIApplicationDelegate, URLSessionDelegate {
UNUserNotificationCenter.current().delegate = self
// if the app was launched because of geofencing

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentsDirectory = paths[0]
let fileName = "\(Date()).log"
let logFilePath = (documentsDirectory as NSString).appendingPathComponent(fileName)
freopen(logFilePath.cString(using: String.Encoding.ascii)!, "a+", stderr)

// Redirects NSLog calls to file
if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileName = "\(Date()).log"
let logFilePath = documentsDirectory.appendingPathComponent(fileName).path
if let cPath = logFilePath.cString(using: .utf8) {
freopen(cPath, "a+", stderr)
}
}

if launchOptions?[UIApplication.LaunchOptionsKey.location] != nil {
NSLog("%@", "App started from location update")
Expand Down