diff --git a/.github/workflows/ios_emerge_upload_adhoc.yml b/.github/workflows/ios_emerge_upload_adhoc.yml deleted file mode 100644 index fead94b5..00000000 --- a/.github/workflows/ios_emerge_upload_adhoc.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: Sentry PR iOS Upload (Build Distribution) - -on: - pull_request: - branches: [main] - paths: [ios/**] - -jobs: - build_adhoc: - runs-on: macos-15 - - defaults: - run: - working-directory: ./ios - - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Select Xcode version - run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' - - - name: Set up Ruby env - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.10 - bundler-cache: true - - - name: Setup gems - run: exec ../.github/scripts/ios/setup.sh - - - name: Decode signing certificate into a file - env: - CERTIFICATE_BASE64: ${{ secrets.IOS_DIST_SIGNING_KEY_BASE64 }} - run: | - echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 - - name: Replace API key in Constants file - run: | - sed -i '' "s/API_KEY/$ETDISTRIBUTION_API_KEY/g" HackerNews/Utils/Constants.swift - env: - ETDISTRIBUTION_API_KEY: ${{ secrets.ETDISTRIBUTION_API_KEY_IOS }} - - name: Build & upload iOS AdHoc binary to Sentry - run: bundle exec fastlane ios build_upload_emerge - env: - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY: ${{ secrets.ASC_PRIVATE_KEY }} - SIGNING_KEY_PASSWORD: ${{ secrets.IOS_DIST_SIGNING_KEY_PASSWORD }} - SIGNING_KEY_FILE_PATH: signing-cert.p12 - EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_SENTRY_AUTH_TOKEN }} - CONFIGURATION: AdHoc - EMERGE_BUILD_TYPE: pull-request-adhoc - PROV_PROFILE_NAME: HackerNews AdHoc Distribution - WIDGET_PROV_PROFILE_NAME: HackerNews AdHoc HomeWidget - ADHOC: true - APP_ID_SUFFIX: adhoc diff --git a/.github/workflows/ios_emerge_upload_main.yml b/.github/workflows/ios_emerge_upload_main.yml deleted file mode 100644 index 4d6704a5..00000000 --- a/.github/workflows/ios_emerge_upload_main.yml +++ /dev/null @@ -1,101 +0,0 @@ -name: Sentry iOS Upload (Size Analysis) - -on: - push: - branches: [main] - -jobs: - build: - runs-on: macos-15 - - defaults: - run: - working-directory: ./ios - - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Select Xcode version - run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' - - - name: Set up Ruby env - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.10 - bundler-cache: true - - - name: Setup gems - run: exec ../.github/scripts/ios/setup.sh - - - name: Decode signing certificate into a file - env: - CERTIFICATE_BASE64: ${{ secrets.IOS_DIST_SIGNING_KEY_BASE64 }} - run: | - echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 - - # This version uploads a build to Testflight - - name: Build & upload iOS size analysis binary to Sentry - run: bundle exec fastlane ios build_upload_testflight - env: - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY: ${{ secrets.ASC_PRIVATE_KEY }} - SIGNING_KEY_PASSWORD: ${{ secrets.IOS_DIST_SIGNING_KEY_PASSWORD }} - SIGNING_KEY_FILE_PATH: signing-cert.p12 - EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_SENTRY_AUTH_TOKEN }} - CONFIGURATION: Release - EMERGE_BUILD_TYPE: release - - build_adhoc: - runs-on: macos-15 - - defaults: - run: - working-directory: ./ios - - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Select Xcode version - run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' - - - name: Set up Ruby env - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.10 - bundler-cache: true - - - name: Setup gems - run: exec ../.github/scripts/ios/setup.sh - - - name: Decode signing certificate into a file - env: - CERTIFICATE_BASE64: ${{ secrets.IOS_DIST_SIGNING_KEY_BASE64 }} - run: | - echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 - - - name: Build & upload iOS AdHoc binary to Sentry - run: bundle exec fastlane ios build_upload_emerge - env: - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY: ${{ secrets.ASC_PRIVATE_KEY }} - SIGNING_KEY_PASSWORD: ${{ secrets.IOS_DIST_SIGNING_KEY_PASSWORD }} - SIGNING_KEY_FILE_PATH: signing-cert.p12 - EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_SENTRY_AUTH_TOKEN }} - CONFIGURATION: AdHoc - EMERGE_BUILD_TYPE: main-adhoc - PROV_PROFILE_NAME: HackerNews AdHoc Distribution - WIDGET_PROV_PROFILE_NAME: HackerNews AdHoc HomeWidget - ADHOC: true - APP_ID_SUFFIX: adhoc diff --git a/.github/workflows/ios_emerge_upload_pr.yml b/.github/workflows/ios_emerge_upload_pr.yml deleted file mode 100644 index ab00c95c..00000000 --- a/.github/workflows/ios_emerge_upload_pr.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Emerge PR iOS Upload (Size Analysis) - -on: - pull_request: - branches: [main] - paths: [ios/**] - -jobs: - build: - runs-on: macos-15 - - defaults: - run: - working-directory: ./ios - - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Select Xcode version - run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' - - - name: Set up Ruby env - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.10 - bundler-cache: true - - - name: Setup gems - run: exec ../.github/scripts/ios/setup.sh - - - name: Decode signing certificate into a file - env: - CERTIFICATE_BASE64: ${{ secrets.IOS_DIST_SIGNING_KEY_BASE64 }} - run: | - echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 - - - name: Build & upload iOS size analysis binary to Emerge Tools - run: bundle exec fastlane ios build_upload_emerge - env: - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY: ${{ secrets.ASC_PRIVATE_KEY }} - SIGNING_KEY_PASSWORD: ${{ secrets.IOS_DIST_SIGNING_KEY_PASSWORD }} - SIGNING_KEY_FILE_PATH: signing-cert.p12 - EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_SENTRY_AUTH_TOKEN }} - CONFIGURATION: Release - EMERGE_BUILD_TYPE: pull-request diff --git a/.github/workflows/ios_emerge_upload_snapshots.yml b/.github/workflows/ios_emerge_upload_snapshots.yml deleted file mode 100644 index 3c9ba0a1..00000000 --- a/.github/workflows/ios_emerge_upload_snapshots.yml +++ /dev/null @@ -1,93 +0,0 @@ -name: Emerge PR iOS Upload (Snapshots) - -on: - push: - branches: [main] - pull_request: - branches: [main] - paths: [ios/**, .github/workflows/ios*] - -jobs: - upload_emerge_snapshots: - runs-on: macos-15 - - defaults: - run: - working-directory: ./ios - - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Select Xcode version - run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' - - - name: Set up Ruby env - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.10 - bundler-cache: true - - - name: Setup gems - run: exec ../.github/scripts/ios/setup.sh - - - name: Build & upload iOS snapshot binary to Emerge Tools - run: bundle exec fastlane ios build_upload_emerge_snapshot - env: - EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} - - upload_swift_snapshot_testing_snapshots: - runs-on: macos-15 - defaults: - run: - working-directory: ./ios - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - name: Select Xcode version - run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' - - name: Ruby setup - uses: ruby/setup-ruby@v1 - with: - ruby-version: 3.3.10 - bundler-cache: true - - name: Install gems - run: gem install xcpretty emerge - - name: Set up App Store Connect API Key - run: | - ABSOLUTE_KEY_PATH="$(pwd)/app_store_key.p8" - echo "${{ secrets.ASC_PRIVATE_KEY }}" > "$ABSOLUTE_KEY_PATH" - echo "AUTH_KEY_PATH=$ABSOLUTE_KEY_PATH" >> $GITHUB_ENV - - name: Generate new snapshots - env: - APP_STORE_KEY_ID: ${{ secrets.ASC_KEY_ID }} - APP_STORE_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - run: | - set -o pipefail && xcodebuild test \ - -scheme HackerNews \ - -sdk iphonesimulator \ - -destination 'platform=iOS Simulator,name=iPhone 16 Pro,OS=18.6' \ - -only-testing:HackerNewsTests/SwiftSnapshotTest \ - -allowProvisioningUpdates \ - -authenticationKeyPath "$AUTH_KEY_PATH" \ - -authenticationKeyID $APP_STORE_KEY_ID \ - -authenticationKeyIssuerID $APP_STORE_ISSUER_ID \ - ONLY_ACTIVE_ARCH=YES \ - TARGETED_DEVICE_FAMILY=1 \ - SUPPORTS_MACCATALYST=NO | xcpretty - continue-on-error: true - - name: Upload snapshots - env: - EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} - run: | - emerge upload snapshots \ - --name "HackerNews Swift-Snapshot-Testing" \ - --id "com.emerge.hn.Hacker-News.swiftsnapshottesting" \ - --repo-name "EmergeTools/hackernews" \ - --client-library swift-snapshot-testing \ - --project-root . \ - --debug diff --git a/.github/workflows/ios_sentry_upload_pr.yml b/.github/workflows/ios_sentry_upload_pr.yml new file mode 100644 index 00000000..75869be1 --- /dev/null +++ b/.github/workflows/ios_sentry_upload_pr.yml @@ -0,0 +1,115 @@ +name: Sentry PR iOS Upload (Size Analysis) + +on: + pull_request: + branches: [main] + paths: [ios/**] + +jobs: + build: + runs-on: macos-15 + + defaults: + run: + working-directory: ./ios + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Select Xcode version + run: sudo xcode-select -s '/Applications/Xcode_26.0.1.app/Contents/Developer' + + - name: Install iOS platform + run: | + for i in 1 2 3 4 5; do + echo "Attempt $i to download iOS platform..." + xcodebuild -downloadPlatform iOS && exit 0 + echo "Attempt $i failed, waiting 45s before retry..." + sleep 45 + done + echo "All attempts failed" + exit 1 + + - name: Set up Ruby env + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.3.10 + bundler-cache: true + + - name: Setup gems + run: exec ../.github/scripts/ios/setup.sh + + - name: Decode signing certificate into a file + env: + CERTIFICATE_BASE64: ${{ secrets.IOS_DIST_SIGNING_KEY_BASE64 }} + run: | + echo $CERTIFICATE_BASE64 | base64 --decode > signing-cert.p12 + + - name: Build iOS binary + run: bundle exec fastlane ios build_upload_emerge + env: + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + ASC_KEY: ${{ secrets.ASC_PRIVATE_KEY }} + SIGNING_KEY_PASSWORD: ${{ secrets.IOS_DIST_SIGNING_KEY_PASSWORD }} + SIGNING_KEY_FILE_PATH: signing-cert.p12 + EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_SENTRY_AUTH_TOKEN }} + CONFIGURATION: Release + EMERGE_BUILD_TYPE: pull-request + + - name: Print build log on failure + if: failure() + run: | + echo "=== Full Gym Build Log ===" + cat ~/Library/Logs/gym/HackerNews-HackerNews.log || echo "Log file not found" + + - name: Upload to Emerge Tools via REST API + env: + EMERGE_API_TOKEN: ${{ secrets.EMERGE_API_KEY }} + run: | + set -e + + ZIP_PATH="./build/HackerNews.xcarchive.zip" + + echo "Zipping xcarchive..." + cd build && zip -r -q HackerNews.xcarchive.zip HackerNews.xcarchive && cd .. + + echo "Getting upload URL from Emerge..." + UPLOAD_RESPONSE=$(curl -s -X POST "https://api.emergetools.com/upload" \ + -H "Accept: application/json" \ + -H "Content-Type: application/json" \ + -H "X-API-Token: $EMERGE_API_TOKEN" \ + -d '{ + "filename": "HackerNews.xcarchive.zip", + "branch": "${{ github.head_ref }}", + "repoName": "${{ github.repository }}", + "sha": "${{ github.event.pull_request.head.sha }}", + "baseSha": "${{ github.event.pull_request.base.sha }}", + "prNumber": "${{ github.event.pull_request.number }}" + }') + + echo "Upload response: $UPLOAD_RESPONSE" + + UPLOAD_URL=$(echo "$UPLOAD_RESPONSE" | jq -r '.uploadURL') + + if [ -z "$UPLOAD_URL" ] || [ "$UPLOAD_URL" = "null" ]; then + echo "Failed to get upload URL. Response: $UPLOAD_RESPONSE" + exit 1 + fi + + echo "Uploading to Emerge..." + UPLOAD_STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X PUT "$UPLOAD_URL" \ + -H "Content-Type: application/zip" \ + -T "$ZIP_PATH") + + if [ "$UPLOAD_STATUS" -ne 200 ]; then + echo "Upload failed with status: $UPLOAD_STATUS" + exit 1 + fi + + echo "Successfully uploaded to Emerge Tools!" diff --git a/ios/HackerNews.xcodeproj/project.pbxproj b/ios/HackerNews.xcodeproj/project.pbxproj index 742c85a8..957908b9 100644 --- a/ios/HackerNews.xcodeproj/project.pbxproj +++ b/ios/HackerNews.xcodeproj/project.pbxproj @@ -12,6 +12,8 @@ A47309B42AA29D9600201376 /* SwiftSoup in Frameworks */ = {isa = PBXBuildFile; productRef = A47309B32AA29D9600201376 /* SwiftSoup */; }; A495A6662CED57BB009A2A6B /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = A495A6652CED57BB009A2A6B /* SnapshotTesting */; }; A495B2952BFEA11B00A8A8A9 /* Reaper in Frameworks */ = {isa = PBXBuildFile; productRef = A495B2942BFEA11B00A8A8A9 /* Reaper */; }; + 05B2BD042A88C8DC9BECD5B9 /* KingfisherDynamic in Frameworks */ = {isa = PBXBuildFile; productRef = A990CB277FAD71FD1667B0AC /* KingfisherDynamic */; }; + 5885E2A84CFAB9F0D52287A5 /* KingfisherDynamic in Embed Frameworks */ = {isa = PBXBuildFile; productRef = A990CB277FAD71FD1667B0AC /* KingfisherDynamic */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; A49D686D2DE8EB1F00E44A18 /* Linkmap.txt in Resources */ = {isa = PBXBuildFile; fileRef = A49D686C2DE8EB1F00E44A18 /* Linkmap.txt */; }; A4B6CF932D49949200077F66 /* WidgetKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4B6CF922D49949200077F66 /* WidgetKit.framework */; }; A4B6CF952D49949200077F66 /* SwiftUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4B6CF942D49949200077F66 /* SwiftUI.framework */; }; @@ -83,6 +85,7 @@ files = ( F45F6F4A2D4D2185003FA9A3 /* Common in Embed Frameworks */, F48E9FDB2D51690400FD8B30 /* ETDistribution in Embed Frameworks */, + 5885E2A84CFAB9F0D52287A5 /* KingfisherDynamic in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -193,6 +196,7 @@ files = ( F45F6EA52D4D1E50003FA9A3 /* Common in Frameworks */, A47309B42AA29D9600201376 /* SwiftSoup in Frameworks */, + 05B2BD042A88C8DC9BECD5B9 /* KingfisherDynamic in Frameworks */, F48E9ECB2D4D691600FD8B30 /* ETDistribution in Frameworks */, A4D28AEE2C237E2A007F20D0 /* SnapshotPreferences in Frameworks */, F45F703E2D4D2695003FA9A3 /* Fonts in Frameworks */, @@ -372,6 +376,7 @@ name = HackerNews; packageProductDependencies = ( A47309B32AA29D9600201376 /* SwiftSoup */, + A990CB277FAD71FD1667B0AC /* KingfisherDynamic */, 673236B0A4D04137A0D80A76 /* Sentry */, A495B2942BFEA11B00A8A8A9 /* Reaper */, A4D28AED2C237E2A007F20D0 /* SnapshotPreferences */, @@ -496,6 +501,7 @@ mainGroup = A42705702A4293B10057E439; packageReferences = ( A47309B22AA29D9600201376 /* XCRemoteSwiftPackageReference "SwiftSoup" */, + BD436D9EB42265A7226AE73D /* XCLocalSwiftPackageReference "Packages/KingfisherDynamic" */, 995A2BEDEF224F7085D3DB13 /* XCRemoteSwiftPackageReference "sentry-cocoa" */, A495B2932BFEA11B00A8A8A9 /* XCRemoteSwiftPackageReference "Reaper" */, A4D28AEC2C237E2A007F20D0 /* XCRemoteSwiftPackageReference "SnapshotPreviews" */, @@ -1224,6 +1230,10 @@ isa = XCLocalSwiftPackageReference; relativePath = Packages/Fonts; }; + BD436D9EB42265A7226AE73D /* XCLocalSwiftPackageReference "Packages/KingfisherDynamic" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Packages/KingfisherDynamic; + }; /* End XCLocalSwiftPackageReference section */ /* Begin XCRemoteSwiftPackageReference section */ @@ -1322,6 +1332,11 @@ package = A47309B22AA29D9600201376 /* XCRemoteSwiftPackageReference "SwiftSoup" */; productName = SwiftSoup; }; + A990CB277FAD71FD1667B0AC /* KingfisherDynamic */ = { + isa = XCSwiftPackageProductDependency; + package = BD436D9EB42265A7226AE73D /* XCLocalSwiftPackageReference "Packages/KingfisherDynamic" */; + productName = KingfisherDynamic; + }; A495A6652CED57BB009A2A6B /* SnapshotTesting */ = { isa = XCSwiftPackageProductDependency; package = A495A6642CED57BB009A2A6B /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */; diff --git a/ios/HackerNews.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/HackerNews.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index f74453c2..90b950f6 100644 --- a/ios/HackerNews.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/ios/HackerNews.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -46,6 +46,15 @@ "version" : "8.0.0" } }, + { + "identity" : "kingfisher", + "kind" : "remoteSourceControl", + "location" : "https://github.com/onevcat/Kingfisher.git", + "state" : { + "revision" : "d30a5fad881137e2267f96a8e3fc35c58999bb94", + "version" : "8.6.2" + } + }, { "identity" : "reaper", "kind" : "remoteSourceControl", diff --git a/ios/HackerNews/Settings/SettingsScreen.swift b/ios/HackerNews/Settings/SettingsScreen.swift index 83497d74..36e83c92 100644 --- a/ios/HackerNews/Settings/SettingsScreen.swift +++ b/ios/HackerNews/Settings/SettingsScreen.swift @@ -8,6 +8,7 @@ import Foundation import SwiftUI import Common +import KingfisherDynamic import SentrySwiftUI struct SettingsScreen: View { @@ -85,6 +86,25 @@ struct SettingsScreen: View { url: URL(string: "https://www.x.com/heyrikin")!) } ) + + SettingsRow( + text: "Kingfisher demo", + leadingIcon: { + KFImage(URL(string: "https://placekitten.com/48/48")) + .resizable() + .frame(width: 20, height: 20) + .clipShape(.rect(cornerRadius: 4)) + }, + trailingIcon: { + Image(systemName: "arrow.up.right") + .font(.system(size: 12)) + .foregroundStyle(.onBackground) + }, + action: { + model.openSafariLink( + url: URL(string: "https://github.com/onevcat/Kingfisher")!) + } + ) #if ADHOC SettingsRow( diff --git a/ios/Packages/KingfisherDynamic/Package.swift b/ios/Packages/KingfisherDynamic/Package.swift new file mode 100644 index 00000000..697f01ff --- /dev/null +++ b/ios/Packages/KingfisherDynamic/Package.swift @@ -0,0 +1,32 @@ +// swift-tools-version: 6.0 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "KingfisherDynamic", + platforms: [ + .iOS(.v17), + ], + products: [ + .library( + name: "KingfisherDynamic", + type: .dynamic, + targets: ["KingfisherDynamic"] + ) + ], + dependencies: [ + .package(url: "https://github.com/onevcat/Kingfisher.git", from: "8.6.2") + ], + targets: [ + .target( + name: "KingfisherDynamic", + dependencies: [ + .product(name: "Kingfisher", package: "Kingfisher") + ], + swiftSettings: [ + .swiftLanguageMode(.v5) + ] + ) + ] +) diff --git a/ios/Packages/KingfisherDynamic/Sources/KingfisherDynamic/KingfisherDynamic.swift b/ios/Packages/KingfisherDynamic/Sources/KingfisherDynamic/KingfisherDynamic.swift new file mode 100644 index 00000000..8596b542 --- /dev/null +++ b/ios/Packages/KingfisherDynamic/Sources/KingfisherDynamic/KingfisherDynamic.swift @@ -0,0 +1,4 @@ +@_exported import Kingfisher + +/// Namespace module for the dynamic Kingfisher wrapper package. +public enum KingfisherDynamic {}