diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index a5d86cfd..d2089d17 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -* @JoeMatt @lonkelle +* @JoeMatt @lonkelle @nythepegasus @Spidy123222 @SternXD diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 41080fbc..f17f038c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,15 +2,15 @@ name: Bug Report description: Report a bug title: "[BUG] " labels: ["bug"] -assignees: - - naturecodevoid +assignees: [] body: - type: markdown attributes: value: | + ## Please note that the issue tracker is not for support Thanks for taking the time to fill out this bug report! Before you continue filling out the report, please **[search in GitHub Issues](https://github.com/SideStore/SideStore/issues?q=is%3Aissue+is%3Aopen) for the bug you are experiencing** in case it has already been reported. - **Please use [Discord](https://discord.gg/RgpFBX3Q3k) or [GitHub Discussions](https://github.com/SideStore/SideStore/discussions) for support.** + **Please use [Discord](https://discord.gg/sidestore-949183273383395328) or [GitHub Discussions](https://github.com/SideStore/SideStore/discussions) for support.** - type: textarea id: description attributes: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 6c3dddb3..2d4102e5 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,7 +3,7 @@ blank_issues_enabled: false contact_links: - name: Discord - url: https://discord.gg/RgpFBX3Q3k + url: https://discord.gg/sidestore-949183273383395328 about: If you need support, please go here first instead of making an issue! - name: GitHub Discussions url: https://github.com/SideStore/SideStore/discussions diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index b291169f..e85b73cc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -2,15 +2,14 @@ name: Feature Request description: Suggest a feature title: "[FEATURE REQUEST] " labels: ["enhancement"] -assignees: - - naturecodevoid +assignees: [] body: - type: markdown attributes: value: | Thanks for taking the time to fill out this feature request! Before you continue filling out the form, please **[search in GitHub Issues](https://github.com/SideStore/SideStore/issues?q=is%3Aissue+is%3Aopen) for the feature you are suggestion** in case it has already been suggested. - **Please use [Discord](https://discord.gg/RgpFBX3Q3k) or [GitHub Discussions](https://github.com/SideStore/SideStore/discussions) for support.** + **Please use [Discord](https://discord.gg/sidestore-949183273383395328) or [GitHub Discussions](https://github.com/SideStore/SideStore/discussions) for support.** - type: textarea id: description attributes: diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 4a0aea21..d22f20b1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,6 +10,3 @@ - [x] Finish UI changes - [ ] Test - - -Closes #1234 diff --git a/.github/workflows/attach_build_products.yml b/.github/workflows/attach_build_products.yml index 1a1ea691..47482b95 100644 --- a/.github/workflows/attach_build_products.yml +++ b/.github/workflows/attach_build_products.yml @@ -20,3 +20,58 @@ jobs: format: name addTo: pull # addTo: pullandissues + nightly-link-comment: + if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + # This snippet is public-domain, taken from + # https://github.com/oprypin/nightly.link/blob/master/.github/workflows/pr-comment.yml + script: | + async function upsertComment(owner, repo, issue_number, purpose, body) { + const {data: comments} = await github.rest.issues.listComments( + {owner, repo, issue_number}); + + const marker = ``; + body = marker + "\n" + body; + + const existing = comments.filter((c) => c.body.includes(marker)); + if (existing.length > 0) { + const last = existing[existing.length - 1]; + core.info(`Updating comment ${last.id}`); + await github.rest.issues.updateComment({ + owner, repo, + body, + comment_id: last.id, + }); + } else { + core.info(`Creating a comment in issue / PR #${issue_number}`); + await github.rest.issues.createComment({issue_number, body, owner, repo}); + } + } + + const {owner, repo} = context.repo; + const run_id = ${{github.event.workflow_run.id}}; + + const pull_requests = ${{ toJSON(github.event.workflow_run.pull_requests) }}; + if (!pull_requests.length) { + return core.error("This workflow doesn't match any pull requests!"); + } + + const artifacts = await github.paginate( + github.rest.actions.listWorkflowRunArtifacts, {owner, repo, run_id}); + if (!artifacts.length) { + return core.error(`No artifacts found`); + } + let body = `Download the artifacts for this pull request (nightly.link):\n`; + for (const art of artifacts) { + body += `\n* [${art.name}.zip](https://nightly.link/${owner}/${repo}/actions/artifacts/${art.id}.zip)`; + } + + core.info("Review thread message body:", body); + + for (const pr of pull_requests) { + await upsertComment(owner, repo, pr.number, + "nightly-link", body); + } diff --git a/.github/workflows/beta.yml b/.github/workflows/beta.yml index e5792b55..432ff1cb 100644 --- a/.github/workflows/beta.yml +++ b/.github/workflows/beta.yml @@ -11,13 +11,13 @@ jobs: fail-fast: false matrix: include: - - os: 'macos-12' - version: '14.2' + - os: 'macos-14' + version: '15.4' runs-on: ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: submodules: recursive @@ -35,10 +35,17 @@ jobs: run: echo "${{ steps.version.outputs.version }}" - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1.4.1 + uses: maxim-lobanov/setup-xcode@v1 with: xcode-version: ${{ matrix.version }} + + - name: Cache Build + uses: irgaly/xcode-cache@v1 + with: + key: xcode-cache-deriveddata-${{ github.sha }} + restore-keys: xcode-cache-deriveddata + - name: Build SideStore run: make build | xcpretty && exit ${PIPESTATUS[0]} @@ -84,13 +91,13 @@ jobs: run: mv SideStore.ipa SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload SideStore.ipa Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}.ipa path: SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload *.dSYM Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}-dSYM path: ./*.dSYM/ diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index aea20363..98522ad4 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -14,13 +14,13 @@ jobs: fail-fast: false matrix: include: - - os: 'macos-12' - version: '14.2' + - os: 'macos-14' + version: '15.4' runs-on: ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: submodules: recursive @@ -28,7 +28,7 @@ jobs: run: brew install ldid - name: Cache .nightly-build-num - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: .nightly-build-num key: nightly-build-num @@ -44,10 +44,16 @@ jobs: run: echo "${{ steps.version.outputs.version }}" - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1.4.1 + uses: maxim-lobanov/setup-xcode@v1.6.0 with: xcode-version: ${{ matrix.version }} + - name: Cache Build + uses: irgaly/xcode-cache@v1 + with: + key: xcode-cache-deriveddata-${{ github.sha }} + restore-keys: xcode-cache-deriveddata- + - name: Build SideStore run: make build | xcpretty && exit ${PIPESTATUS[0]} @@ -91,16 +97,13 @@ jobs: run: mv SideStore.ipa SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload SideStore.ipa Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}.ipa path: SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload *.dSYM Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}-dSYM path: ./*.dSYM/ - - - name: Reset cache for apps.sidestore.io/nightly - run: sleep 10 && curl https://apps.sidestore.io/reset-cache/nightly/${{ secrets.SIDESOURCE_KEY }} diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 6befcfbb..a302b61a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -9,13 +9,13 @@ jobs: fail-fast: false matrix: include: - - os: 'macos-12' - version: '14.2' + - os: 'macos-14' + version: '15.4' runs-on: ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: submodules: recursive @@ -35,10 +35,16 @@ jobs: run: echo "${{ steps.version.outputs.version }}" - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1.4.1 + uses: maxim-lobanov/setup-xcode@v1.6.0 with: xcode-version: ${{ matrix.version }} + - name: Cache Build + uses: irgaly/xcode-cache@v1 + with: + key: xcode-cache-deriveddata-${{ github.sha }} + restore-keys: xcode-cache-deriveddata- + - name: Build SideStore run: make build | xcpretty && exit ${PIPESTATUS[0]} @@ -52,13 +58,13 @@ jobs: run: mv SideStore.ipa SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload SideStore.ipa Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}.ipa path: SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload *.dSYM Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}-dSYM path: ./*.dSYM/ diff --git a/.github/workflows/stable.yml b/.github/workflows/stable.yml index d1a6d1e5..56692010 100644 --- a/.github/workflows/stable.yml +++ b/.github/workflows/stable.yml @@ -11,13 +11,13 @@ jobs: fail-fast: false matrix: include: - - os: 'macos-12' - version: '14.2' + - os: 'macos-14' + version: '15.4' runs-on: ${{ matrix.os }} steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: submodules: recursive @@ -35,10 +35,16 @@ jobs: run: echo "${{ steps.version.outputs.version }}" - name: Setup Xcode - uses: maxim-lobanov/setup-xcode@v1.4.1 + uses: maxim-lobanov/setup-xcode@v1.6.0 with: xcode-version: ${{ matrix.version }} + - name: Cache Build + uses: irgaly/xcode-cache@v1 + with: + key: xcode-cache-deriveddata-${{ github.sha }} + restore-keys: xcode-cache-deriveddata- + - name: Build SideStore run: make build | xcpretty && exit ${PIPESTATUS[0]} @@ -81,13 +87,13 @@ jobs: run: mv SideStore.ipa SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload SideStore.ipa Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}.ipa path: SideStore-${{ steps.version.outputs.version }}.ipa - name: Upload *.dSYM Artifact - uses: actions/upload-artifact@v3.1.0 + uses: actions/upload-artifact@v4 with: name: SideStore-${{ steps.version.outputs.version }}-dSYM path: ./*.dSYM/ diff --git a/.gitignore b/.gitignore index 9e0fcf89..72b3ada8 100644 --- a/.gitignore +++ b/.gitignore @@ -19,7 +19,6 @@ archive.xcarchive *.perspectivev3 !default.perspectivev3 xcuserdata - ## Other *.xccheckout *.moved-aside diff --git a/.gitmodules b/.gitmodules index 4ca1ebdb..3272e236 100644 --- a/.gitmodules +++ b/.gitmodules @@ -9,7 +9,7 @@ url = https://github.com/libimobiledevice/libusbmuxd.git [submodule "Dependencies/libplist"] path = Dependencies/libplist - url = https://github.com/libimobiledevice/libplist.git + url = https://github.com/SideStore/libplist.git [submodule "Dependencies/MarkdownAttributedString"] path = Dependencies/MarkdownAttributedString url = https://github.com/chockenberry/MarkdownAttributedString.git diff --git a/AltBackup/Assets.xcassets/Background.colorset/Contents.json b/AltBackup/Assets.xcassets/Background.colorset/Contents.json index 8251d696..262221ad 100644 --- a/AltBackup/Assets.xcassets/Background.colorset/Contents.json +++ b/AltBackup/Assets.xcassets/Background.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0.518", - "green" : "0.502", - "red" : "0.004" + "blue" : "175", + "green" : "4", + "red" : "115" } }, "idiom" : "universal" @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0.404", - "green" : "0.322", - "red" : "0.008" + "blue" : "150", + "green" : "3", + "red" : "99" } }, "idiom" : "universal" diff --git a/AltServer/ErrorDetailsViewController.swift b/AltServer/ErrorDetailsViewController.swift new file mode 100644 index 00000000..6f9fd1c7 --- /dev/null +++ b/AltServer/ErrorDetailsViewController.swift @@ -0,0 +1,48 @@ +// +// ErrorDetailsViewController.swift +// AltServer +// +// Created by Riley Testut on 10/4/22. +// Copyright © 2022 Riley Testut. All rights reserved. +// + +import AppKit + +class ErrorDetailsViewController: NSViewController +{ + var error: NSError? { + didSet { + self.update() + } + } + + @IBOutlet private var errorCodeLabel: NSTextField! + @IBOutlet private var detailedDescriptionLabel: NSTextField! + + override func viewDidLoad() + { + super.viewDidLoad() + + self.detailedDescriptionLabel.preferredMaxLayoutWidth = 800 + } +} + +private extension ErrorDetailsViewController +{ + func update() + { + if !self.isViewLoaded + { + self.loadView() + } + + guard let error = self.error else { return } + + self.errorCodeLabel.stringValue = error.localizedErrorCode + + let font = self.detailedDescriptionLabel.font ?? NSFont.systemFont(ofSize: 12) + let detailedDescription = error.formattedDetailedDescription(with: font) + self.detailedDescriptionLabel.attributedStringValue = detailedDescription + } +} + diff --git a/AltStore.xcodeproj/project.pbxproj b/AltStore.xcodeproj/project.pbxproj index 96c93b3d..060580d0 100644 --- a/AltStore.xcodeproj/project.pbxproj +++ b/AltStore.xcodeproj/project.pbxproj @@ -3,28 +3,65 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ 03F06CD52942C27E001C4D68 /* Bundle+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314122A05D4C00370A3C /* Bundle+AltStore.swift */; }; + 0E05025A2BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0502592BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift */; }; + 0E05025C2BEC947000879B5C /* String+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E05025B2BEC947000879B5C /* String+SideStore.swift */; }; + 0E13E5862CC8F55900E9C0DF /* ProcessInfo+SideStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E13E5852CC8F55900E9C0DF /* ProcessInfo+SideStore.swift */; }; + 0E1A1F912AE36A9700364CAD /* bytearray.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E1A1F902AE36A9600364CAD /* bytearray.c */; }; + 0E764E172ADFF5740043DD4E /* AltBackup.ipa in Resources */ = {isa = PBXBuildFile; fileRef = 0E764E162ADFF5740043DD4E /* AltBackup.ipa */; }; + 0EA1665B2ADFE0D2003015C1 /* out-limd.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166472ADFE0D1003015C1 /* out-limd.c */; }; + 0EA1665C2ADFE0D2003015C1 /* out-default.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166522ADFE0D2003015C1 /* out-default.c */; }; + 0EA1665D2ADFE0D2003015C1 /* out-plutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166552ADFE0D2003015C1 /* out-plutil.c */; }; + 0EA1665E2ADFE0D2003015C1 /* oplist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166562ADFE0D2003015C1 /* oplist.c */; }; + 0EA166682ADFE122003015C1 /* jsmn.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EA166632ADFE122003015C1 /* jsmn.h */; }; + 0EA166692ADFE140003015C1 /* Array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166452ADFE0D1003015C1 /* Array.cpp */; }; + 0EA1666A2ADFE140003015C1 /* String.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166492ADFE0D1003015C1 /* String.cpp */; }; + 0EA1666B2ADFE140003015C1 /* Boolean.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664E2ADFE0D1003015C1 /* Boolean.cpp */; }; + 0EA1666C2ADFE140003015C1 /* Integer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166532ADFE0D2003015C1 /* Integer.cpp */; }; + 0EA1666D2ADFE140003015C1 /* Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166432ADFE0D1003015C1 /* Data.cpp */; }; + 0EA1666E2ADFE140003015C1 /* ptrarray.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166512ADFE0D2003015C1 /* ptrarray.c */; }; + 0EA1666F2ADFE140003015C1 /* hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664F2ADFE0D1003015C1 /* hashtable.c */; }; + 0EA166702ADFE140003015C1 /* Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166502ADFE0D2003015C1 /* Node.cpp */; }; + 0EA166712ADFE140003015C1 /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166582ADFE0D2003015C1 /* Key.cpp */; }; + 0EA166732ADFE140003015C1 /* Dictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166462ADFE0D1003015C1 /* Dictionary.cpp */; }; + 0EA166742ADFE140003015C1 /* Date.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166422ADFE0D1003015C1 /* Date.cpp */; }; + 0EA166752ADFE140003015C1 /* Real.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166542ADFE0D2003015C1 /* Real.cpp */; }; + 0EA166762ADFE140003015C1 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664A2ADFE0D1003015C1 /* base64.c */; }; + 0EA166772ADFE140003015C1 /* jplist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166412ADFE0D1003015C1 /* jplist.c */; }; + 0EA166782ADFE140003015C1 /* jsmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166572ADFE0D2003015C1 /* jsmn.c */; }; + 0EA166792ADFE140003015C1 /* bplist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166442ADFE0D1003015C1 /* bplist.c */; }; + 0EA1667A2ADFE140003015C1 /* Uid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664B2ADFE0D1003015C1 /* Uid.cpp */; }; + 0EA1667B2ADFE140003015C1 /* Structure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1665A2ADFE0D2003015C1 /* Structure.cpp */; }; + 0EA1667D2ADFE140003015C1 /* xplist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA166592ADFE0D2003015C1 /* xplist.c */; }; + 0EA1667E2ADFE140003015C1 /* time64.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664C2ADFE0D1003015C1 /* time64.c */; }; + 0EA4263A2C2230150026D7FB /* AnisetteServerList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA426392C2230150026D7FB /* AnisetteServerList.swift */; }; + 0EA4B9BC2AE4A414009209CE /* plist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4B9BB2AE4A3F6009209CE /* plist.c */; }; + 0EE7FDC42BE8BC7900D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; }; + 0EE7FDC62BE8CEA300D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; }; + 0EE7FDC72BE8CF4100D1E390 /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */; }; + 0EE7FDC82BE8CF4800D1E390 /* ALTWrappedError.h in Headers */ = {isa = PBXBuildFile; fileRef = 0EE7FDC22BE8BC4200D1E390 /* ALTWrappedError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0EE7FDC92BE8D07400D1E390 /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; + 0EE7FDCB2BE8D12B00D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; }; + 0EE7FDCD2BE9124400D1E390 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */; }; 19104D952909BAEA00C49C7B /* libimobiledevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BF45872B2298D31600BD7491 /* libimobiledevice.a */; }; 19104DB52909C06D00C49C7B /* EmotionalDamage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19104DB42909C06D00C49C7B /* EmotionalDamage.swift */; }; 19104DBC2909C4E500C49C7B /* libEmotionalDamage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 19104DB22909C06C00C49C7B /* libEmotionalDamage.a */; }; 191E5FB4290A5DA0001A3B7C /* libminimuxer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 191E5FAB290A5D92001A3B7C /* libminimuxer.a */; }; 191E5FDC290AFA5C001A3B7C /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 191E5FDB290AFA5C001A3B7C /* OpenSSL */; }; - 191E607D290B2EA5001A3B7C /* jsmn.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E5FD0290A651D001A3B7C /* jsmn.c */; }; - 191E607E290B2EA7001A3B7C /* jplist.c in Sources */ = {isa = PBXBuildFile; fileRef = 191E5FCF290A651D001A3B7C /* jplist.c */; }; - 1920B04F2924AC8300744F60 /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 1920B04E2924AC8300744F60 /* Settings.bundle */; }; 19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */; }; 4879A95F2861046500FC1BBD /* AltSign in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A95E2861046500FC1BBD /* AltSign */; }; 4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */ = {isa = PBXBuildFile; productRef = 4879A9612861049C00FC1BBD /* OpenSSL */; }; + 9922FFEC29B501C50020F868 /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = 9922FFEB29B501C50020F868 /* Starscream */; }; 99C4EF4D2979132100CB538D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = 99C4EF4C2979132100CB538D /* SemanticVersion */; }; 99F87D0529D8B4E200B40039 /* minimuxer-helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9961EC2D29BE9F2E00AF2C6F /* minimuxer-helpers.swift */; }; 99F87D1829D8E4C900B40039 /* SwiftBridgeCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F87D1629D8E4C900B40039 /* SwiftBridgeCore.swift */; }; 99F87D1929D8E4C900B40039 /* minimuxer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F87D1729D8E4C900B40039 /* minimuxer.swift */; }; + A800F7042CE28E3800208744 /* View+AltWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A800F7032CE28E2F00208744 /* View+AltWidget.swift */; }; B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; }; - B3146ED3284F581E00BBC3FD /* Roxas.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B3146ECD284F580500BBC3FD /* Roxas.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; B33FFBA8295F8E98002259E6 /* libfragmentzip.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B343F894295F7F9B002B1159 /* libfragmentzip.a */; }; B33FFBAA295F8F78002259E6 /* preboard.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBA9295F8F78002259E6 /* preboard.c */; }; B33FFBAC295F8F98002259E6 /* companion_proxy.c in Sources */ = {isa = PBXBuildFile; fileRef = B33FFBAB295F8F98002259E6 /* companion_proxy.c */; }; @@ -49,6 +86,7 @@ B3C395F7284F362400DA9E2F /* AppCenterAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = B3C395F6284F362400DA9E2F /* AppCenterAnalytics */; }; B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */ = {isa = PBXBuildFile; productRef = B3C395F8284F362400DA9E2F /* AppCenterCrashes */; }; B3EE16B62925E27D00B3B1F5 /* AnisetteManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3EE16B52925E27D00B3B1F5 /* AnisetteManager.swift */; }; + BD4513AB2C6FA98C0052BCC0 /* AppExtensionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD4513AA2C6FA98C0052BCC0 /* AppExtensionView.swift */; }; BF02419622F2199300129732 /* RefreshAttemptsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF02419522F2199300129732 /* RefreshAttemptsViewController.swift */; }; BF08858322DE795100DE9F1E /* MyAppsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF08858222DE795100DE9F1E /* MyAppsViewController.swift */; }; BF08858522DE7EC800DE9F1E /* UpdateCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF08858422DE7EC800DE9F1E /* UpdateCollectionViewCell.swift */; }; @@ -73,7 +111,6 @@ BF41B808233433C100C593A3 /* LoadingState.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF41B807233433C100C593A3 /* LoadingState.swift */; }; BF42345A25101C35006D1EB2 /* WidgetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF42345825101C1D006D1EB2 /* WidgetView.swift */; }; BF44EEF0246B08BA002A52F2 /* BackupController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF44EEEF246B08BA002A52F2 /* BackupController.swift */; }; - BF44EEF3246B3A17002A52F2 /* AltBackup.ipa in Resources */ = {isa = PBXBuildFile; fileRef = BF44EEF2246B3A17002A52F2 /* AltBackup.ipa */; }; BF44EEFC246B4550002A52F2 /* RemoveAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF44EEFB246B4550002A52F2 /* RemoveAppOperation.swift */; }; BF4587F82298D3AB00BD7491 /* service.h in Headers */ = {isa = PBXBuildFile; fileRef = BF4587C82298D3A800BD7491 /* service.h */; }; BF4587F92298D3AB00BD7491 /* diagnostics_relay.c in Sources */ = {isa = PBXBuildFile; fileRef = BF4587C92298D3A800BD7491 /* diagnostics_relay.c */; }; @@ -137,7 +174,6 @@ BF58048A246A28F9008AE704 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BF580488246A28F9008AE704 /* LaunchScreen.storyboard */; }; BF580496246A3CB5008AE704 /* UIColor+AltBackup.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF580495246A3CB5008AE704 /* UIColor+AltBackup.swift */; }; BF580498246A3D19008AE704 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF580497246A3D19008AE704 /* UIKit.framework */; }; - BF58049B246A432D008AE704 /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; BF663C4F2433ED8200DAA738 /* FileManager+DirectorySize.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF663C4E2433ED8200DAA738 /* FileManager+DirectorySize.swift */; }; BF66EE822501AE50007EE018 /* AltStoreCore.h in Headers */ = {isa = PBXBuildFile; fileRef = BF66EE802501AE50007EE018 /* AltStoreCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; BF66EE852501AE50007EE018 /* AltStoreCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */; }; @@ -183,7 +219,6 @@ BF66EEE92501AED0007EE018 /* JSONDecoder+Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE52501AED0007EE018 /* JSONDecoder+Properties.swift */; }; BF66EEEA2501AED0007EE018 /* UIColor+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE62501AED0007EE018 /* UIColor+Hex.swift */; }; BF66EEEB2501AED0007EE018 /* UIApplication+AppExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF66EEE72501AED0007EE018 /* UIApplication+AppExtension.swift */; }; - BF6C336224197D700034FD24 /* NSError+AltStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C336124197D700034FD24 /* NSError+AltStore.swift */; }; BF6C8FAC242935ED00125131 /* NSAttributedString+Markdown.m in Sources */ = {isa = PBXBuildFile; fileRef = BF6C8FAA242935ED00125131 /* NSAttributedString+Markdown.m */; }; BF6C8FAE2429597900125131 /* BannerCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C8FAD2429597900125131 /* BannerCollectionViewCell.swift */; }; BF6C8FB02429599900125131 /* TextCollectionReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF6C8FAF2429599900125131 /* TextCollectionReusableView.swift */; }; @@ -214,7 +249,7 @@ BF9ABA4B22DD1380008935CF /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4A22DD137F008935CF /* NavigationBar.swift */; }; BF9ABA4D22DD16DE008935CF /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF9ABA4C22DD16DE008935CF /* PillButton.swift */; }; BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFA8172A23C5633D001B5953 /* FetchAnisetteDataOperation.swift */; }; - BFAECC522501B0A400528F27 /* CodableServerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableServerError.swift */; }; + BFAECC522501B0A400528F27 /* CodableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableError.swift */; }; BFAECC532501B0A400528F27 /* ServerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3128229F474900370A3C /* ServerProtocol.swift */; }; BFAECC542501B0A400528F27 /* NSError+ALTServerError.m in Sources */ = {isa = PBXBuildFile; fileRef = BF1E314922A060F400370A3C /* NSError+ALTServerError.m */; }; BFAECC552501B0A400528F27 /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF624858BDE00DD5981 /* Connection.swift */; }; @@ -253,34 +288,6 @@ BFD2477A2284B9A700981D42 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFD247782284B9A700981D42 /* LaunchScreen.storyboard */; }; BFD2478C2284C4C300981D42 /* AppIconImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2478B2284C4C300981D42 /* AppIconImageView.swift */; }; BFD2478F2284C8F900981D42 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD2478E2284C8F900981D42 /* Button.swift */; }; - BFD52C0122A1A9CB000B7ED1 /* ptrarray.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */; }; - BFD52C0222A1A9CB000B7ED1 /* base64.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE622A1A9CA000B7ED1 /* base64.c */; }; - BFD52C0322A1A9CB000B7ED1 /* hashtable.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE722A1A9CA000B7ED1 /* hashtable.c */; }; - BFD52C0422A1A9CB000B7ED1 /* Dictionary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BE822A1A9CA000B7ED1 /* Dictionary.cpp */; }; - BFD52C0522A1A9CB000B7ED1 /* ptrarray.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BE922A1A9CA000B7ED1 /* ptrarray.h */; }; - BFD52C0622A1A9CB000B7ED1 /* bplist.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BEA22A1A9CA000B7ED1 /* bplist.c */; }; - BFD52C0722A1A9CB000B7ED1 /* String.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BEB22A1A9CA000B7ED1 /* String.cpp */; }; - BFD52C0822A1A9CB000B7ED1 /* time64.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BEC22A1A9CA000B7ED1 /* time64.c */; }; - BFD52C0922A1A9CB000B7ED1 /* plist.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BED22A1A9CA000B7ED1 /* plist.h */; }; - BFD52C0A22A1A9CB000B7ED1 /* plist.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BEE22A1A9CA000B7ED1 /* plist.c */; }; - BFD52C0B22A1A9CB000B7ED1 /* hashtable.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BEF22A1A9CA000B7ED1 /* hashtable.h */; }; - BFD52C0C22A1A9CB000B7ED1 /* Date.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF022A1A9CA000B7ED1 /* Date.cpp */; }; - BFD52C0D22A1A9CB000B7ED1 /* Uid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF122A1A9CA000B7ED1 /* Uid.cpp */; }; - BFD52C0E22A1A9CB000B7ED1 /* Boolean.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF222A1A9CA000B7ED1 /* Boolean.cpp */; }; - BFD52C0F22A1A9CB000B7ED1 /* Real.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF322A1A9CA000B7ED1 /* Real.cpp */; }; - BFD52C1022A1A9CB000B7ED1 /* strbuf.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BF422A1A9CA000B7ED1 /* strbuf.h */; }; - BFD52C1122A1A9CB000B7ED1 /* bytearray.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF522A1A9CA000B7ED1 /* bytearray.c */; }; - BFD52C1222A1A9CB000B7ED1 /* base64.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BF622A1A9CA000B7ED1 /* base64.h */; }; - BFD52C1322A1A9CB000B7ED1 /* Data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF722A1A9CA000B7ED1 /* Data.cpp */; }; - BFD52C1422A1A9CB000B7ED1 /* Array.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF822A1A9CB000B7ED1 /* Array.cpp */; }; - BFD52C1522A1A9CB000B7ED1 /* Node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BF922A1A9CB000B7ED1 /* Node.cpp */; }; - BFD52C1622A1A9CB000B7ED1 /* bytearray.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BFA22A1A9CB000B7ED1 /* bytearray.h */; }; - BFD52C1722A1A9CB000B7ED1 /* Key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BFB22A1A9CB000B7ED1 /* Key.cpp */; }; - BFD52C1822A1A9CB000B7ED1 /* Integer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BFC22A1A9CB000B7ED1 /* Integer.cpp */; }; - BFD52C1922A1A9CB000B7ED1 /* Structure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = BFD52BFD22A1A9CB000B7ED1 /* Structure.cpp */; }; - BFD52C1A22A1A9CB000B7ED1 /* time64_limits.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BFE22A1A9CB000B7ED1 /* time64_limits.h */; }; - BFD52C1B22A1A9CB000B7ED1 /* time64.h in Headers */ = {isa = PBXBuildFile; fileRef = BFD52BFF22A1A9CB000B7ED1 /* time64.h */; }; - BFD52C1C22A1A9CB000B7ED1 /* xplist.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C0022A1A9CB000B7ED1 /* xplist.c */; }; BFD52C2022A1A9EC000B7ED1 /* node.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1D22A1A9EC000B7ED1 /* node.c */; }; BFD52C2122A1A9EC000B7ED1 /* node_list.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1E22A1A9EC000B7ED1 /* node_list.c */; }; BFD52C2222A1A9EC000B7ED1 /* cnary.c in Sources */ = {isa = PBXBuildFile; fileRef = BFD52C1F22A1A9EC000B7ED1 /* cnary.c */; }; @@ -301,7 +308,7 @@ BFE60742231B07E6002B0E8E /* SettingsHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE60741231B07E6002B0E8E /* SettingsHeaderFooterView.swift */; }; BFE6325A22A83BEB00F30809 /* Authentication.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BFE6325922A83BEB00F30809 /* Authentication.storyboard */; }; BFE6326C22A86FF300F30809 /* AuthenticationOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFE6326B22A86FF300F30809 /* AuthenticationOperation.swift */; }; - BFECAC8824FD950E0077C41F /* CodableServerError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableServerError.swift */; }; + BFECAC8824FD950E0077C41F /* CodableError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFD44605241188C300EAB90A /* CodableError.swift */; }; BFECAC8924FD950E0077C41F /* ConnectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF18BFF22485828200DD5981 /* ConnectionManager.swift */; }; BFECAC8A24FD950E0077C41F /* ALTServerError+Conveniences.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */; }; BFECAC8B24FD950E0077C41F /* ServerProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF1E3128229F474900370A3C /* ServerProtocol.swift */; }; @@ -335,6 +342,7 @@ D57FE84428C7DB7100216002 /* ErrorLogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */; }; D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = D58916FD28C7C55C00E39C8B /* LoggedError.swift */; }; D593F1942717749A006E82DE /* PatchAppOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D593F1932717749A006E82DE /* PatchAppOperation.swift */; }; + D5ACE84528E3B8450021CAB9 /* ClearAppCacheOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */; }; D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4A280E141900469595 /* ManagedPatron.swift */; }; D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */; }; D5DAE0942804B0B80034D8D4 /* ScreenshotProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5DAE0932804B0B80034D8D4 /* ScreenshotProcessor.swift */; }; @@ -481,7 +489,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - B3146ED3284F581E00BBC3FD /* Roxas.framework in Embed Frameworks */, BF1614F2250822F100767AEA /* Roxas.framework in Embed Frameworks */, BF66EE862501AE50007EE018 /* AltStoreCore.framework in Embed Frameworks */, ); @@ -502,17 +509,58 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0E0502592BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "OperatingSystemVersion+Comparable.swift"; sourceTree = ""; }; + 0E05025B2BEC947000879B5C /* String+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SideStore.swift"; sourceTree = ""; }; + 0E13E5852CC8F55900E9C0DF /* ProcessInfo+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ProcessInfo+SideStore.swift"; sourceTree = ""; }; + 0E1A1F902AE36A9600364CAD /* bytearray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bytearray.c; path = src/bytearray.c; sourceTree = ""; }; + 0E764E162ADFF5740043DD4E /* AltBackup.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; name = AltBackup.ipa; path = AltStore/Resources/AltBackup.ipa; sourceTree = SOURCE_ROOT; }; + 0EA166412ADFE0D1003015C1 /* jplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jplist.c; path = Dependencies/libplist/src/jplist.c; sourceTree = SOURCE_ROOT; }; + 0EA166422ADFE0D1003015C1 /* Date.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Date.cpp; path = Dependencies/libplist/src/Date.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166432ADFE0D1003015C1 /* Data.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Data.cpp; path = Dependencies/libplist/src/Data.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166442ADFE0D1003015C1 /* bplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bplist.c; path = Dependencies/libplist/src/bplist.c; sourceTree = SOURCE_ROOT; }; + 0EA166452ADFE0D1003015C1 /* Array.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Array.cpp; path = Dependencies/libplist/src/Array.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166462ADFE0D1003015C1 /* Dictionary.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Dictionary.cpp; path = Dependencies/libplist/src/Dictionary.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166472ADFE0D1003015C1 /* out-limd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "out-limd.c"; path = "Dependencies/libplist/src/out-limd.c"; sourceTree = SOURCE_ROOT; }; + 0EA166492ADFE0D1003015C1 /* String.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = String.cpp; path = Dependencies/libplist/src/String.cpp; sourceTree = SOURCE_ROOT; }; + 0EA1664A2ADFE0D1003015C1 /* base64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = base64.c; path = Dependencies/libplist/src/base64.c; sourceTree = SOURCE_ROOT; }; + 0EA1664B2ADFE0D1003015C1 /* Uid.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Uid.cpp; path = Dependencies/libplist/src/Uid.cpp; sourceTree = SOURCE_ROOT; }; + 0EA1664C2ADFE0D1003015C1 /* time64.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = time64.c; path = Dependencies/libplist/src/time64.c; sourceTree = SOURCE_ROOT; }; + 0EA1664E2ADFE0D1003015C1 /* Boolean.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Boolean.cpp; path = Dependencies/libplist/src/Boolean.cpp; sourceTree = SOURCE_ROOT; }; + 0EA1664F2ADFE0D1003015C1 /* hashtable.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = hashtable.c; path = Dependencies/libplist/src/hashtable.c; sourceTree = SOURCE_ROOT; }; + 0EA166502ADFE0D2003015C1 /* Node.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Node.cpp; path = Dependencies/libplist/src/Node.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166512ADFE0D2003015C1 /* ptrarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = ptrarray.c; path = Dependencies/libplist/src/ptrarray.c; sourceTree = SOURCE_ROOT; }; + 0EA166522ADFE0D2003015C1 /* out-default.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "out-default.c"; path = "Dependencies/libplist/src/out-default.c"; sourceTree = SOURCE_ROOT; }; + 0EA166532ADFE0D2003015C1 /* Integer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Integer.cpp; path = Dependencies/libplist/src/Integer.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166542ADFE0D2003015C1 /* Real.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Real.cpp; path = Dependencies/libplist/src/Real.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166552ADFE0D2003015C1 /* out-plutil.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "out-plutil.c"; path = "Dependencies/libplist/src/out-plutil.c"; sourceTree = SOURCE_ROOT; }; + 0EA166562ADFE0D2003015C1 /* oplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = oplist.c; path = Dependencies/libplist/src/oplist.c; sourceTree = SOURCE_ROOT; }; + 0EA166572ADFE0D2003015C1 /* jsmn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jsmn.c; path = Dependencies/libplist/src/jsmn.c; sourceTree = SOURCE_ROOT; }; + 0EA166582ADFE0D2003015C1 /* Key.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Key.cpp; path = Dependencies/libplist/src/Key.cpp; sourceTree = SOURCE_ROOT; }; + 0EA166592ADFE0D2003015C1 /* xplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = xplist.c; path = Dependencies/libplist/src/xplist.c; sourceTree = SOURCE_ROOT; }; + 0EA1665A2ADFE0D2003015C1 /* Structure.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Structure.cpp; path = Dependencies/libplist/src/Structure.cpp; sourceTree = SOURCE_ROOT; }; + 0EA1665F2ADFE122003015C1 /* time64_limits.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = time64_limits.h; path = Dependencies/libplist/src/time64_limits.h; sourceTree = SOURCE_ROOT; }; + 0EA166602ADFE122003015C1 /* time64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = time64.h; path = Dependencies/libplist/src/time64.h; sourceTree = SOURCE_ROOT; }; + 0EA166612ADFE122003015C1 /* bytearray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = bytearray.h; path = Dependencies/libplist/src/bytearray.h; sourceTree = SOURCE_ROOT; }; + 0EA166622ADFE122003015C1 /* ptrarray.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ptrarray.h; path = Dependencies/libplist/src/ptrarray.h; sourceTree = SOURCE_ROOT; }; + 0EA166632ADFE122003015C1 /* jsmn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jsmn.h; path = Dependencies/libplist/src/jsmn.h; sourceTree = SOURCE_ROOT; }; + 0EA166642ADFE122003015C1 /* plist.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = plist.h; path = Dependencies/libplist/src/plist.h; sourceTree = SOURCE_ROOT; }; + 0EA166652ADFE122003015C1 /* hashtable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = hashtable.h; path = Dependencies/libplist/src/hashtable.h; sourceTree = SOURCE_ROOT; }; + 0EA166662ADFE122003015C1 /* base64.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = base64.h; path = Dependencies/libplist/src/base64.h; sourceTree = SOURCE_ROOT; }; + 0EA166672ADFE122003015C1 /* strbuf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = strbuf.h; path = Dependencies/libplist/src/strbuf.h; sourceTree = SOURCE_ROOT; }; + 0EA426392C2230150026D7FB /* AnisetteServerList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnisetteServerList.swift; sourceTree = ""; }; + 0EA4B9BB2AE4A3F6009209CE /* plist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = plist.c; path = Dependencies/libplist/src/plist.c; sourceTree = SOURCE_ROOT; }; + 0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTWrappedError.m; sourceTree = ""; }; + 0EE7FDC22BE8BC4200D1E390 /* ALTWrappedError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTWrappedError.h; sourceTree = ""; }; + 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTLocalizedError.swift; sourceTree = ""; }; + 0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = ""; }; 19104DB22909C06C00C49C7B /* libEmotionalDamage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libEmotionalDamage.a; sourceTree = BUILT_PRODUCTS_DIR; }; 19104DB42909C06D00C49C7B /* EmotionalDamage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmotionalDamage.swift; sourceTree = ""; }; 191E5FAB290A5D92001A3B7C /* libminimuxer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 191E5FCF290A651D001A3B7C /* jplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jplist.c; path = Dependencies/libplist/src/jplist.c; sourceTree = SOURCE_ROOT; }; - 191E5FD0290A651D001A3B7C /* jsmn.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jsmn.c; path = Dependencies/libplist/src/jsmn.c; sourceTree = SOURCE_ROOT; }; - 191E5FD1290A651D001A3B7C /* jsmn.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = jsmn.h; path = Dependencies/libplist/src/jsmn.h; sourceTree = SOURCE_ROOT; }; - 1920B04E2924AC8300744F60 /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = ""; }; 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = ""; }; 9961EC2D29BE9F2E00AF2C6F /* minimuxer-helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "minimuxer-helpers.swift"; path = "Dependencies/minimuxer/minimuxer-helpers.swift"; sourceTree = SOURCE_ROOT; }; 99F87D1629D8E4C900B40039 /* SwiftBridgeCore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftBridgeCore.swift; path = Dependencies/minimuxer/SwiftBridgeCore.swift; sourceTree = SOURCE_ROOT; }; 99F87D1729D8E4C900B40039 /* minimuxer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = minimuxer.swift; path = Dependencies/minimuxer/minimuxer.swift; sourceTree = SOURCE_ROOT; }; + A800F7032CE28E2F00208744 /* View+AltWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+AltWidget.swift"; sourceTree = ""; }; B3146EC6284F580500BBC3FD /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Roxas.xcodeproj; path = Dependencies/Roxas/Roxas.xcodeproj; sourceTree = ""; }; B33FFBA9295F8F78002259E6 /* preboard.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = preboard.c; path = src/preboard.c; sourceTree = ""; }; B33FFBAB295F8F98002259E6 /* companion_proxy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = companion_proxy.c; path = src/companion_proxy.c; sourceTree = ""; }; @@ -541,6 +589,7 @@ B3C3960E284F4F9100DA9E2F /* AltStoreCore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStoreCore.xcconfig; sourceTree = ""; }; B3C3960F284F53E900DA9E2F /* AltBackup.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltBackup.xcconfig; sourceTree = ""; }; B3EE16B52925E27D00B3B1F5 /* AnisetteManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnisetteManager.swift; sourceTree = ""; }; + BD4513AA2C6FA98C0052BCC0 /* AppExtensionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppExtensionView.swift; sourceTree = ""; }; BF02419522F2199300129732 /* RefreshAttemptsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshAttemptsViewController.swift; sourceTree = ""; }; BF08858222DE795100DE9F1E /* MyAppsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyAppsViewController.swift; sourceTree = ""; }; BF08858422DE7EC800DE9F1E /* UpdateCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateCollectionViewCell.swift; sourceTree = ""; }; @@ -572,7 +621,6 @@ BF41B807233433C100C593A3 /* LoadingState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingState.swift; sourceTree = ""; }; BF42345825101C1D006D1EB2 /* WidgetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetView.swift; sourceTree = ""; }; BF44EEEF246B08BA002A52F2 /* BackupController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupController.swift; sourceTree = ""; }; - BF44EEF2246B3A17002A52F2 /* AltBackup.ipa */ = {isa = PBXFileReference; lastKnownFileType = file; path = AltBackup.ipa; sourceTree = ""; }; BF44EEFB246B4550002A52F2 /* RemoveAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoveAppOperation.swift; sourceTree = ""; }; BF45872B2298D31600BD7491 /* libimobiledevice.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libimobiledevice.a; sourceTree = BUILT_PRODUCTS_DIR; }; BF4587C82298D3A800BD7491 /* service.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = service.h; path = Dependencies/libimobiledevice/src/service.h; sourceTree = SOURCE_ROOT; }; @@ -756,36 +804,8 @@ BFD2478B2284C4C300981D42 /* AppIconImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppIconImageView.swift; sourceTree = ""; }; BFD2478E2284C8F900981D42 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; BFD2479E2284FBD000981D42 /* UIColor+AltStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+AltStore.swift"; sourceTree = ""; }; - BFD44605241188C300EAB90A /* CodableServerError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableServerError.swift; sourceTree = ""; }; + BFD44605241188C300EAB90A /* CodableError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableError.swift; sourceTree = ""; }; BFD52BD222A06EFB000B7ED1 /* ALTConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTConstants.h; sourceTree = ""; }; - BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ptrarray.c; path = Dependencies/libplist/src/ptrarray.c; sourceTree = SOURCE_ROOT; }; - BFD52BE622A1A9CA000B7ED1 /* base64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = base64.c; path = Dependencies/libplist/src/base64.c; sourceTree = SOURCE_ROOT; }; - BFD52BE722A1A9CA000B7ED1 /* hashtable.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hashtable.c; path = Dependencies/libplist/src/hashtable.c; sourceTree = SOURCE_ROOT; }; - BFD52BE822A1A9CA000B7ED1 /* Dictionary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Dictionary.cpp; path = Dependencies/libplist/src/Dictionary.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BE922A1A9CA000B7ED1 /* ptrarray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ptrarray.h; path = Dependencies/libplist/src/ptrarray.h; sourceTree = SOURCE_ROOT; }; - BFD52BEA22A1A9CA000B7ED1 /* bplist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bplist.c; path = Dependencies/libplist/src/bplist.c; sourceTree = SOURCE_ROOT; }; - BFD52BEB22A1A9CA000B7ED1 /* String.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = String.cpp; path = Dependencies/libplist/src/String.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BEC22A1A9CA000B7ED1 /* time64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = time64.c; path = Dependencies/libplist/src/time64.c; sourceTree = SOURCE_ROOT; }; - BFD52BED22A1A9CA000B7ED1 /* plist.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = plist.h; path = Dependencies/libplist/src/plist.h; sourceTree = SOURCE_ROOT; }; - BFD52BEE22A1A9CA000B7ED1 /* plist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = plist.c; path = Dependencies/libplist/src/plist.c; sourceTree = SOURCE_ROOT; }; - BFD52BEF22A1A9CA000B7ED1 /* hashtable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hashtable.h; path = Dependencies/libplist/src/hashtable.h; sourceTree = SOURCE_ROOT; }; - BFD52BF022A1A9CA000B7ED1 /* Date.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Date.cpp; path = Dependencies/libplist/src/Date.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BF122A1A9CA000B7ED1 /* Uid.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Uid.cpp; path = Dependencies/libplist/src/Uid.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BF222A1A9CA000B7ED1 /* Boolean.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Boolean.cpp; path = Dependencies/libplist/src/Boolean.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BF322A1A9CA000B7ED1 /* Real.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Real.cpp; path = Dependencies/libplist/src/Real.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BF422A1A9CA000B7ED1 /* strbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = strbuf.h; path = Dependencies/libplist/src/strbuf.h; sourceTree = SOURCE_ROOT; }; - BFD52BF522A1A9CA000B7ED1 /* bytearray.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = bytearray.c; path = Dependencies/libplist/src/bytearray.c; sourceTree = SOURCE_ROOT; }; - BFD52BF622A1A9CA000B7ED1 /* base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = base64.h; path = Dependencies/libplist/src/base64.h; sourceTree = SOURCE_ROOT; }; - BFD52BF722A1A9CA000B7ED1 /* Data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Data.cpp; path = Dependencies/libplist/src/Data.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BF822A1A9CB000B7ED1 /* Array.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Array.cpp; path = Dependencies/libplist/src/Array.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BF922A1A9CB000B7ED1 /* Node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Node.cpp; path = Dependencies/libplist/src/Node.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BFA22A1A9CB000B7ED1 /* bytearray.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bytearray.h; path = Dependencies/libplist/src/bytearray.h; sourceTree = SOURCE_ROOT; }; - BFD52BFB22A1A9CB000B7ED1 /* Key.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Key.cpp; path = Dependencies/libplist/src/Key.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BFC22A1A9CB000B7ED1 /* Integer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Integer.cpp; path = Dependencies/libplist/src/Integer.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BFD22A1A9CB000B7ED1 /* Structure.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Structure.cpp; path = Dependencies/libplist/src/Structure.cpp; sourceTree = SOURCE_ROOT; }; - BFD52BFE22A1A9CB000B7ED1 /* time64_limits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time64_limits.h; path = Dependencies/libplist/src/time64_limits.h; sourceTree = SOURCE_ROOT; }; - BFD52BFF22A1A9CB000B7ED1 /* time64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = time64.h; path = Dependencies/libplist/src/time64.h; sourceTree = SOURCE_ROOT; }; - BFD52C0022A1A9CB000B7ED1 /* xplist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xplist.c; path = Dependencies/libplist/src/xplist.c; sourceTree = SOURCE_ROOT; }; BFD52C1D22A1A9EC000B7ED1 /* node.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = node.c; path = Dependencies/libplist/libcnary/node.c; sourceTree = SOURCE_ROOT; }; BFD52C1E22A1A9EC000B7ED1 /* node_list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = node_list.c; path = Dependencies/libplist/libcnary/node_list.c; sourceTree = SOURCE_ROOT; }; BFD52C1F22A1A9EC000B7ED1 /* cnary.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cnary.c; path = Dependencies/libplist/libcnary/cnary.c; sourceTree = SOURCE_ROOT; }; @@ -839,6 +859,7 @@ D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorLogViewController.swift; sourceTree = ""; }; D58916FD28C7C55C00E39C8B /* LoggedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggedError.swift; sourceTree = ""; }; D593F1932717749A006E82DE /* PatchAppOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PatchAppOperation.swift; sourceTree = ""; }; + D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClearAppCacheOperation.swift; sourceTree = ""; }; D5CA0C4A280E141900469595 /* ManagedPatron.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPatron.swift; sourceTree = ""; }; D5CA0C4C280E242500469595 /* AltStore 10.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 10.xcdatamodel"; sourceTree = ""; }; D5CA0C4D280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = AltStore9ToAltStore10.xcmappingmodel; sourceTree = ""; }; @@ -921,6 +942,7 @@ B3146ED2284F581E00BBC3FD /* Roxas.framework in Frameworks */, D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */, B3C395F9284F362400DA9E2F /* AppCenterCrashes in Frameworks */, + 9922FFEC29B501C50020F868 /* Starscream in Frameworks */, D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */, 4879A9622861049C00FC1BBD /* OpenSSL in Frameworks */, B3C395F4284F35DD00DA9E2F /* Nuke in Frameworks */, @@ -933,6 +955,16 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0EE7FDBF2BE8BBBF00D1E390 /* Errors */ = { + isa = PBXGroup; + children = ( + 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */, + 0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */, + 0EE7FDC22BE8BC4200D1E390 /* ALTWrappedError.h */, + ); + path = Errors; + sourceTree = ""; + }; 19104DB32909C06D00C49C7B /* EmotionalDamage */ = { isa = PBXGroup; children = ( @@ -978,6 +1010,14 @@ name = Generated; sourceTree = ""; }; + A800F6FE2CE28DE300208744 /* Extensions */ = { + isa = PBXGroup; + children = ( + A800F7032CE28E2F00208744 /* View+AltWidget.swift */, + ); + path = Extensions; + sourceTree = ""; + }; B3146EC7284F580500BBC3FD /* Products */ = { isa = PBXGroup; children = ( @@ -1058,7 +1098,7 @@ isa = PBXGroup; children = ( BF1E3128229F474900370A3C /* ServerProtocol.swift */, - BFD44605241188C300EAB90A /* CodableServerError.swift */, + BFD44605241188C300EAB90A /* CodableError.swift */, ); path = "Server Protocol"; sourceTree = ""; @@ -1071,6 +1111,7 @@ BF18BFFF2485A75F00DD5981 /* Server Protocol */, BFF767CF2489AC240097E58C /* Connections */, BFF7C92D2578464D00E55F36 /* XPC */, + 0EE7FDBF2BE8BBBF00D1E390 /* Errors */, BFF767C32489A6800097E58C /* Extensions */, BFF767C42489A6980097E58C /* Categories */, ); @@ -1190,37 +1231,41 @@ BF4588562298DC6D00BD7491 /* libplist */ = { isa = PBXGroup; children = ( - BFD52BE622A1A9CA000B7ED1 /* base64.c */, - BFD52BEA22A1A9CA000B7ED1 /* bplist.c */, - BFD52BF522A1A9CA000B7ED1 /* bytearray.c */, - BFD52BE722A1A9CA000B7ED1 /* hashtable.c */, - 191E5FCF290A651D001A3B7C /* jplist.c */, - 191E5FD0290A651D001A3B7C /* jsmn.c */, - BFD52BEE22A1A9CA000B7ED1 /* plist.c */, - BFD52BE522A1A9CA000B7ED1 /* ptrarray.c */, - BFD52BEC22A1A9CA000B7ED1 /* time64.c */, - BFD52C0022A1A9CB000B7ED1 /* xplist.c */, - BFD52BF822A1A9CB000B7ED1 /* Array.cpp */, - BFD52BF222A1A9CA000B7ED1 /* Boolean.cpp */, - BFD52BF722A1A9CA000B7ED1 /* Data.cpp */, - BFD52BF022A1A9CA000B7ED1 /* Date.cpp */, - BFD52BE822A1A9CA000B7ED1 /* Dictionary.cpp */, - BFD52BFC22A1A9CB000B7ED1 /* Integer.cpp */, - BFD52BFB22A1A9CB000B7ED1 /* Key.cpp */, - BFD52BF922A1A9CB000B7ED1 /* Node.cpp */, - BFD52BF322A1A9CA000B7ED1 /* Real.cpp */, - BFD52BEB22A1A9CA000B7ED1 /* String.cpp */, - BFD52BFD22A1A9CB000B7ED1 /* Structure.cpp */, - BFD52BF122A1A9CA000B7ED1 /* Uid.cpp */, - BFD52BF622A1A9CA000B7ED1 /* base64.h */, - BFD52BFA22A1A9CB000B7ED1 /* bytearray.h */, - BFD52BEF22A1A9CA000B7ED1 /* hashtable.h */, - 191E5FD1290A651D001A3B7C /* jsmn.h */, - BFD52BED22A1A9CA000B7ED1 /* plist.h */, - BFD52BE922A1A9CA000B7ED1 /* ptrarray.h */, - BFD52BF422A1A9CA000B7ED1 /* strbuf.h */, - BFD52BFE22A1A9CB000B7ED1 /* time64_limits.h */, - BFD52BFF22A1A9CB000B7ED1 /* time64.h */, + 0EA166462ADFE0D1003015C1 /* Dictionary.cpp */, + 0E1A1F902AE36A9600364CAD /* bytearray.c */, + 0EA166442ADFE0D1003015C1 /* bplist.c */, + 0EA166432ADFE0D1003015C1 /* Data.cpp */, + 0EA166422ADFE0D1003015C1 /* Date.cpp */, + 0EA1664F2ADFE0D1003015C1 /* hashtable.c */, + 0EA166532ADFE0D2003015C1 /* Integer.cpp */, + 0EA166562ADFE0D2003015C1 /* oplist.c */, + 0EA166522ADFE0D2003015C1 /* out-default.c */, + 0EA166472ADFE0D1003015C1 /* out-limd.c */, + 0EA166552ADFE0D2003015C1 /* out-plutil.c */, + 0EA166492ADFE0D1003015C1 /* String.cpp */, + 0EA1665A2ADFE0D2003015C1 /* Structure.cpp */, + 0EA166452ADFE0D1003015C1 /* Array.cpp */, + 0EA1664A2ADFE0D1003015C1 /* base64.c */, + 0EA166572ADFE0D2003015C1 /* jsmn.c */, + 0EA1664E2ADFE0D1003015C1 /* Boolean.cpp */, + 0EA4B9BB2AE4A3F6009209CE /* plist.c */, + 0EA166412ADFE0D1003015C1 /* jplist.c */, + 0EA166582ADFE0D2003015C1 /* Key.cpp */, + 0EA166512ADFE0D2003015C1 /* ptrarray.c */, + 0EA1664C2ADFE0D1003015C1 /* time64.c */, + 0EA166502ADFE0D2003015C1 /* Node.cpp */, + 0EA166542ADFE0D2003015C1 /* Real.cpp */, + 0EA1664B2ADFE0D1003015C1 /* Uid.cpp */, + 0EA166592ADFE0D2003015C1 /* xplist.c */, + 0EA166662ADFE122003015C1 /* base64.h */, + 0EA166652ADFE122003015C1 /* hashtable.h */, + 0EA166632ADFE122003015C1 /* jsmn.h */, + 0EA166642ADFE122003015C1 /* plist.h */, + 0EA166612ADFE122003015C1 /* bytearray.h */, + 0EA166622ADFE122003015C1 /* ptrarray.h */, + 0EA166672ADFE122003015C1 /* strbuf.h */, + 0EA1665F2ADFE122003015C1 /* time64_limits.h */, + 0EA166602ADFE122003015C1 /* time64.h */, BF4588892298DDEA00BD7491 /* libcnary */, ); path = libplist; @@ -1389,6 +1434,8 @@ BF66EEE62501AED0007EE018 /* UIColor+Hex.swift */, BF66EEE42501AED0007EE018 /* UserDefaults+AltStore.swift */, BF6A531F246DC1B0004F59C8 /* FileManager+SharedDirectories.swift */, + 0E0502592BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift */, + 0E05025B2BEC947000879B5C /* String+SideStore.swift */, ); path = Extensions; sourceTree = ""; @@ -1428,6 +1475,7 @@ BF98916C250AABF3002ACF50 /* AltWidget */ = { isa = PBXGroup; children = ( + A800F6FE2CE28DE300208744 /* Extensions */, BF8B17F0250AC62400F8157F /* AltWidgetExtension.entitlements */, BF98917D250AAC4F002ACF50 /* AltWidget.swift */, BF42345825101C1D006D1EB2 /* WidgetView.swift */, @@ -1568,7 +1616,6 @@ BFD247962284D7C100981D42 /* Resources */, BF6C8FA8242935CA00125131 /* Dependencies */, BFD247972284D7D800981D42 /* Supporting Files */, - 1920B04E2924AC8300744F60 /* Settings.bundle */, ); path = AltStore; sourceTree = ""; @@ -1591,6 +1638,7 @@ children = ( BF0C4EBC22A1BD8B009A2DD7 /* AppManager.swift */, BF88F97124F8727D00BB75DF /* AppManagerErrors.swift */, + BD4513AA2C6FA98C0052BCC0 /* AppExtensionView.swift */, ); path = "Managing Apps"; sourceTree = ""; @@ -1617,7 +1665,7 @@ BFD247962284D7C100981D42 /* Resources */ = { isa = PBXGroup; children = ( - BF44EEF2246B3A17002A52F2 /* AltBackup.ipa */, + 0E764E162ADFF5740043DD4E /* AltBackup.ipa */, BFD247762284B9A700981D42 /* Assets.xcassets */, BF770E6822BD57DD002A40FE /* Silence.m4a */, ); @@ -1643,6 +1691,7 @@ BFE00A1F2503097F00EB4D0C /* INInteraction+AltStore.swift */, D57F2C9326E01BC700B9FA39 /* UIDevice+Vibration.swift */, B376FE3D29258C8900E18883 /* OSLog+SideStore.swift */, + 0E13E5852CC8F55900E9C0DF /* ProcessInfo+SideStore.swift */, ); path = Extensions; sourceTree = ""; @@ -1652,6 +1701,7 @@ children = ( BFE60737231ADF49002B0E8E /* Settings.storyboard */, BFE60739231ADF82002B0E8E /* SettingsViewController.swift */, + 0EA426392C2230150026D7FB /* AnisetteServerList.swift */, BFE6073F231AFD2A002B0E8E /* InsetGroupTableViewCell.swift */, BFE60741231B07E6002B0E8E /* SettingsHeaderFooterView.swift */, BFE6073B231AE1E7002B0E8E /* SettingsHeaderFooterView.xib */, @@ -1692,6 +1742,7 @@ D57F2C9026E0070200B9FA39 /* EnableJITOperation.swift */, D5DAE0952804DF430034D8D4 /* UpdatePatronsOperation.swift */, D5E1E7C028077DE90016FC96 /* FetchTrustedSourcesOperation.swift */, + D5ACE84428E3B8450021CAB9 /* ClearAppCacheOperation.swift */, BF7B44062725A4B8005288A4 /* Patch App */, ); path = Operations; @@ -1767,6 +1818,7 @@ children = ( D57FE84328C7DB7100216002 /* ErrorLogViewController.swift */, D54DED1328CBC44B008B27A0 /* ErrorLogTableViewCell.swift */, + 0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */, ); path = "Error Log"; sourceTree = ""; @@ -1778,32 +1830,26 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 0EA166682ADFE122003015C1 /* jsmn.h in Headers */, BF4588112298D3AB00BD7491 /* misagent.h in Headers */, BF4588042298D3AB00BD7491 /* lockdown.h in Headers */, BF45880B2298D3AB00BD7491 /* mobilesync.h in Headers */, BF4588002298D3AB00BD7491 /* restore.h in Headers */, BF4588152298D3AB00BD7491 /* mobilebackup.h in Headers */, BF4588182298D3AB00BD7491 /* syslog_relay.h in Headers */, - BFD52C1022A1A9CB000B7ED1 /* strbuf.h in Headers */, BF45881D2298D3AB00BD7491 /* file_relay.h in Headers */, - BFD52C0922A1A9CB000B7ED1 /* plist.h in Headers */, BF4587FD2298D3AB00BD7491 /* sbservices.h in Headers */, BF4588362298D3C100BD7491 /* debug.h in Headers */, BF4588202298D3AB00BD7491 /* mobile_image_mounter.h in Headers */, BF4588122298D3AB00BD7491 /* house_arrest.h in Headers */, BF45881F2298D3AB00BD7491 /* device_link_service.h in Headers */, - BFD52C1A22A1A9CB000B7ED1 /* time64_limits.h in Headers */, BF45880E2298D3AB00BD7491 /* debugserver.h in Headers */, BF4588102298D3AB00BD7491 /* heartbeat.h in Headers */, BF4587FA2298D3AB00BD7491 /* diagnostics_relay.h in Headers */, - BFD52C1622A1A9CB000B7ED1 /* bytearray.h in Headers */, - BFD52C1222A1A9CB000B7ED1 /* base64.h in Headers */, BF4588192298D3AB00BD7491 /* webinspector.h in Headers */, BF4588342298D3C100BD7491 /* userpref.h in Headers */, BF45880A2298D3AB00BD7491 /* screenshotr.h in Headers */, - BFD52C0B22A1A9CB000B7ED1 /* hashtable.h in Headers */, BF4587FE2298D3AB00BD7491 /* mobilebackup2.h in Headers */, - BFD52C0522A1A9CB000B7ED1 /* ptrarray.h in Headers */, BF45881C2298D3AB00BD7491 /* afc.h in Headers */, BF45881A2298D3AB00BD7491 /* mobileactivation.h in Headers */, BF4588052298D3AB00BD7491 /* idevice.h in Headers */, @@ -1811,7 +1857,6 @@ BF4587F82298D3AB00BD7491 /* service.h in Headers */, BF4588252298D3AB00BD7491 /* property_list_service.h in Headers */, BF4588132298D3AB00BD7491 /* notification_proxy.h in Headers */, - BFD52C1B22A1A9CB000B7ED1 /* time64.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1826,6 +1871,7 @@ BFAECC5D2501B0BF00528F27 /* ALTConnection.h in Headers */, BF66EE942501AEBC007EE018 /* ALTAppPermission.h in Headers */, BFAECC602501B0BF00528F27 /* NSError+ALTServerError.h in Headers */, + 0EE7FDC82BE8CF4800D1E390 /* ALTWrappedError.h in Headers */, BFAECC5E2501B0BF00528F27 /* CFNotificationName+AltStore.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1991,6 +2037,7 @@ B3C395F6284F362400DA9E2F /* AppCenterAnalytics */, B3C395F8284F362400DA9E2F /* AppCenterCrashes */, 4879A9612861049C00FC1BBD /* OpenSSL */, + 9922FFEB29B501C50020F868 /* Starscream */, ); productName = AltStore; productReference = BFD2476A2284B9A500981D42 /* SideStore.app */; @@ -2062,6 +2109,7 @@ 4879A95D2861046500FC1BBD /* XCRemoteSwiftPackageReference "AltSign" */, 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */, 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */, + 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */, ); productRefGroup = BFD2476B2284B9A500981D42 /* Products */; projectDirPath = ""; @@ -2205,14 +2253,13 @@ BFE60738231ADF49002B0E8E /* Settings.storyboard in Resources */, D57DF638271E32F000677701 /* PatchApp.storyboard in Resources */, BFD2477A2284B9A700981D42 /* LaunchScreen.storyboard in Resources */, - BF44EEF3246B3A17002A52F2 /* AltBackup.ipa in Resources */, BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */, BFD247772284B9A700981D42 /* Assets.xcassets in Resources */, - 1920B04F2924AC8300744F60 /* Settings.bundle in Resources */, BFF0B6922321A305007A79E1 /* AboutPatreonHeaderView.xib in Resources */, BFB6B22423187A3D0022A802 /* NewsCollectionViewCell.xib in Resources */, BFD247752284B9A500981D42 /* Main.storyboard in Resources */, BFDB5B2622EFBBEA00F74113 /* BrowseCollectionViewCell.xib in Resources */, + 0E764E172ADFF5740043DD4E /* AltBackup.ipa in Resources */, BFE6073C231AE1E7002B0E8E /* SettingsHeaderFooterView.xib in Resources */, BF29012F2318F6B100D88A45 /* AppBannerView.xib in Resources */, BFE6325A22A83BEB00F30809 /* Authentication.storyboard in Resources */, @@ -2268,7 +2315,7 @@ BF1FE358251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */, BFECAC8F24FD950E0077C41F /* Result+Conveniences.swift in Sources */, BF8CAE472489E772004D6CCE /* DaemonRequestHandler.swift in Sources */, - BFECAC8824FD950E0077C41F /* CodableServerError.swift in Sources */, + BFECAC8824FD950E0077C41F /* CodableError.swift in Sources */, BFC712C32512D5F100AB5EBE /* XPCConnection.swift in Sources */, BFC712C52512D5F100AB5EBE /* XPCConnectionHandler.swift in Sources */, BFECAC8A24FD950E0077C41F /* ALTServerError+Conveniences.swift in Sources */, @@ -2288,69 +2335,73 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0E1A1F912AE36A9700364CAD /* bytearray.c in Sources */, + 0EA1666E2ADFE140003015C1 /* ptrarray.c in Sources */, + 0EA1665B2ADFE0D2003015C1 /* out-limd.c in Sources */, + 0EA166742ADFE140003015C1 /* Date.cpp in Sources */, + 0EA166712ADFE140003015C1 /* Key.cpp in Sources */, + 0EA1665C2ADFE0D2003015C1 /* out-default.c in Sources */, + 0EA1666A2ADFE140003015C1 /* String.cpp in Sources */, + 0EA166732ADFE140003015C1 /* Dictionary.cpp in Sources */, + 0EA1665D2ADFE0D2003015C1 /* out-plutil.c in Sources */, + 0EA1665E2ADFE0D2003015C1 /* oplist.c in Sources */, + 0EA166702ADFE140003015C1 /* Node.cpp in Sources */, + 0EA166752ADFE140003015C1 /* Real.cpp in Sources */, + 0EA166762ADFE140003015C1 /* base64.c in Sources */, + 0EA1666D2ADFE140003015C1 /* Data.cpp in Sources */, BF45881B2298D3AB00BD7491 /* house_arrest.c in Sources */, - BFD52C0622A1A9CB000B7ED1 /* bplist.c in Sources */, + 0EA1666F2ADFE140003015C1 /* hashtable.c in Sources */, BF4588232298D3AB00BD7491 /* mobilesync.c in Sources */, BF4588072298D3AB00BD7491 /* afc.c in Sources */, - 191E607D290B2EA5001A3B7C /* jsmn.c in Sources */, - 191E607E290B2EA7001A3B7C /* jplist.c in Sources */, BF4588082298D3AB00BD7491 /* mobile_image_mounter.c in Sources */, - BFD52C1122A1A9CB000B7ED1 /* bytearray.c in Sources */, BF4588022298D3AB00BD7491 /* file_relay.c in Sources */, BF45880F2298D3AB00BD7491 /* debugserver.c in Sources */, + 0EA166792ADFE140003015C1 /* bplist.c in Sources */, + 0EA166772ADFE140003015C1 /* jplist.c in Sources */, BF4588162298D3AB00BD7491 /* restore.c in Sources */, - BFD52C0422A1A9CB000B7ED1 /* Dictionary.cpp in Sources */, - BFD52C0222A1A9CB000B7ED1 /* base64.c in Sources */, BFD52C2022A1A9EC000B7ED1 /* node.c in Sources */, BF4588092298D3AB00BD7491 /* installation_proxy.c in Sources */, + 0EA1666B2ADFE140003015C1 /* Boolean.cpp in Sources */, + 0EA1667E2ADFE140003015C1 /* time64.c in Sources */, BF4587FF2298D3AB00BD7491 /* heartbeat.c in Sources */, BF4588222298D3AB00BD7491 /* mobileactivation.c in Sources */, - BFD52C1822A1A9CB000B7ED1 /* Integer.cpp in Sources */, BF4588212298D3AB00BD7491 /* idevice.c in Sources */, B343F885295F7C5D002B1159 /* tlv.c in Sources */, - BFD52C1C22A1A9CB000B7ED1 /* xplist.c in Sources */, BF4587F92298D3AB00BD7491 /* diagnostics_relay.c in Sources */, B343F87D295F7C5D002B1159 /* cbuf.c in Sources */, BF4588062298D3AB00BD7491 /* webinspector.c in Sources */, - BFD52C1722A1A9CB000B7ED1 /* Key.cpp in Sources */, B343F883295F7C5D002B1159 /* thread.c in Sources */, BF45880D2298D3AB00BD7491 /* mobilebackup.c in Sources */, - BFD52C0C22A1A9CB000B7ED1 /* Date.cpp in Sources */, - BFD52C0A22A1A9CB000B7ED1 /* plist.c in Sources */, - BFD52C1322A1A9CB000B7ED1 /* Data.cpp in Sources */, BF45883A2298D3C100BD7491 /* debug.c in Sources */, B343F881295F7C5D002B1159 /* termcolors.c in Sources */, + 0EA1667D2ADFE140003015C1 /* xplist.c in Sources */, B343F87E295F7C5D002B1159 /* collection.c in Sources */, - BFD52C0F22A1A9CB000B7ED1 /* Real.cpp in Sources */, B33FFBAA295F8F78002259E6 /* preboard.c in Sources */, B33FFBAC295F8F98002259E6 /* companion_proxy.c in Sources */, BF4587FB2298D3AB00BD7491 /* notification_proxy.c in Sources */, BF4588352298D3C100BD7491 /* userpref.c in Sources */, - BFD52C0122A1A9CB000B7ED1 /* ptrarray.c in Sources */, + 0EA1667A2ADFE140003015C1 /* Uid.cpp in Sources */, B343F87C295F7C5D002B1159 /* opack.c in Sources */, - BFD52C0E22A1A9CB000B7ED1 /* Boolean.cpp in Sources */, - BFD52C0822A1A9CB000B7ED1 /* time64.c in Sources */, B343F884295F7C5D002B1159 /* utils.c in Sources */, BFD52C2122A1A9EC000B7ED1 /* node_list.c in Sources */, B343F87F295F7C5D002B1159 /* glue.c in Sources */, - BFD52C1422A1A9CB000B7ED1 /* Array.cpp in Sources */, BF4588242298D3AB00BD7491 /* property_list_service.c in Sources */, BF45881E2298D3AB00BD7491 /* misagent.c in Sources */, + 0EA166692ADFE140003015C1 /* Array.cpp in Sources */, B343F880295F7C5D002B1159 /* socket.c in Sources */, BF4587FC2298D3AB00BD7491 /* sbservices.c in Sources */, - BFD52C1522A1A9CB000B7ED1 /* Node.cpp in Sources */, + 0EA166782ADFE140003015C1 /* jsmn.c in Sources */, BF4588142298D3AB00BD7491 /* device_link_service.c in Sources */, BF4588172298D3AB00BD7491 /* screenshotr.c in Sources */, - BFD52C0D22A1A9CB000B7ED1 /* Uid.cpp in Sources */, - BFD52C0322A1A9CB000B7ED1 /* hashtable.c in Sources */, BF4588432298D40000BD7491 /* libusbmuxd.c in Sources */, + 0EA1667B2ADFE140003015C1 /* Structure.cpp in Sources */, + 0EA1666C2ADFE140003015C1 /* Integer.cpp in Sources */, BF4588032298D3AB00BD7491 /* syslog_relay.c in Sources */, BF4588272298D3AB00BD7491 /* service.c in Sources */, - BFD52C0722A1A9CB000B7ED1 /* String.cpp in Sources */, BF4588262298D3AB00BD7491 /* lockdown.c in Sources */, BFD52C2222A1A9EC000B7ED1 /* cnary.c in Sources */, BF45880C2298D3AB00BD7491 /* mobilebackup2.c in Sources */, - BFD52C1922A1A9CB000B7ED1 /* Structure.cpp in Sources */, + 0EA4B9BC2AE4A414009209CE /* plist.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2361,8 +2412,8 @@ BF580496246A3CB5008AE704 /* UIColor+AltBackup.swift in Sources */, BF580482246A28F7008AE704 /* ViewController.swift in Sources */, BF44EEF0246B08BA002A52F2 /* BackupController.swift in Sources */, + 0EE7FDC62BE8CEA300D1E390 /* ALTLocalizedError.swift in Sources */, 03F06CD52942C27E001C4D68 /* Bundle+AltStore.swift in Sources */, - BF58049B246A432D008AE704 /* NSError+AltStore.swift in Sources */, BF58047E246A28F7008AE704 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2378,7 +2429,7 @@ BF66EECD2501AECA007EE018 /* StoreAppPolicy.swift in Sources */, BF66EEE82501AED0007EE018 /* UserDefaults+AltStore.swift in Sources */, BF340E9A250AD39500A192CB /* ViewApp.intentdefinition in Sources */, - BFAECC522501B0A400528F27 /* CodableServerError.swift in Sources */, + BFAECC522501B0A400528F27 /* CodableError.swift in Sources */, BF66EE9E2501AEC1007EE018 /* Fetchable.swift in Sources */, BF66EEDF2501AECA007EE018 /* PatreonAccount.swift in Sources */, BFAECC532501B0A400528F27 /* ServerProtocol.swift in Sources */, @@ -2386,11 +2437,14 @@ BF66EE9D2501AEC1007EE018 /* AppProtocol.swift in Sources */, BFC712C42512D5F100AB5EBE /* XPCConnection.swift in Sources */, D5CA0C4B280E141900469595 /* ManagedPatron.swift in Sources */, + 0E05025A2BEC83C500879B5C /* OperatingSystemVersion+Comparable.swift in Sources */, BF66EE8C2501AEB2007EE018 /* Keychain.swift in Sources */, BF66EED42501AECA007EE018 /* AltStore5ToAltStore6.xcmappingmodel in Sources */, BF66EE972501AEBC007EE018 /* ALTAppPermission.m in Sources */, BFAECC552501B0A400528F27 /* Connection.swift in Sources */, BF66EEDA2501AECA007EE018 /* RefreshAttempt.swift in Sources */, + 0E05025C2BEC947000879B5C /* String+SideStore.swift in Sources */, + 0EE7FDCB2BE8D12B00D1E390 /* ALTLocalizedError.swift in Sources */, BF66EEA92501AEC5007EE018 /* Tier.swift in Sources */, BF66EEDB2501AECA007EE018 /* StoreApp.swift in Sources */, BF66EEDE2501AECA007EE018 /* AppID.swift in Sources */, @@ -2399,6 +2453,7 @@ BF66EEDD2501AECA007EE018 /* AppPermission.swift in Sources */, D58916FE28C7C55C00E39C8B /* LoggedError.swift in Sources */, BFBF331B2526762200B7B8C9 /* AltStore8ToAltStore9.xcmappingmodel in Sources */, + 0EE7FDC72BE8CF4100D1E390 /* ALTWrappedError.m in Sources */, D5CA0C4E280E249E00469595 /* AltStore9ToAltStore10.xcmappingmodel in Sources */, BF989184250AACFC002ACF50 /* Date+RelativeDate.swift in Sources */, BF66EE962501AEBC007EE018 /* ALTPatreonBenefitType.m in Sources */, @@ -2423,6 +2478,7 @@ BF66EEEA2501AED0007EE018 /* UIColor+Hex.swift in Sources */, BF66EECC2501AECA007EE018 /* Source.swift in Sources */, BF66EED72501AECA007EE018 /* InstalledApp.swift in Sources */, + 0EE7FDC92BE8D07400D1E390 /* NSError+AltStore.swift in Sources */, BF66EECE2501AECA007EE018 /* InstalledAppPolicy.swift in Sources */, BF1FE359251A9FB000C3CE09 /* NSXPCConnection+MachServices.swift in Sources */, BF66EEA62501AEC5007EE018 /* PatreonAPI.swift in Sources */, @@ -2444,6 +2500,7 @@ BF42345A25101C35006D1EB2 /* WidgetView.swift in Sources */, D55E163728776CB700A627A1 /* ComplicationView.swift in Sources */, BF98917F250AAC4F002ACF50 /* AltWidget.swift in Sources */, + A800F7042CE28E3800208744 /* View+AltWidget.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2478,7 +2535,6 @@ BF8F69C422E662D300049BA1 /* AppViewController.swift in Sources */, BFF0B68E23219520007A79E1 /* PatreonViewController.swift in Sources */, BFF00D302501BD7D00746320 /* Intents.intentdefinition in Sources */, - BF6C336224197D700034FD24 /* NSError+AltStore.swift in Sources */, D5DAE0942804B0B80034D8D4 /* ScreenshotProcessor.swift in Sources */, BFD2476E2284B9A500981D42 /* AppDelegate.swift in Sources */, BF41B806233423AE00C593A3 /* TabBarController.swift in Sources */, @@ -2494,12 +2550,15 @@ BF6C8FAE2429597900125131 /* BannerCollectionViewCell.swift in Sources */, BF6F439223644C6E00A0B879 /* RefreshAltStoreViewController.swift in Sources */, BFE60742231B07E6002B0E8E /* SettingsHeaderFooterView.swift in Sources */, + BD4513AB2C6FA98C0052BCC0 /* AppExtensionView.swift in Sources */, BFE338E822F10E56002E24B9 /* LaunchViewController.swift in Sources */, BFA8172B23C5633D001B5953 /* FetchAnisetteDataOperation.swift in Sources */, BF9ABA4722DD0638008935CF /* BrowseCollectionViewCell.swift in Sources */, BFD6B03322DFF20800B86064 /* MyAppsComponents.swift in Sources */, BF41B808233433C100C593A3 /* LoadingState.swift in Sources */, BFF0B69A2322D7D0007A79E1 /* UIScreen+CompactHeight.swift in Sources */, + D5ACE84528E3B8450021CAB9 /* ClearAppCacheOperation.swift in Sources */, + 0EA4263A2C2230150026D7FB /* AnisetteServerList.swift in Sources */, D5F2F6A92720B7C20081CCF5 /* PatchViewController.swift in Sources */, B39F16132918D7C5002E9404 /* Consts.swift in Sources */, BF8F69C222E659F700049BA1 /* AppContentViewController.swift in Sources */, @@ -2508,6 +2567,7 @@ BF770E5822BC3D0F002A40FE /* RefreshGroup.swift in Sources */, 19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */, 99F87D0529D8B4E200B40039 /* minimuxer-helpers.swift in Sources */, + 0E13E5862CC8F55900E9C0DF /* ProcessInfo+SideStore.swift in Sources */, BF18B0F122E25DF9005C4CF5 /* ToastView.swift in Sources */, BF3D649F22E7B24C00E9056B /* CollapsingTextView.swift in Sources */, BF02419622F2199300129732 /* RefreshAttemptsViewController.swift in Sources */, @@ -2525,9 +2585,11 @@ BFF00D322501BDA100746320 /* BackgroundRefreshAppsOperation.swift in Sources */, BF0C4EBD22A1BD8B009A2DD7 /* AppManager.swift in Sources */, BF2901312318F7A800D88A45 /* AppBannerView.swift in Sources */, + 0EE7FDC42BE8BC7900D1E390 /* ALTLocalizedError.swift in Sources */, BFF00D342501BDCF00746320 /* IntentHandler.swift in Sources */, BFDBBD80246CB84F004ED2F3 /* RemoveAppBackupOperation.swift in Sources */, BFF0B6942321CB85007A79E1 /* AuthenticationViewController.swift in Sources */, + 0EE7FDCD2BE9124400D1E390 /* ErrorDetailsViewController.swift in Sources */, BF3432FB246B894F0052F4A1 /* BackupAppOperation.swift in Sources */, BF9ABA4922DD0742008935CF /* ScreenshotCollectionViewCell.swift in Sources */, BF9ABA4D22DD16DE008935CF /* PillButton.swift in Sources */, @@ -2957,6 +3019,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + LLVM_LTO = YES_THIN; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2985,6 +3048,7 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_OPTIMIZATION_LEVEL = fast; INFOPLIST_FILE = AltStoreCore/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -2993,6 +3057,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); + LLVM_LTO = YES_THIN; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -3020,6 +3085,7 @@ CODE_SIGN_STYLE = Automatic; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; + ENABLE_DEBUG_DYLIB = NO; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = AltWidget/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -3050,6 +3116,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; + ENABLE_DEBUG_DYLIB = NO; FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = AltWidget/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; @@ -3102,6 +3169,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EAGER_LINKING = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3119,6 +3187,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LLVM_LTO = YES_THIN; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -3129,6 +3198,7 @@ SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG BETA"; + SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SYSTEM_HEADER_SEARCH_PATHS = "\"$(SRCROOT)/Dependencies/AltSign/Dependencies\""; }; @@ -3170,10 +3240,12 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EAGER_LINKING = YES; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = fast; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -3181,6 +3253,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LLVM_LTO = YES_THIN; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; OTHER_CPLUSPLUSFLAGS = ( @@ -3190,8 +3263,9 @@ SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG BETA"; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only"; + SWIFT_OPTIMIZATION_LEVEL = "-Osize"; SYSTEM_HEADER_SEARCH_PATHS = "\"$(SRCROOT)/Dependencies/AltSign/Dependencies\""; VALIDATE_PRODUCT = YES; }; @@ -3201,7 +3275,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = B3C3960B284F4C9800DA9E2F /* AltStore.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = AltStore/AltStore.entitlements; @@ -3209,21 +3283,27 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_BITCODE = NO; + ENABLE_DEBUG_DYLIB = NO; + GCC_UNROLL_LOOPS = YES; INFOPLIST_FILE = AltStore/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_EXPORT_SYMBOLS = NO; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Dependencies/fragmentzip", + "$(PROJECT_DIR)/Dependencies/libfragmentzip", "$(PROJECT_DIR)/Dependencies/libcurl", ); + LLVM_LTO = YES_THIN; + OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only"; SWIFT_OBJC_BRIDGING_HEADER = "AltStore/AltStore-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -3235,7 +3315,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = B3C3960B284F4C9800DA9E2F /* AltStore.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; CODE_SIGN_ENTITLEMENTS = AltStore/AltStore.entitlements; @@ -3243,22 +3323,31 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)"; ENABLE_BITCODE = NO; + ENABLE_DEBUG_DYLIB = NO; + GCC_OPTIMIZATION_LEVEL = fast; + GCC_UNROLL_LOOPS = YES; INFOPLIST_FILE = AltStore/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_EXPORT_SYMBOLS = NO; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", - "$(PROJECT_DIR)/Dependencies/fragmentzip", + "$(PROJECT_DIR)/Dependencies/libfragmentzip", "$(PROJECT_DIR)/Dependencies/libcurl", ); + LLVM_LTO = YES_THIN; + OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only"; SWIFT_OBJC_BRIDGING_HEADER = "AltStore/AltStore-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Osize"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -3367,6 +3456,14 @@ minimumVersion = 1.1.180; }; }; + 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/daltoniam/Starscream.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 4.0.0; + }; + }; 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/SwiftPackageIndex/SemanticVersion.git"; @@ -3446,6 +3543,11 @@ package = 4879A9602861049C00FC1BBD /* XCRemoteSwiftPackageReference "OpenSSL" */; productName = OpenSSL; }; + 9922FFEB29B501C50020F868 /* Starscream */ = { + isa = XCSwiftPackageProductDependency; + package = 9922FFEA29B501C50020F868 /* XCRemoteSwiftPackageReference "Starscream" */; + productName = Starscream; + }; 99C4EF4C2979132100CB538D /* SemanticVersion */ = { isa = XCSwiftPackageProductDependency; package = 99C4EF472978D52400CB538D /* XCRemoteSwiftPackageReference "SemanticVersion" */; diff --git a/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 410b636e..b0a3df0d 100644 --- a/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/AltStore.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,4 +1,5 @@ { + "originHash" : "ee46302f91cbb62c5234c36750d40856658e961e191f5536cf4fe74d10fc2c94", "pins" : [ { "identity" : "altsign", @@ -6,7 +7,7 @@ "location" : "https://github.com/SideStore/AltSign", "state" : { "branch" : "master", - "revision" : "7e0e7edcf8fbc44ac1e35da3e9030a297aa18b84" + "revision" : "cc6189f0f7cd8e5bd24943af9322e0ff9420e9f4" } }, { @@ -14,8 +15,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/microsoft/appcenter-sdk-apple.git", "state" : { - "revision" : "8354a50fe01a7e54e196d3b5493b5ab53dd5866a", - "version" : "4.4.2" + "revision" : "b2dc99cfedead0bad4e6573d86c5228c89cff332", + "version" : "4.4.3" + } + }, + { + "identity" : "imobiledevice.swift", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SideStore/iMobileDevice.swift", + "state" : { + "revision" : "74e481106dd155c0cd21bca6795fd9fe5f751654", + "version" : "1.0.5" } }, { @@ -50,8 +60,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/krzyzanowskim/OpenSSL", "state" : { - "revision" : "033fcb41dac96b1b6effa945ca1f9ade002370b2", - "version" : "1.1.1501" + "revision" : "8cb1d641ab5ebce2cd7cf31c93baef07bed672d4", + "version" : "1.1.2301" } }, { @@ -59,8 +69,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/microsoft/PLCrashReporter.git", "state" : { - "revision" : "6b27393cad517c067dceea85fadf050e70c4ceaa", - "version" : "1.10.1" + "revision" : "81cdec2b3827feb03286cb297f4c501a8eb98df1", + "version" : "1.10.2" } }, { @@ -68,8 +78,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/SwiftPackageIndex/SemanticVersion.git", "state" : { - "revision" : "fc670910dc0903cc269b3d0b776cda5703979c4e", - "version" : "0.3.5" + "revision" : "ea8eea9d89842a29af1b8e6c7677f1c86e72fa42", + "version" : "0.4.0" } }, { @@ -77,8 +87,17 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/sparkle-project/Sparkle.git", "state" : { - "revision" : "286edd1fa22505a9e54d170e9fd07d775ea233f2", - "version" : "2.1.0" + "revision" : "0ef1ee0220239b3776f433314515fd849025673f", + "version" : "2.6.4" + } + }, + { + "identity" : "starscream", + "kind" : "remoteSourceControl", + "location" : "https://github.com/daltoniam/Starscream.git", + "state" : { + "revision" : "c6bfd1af48efcc9a9ad203665db12375ba6b145a", + "version" : "4.0.8" } }, { @@ -91,5 +110,5 @@ } } ], - "version" : 2 + "version" : 3 } diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltDaemon.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/AltDaemon.xcscheme deleted file mode 100644 index c65d4dbf..00000000 --- a/AltStore.xcodeproj/xcshareddata/xcschemes/AltDaemon.xcscheme +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme deleted file mode 100644 index 2bfc3556..00000000 --- a/AltStore.xcodeproj/xcshareddata/xcschemes/AltPlugin.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltServer.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/AltServer.xcscheme deleted file mode 100644 index 46e59030..00000000 --- a/AltStore.xcodeproj/xcshareddata/xcschemes/AltServer.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltXPC.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/AltXPC.xcscheme deleted file mode 100644 index 4aca1860..00000000 --- a/AltStore.xcodeproj/xcshareddata/xcschemes/AltXPC.xcscheme +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AltStore.xcodeproj/xcshareddata/xcschemes/AltStore - Release.xcscheme b/AltStore.xcodeproj/xcshareddata/xcschemes/SideStore - Release.xcscheme similarity index 81% rename from AltStore.xcodeproj/xcshareddata/xcschemes/AltStore - Release.xcscheme rename to AltStore.xcodeproj/xcshareddata/xcschemes/SideStore - Release.xcscheme index b86d9086..06efdd6a 100644 --- a/AltStore.xcodeproj/xcshareddata/xcschemes/AltStore - Release.xcscheme +++ b/AltStore.xcodeproj/xcshareddata/xcschemes/SideStore - Release.xcscheme @@ -55,7 +55,26 @@ argument = "-com.apple.CoreData.ConcurrencyDebug 1" isEnabled = "YES"> + + + + + + + + + + + + + + + + + + + + - aps-environment - development + com.apple.developer.kernel.extended-virtual-addressing + + com.apple.developer.kernel.increased-debugging-memory-limit + + com.apple.developer.kernel.increased-memory-limit + com.apple.developer.siri com.apple.security.application-groups diff --git a/AltStore/App Detail/AppContentViewController.swift b/AltStore/App Detail/AppContentViewController.swift index 6dc52b87..2aacf37c 100644 --- a/AltStore/App Detail/AppContentViewController.swift +++ b/AltStore/App Detail/AppContentViewController.swift @@ -81,7 +81,7 @@ final class AppContentViewController: UITableViewController self.subtitleLabel.text = self.app.subtitle self.descriptionTextView.text = self.app.localizedDescription - if let version = self.app.latestVersion + if let version = self.app.latestAvailableVersion { self.versionDescriptionTextView.text = version.localizedDescription self.versionLabel.text = String(format: NSLocalizedString("Version %@", comment: ""), version.version) diff --git a/AltStore/App Detail/AppViewController.swift b/AltStore/App Detail/AppViewController.swift index 238b90b8..6ea8a81f 100644 --- a/AltStore/App Detail/AppViewController.swift +++ b/AltStore/App Detail/AppViewController.swift @@ -217,8 +217,8 @@ final class AppViewController: UIViewController self._shouldResetLayout = false } - - let statusBarHeight = UIApplication.shared.statusBarFrame.height + + let statusBarHeight = self.view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0 let cornerRadius = self.contentViewControllerShadowView.layer.cornerRadius let inset = 12 as CGFloat @@ -323,7 +323,7 @@ final class AppViewController: UIViewController self.backButtonContainerView.layer.cornerRadius = self.backButtonContainerView.bounds.midY - self.scrollView.scrollIndicatorInsets.top = statusBarHeight + self.scrollView.verticalScrollIndicatorInsets.top = statusBarHeight // Adjust content offset + size. let contentOffset = self.scrollView.contentOffset @@ -384,7 +384,7 @@ private extension AppViewController button.progress = progress } - if let versionDate = self.app.latestVersion?.date, versionDate > Date() + if let versionDate = self.app.latestAvailableVersion?.date, versionDate > Date() { self.bannerView.button.countdownDate = versionDate self.navigationBarDownloadButton.countdownDate = versionDate @@ -510,7 +510,7 @@ extension AppViewController catch { DispatchQueue.main.async { - let toastView = ToastView(error: error) + let toastView = ToastView(error: error, opensLog: true) toastView.show(in: self) } } diff --git a/AltStore/App IDs/AppIDsViewController.swift b/AltStore/App IDs/AppIDsViewController.swift index 1cd764b4..8f5ffefc 100644 --- a/AltStore/App IDs/AppIDsViewController.swift +++ b/AltStore/App IDs/AppIDsViewController.swift @@ -90,14 +90,21 @@ private extension AppIDsViewController cell.bannerView.button.isUserInteractionEnabled = false cell.bannerView.buttonLabel.isHidden = false - + let currentDate = Date() - let numberOfDays = expirationDate.numberOfCalendarDays(since: currentDate) - let numberOfDaysText = (numberOfDays == 1) ? NSLocalizedString("1 day", comment: "") : String(format: NSLocalizedString("%@ days", comment: ""), NSNumber(value: numberOfDays)) - cell.bannerView.button.setTitle(numberOfDaysText.uppercased(), for: .normal) + let formatter = DateComponentsFormatter() + formatter.unitsStyle = .full + formatter.includesApproximationPhrase = false + formatter.includesTimeRemainingPhrase = false + formatter.allowedUnits = [.minute, .hour, .day] + formatter.maximumUnitCount = 1 - attributedAccessibilityLabel.mutableString.append(String(format: NSLocalizedString("Expires in %@.", comment: ""), numberOfDaysText) + " ") + cell.bannerView.button.setTitle((formatter.string(from: currentDate, to: expirationDate) ?? NSLocalizedString("Unknown", comment: "")).uppercased(), for: .normal) + + // formatter.includesTimeRemainingPhrase = true + + // attributedAccessibilityLabel.mutableString.append((formatter.string(from: currentDate, to: expirationDate) ?? NSLocalizedString("Unknown", comment: "")) + " ") } else { diff --git a/AltStore/AppDelegate.swift b/AltStore/AppDelegate.swift index 34e1b073..eeaabaf1 100644 --- a/AltStore/AppDelegate.swift +++ b/AltStore/AppDelegate.swift @@ -61,6 +61,8 @@ final class AppDelegate: UIResponder, UIApplicationDelegate { // Register default settings before doing anything else. UserDefaults.registerDefaults() + + DatabaseManager.shared.start { (error) in if let error = error { @@ -380,7 +382,7 @@ private extension AppDelegate for update in updates { guard !previousUpdates.contains(where: { $0[#keyPath(InstalledApp.bundleIdentifier)] == update.bundleIdentifier }) else { continue } - guard let storeApp = update.storeApp, let version = storeApp.version else { continue } + guard let storeApp = update.storeApp, let version = storeApp.latestSupportedVersion else { continue } let content = UNMutableNotificationContent() content.title = NSLocalizedString("New Update Available", comment: "") diff --git a/AltStore/Authentication/Authentication.storyboard b/AltStore/Authentication/Authentication.storyboard index d4e7e2ec..98057985 100644 --- a/AltStore/Authentication/Authentication.storyboard +++ b/AltStore/Authentication/Authentication.storyboard @@ -1,9 +1,9 @@ - + - + @@ -13,8 +13,8 @@ - - + + @@ -36,19 +36,19 @@ - + - + @@ -57,7 +57,7 @@ - + + + + + @@ -215,19 +219,15 @@ - - - - @@ -258,13 +258,13 @@ - + - + @@ -298,7 +298,7 @@ - + - + - + - + - + @@ -114,19 +138,21 @@ If you would subscribe to the patreon that would support us and make sure we can + + - + - + - + diff --git a/AltStore/Settings/AnisetteManager.swift b/AltStore/Settings/AnisetteManager.swift index 4edc4617..fa269825 100644 --- a/AltStore/Settings/AnisetteManager.swift +++ b/AltStore/Settings/AnisetteManager.swift @@ -10,6 +10,11 @@ import Foundation public struct AnisetteManager { + var menuURL: String { + var url: String + url = UserDefaults.standard.menuAnisetteURL + return url + } /// User defined URL from Settings/UserDefaults static var userURL: String? { var urlString: String? diff --git a/AltStore/Settings/AnisetteServerList.swift b/AltStore/Settings/AnisetteServerList.swift new file mode 100644 index 00000000..4fe6425a --- /dev/null +++ b/AltStore/Settings/AnisetteServerList.swift @@ -0,0 +1,227 @@ +// +// AnisetteServerList.swift +// SideStore +// +// Created by ny on 6/18/24. +// Copyright © 2024 SideStore. All rights reserved. +// + +import UIKit +import SwiftUI +import AltStoreCore + +typealias SUIButton = SwiftUI.Button + +// MARK: - AnisetteServerData +struct AnisetteServerData: Codable { + let servers: [Server] +} + +// MARK: - Server +struct Server: Codable { + var name: String + var address: String +} + +class AnisetteViewModel: ObservableObject { + @Published var selected: String = "" + + @Published var source: String = "https://servers.sidestore.io/servers.json" + @Published var servers: [Server] = [] + + init() { + // using the custom Anisette list + if !UserDefaults.standard.menuAnisetteList.isEmpty { + self.source = UserDefaults.standard.menuAnisetteList + } + } + + func getListOfServers() { + guard let url = URL(string: source) else { return } + + // DO NOT use local cache when fetching anisette servers + var request = URLRequest(url: url) + request.cachePolicy = .reloadIgnoringLocalCacheData + + URLSession.shared.dataTask(with: request) { data, response, error in + if let error = error { + return + } + if let data = data { + do { + let decoder = Foundation.JSONDecoder() + let servers = try decoder.decode(AnisetteServerData.self, from: data) + DispatchQueue.main.async { + self.servers = servers.servers + // store server addresses as list + UserDefaults.standard.menuAnisetteServersList = servers.servers.map(\.self.address) + } + } catch { + // Handle decoding error + print("Failed to decode JSON: \(error)") + } + } + }.resume() + } +} + +struct AnisetteServers: View { + @Environment(\.presentationMode) var presentationMode + @StateObject var viewModel: AnisetteViewModel = AnisetteViewModel() + @State var selected: String? = nil + @State private var showingConfirmation = false + var errorCallback: () -> () + + var body: some View { + ZStack { + Color(UIColor.systemBackground) + .ignoresSafeArea() + .onAppear { + viewModel.getListOfServers() + } + VStack { + if #available(iOS 16.0, *) { + SwiftUI.List($viewModel.servers, id: \.address, selection: $selected) { server in + HStack { + VStack(alignment: .leading) { + Text("\(server.name.wrappedValue)") + .font(.headline) + .foregroundColor(.primary) + Text("\(server.address.wrappedValue)") + .font(.subheadline) + .foregroundColor(.secondary) + } + Spacer() + if selected != nil { + if server.address.wrappedValue == selected { + Spacer() + Image(systemName: "checkmark.circle.fill") + .foregroundColor(.accentColor) + .onAppear { + UserDefaults.standard.menuAnisetteURL = server.address.wrappedValue + print(UserDefaults.synchronize(.standard)()) + print(UserDefaults.standard.menuAnisetteURL) + print(server.address.wrappedValue) + } + } + } + } + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color(UIColor.secondarySystemBackground))) + .shadow(color: Color.black.opacity(0.2), radius: 5, x: 0, y: 5) + } + .listStyle(.plain) + .scrollContentBackground(.hidden) + .listRowBackground(Color(UIColor.systemBackground)) + } else { + List(selection: $selected) { + ForEach($viewModel.servers, id: \.name) { server in + VStack { + HStack { + Text("\(server.name.wrappedValue)") + .foregroundColor(.primary) + .frame(alignment: .center) + Text("\(server.address.wrappedValue)") + .foregroundColor(.secondary) + .frame(alignment: .center) + } + } + Spacer() + } + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color(UIColor.secondarySystemBackground))) + .shadow(color: Color.black.opacity(0.2), radius: 5, x: 0, y: 5) + } + .listStyle(.plain) + } + + VStack(spacing: 16) { + TextField("Anisette Server List", text: $viewModel.source) + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color(UIColor.secondarySystemFill))) + .foregroundColor(.primary) + .frame(height: 60) + .shadow(color: Color.black.opacity(0.2), radius: 5, x: 0, y: 5) + .onChange(of: viewModel.source) { newValue in + UserDefaults.standard.menuAnisetteList = newValue + viewModel.getListOfServers() + } + + HStack(spacing: 16) { + SUIButton(action: { + presentationMode.wrappedValue.dismiss() + }) { + HStack{ + Spacer() + Text("Back") + .fontWeight(.semibold) + Spacer() + } + .contentShape(Rectangle()) + } + .buttonStyle(PlainButtonStyle()) + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color.accentColor)) + .foregroundColor(.white) + .shadow(color: Color.accentColor.opacity(0.4), radius: 10, x: 0, y: 5) + + SUIButton(action: { + viewModel.getListOfServers() + }) { + HStack{ + Spacer() + Text("Refresh Servers") + .fontWeight(.semibold) + .frame(maxWidth: .infinity) + Spacer() + } + .contentShape(Rectangle()) + } + .buttonStyle(PlainButtonStyle()) + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color.accentColor)) + .foregroundColor(.white) + .shadow(color: Color.accentColor.opacity(0.4), radius: 10, x: 0, y: 5) + + } + + SUIButton(action: { + showingConfirmation = true + }) { + Text("Reset adi.pb") + .fontWeight(.semibold) + .frame(maxWidth: .infinity) + } + .buttonStyle(PlainButtonStyle()) + .padding() + .background(RoundedRectangle(cornerRadius: 10).fill(Color.red)) + .foregroundColor(.white) + .shadow(color: Color.red.opacity(0.4), radius: 10, x: 0, y: 5) + .alert(isPresented: $showingConfirmation) { + Alert( + title: Text("Reset adi.pb"), + message: Text("are you sure to clear the adi.pb from keychain?"), + primaryButton: .default(Text("do it")) { + #if !DEBUG + if Keychain.shared.adiPb != nil { + Keychain.shared.adiPb = nil + } + #endif + print("Cleared adi.pb from keychain") + errorCallback() + presentationMode.wrappedValue.dismiss() + }, + secondaryButton: .cancel(Text("cancel")) { + print("canceled") + } + ) + } + } + .padding(.horizontal) + .padding(.bottom) + } + } + .navigationBarHidden(true) + .navigationTitle("") + } +} diff --git a/AltStore/Settings/Error Log/ErrorDetailsViewController.swift b/AltStore/Settings/Error Log/ErrorDetailsViewController.swift new file mode 100644 index 00000000..c3cd5a2c --- /dev/null +++ b/AltStore/Settings/Error Log/ErrorDetailsViewController.swift @@ -0,0 +1,53 @@ +// +// ErrorDetailsViewController.swift +// AltStore +// +// Created by Riley Testut on 10/5/22. +// Copyright © 2022 Riley Testut. All rights reserved. +// + +import UIKit + +import AltStoreCore + +class ErrorDetailsViewController: UIViewController +{ + var loggedError: LoggedError? + + @IBOutlet private var textView: UITextView! + + override func viewDidLoad() + { + super.viewDidLoad() + + if let error = self.loggedError?.error + { + self.title = error.localizedErrorCode + + let font = self.textView.font ?? UIFont.preferredFont(forTextStyle: .body) + let detailedDescription = error.formattedDetailedDescription(with: font) + self.textView.attributedText = detailedDescription + } + else + { + self.title = NSLocalizedString("Error Details", comment: "") + } + + self.navigationController?.navigationBar.tintColor = .altPrimary + + if #available(iOS 15, *), let sheetController = self.navigationController?.sheetPresentationController + { + sheetController.detents = [.medium(), .large()] + sheetController.selectedDetentIdentifier = .medium + sheetController.prefersGrabberVisible = true + } + } + + override func viewDidLayoutSubviews() + { + super.viewDidLayoutSubviews() + + self.textView.textContainerInset.left = self.view.layoutMargins.left + self.textView.textContainerInset.right = self.view.layoutMargins.right + } +} diff --git a/AltStore/Settings/Error Log/ErrorLogTableViewCell.swift b/AltStore/Settings/Error Log/ErrorLogTableViewCell.swift index 71b67b88..0e4f817c 100644 --- a/AltStore/Settings/Error Log/ErrorLogTableViewCell.swift +++ b/AltStore/Settings/Error Log/ErrorLogTableViewCell.swift @@ -8,6 +8,16 @@ import UIKit +@objc(ErrorLogMenuButton) +private final class ErrorLogMenuButton: UIButton { + @available(iOS 14.0, *) + override func menuAttachmentPoint(for configuration: UIContextMenuConfiguration) -> CGPoint { + var point = super.menuAttachmentPoint(for: configuration) + point.y = self.bounds.midY + return point + } +} + @objc(ErrorLogTableViewCell) final class ErrorLogTableViewCell: UITableViewCell { diff --git a/AltStore/Settings/Error Log/ErrorLogViewController.swift b/AltStore/Settings/Error Log/ErrorLogViewController.swift index 7a67a301..23786b9b 100644 --- a/AltStore/Settings/Error Log/ErrorLogViewController.swift +++ b/AltStore/Settings/Error Log/ErrorLogViewController.swift @@ -21,6 +21,13 @@ final class ErrorLogViewController: UITableViewController private lazy var dataSource = self.makeDataSource() private var expandedErrorIDs = Set() + private var isScrolling = false { + didSet { + guard self.isScrolling != oldValue else { return } + self.updateButtonInteractivity() + } + } + private lazy var timeFormatter: DateFormatter = { let dateFormatter = DateFormatter() dateFormatter.dateStyle = .none @@ -39,6 +46,15 @@ final class ErrorLogViewController: UITableViewController self.tableView.dataSource = self.dataSource self.tableView.prefetchDataSource = self.dataSource } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + guard let loggedError = sender as? LoggedError, segue.identifier == "showErrorDetails" else { return } + + let navigationController = segue.destination as! UINavigationController + + let errorDetailsViewController = navigationController.viewControllers.first as! ErrorDetailsViewController + errorDetailsViewController.loggedError = loggedError + } } private extension ErrorLogViewController @@ -60,14 +76,8 @@ private extension ErrorLogViewController let cell = cell as! ErrorLogTableViewCell cell.dateLabel.text = self.timeFormatter.string(from: loggedError.date) cell.errorFailureLabel.text = loggedError.localizedFailure ?? NSLocalizedString("Operation Failed", comment: "") - - switch loggedError.domain - { - case AltServerErrorDomain: cell.errorCodeLabel?.text = String(format: NSLocalizedString("AltServer Error %@", comment: ""), NSNumber(value: loggedError.code)) - case OperationError.domain: cell.errorCodeLabel?.text = String(format: NSLocalizedString("AltStore Error %@", comment: ""), NSNumber(value: loggedError.code)) - default: cell.errorCodeLabel?.text = loggedError.error.localizedErrorCode - } - + cell.errorCodeLabel.text = loggedError.error.localizedErrorCode + let nsError = loggedError.error as NSError let errorDescription = [nsError.localizedDescription, nsError.localizedRecoverySuggestion].compactMap { $0 }.joined(separator: "\n\n") cell.errorDescriptionTextView.text = errorDescription @@ -93,12 +103,19 @@ private extension ErrorLogViewController }, UIAction(title: NSLocalizedString("Search FAQ", comment: ""), image: UIImage(systemName: "magnifyingglass")) { [weak self] _ in self?.searchFAQ(for: loggedError) - } + }, + UIAction(title: NSLocalizedString("View More Details", comment: ""), image: UIImage(systemName: "ellipsis.circle")) { [weak self] _ in + self?.viewMoreDetails(for: loggedError) + }, ]) cell.menuButton.menu = menu + cell.menuButton.showsMenuAsPrimaryAction = self.isScrolling ? false : true + cell.selectionStyle = .none + } else { + cell.menuButton.isUserInteractionEnabled = false } - + // Include errorDescriptionTextView's text in cell summary. cell.accessibilityLabel = [cell.errorFailureLabel.text, cell.dateLabel.text, cell.errorCodeLabel.text, cell.errorDescriptionTextView.text].compactMap { $0 }.joined(separator: ". ") @@ -232,22 +249,27 @@ private extension ErrorLogViewController func searchFAQ(for loggedError: LoggedError) { - let baseURL = URL(string: "https://faq.altstore.io/getting-started/troubleshooting-guide")! + let baseURL = URL(string: "https://faq.altstore.io/getting-started/error-codes")! var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false)! - let query = [loggedError.domain, "\(loggedError.code)"].joined(separator: "+") + let query = [loggedError.domain, "\(loggedError.error.displayCode)"].joined(separator: "+") components.queryItems = [URLQueryItem(name: "q", value: query)] let safariViewController = SFSafariViewController(url: components.url ?? baseURL) safariViewController.preferredControlTintColor = .altPrimary self.present(safariViewController, animated: true) } + + func viewMoreDetails(for loggedError: LoggedError) { + self.performSegue(withIdentifier: "showErrorDetails", sender: loggedError) + } } extension ErrorLogViewController { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard #unavailable(iOS 14) else { return } let loggedError = self.dataSource.item(at: indexPath) let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) @@ -321,3 +343,32 @@ extension ErrorLogViewController: QLPreviewControllerDataSource { return fileURL as QLPreviewItem } } + +extension ErrorLogViewController +{ + override func scrollViewWillBeginDragging(_ scrollView: UIScrollView) + { + self.isScrolling = true + } + + override func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) + { + self.isScrolling = false + } + + override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) + { + guard !decelerate else { return } + self.isScrolling = false + } + + private func updateButtonInteractivity() + { + guard #available(iOS 14, *) else { return } + + for case let cell as ErrorLogTableViewCell in self.tableView.visibleCells + { + cell.menuButton.showsMenuAsPrimaryAction = self.isScrolling ? false : true + } + } +} diff --git a/AltStore/Settings/PatreonComponents.swift b/AltStore/Settings/PatreonComponents.swift index 4f2ec8ea..df0fb810 100644 --- a/AltStore/Settings/PatreonComponents.swift +++ b/AltStore/Settings/PatreonComponents.swift @@ -56,6 +56,8 @@ final class PatronsFooterView: UICollectionReusableView final class AboutPatreonHeaderView: UICollectionReusableView { @IBOutlet var supportButton: UIButton! + @IBOutlet var twitterButton: UIButton! + @IBOutlet var instagramButton: UIButton! @IBOutlet var accountButton: UIButton! @IBOutlet var textView: UITextView! @@ -79,12 +81,12 @@ final class AboutPatreonHeaderView: UICollectionReusableView imageView.layer.cornerRadius = imageView.bounds.midY } - for button in [self.supportButton, self.accountButton].compactMap({ $0 }) + for button in [self.supportButton, self.accountButton, self.twitterButton, self.instagramButton].compactMap({ $0 }) { button.clipsToBounds = true button.layer.cornerRadius = 16 } - } +} override func layoutMarginsDidChange() { diff --git a/AltStore/Settings/PatreonViewController.swift b/AltStore/Settings/PatreonViewController.swift index 3caab7a2..c7df8d70 100644 --- a/AltStore/Settings/PatreonViewController.swift +++ b/AltStore/Settings/PatreonViewController.swift @@ -111,7 +111,9 @@ private extension PatreonViewController headerView.layoutMargins = self.view.layoutMargins headerView.supportButton.addTarget(self, action: #selector(PatreonViewController.openPatreonURL(_:)), for: .primaryActionTriggered) - + headerView.twitterButton.addTarget(self, action: #selector(PatreonViewController.openTwitterURL(_:)), for: .primaryActionTriggered) + headerView.instagramButton.addTarget(self, action: #selector(PatreonViewController.openInstagramURL(_:)), for: .primaryActionTriggered) + let defaultSupportButtonTitle = NSLocalizedString("Become a patron", comment: "") let isPatronSupportButtonTitle = NSLocalizedString("View Patreon", comment: "") @@ -126,7 +128,7 @@ private extension PatreonViewController let isPatronText = NSLocalizedString(""" Hey , - You’re the best. Your account was linked successfully, so you now have access to the beta versions of all of our apps. You can find them all in the Browse tab. + You’re the best. Your account was linked successfully, so you now have access to any beta versions of our apps. You can find them all in the Browse tab. Thanks for all of your support. Enjoy! - SideTeam @@ -173,13 +175,31 @@ private extension PatreonViewController @objc func openPatreonURL(_ sender: UIButton) { - let patreonURL = URL(string: "https://www.patreon.com/SideStore")! + let patreonURL = URL(string: "https://www.patreon.com/SideStoreIO")! let safariViewController = SFSafariViewController(url: patreonURL) safariViewController.preferredControlTintColor = self.view.tintColor self.present(safariViewController, animated: true, completion: nil) } + @objc func openTwitterURL(_ sender: UIButton) + { + let twitterURL = URL(string: "https://twitter.com/sidestoreio")! + + let safariViewController = SFSafariViewController(url: twitterURL) + safariViewController.preferredControlTintColor = self.view.tintColor + self.present(safariViewController, animated: true, completion: nil) + } + + @objc func openInstagramURL(_ sender: UIButton) + { + let twitterURL = URL(string: "https://instagram.com/sidestore.io")! + + let safariViewController = SFSafariViewController(url: twitterURL) + safariViewController.preferredControlTintColor = self.view.tintColor + self.present(safariViewController, animated: true, completion: nil) + } + @IBAction func authenticate(_ sender: UIBarButtonItem) { PatreonAPI.shared.authenticate { (result) in @@ -328,7 +348,7 @@ extension PatreonViewController: UICollectionViewDelegateFlowLayout switch section { case .about: return .zero - case .patrons: return CGSize(width: 0, height: 0) + case .patrons: return CGSize(width: 320, height: 44) } } } diff --git a/AltStore/Settings/Settings.storyboard b/AltStore/Settings/Settings.storyboard index ccf9515c..2b825df8 100644 --- a/AltStore/Settings/Settings.storyboard +++ b/AltStore/Settings/Settings.storyboard @@ -1,9 +1,9 @@ - + - + @@ -20,8 +20,8 @@ -