Skip to content
Closed
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
17 changes: 13 additions & 4 deletions .github/workflows/build-xcframework.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,20 @@ on:
jobs:
build:
runs-on: macos-14

strategy:
matrix:
xcode-version: [15.4, 16.1]
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Xcode select
run: sudo xcode-select -s '/Applications/Xcode_15.4.app/Contents/Developer'
- name: Xcode select ${{ matrix.xcode-version }}
run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode-version }}.app/Contents/Developer'
- name: Get Swift Version
run: |
SWIFT_MAJOR_VERSION=$(swift --version 2>&1 | awk '/Apple Swift version/ { split($7, ver, "."); print ver[1]; exit }')
echo "Swift major version: $SWIFT_MAJOR_VERSION"
echo "SWIFT_VERSION=$SWIFT_MAJOR_VERSION.0" >> "$GITHUB_ENV"
- name: Build xcframework
run: sh build.sh
run: sh build.sh
env:
SWIFT_VERSION: ${{ env.SWIFT_VERSION }}
15 changes: 11 additions & 4 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,22 @@ on:
jobs:
build:
runs-on: macos-14

strategy:
matrix:
xcode-version: [15.4, 16.1]
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Xcode select
run: sudo xcode-select -s '/Applications/Xcode_15.4.app/Contents/Developer'
- name: Xcode select ${{ matrix.xcode-version }}
run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode-version }}.app/Contents/Developer'
- name: Get Swift Version
run: |
SWIFT_MAJOR_VERSION=$(swift --version 2>&1 | awk '/Apple Swift version/ { split($7, ver, "."); print ver[1]; exit }')
echo "Swift major version: $SWIFT_MAJOR_VERSION"
echo "SWIFT_VERSION=$SWIFT_MAJOR_VERSION.0" >> "$GITHUB_ENV"
- name: Build for iOS Simulator
run: xcodebuild build -scheme ETDistribution -sdk iphonesimulator -destination 'generic/platform=iOS Simulator'
- name: Build for iOS
run: xcodebuild build -scheme ETDistribution -sdk iphoneos -destination 'generic/platform=iOS'
- name: Build TestApp
run: cd Example && xcodebuild build -scheme DemoApp -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' -project DemoApp.xcodeproj
run: cd Example && xcodebuild build -scheme DemoApp -sdk iphonesimulator -destination 'generic/platform=iOS Simulator' -project DemoApp.xcodeproj SWIFT_VERSION=${{ env.SWIFT_VERSION }}
20 changes: 15 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,32 @@ on:
jobs:
release:
runs-on: macos-14

strategy:
matrix:
xcode-version: [15.4, 16.1]
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Xcode select
run: sudo xcode-select -s '/Applications/Xcode_15.4.app/Contents/Developer'
- name: Xcode select ${{ matrix.xcode-version }}
run: sudo xcode-select -s '/Applications/Xcode_${{ matrix.xcode-version }}.app/Contents/Developer'
- name: Get Swift Version
run: |
SWIFT_MAJOR_VERSION=$(swift --version 2>&1 | awk '/Apple Swift version/ { split($7, ver, "."); print ver[1]; exit }')
echo "Swift major version: $SWIFT_MAJOR_VERSION"
echo "SWIFT_MAJOR_VERSION=$SWIFT_MAJOR_VERSION" >> "$GITHUB_ENV"
echo "SWIFT_VERSION=$SWIFT_MAJOR_VERSION.0" >> "$GITHUB_ENV"
- name: Build xcframework
run: sh build.sh
env:
SWIFT_VERSION: ${{ env.SWIFT_VERSION }}
- name: Zip xcframework
run: zip -r ETDistribution.xcframework.zip ETDistribution.xcframework
run: zip -r ETDistribution_swift_${{ env.SWIFT_MAJOR_VERSION }}.xcframework.zip ETDistribution.xcframework
- name: Upload Artifact
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: |
ETDistribution.xcframework.zip
ETDistribution_swift_${{ env.SWIFT_MAJOR_VERSION }}.xcframework.zip
body:
Release ${{ github.ref }}
Automated release created by GitHub Actions.
16 changes: 16 additions & 0 deletions Example/DemoApp.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,27 @@
F41853D22CB70EE3007F7CE8 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = F41853D12CB70EE3007F7CE8 /* Constants.swift */; };
F41853D42CB70EF0007F7CE8 /* UpdateUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = F41853D32CB70EF0007F7CE8 /* UpdateUtil.swift */; };
F41853D62CB70EF8007F7CE8 /* UpdateUtilObjc.m in Sources */ = {isa = PBXBuildFile; fileRef = F41853D52CB70EF8007F7CE8 /* UpdateUtilObjc.m */; };
F4C4FC962D416F81003E4309 /* ETDistribution in Embed Frameworks */ = {isa = PBXBuildFile; productRef = F41853CF2CB70E47007F7CE8 /* ETDistribution */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
FA1671C32A5367A800A42DB0 /* DemoAppApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1671C22A5367A800A42DB0 /* DemoAppApp.swift */; };
FA1671C52A5367A800A42DB0 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA1671C42A5367A800A42DB0 /* ContentView.swift */; };
FA1671C72A5367A800A42DB0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA1671C62A5367A800A42DB0 /* Assets.xcassets */; };
FA1671CB2A5367A800A42DB0 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FA1671CA2A5367A800A42DB0 /* Preview Assets.xcassets */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
F4C4FC972D416F81003E4309 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
F4C4FC962D416F81003E4309 /* ETDistribution in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
F41853D12CB70EE3007F7CE8 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
F41853D32CB70EF0007F7CE8 /* UpdateUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateUtil.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -104,6 +119,7 @@
FA1671BB2A5367A800A42DB0 /* Sources */,
FA1671BC2A5367A800A42DB0 /* Frameworks */,
FA1671BD2A5367A800A42DB0 /* Resources */,
F4C4FC972D416F81003E4309 /* Embed Frameworks */,
);
buildRules = (
);
Expand Down
111 changes: 57 additions & 54 deletions Example/DemoApp/UpdateUtil.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,84 +11,87 @@ import Foundation
import UIKit
import ETDistribution

@MainActor
struct UpdateUtil {
static func checkForUpdates() {
ETDistribution.shared.checkForUpdate(params: CheckForUpdateParams(apiKey: Constants.apiKey)) { result in
guard case let .success(releaseInfo) = result else {
if case let .failure(error) = result {
print("Error checking for update: \(error)")
Task {
guard case let .success(releaseInfo) = result else {
if case let .failure(error) = result {
print("Error checking for update: \(error)")
}
return
}
return
}

guard let releaseInfo = releaseInfo else {
print("Already up to date")
return
}

print("Update found: \(releaseInfo), requires login: \(releaseInfo.loginRequiredForDownload)")
if releaseInfo.loginRequiredForDownload {
// Get new release info, with login
ETDistribution.shared.getReleaseInfo(releaseId: releaseInfo.id) { newReleaseInfo in
if case let .success(newReleaseInfo) = newReleaseInfo {
UpdateUtil.installRelease(releaseInfo: newReleaseInfo)

guard let releaseInfo = releaseInfo else {
print("Already up to date")
return
}

print("Update found: \(releaseInfo), requires login: \(releaseInfo.loginRequiredForDownload)")
if releaseInfo.loginRequiredForDownload {
// Get new release info, with login
await ETDistribution.shared.getReleaseInfo(releaseId: releaseInfo.id) { newReleaseInfo in
Task {
if case let .success(newReleaseInfo) = newReleaseInfo {
await UpdateUtil.installRelease(releaseInfo: newReleaseInfo)
}
}
}
} else {
await UpdateUtil.installRelease(releaseInfo: releaseInfo)
}
} else {
UpdateUtil.installRelease(releaseInfo: releaseInfo)
}
}
}

static func checkForUpdatesWithLogin() {
let params = CheckForUpdateParams(apiKey: Constants.apiKey, requiresLogin: true)
ETDistribution.shared.checkForUpdate(params: params) { result in
guard case let .success(releaseInfo) = result else {
if case let .failure(error) = result {
print("Error checking for update: \(error)")
Task {
guard case let .success(releaseInfo) = result else {
if case let .failure(error) = result {
print("Error checking for update: \(error)")
}
return
}
return
}

guard let releaseInfo = releaseInfo else {
print("Already up to date")
return
}

print("Update found: \(releaseInfo), requires login: \(releaseInfo.loginRequiredForDownload)")
if releaseInfo.loginRequiredForDownload {
// Get new release info, with login
ETDistribution.shared.getReleaseInfo(releaseId: releaseInfo.id) { newReleaseInfo in
if case let .success(newReleaseInfo) = newReleaseInfo {
UpdateUtil.installRelease(releaseInfo: newReleaseInfo)

guard let releaseInfo = releaseInfo else {
print("Already up to date")
return
}

print("Update found: \(releaseInfo), requires login: \(releaseInfo.loginRequiredForDownload)")
if releaseInfo.loginRequiredForDownload {
// Get new release info, with login
await ETDistribution.shared.getReleaseInfo(releaseId: releaseInfo.id) { newReleaseInfo in
Task {
if case let .success(newReleaseInfo) = newReleaseInfo {
await UpdateUtil.installRelease(releaseInfo: newReleaseInfo)
}
}
}
} else {
await UpdateUtil.installRelease(releaseInfo: releaseInfo)
}
} else {
UpdateUtil.installRelease(releaseInfo: releaseInfo)
}
}
}

static func clearTokens() {
delete(key: "accessToken") {
delete(key: "refreshToken") {
print("Tokens cleared")
}
}
delete(key: "accessToken")
delete(key: "refreshToken")
print("Tokens cleared")
}

private static func delete(key: String, completion: @escaping () -> Void) {
DispatchQueue.global().async {
let attributes = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: "com.emerge.ETDistribution",
kSecAttrAccount: key,
] as CFDictionary
private static func delete(key: String) {
let attributes = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: "com.emerge.ETDistribution",
kSecAttrAccount: key,
] as CFDictionary

SecItemDelete(attributes)

completion()
}
SecItemDelete(attributes)
}

private static func installRelease(releaseInfo: DistributionReleaseInfo) {
Expand Down
Loading