mirror of
https://github.com/SideStore/SideStore.git
synced 2026-04-01 08:15:40 +02:00
Compare commits
42 Commits
0.6.2
...
fabe093b1d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fabe093b1d | ||
|
|
e1550811eb | ||
|
|
8730ae42c6 | ||
|
|
7d7a44bc61 | ||
|
|
639753149f | ||
|
|
cc5aeaf099 | ||
|
|
1d642e2ffa | ||
|
|
decf21f177 | ||
|
|
b2f42160f9 | ||
|
|
4f8a70d31e | ||
|
|
bedda8c6a4 | ||
|
|
d042267ff9 | ||
|
|
4cc534c89e | ||
|
|
606140a7be | ||
|
|
55761029a3 | ||
|
|
4e6756d4d5 | ||
|
|
c64b0c99de | ||
|
|
e19b147962 | ||
|
|
85427ecbc6 | ||
|
|
ecf5e2d770 | ||
|
|
2f2df9ca43 | ||
|
|
31520354bd | ||
|
|
25f13faa67 | ||
|
|
dcaddcc219 | ||
|
|
fa1757ff1d | ||
|
|
f0cb86aff4 | ||
|
|
7a34d7ac67 | ||
|
|
cfd9247fdd | ||
|
|
15ffe766d3 | ||
|
|
a0ae0cb2b1 | ||
|
|
dc53f19947 | ||
|
|
baf3594a8e | ||
|
|
1d4666e79e | ||
|
|
b4df06f742 | ||
|
|
d41a6b17d2 | ||
|
|
d98e0dde72 | ||
|
|
f23a7e9c82 | ||
|
|
7ed45c7cb1 | ||
|
|
c319524df6 | ||
|
|
724e8db980 | ||
|
|
669d33183e | ||
|
|
a12b6cd62b |
1007
.github/.obsolete/reusable-build-workflow.yml
vendored
1007
.github/.obsolete/reusable-build-workflow.yml
vendored
File diff suppressed because it is too large
Load Diff
45
.github/workflows/pr.yml
vendored
45
.github/workflows/pr.yml
vendored
@@ -54,57 +54,12 @@ jobs:
|
|||||||
swiftpm-cache-restore-keys: |
|
swiftpm-cache-restore-keys: |
|
||||||
xcode-cache-sourcedata-
|
xcode-cache-sourcedata-
|
||||||
|
|
||||||
|
|
||||||
- name: Restore Pods from Cache (Exact match)
|
|
||||||
id: pods-restore
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-${{ hashFiles('Podfile') }}
|
|
||||||
# restore-keys: | # commented out to strictly check cache for this particular podfile
|
|
||||||
# pods-cache-
|
|
||||||
|
|
||||||
- name: Restore Pods from Cache (Last Available)
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
id: pods-restore-recent
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-
|
|
||||||
|
|
||||||
- name: Install CocoaPods
|
|
||||||
# if: ${{ steps.pods-restore.outputs.cache-hit != 'true'}}
|
|
||||||
id: pods-install
|
|
||||||
run: |
|
|
||||||
pod install
|
|
||||||
|
|
||||||
- name: Save Pods to Cache
|
|
||||||
id: save-pods
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: List Files and derived data
|
- name: List Files and derived data
|
||||||
run: |
|
run: |
|
||||||
echo ">>>>>>>>> Workdir <<<<<<<<<<"
|
echo ">>>>>>>>> Workdir <<<<<<<<<<"
|
||||||
ls -la .
|
ls -la .
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo ">>>>>>>>> Pods <<<<<<<<<<"
|
|
||||||
find Pods -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
||||||
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
47
.github/workflows/sidestore-build.yml
vendored
47
.github/workflows/sidestore-build.yml
vendored
@@ -35,8 +35,8 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: 'macos-15'
|
- os: 'macos-26'
|
||||||
version: '16.2'
|
version: '26.0'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
outputs:
|
outputs:
|
||||||
version: ${{ steps.version.outputs.version }}
|
version: ${{ steps.version.outputs.version }}
|
||||||
@@ -173,45 +173,6 @@ jobs:
|
|||||||
# swiftpm-cache-restore-keys: |
|
# swiftpm-cache-restore-keys: |
|
||||||
# xcode-cache-sourcedata-build-${{ github.ref_name }}-
|
# xcode-cache-sourcedata-build-${{ github.ref_name }}-
|
||||||
|
|
||||||
- name: (Build) Restore Pods from Cache (Exact match)
|
|
||||||
id: pods-restore
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-build-${{ github.ref_name }}-${{ hashFiles('Podfile') }}
|
|
||||||
# restore-keys: | # commented out to strictly check cache for this particular podfile
|
|
||||||
# pods-cache-
|
|
||||||
|
|
||||||
- name: (Build) Restore Pods from Cache (Last Available)
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
id: pods-restore-recent
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-build-${{ github.ref_name }}-
|
|
||||||
|
|
||||||
|
|
||||||
- name: (Build) Install CocoaPods
|
|
||||||
run: pod install
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: (Build) Save Pods to Cache
|
|
||||||
id: save-pods
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-build-${{ github.ref_name }}-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: (Build) Clean previous build artifacts
|
- name: (Build) Clean previous build artifacts
|
||||||
# using 'tee' to intercept stdout and log for detailed build-log
|
# using 'tee' to intercept stdout and log for detailed build-log
|
||||||
run: |
|
run: |
|
||||||
@@ -227,10 +188,6 @@ jobs:
|
|||||||
ls -la .
|
ls -la .
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo ">>>>>>>>> Pods <<<<<<<<<<"
|
|
||||||
find Pods -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
||||||
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
31
.github/workflows/sidestore-deploy.yml
vendored
31
.github/workflows/sidestore-deploy.yml
vendored
@@ -116,6 +116,35 @@ jobs:
|
|||||||
run: echo "date=$(date -u +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
run: echo "date=$(date -u +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
|
|
||||||
|
- name: List files to upload
|
||||||
|
id: list_uploads
|
||||||
|
run: |
|
||||||
|
echo ">>>>>>>>> Workdir <<<<<<<<<<"
|
||||||
|
find . -maxdepth 4 -exec ls -ld {} + || true # List contents if directory exists
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
FILES="SideStore.ipa SideStore.dSYMs.zip encrypted-build-logs.zip"
|
||||||
|
|
||||||
|
if [[ "${{ vars.ENABLE_TESTS }}" == "1" && "${{ vars.ENABLE_TESTS_BUILD }}" == "1" ]]; then
|
||||||
|
FILES="$FILES encrypted-tests-build-logs.zip"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${{ vars.ENABLE_TESTS }}" == "1" && "${{ vars.ENABLE_TESTS_RUN }}" == "1" ]]; then
|
||||||
|
FILES="$FILES encrypted-tests-run-logs.zip test-results.zip tests-recording.mp4"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Final upload list:"
|
||||||
|
for f in $FILES; do
|
||||||
|
if [[ -f "$f" ]]; then
|
||||||
|
echo " ✓ $f"
|
||||||
|
else
|
||||||
|
echo " - $f (missing)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "files=$FILES" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Upload to releases
|
- name: Upload to releases
|
||||||
uses: IsaacShelton/update-existing-release@v1.3.1
|
uses: IsaacShelton/update-existing-release@v1.3.1
|
||||||
with:
|
with:
|
||||||
@@ -123,7 +152,7 @@ jobs:
|
|||||||
release: ${{ inputs.release_name }}
|
release: ${{ inputs.release_name }}
|
||||||
tag: ${{ inputs.release_tag }}
|
tag: ${{ inputs.release_tag }}
|
||||||
prerelease: ${{ inputs.is_beta }}
|
prerelease: ${{ inputs.is_beta }}
|
||||||
files: SideStore.ipa SideStore.dSYMs.zip encrypted-build-logs.zip encrypted-tests-build-logs.zip encrypted-tests-run-logs.zip test-results.zip tests-recording.mp4
|
files: ${{ steps.list_uploads.outputs.files }}
|
||||||
body: |
|
body: |
|
||||||
This is an ⚠️ **EXPERIMENTAL** ⚠️ ${{ inputs.release_name }} build for commit [${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }}).
|
This is an ⚠️ **EXPERIMENTAL** ⚠️ ${{ inputs.release_name }} build for commit [${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }}).
|
||||||
|
|
||||||
|
|||||||
45
.github/workflows/sidestore-tests-build.yml
vendored
45
.github/workflows/sidestore-tests-build.yml
vendored
@@ -19,8 +19,8 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: 'macos-15'
|
- os: 'macos-26'
|
||||||
version: '16.2'
|
version: '26.0'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -37,7 +37,7 @@ jobs:
|
|||||||
- name: Setup Xcode
|
- name: Setup Xcode
|
||||||
uses: maxim-lobanov/setup-xcode@v1.6.0
|
uses: maxim-lobanov/setup-xcode@v1.6.0
|
||||||
with:
|
with:
|
||||||
xcode-version: '16.2'
|
xcode-version: '26.0'
|
||||||
|
|
||||||
# - name: (Tests-Build) Cache Build
|
# - name: (Tests-Build) Cache Build
|
||||||
# uses: irgaly/xcode-cache@v1.8.1
|
# uses: irgaly/xcode-cache@v1.8.1
|
||||||
@@ -68,41 +68,6 @@ jobs:
|
|||||||
~/Library/Caches/org.swift.swiftpm
|
~/Library/Caches/org.swift.swiftpm
|
||||||
key: xcode-cache-tests-${{ github.ref_name }}-
|
key: xcode-cache-tests-${{ github.ref_name }}-
|
||||||
|
|
||||||
- name: (Tests-Build) Restore Pods from Cache (Exact match)
|
|
||||||
id: pods-restore
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-test-${{ github.ref_name }}-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: (Tests-Build) Restore Pods from Cache (Last Available)
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
id: pods-restore-recent
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-test-${{ github.ref_name }}-
|
|
||||||
|
|
||||||
- name: (Tests-Build) Install CocoaPods
|
|
||||||
run: pod install
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: (Tests-Build) Save Pods to Cache
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-test-${{ github.ref_name }}-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: Clean Derived Data (if required)
|
- name: Clean Derived Data (if required)
|
||||||
if: ${{ vars.PERFORM_CLEAN_TESTS_BUILD == '1' }}
|
if: ${{ vars.PERFORM_CLEAN_TESTS_BUILD == '1' }}
|
||||||
run: |
|
run: |
|
||||||
@@ -124,10 +89,6 @@ jobs:
|
|||||||
ls -la .
|
ls -la .
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo ">>>>>>>>> Pods <<<<<<<<<<"
|
|
||||||
find Pods -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
||||||
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
45
.github/workflows/sidestore-tests-run.yml
vendored
45
.github/workflows/sidestore-tests-run.yml
vendored
@@ -19,8 +19,8 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: 'macos-15'
|
- os: 'macos-26'
|
||||||
version: '16.2'
|
version: '26.0'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
- name: Setup Xcode
|
- name: Setup Xcode
|
||||||
uses: maxim-lobanov/setup-xcode@v1.6.0
|
uses: maxim-lobanov/setup-xcode@v1.6.0
|
||||||
with:
|
with:
|
||||||
xcode-version: '16.2'
|
xcode-version: '26.0'
|
||||||
|
|
||||||
# - name: (Tests-Run) Cache Build
|
# - name: (Tests-Run) Cache Build
|
||||||
# uses: irgaly/xcode-cache@v1.8.1
|
# uses: irgaly/xcode-cache@v1.8.1
|
||||||
@@ -56,41 +56,6 @@ jobs:
|
|||||||
~/Library/Caches/org.swift.swiftpm
|
~/Library/Caches/org.swift.swiftpm
|
||||||
key: xcode-cache-tests-${{ github.ref_name }}-${{ github.sha }}
|
key: xcode-cache-tests-${{ github.ref_name }}-${{ github.sha }}
|
||||||
|
|
||||||
- name: (Tests-Run) Restore Pods from Cache (Exact match)
|
|
||||||
id: pods-restore
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-test-${{ github.ref_name }}-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: (Tests-Run) Restore Pods from Cache (Last Available)
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
id: pods-restore-recent
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-test-${{ github.ref_name }}-
|
|
||||||
|
|
||||||
- name: (Tests-Run) Install CocoaPods
|
|
||||||
run: pod install
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: (Tests-Run) Save Pods to Cache
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-test-${{ github.ref_name }}-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: (Tests-Run) Clean previous build artifacts
|
- name: (Tests-Run) Clean previous build artifacts
|
||||||
run: |
|
run: |
|
||||||
make clean
|
make clean
|
||||||
@@ -104,10 +69,6 @@ jobs:
|
|||||||
ls -la .
|
ls -la .
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo ">>>>>>>>> Pods <<<<<<<<<<"
|
|
||||||
find Pods -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
||||||
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
45
.github/workflows/stable.yml
vendored
45
.github/workflows/stable.yml
vendored
@@ -12,8 +12,8 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: 'macos-15'
|
- os: 'macos-26'
|
||||||
version: '16.2'
|
version: '26.0'
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
@@ -89,43 +89,6 @@ jobs:
|
|||||||
~/Library/Caches/org.swift.swiftpm
|
~/Library/Caches/org.swift.swiftpm
|
||||||
key: xcode-cache-build-stable-
|
key: xcode-cache-build-stable-
|
||||||
|
|
||||||
- name: (Build) Restore Pods from Cache (Exact match)
|
|
||||||
id: pods-restore
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-build-stable-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: (Build) Restore Pods from Cache (Last Available)
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
id: pods-restore-recent
|
|
||||||
uses: actions/cache/restore@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-build-stable-
|
|
||||||
|
|
||||||
|
|
||||||
- name: (Build) Install CocoaPods
|
|
||||||
run: pod install
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: (Build) Save Pods to Cache
|
|
||||||
id: save-pods
|
|
||||||
if: ${{ steps.pods-restore.outputs.cache-hit != 'true' }}
|
|
||||||
uses: actions/cache/save@v3
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
./Podfile.lock
|
|
||||||
./Pods/
|
|
||||||
./AltStore.xcworkspace/
|
|
||||||
key: pods-cache-build-stable-${{ hashFiles('Podfile') }}
|
|
||||||
|
|
||||||
- name: (Build) Clean previous build artifacts
|
- name: (Build) Clean previous build artifacts
|
||||||
run: |
|
run: |
|
||||||
make clean
|
make clean
|
||||||
@@ -140,10 +103,6 @@ jobs:
|
|||||||
ls -la .
|
ls -la .
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
echo ">>>>>>>>> Pods <<<<<<<<<<"
|
|
||||||
find Pods -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
echo ">>>>>>>>> SideStore <<<<<<<<<<"
|
||||||
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
find SideStore -maxdepth 2 -exec ls -ld {} + || true # List contents if directory exists
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
4
.gitmodules
vendored
4
.gitmodules
vendored
@@ -50,6 +50,10 @@
|
|||||||
path = SideStore/minimuxer
|
path = SideStore/minimuxer
|
||||||
url = https://github.com/SideStore/minimuxer
|
url = https://github.com/SideStore/minimuxer
|
||||||
branch = master
|
branch = master
|
||||||
|
[submodule "SideStore/em_proxy"]
|
||||||
|
path = SideStore/em_proxy
|
||||||
|
url = https://github.com/SideStore/em_proxy
|
||||||
|
branch = master
|
||||||
[submodule "SideStore/libfragmentzip"]
|
[submodule "SideStore/libfragmentzip"]
|
||||||
path = SideStore/libfragmentzip
|
path = SideStore/libfragmentzip
|
||||||
url = https://github.com/SideStore/libfragmentzip
|
url = https://github.com/SideStore/libfragmentzip
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<dict>
|
<dict>
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>group.$(APP_GROUP_IDENTIFIER)</string>
|
<string>group.$(GROUP_ID)</string>
|
||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 60;
|
objectVersion = 70;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
@@ -37,6 +37,8 @@
|
|||||||
0EA1667E2ADFE140003015C1 /* time64.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664C2ADFE0D1003015C1 /* time64.c */; };
|
0EA1667E2ADFE140003015C1 /* time64.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1664C2ADFE0D1003015C1 /* time64.c */; };
|
||||||
0EA4263A2C2230150026D7FB /* AnisetteServerList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA426392C2230150026D7FB /* AnisetteServerList.swift */; };
|
0EA4263A2C2230150026D7FB /* AnisetteServerList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA426392C2230150026D7FB /* AnisetteServerList.swift */; };
|
||||||
0EA4B9BC2AE4A414009209CE /* plist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4B9BB2AE4A3F6009209CE /* plist.c */; };
|
0EA4B9BC2AE4A414009209CE /* plist.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EA4B9BB2AE4A3F6009209CE /* plist.c */; };
|
||||||
|
0ED4AECB2E6DDDB50039E2C0 /* ImportedAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED4AECA2E6DDDAE0039E2C0 /* ImportedAccount.swift */; };
|
||||||
|
0ED4AECD2E6DF17B0039E2C0 /* AltStoreFree.entitlements in Resources */ = {isa = PBXBuildFile; fileRef = 0ED4AECC2E6DF17B0039E2C0 /* AltStoreFree.entitlements */; };
|
||||||
0EE7FDC42BE8BC7900D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; };
|
0EE7FDC42BE8BC7900D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; };
|
||||||
0EE7FDC62BE8CEA300D1E390 /* 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 */; };
|
0EE7FDC72BE8CF4100D1E390 /* ALTWrappedError.m in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */; };
|
||||||
@@ -45,9 +47,7 @@
|
|||||||
0EE7FDCB2BE8D12B00D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; };
|
0EE7FDCB2BE8D12B00D1E390 /* ALTLocalizedError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */; };
|
||||||
0EE7FDCD2BE9124400D1E390 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */; };
|
0EE7FDCD2BE9124400D1E390 /* ErrorDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */; };
|
||||||
19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */; };
|
19B9B7452845E6DF0076EF69 /* SelectTeamViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */; };
|
||||||
551A15E55999499418AC1022 /* Pods_AltStoreCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 707E746318F0B6F1A44935D3 /* Pods_AltStoreCore.framework */; };
|
|
||||||
A800F7042CE28E3800208744 /* View+AltWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A800F7032CE28E2F00208744 /* View+AltWidget.swift */; };
|
A800F7042CE28E3800208744 /* View+AltWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A800F7032CE28E2F00208744 /* View+AltWidget.swift */; };
|
||||||
A805C3CD2D0C316A00E76BDD /* Pods_SideStore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A805C3CC2D0C316A00E76BDD /* Pods_SideStore.framework */; };
|
|
||||||
A8087E752D2D2958002DB21B /* ImportExport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8087E742D2D2958002DB21B /* ImportExport.swift */; };
|
A8087E752D2D2958002DB21B /* ImportExport.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8087E742D2D2958002DB21B /* ImportExport.swift */; };
|
||||||
A8096D182D30AD4F000C39C6 /* WidgetUpdateIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8096D172D30AD4F000C39C6 /* WidgetUpdateIntent.swift */; };
|
A8096D182D30AD4F000C39C6 /* WidgetUpdateIntent.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8096D172D30AD4F000C39C6 /* WidgetUpdateIntent.swift */; };
|
||||||
A8096D1C2D30ADA9000C39C6 /* ActiveAppsTimelineProvider+Simulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8096D1B2D30ADA9000C39C6 /* ActiveAppsTimelineProvider+Simulator.swift */; };
|
A8096D1C2D30ADA9000C39C6 /* ActiveAppsTimelineProvider+Simulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8096D1B2D30ADA9000C39C6 /* ActiveAppsTimelineProvider+Simulator.swift */; };
|
||||||
@@ -82,6 +82,12 @@
|
|||||||
A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = A82067C32D03E0DE00645C0D /* SemanticVersion */; };
|
A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */ = {isa = PBXBuildFile; productRef = A82067C32D03E0DE00645C0D /* SemanticVersion */; };
|
||||||
A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
A8228B5B2D6E2C0C00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
||||||
A8228B5D2D6E361F00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
A8228B5D2D6E361F00F7CE0E /* (null) in Sources */ = {isa = PBXBuildFile; };
|
||||||
|
A83FE3672EC90482005ACE9A /* Starscream in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE3662EC90482005ACE9A /* Starscream */; };
|
||||||
|
A83FE36A2EC904FD005ACE9A /* AppCenterAnalytics in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE3692EC904FD005ACE9A /* AppCenterAnalytics */; };
|
||||||
|
A83FE36C2EC904FD005ACE9A /* AppCenterCrashes in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE36B2EC904FD005ACE9A /* AppCenterCrashes */; };
|
||||||
|
A83FE3772EC905E3005ACE9A /* KeychainAccess in Frameworks */ = {isa = PBXBuildFile; productRef = A83FE3762EC905E3005ACE9A /* KeychainAccess */; };
|
||||||
|
A83FE3CF2EC9219C005ACE9A /* libem_proxy_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A83FE3CE2EC9219C005ACE9A /* libem_proxy_static.a */; };
|
||||||
|
A83FE3D42EC92495005ACE9A /* libEmotionalDamage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A83FE3CD2EC9217F005ACE9A /* libEmotionalDamage.a */; };
|
||||||
A859ED5C2D1EE827003DCC58 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; };
|
A859ED5C2D1EE827003DCC58 /* OpenSSL.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; };
|
||||||
A859ED5D2D1EE827003DCC58 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
A859ED5D2D1EE827003DCC58 /* OpenSSL.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
A86315DF2D3EB2DE0048FA40 /* ErrorProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */; };
|
A86315DF2D3EB2DE0048FA40 /* ErrorProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86315DE2D3EB2D80048FA40 /* ErrorProcessing.swift */; };
|
||||||
@@ -99,6 +105,7 @@
|
|||||||
A8B645FF2D70C1AD00125819 /* MarkdownKit in Frameworks */ = {isa = PBXBuildFile; productRef = A8B645FE2D70C1AD00125819 /* MarkdownKit */; };
|
A8B645FF2D70C1AD00125819 /* MarkdownKit in Frameworks */ = {isa = PBXBuildFile; productRef = A8B645FE2D70C1AD00125819 /* MarkdownKit */; };
|
||||||
A8B646012D70C23E00125819 /* MarkdownKit in Frameworks */ = {isa = PBXBuildFile; productRef = A8B646002D70C23E00125819 /* MarkdownKit */; };
|
A8B646012D70C23E00125819 /* MarkdownKit in Frameworks */ = {isa = PBXBuildFile; productRef = A8B646002D70C23E00125819 /* MarkdownKit */; };
|
||||||
A8BB34E52D04EC8E000A8B4D /* minimuxer-helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A809F6A52D04DA1900F0F0F3 /* minimuxer-helpers.swift */; };
|
A8BB34E52D04EC8E000A8B4D /* minimuxer-helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A809F6A52D04DA1900F0F0F3 /* minimuxer-helpers.swift */; };
|
||||||
|
A8C2260E2EC9039A00047C0D /* Nuke in Frameworks */ = {isa = PBXBuildFile; productRef = A8C2260D2EC9039A00047C0D /* Nuke */; };
|
||||||
A8C38C242D206A3A00E83DBD /* ConsoleLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C38C1D2D206A3A00E83DBD /* ConsoleLogger.swift */; };
|
A8C38C242D206A3A00E83DBD /* ConsoleLogger.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C38C1D2D206A3A00E83DBD /* ConsoleLogger.swift */; };
|
||||||
A8C38C262D206A3A00E83DBD /* ConsoleLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C38C1E2D206A3A00E83DBD /* ConsoleLog.swift */; };
|
A8C38C262D206A3A00E83DBD /* ConsoleLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C38C1E2D206A3A00E83DBD /* ConsoleLog.swift */; };
|
||||||
A8C38C2A2D206AC100E83DBD /* OutputStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C38C282D206AC100E83DBD /* OutputStream.swift */; };
|
A8C38C2A2D206AC100E83DBD /* OutputStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C38C282D206AC100E83DBD /* OutputStream.swift */; };
|
||||||
@@ -447,6 +454,13 @@
|
|||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
0ED4AEC82E6DDB2A0039E2C0 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = BF58047A246A28F7008AE704;
|
||||||
|
remoteInfo = AltBackup;
|
||||||
|
};
|
||||||
191E5FB2290A5D9B001A3B7C /* PBXContainerItemProxy */ = {
|
191E5FB2290A5D9B001A3B7C /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
@@ -468,6 +482,27 @@
|
|||||||
remoteGlobalIDString = CA609C732349A560B9642892;
|
remoteGlobalIDString = CA609C732349A560B9642892;
|
||||||
remoteInfo = "minimuxer-staticlib";
|
remoteInfo = "minimuxer-staticlib";
|
||||||
};
|
};
|
||||||
|
A83FE3D52EC92495005ACE9A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = A83FE3C22EC9217F005ACE9A;
|
||||||
|
remoteInfo = EmotionalDamage;
|
||||||
|
};
|
||||||
|
A83FE40C2EC93DCD005ACE9A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A83FE3A32EC91F35005ACE9A /* em_proxy.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = CA60C44C93D7916DE57E6EBD;
|
||||||
|
remoteInfo = "em_proxy-staticlib";
|
||||||
|
};
|
||||||
|
A83FE40E2EC93DCD005ACE9A /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = A83FE3A32EC91F35005ACE9A /* em_proxy.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = CA60058A9FBE4D17AF51A7D5;
|
||||||
|
remoteInfo = "run-bin";
|
||||||
|
};
|
||||||
A8A543282D04F0C100D72399 /* PBXContainerItemProxy */ = {
|
A8A543282D04F0C100D72399 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */;
|
containerPortal = B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */;
|
||||||
@@ -496,13 +531,6 @@
|
|||||||
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
|
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
|
||||||
remoteInfo = "fragmentzip-iOS";
|
remoteInfo = "fragmentzip-iOS";
|
||||||
};
|
};
|
||||||
A8E00D3D2D0C95B5000DD2C7 /* PBXContainerItemProxy */ = {
|
|
||||||
isa = PBXContainerItemProxy;
|
|
||||||
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
|
||||||
proxyType = 1;
|
|
||||||
remoteGlobalIDString = BF58047A246A28F7008AE704;
|
|
||||||
remoteInfo = AltBackup;
|
|
||||||
};
|
|
||||||
A8E2DB272D684CBD009E5D31 /* PBXContainerItemProxy */ = {
|
A8E2DB272D684CBD009E5D31 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
containerPortal = BFD247622284B9A500981D42 /* Project object */;
|
||||||
@@ -585,6 +613,7 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
0E05025B2BEC947000879B5C /* String+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SideStore.swift"; sourceTree = "<group>"; };
|
0E05025B2BEC947000879B5C /* String+SideStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+SideStore.swift"; sourceTree = "<group>"; };
|
||||||
0E1A1F902AE36A9600364CAD /* bytearray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bytearray.c; path = src/bytearray.c; sourceTree = "<group>"; };
|
0E1A1F902AE36A9600364CAD /* bytearray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = bytearray.c; path = src/bytearray.c; sourceTree = "<group>"; };
|
||||||
|
0E214ADD2E6DD75200B3D63D /* SideStoreDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = SideStoreDebug.entitlements; sourceTree = "<group>"; };
|
||||||
0EA166412ADFE0D1003015C1 /* jplist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jplist.c; path = Dependencies/libplist/src/jplist.c; 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; };
|
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; };
|
0EA166432ADFE0D1003015C1 /* Data.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = Data.cpp; path = Dependencies/libplist/src/Data.cpp; sourceTree = SOURCE_ROOT; };
|
||||||
@@ -620,18 +649,17 @@
|
|||||||
0EA166672ADFE122003015C1 /* strbuf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = strbuf.h; path = Dependencies/libplist/src/strbuf.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 = "<group>"; };
|
0EA426392C2230150026D7FB /* AnisetteServerList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnisetteServerList.swift; sourceTree = "<group>"; };
|
||||||
0EA4B9BB2AE4A3F6009209CE /* plist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = plist.c; path = Dependencies/libplist/src/plist.c; sourceTree = SOURCE_ROOT; };
|
0EA4B9BB2AE4A3F6009209CE /* plist.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = plist.c; path = Dependencies/libplist/src/plist.c; sourceTree = SOURCE_ROOT; };
|
||||||
|
0ED4AEBC2E6DD9CE0039E2C0 /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
0ED4AEC22E6DD9FC0039E2C0 /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
0ED4AECA2E6DDDAE0039E2C0 /* ImportedAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportedAccount.swift; sourceTree = "<group>"; };
|
||||||
|
0ED4AECC2E6DF17B0039E2C0 /* AltStoreFree.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AltStoreFree.entitlements; sourceTree = "<group>"; };
|
||||||
0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTWrappedError.m; sourceTree = "<group>"; };
|
0EE7FDC02BE8BC2100D1E390 /* ALTWrappedError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ALTWrappedError.m; sourceTree = "<group>"; };
|
||||||
0EE7FDC22BE8BC4200D1E390 /* ALTWrappedError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTWrappedError.h; sourceTree = "<group>"; };
|
0EE7FDC22BE8BC4200D1E390 /* ALTWrappedError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ALTWrappedError.h; sourceTree = "<group>"; };
|
||||||
0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTLocalizedError.swift; sourceTree = "<group>"; };
|
0EE7FDC32BE8BC7900D1E390 /* ALTLocalizedError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ALTLocalizedError.swift; sourceTree = "<group>"; };
|
||||||
0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = "<group>"; };
|
0EE7FDCC2BE9124400D1E390 /* ErrorDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorDetailsViewController.swift; sourceTree = "<group>"; };
|
||||||
191E5FAB290A5D92001A3B7C /* libminimuxer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
191E5FAB290A5D92001A3B7C /* libminimuxer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = "<group>"; };
|
19B9B7442845E6DF0076EF69 /* SelectTeamViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectTeamViewController.swift; sourceTree = "<group>"; };
|
||||||
32741831F952989EC7E74FFA /* Pods-SideStore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideStore.debug.xcconfig"; path = "Target Support Files/Pods-SideStore/Pods-SideStore.debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
37C39DA99ADEE21E3BDD056F /* Pods-AltStoreCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStoreCore.debug.xcconfig"; path = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
707E746318F0B6F1A44935D3 /* Pods_AltStoreCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AltStoreCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
7935E4499B2FC11DA8BAB2CC /* Pods-AltStoreCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AltStoreCore.release.xcconfig"; path = "Target Support Files/Pods-AltStoreCore/Pods-AltStoreCore.release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
A800F7032CE28E2F00208744 /* View+AltWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+AltWidget.swift"; sourceTree = "<group>"; };
|
A800F7032CE28E2F00208744 /* View+AltWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+AltWidget.swift"; sourceTree = "<group>"; };
|
||||||
A805C3CC2D0C316A00E76BDD /* Pods_SideStore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Pods_SideStore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A8087E742D2D2958002DB21B /* ImportExport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportExport.swift; sourceTree = "<group>"; };
|
A8087E742D2D2958002DB21B /* ImportExport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportExport.swift; sourceTree = "<group>"; };
|
||||||
A8096D172D30AD4F000C39C6 /* WidgetUpdateIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetUpdateIntent.swift; sourceTree = "<group>"; };
|
A8096D172D30AD4F000C39C6 /* WidgetUpdateIntent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WidgetUpdateIntent.swift; sourceTree = "<group>"; };
|
||||||
A8096D1B2D30ADA9000C39C6 /* ActiveAppsTimelineProvider+Simulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActiveAppsTimelineProvider+Simulator.swift"; sourceTree = "<group>"; };
|
A8096D1B2D30ADA9000C39C6 /* ActiveAppsTimelineProvider+Simulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ActiveAppsTimelineProvider+Simulator.swift"; sourceTree = "<group>"; };
|
||||||
@@ -663,6 +691,10 @@
|
|||||||
A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 17_1.xcdatamodel"; sourceTree = "<group>"; };
|
A81BF9E12D84C9E900768940 /* AltStore 17_1.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 17_1.xcdatamodel"; sourceTree = "<group>"; };
|
||||||
A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermission17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
A81BF9E22D84CB0C00768940 /* AppPermission17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppPermission17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
A81BF9E32D84CB0C00768940 /* Source17To17_1MigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Source17To17_1MigrationPolicy.swift; sourceTree = "<group>"; };
|
||||||
|
A83FE3A32EC91F35005ACE9A /* em_proxy.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = em_proxy.xcodeproj; sourceTree = "<group>"; };
|
||||||
|
A83FE3CD2EC9217F005ACE9A /* libEmotionalDamage.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libEmotionalDamage.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
A83FE3CE2EC9219C005ACE9A /* libem_proxy_static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libem_proxy_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
A83FE3D02EC921B2005ACE9A /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.1.sdk/usr/lib/libresolv.tbd; sourceTree = DEVELOPER_DIR; };
|
||||||
A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:67RAULRX93:Marcin Krzyzanowski"; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = SideStore/AltSign/Dependencies/OpenSSL/Frameworks/OpenSSL.xcframework; sourceTree = "<group>"; };
|
A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */ = {isa = PBXFileReference; expectedSignature = "AppleDeveloperProgram:67RAULRX93:Marcin Krzyzanowski"; lastKnownFileType = wrapper.xcframework; name = OpenSSL.xcframework; path = SideStore/AltSign/Dependencies/OpenSSL/Frameworks/OpenSSL.xcframework; sourceTree = "<group>"; };
|
||||||
A85ACB8E2D1F31C400AA3DE7 /* AltBackup.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltBackup.xcconfig; sourceTree = "<group>"; };
|
A85ACB8E2D1F31C400AA3DE7 /* AltBackup.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltBackup.xcconfig; sourceTree = "<group>"; };
|
||||||
A85ACB8F2D1F31C400AA3DE7 /* AltStore.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStore.debug.xcconfig; sourceTree = "<group>"; };
|
A85ACB8F2D1F31C400AA3DE7 /* AltStore.debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AltStore.debug.xcconfig; sourceTree = "<group>"; };
|
||||||
@@ -964,7 +996,6 @@
|
|||||||
BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTServerError+Conveniences.swift"; sourceTree = "<group>"; };
|
BFF767CB2489AB5C0097E58C /* ALTServerError+Conveniences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ALTServerError+Conveniences.swift"; sourceTree = "<group>"; };
|
||||||
BFF767CD2489ABE90097E58C /* NetworkConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConnection.swift; sourceTree = "<group>"; };
|
BFF767CD2489ABE90097E58C /* NetworkConnection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkConnection.swift; sourceTree = "<group>"; };
|
||||||
BFF7EC4C25081E9300BDE521 /* AltStore 8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 8.xcdatamodel"; sourceTree = "<group>"; };
|
BFF7EC4C25081E9300BDE521 /* AltStore 8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "AltStore 8.xcdatamodel"; sourceTree = "<group>"; };
|
||||||
C0ED2BA78F87A9001A13E715 /* Pods-SideStore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SideStore.release.xcconfig"; path = "Target Support Files/Pods-SideStore/Pods-SideStore.release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceTextFieldCell.swift; sourceTree = "<group>"; };
|
D50107EB2ADF2E1A0069F2A1 /* AddSourceTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddSourceTextFieldCell.swift; sourceTree = "<group>"; };
|
||||||
D5084CCB2B1EA80100C02160 /* FeaturedComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturedComponents.swift; sourceTree = "<group>"; };
|
D5084CCB2B1EA80100C02160 /* FeaturedComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeaturedComponents.swift; sourceTree = "<group>"; };
|
||||||
D5144BA72B8684EF00738A5C /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = "<group>"; };
|
D5144BA72B8684EF00738A5C /* Icons.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icons.xcassets; sourceTree = "<group>"; };
|
||||||
@@ -1060,6 +1091,45 @@
|
|||||||
D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DatabaseManager+Async.swift"; sourceTree = "<group>"; };
|
D5FD4ECA2A9532960097BEE8 /* DatabaseManager+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DatabaseManager+Async.swift"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
A83FE3D22EC9229A005ACE9A /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||||
|
membershipExceptions = (
|
||||||
|
EmotionalDamage.swift,
|
||||||
|
);
|
||||||
|
target = A83FE3C22EC9217F005ACE9A /* EmotionalDamage */;
|
||||||
|
};
|
||||||
|
A83FE3D32EC922F8005ACE9A /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
|
||||||
|
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||||
|
membershipExceptions = (
|
||||||
|
.github/CODEOWNERS,
|
||||||
|
.github/workflows/build.yml,
|
||||||
|
.gitignore,
|
||||||
|
build.rs,
|
||||||
|
Cargo.toml,
|
||||||
|
cbindgen.toml,
|
||||||
|
keys/client_privatekey,
|
||||||
|
keys/client_publickey,
|
||||||
|
keys/emp.conf,
|
||||||
|
keys/README.md,
|
||||||
|
keys/server_privatekey,
|
||||||
|
keys/server_publickey_client,
|
||||||
|
"libem_proxy-ios.a",
|
||||||
|
"libem_proxy-sim.a",
|
||||||
|
LICENSE,
|
||||||
|
README.md,
|
||||||
|
src/lib.rs,
|
||||||
|
src/run.rs,
|
||||||
|
);
|
||||||
|
target = BFD247692284B9A500981D42 /* SideStore */;
|
||||||
|
};
|
||||||
|
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||||
|
|
||||||
|
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||||
|
A83FE3A22EC91F35005ACE9A /* em_proxy */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A83FE3D32EC922F8005ACE9A /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = em_proxy; sourceTree = "<group>"; };
|
||||||
|
A83FE3A52EC91F35005ACE9A /* EmotionalDamage */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A83FE3D22EC9229A005ACE9A /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = EmotionalDamage; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileSystemSynchronizedRootGroup section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
191E5FA8290A5D92001A3B7C /* Frameworks */ = {
|
191E5FA8290A5D92001A3B7C /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
@@ -1083,6 +1153,14 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
A83FE3C82EC9217F005ACE9A /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
A83FE3CF2EC9219C005ACE9A /* libem_proxy_static.a in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
A8E2DB1E2D684CBD009E5D31 /* Frameworks */ = {
|
A8E2DB1E2D684CBD009E5D31 /* Frameworks */ = {
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -1107,8 +1185,8 @@
|
|||||||
A8945AA62D059B6100D86CBE /* Roxas.framework in Frameworks */,
|
A8945AA62D059B6100D86CBE /* Roxas.framework in Frameworks */,
|
||||||
A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */,
|
A82067C42D03E0DE00645C0D /* SemanticVersion in Frameworks */,
|
||||||
A859ED5C2D1EE827003DCC58 /* OpenSSL.xcframework in Frameworks */,
|
A859ED5C2D1EE827003DCC58 /* OpenSSL.xcframework in Frameworks */,
|
||||||
551A15E55999499418AC1022 /* Pods_AltStoreCore.framework in Frameworks */,
|
|
||||||
A8C6D50C2D1EE87600DF01F1 /* AltSign-Static in Frameworks */,
|
A8C6D50C2D1EE87600DF01F1 /* AltSign-Static in Frameworks */,
|
||||||
|
A83FE3772EC905E3005ACE9A /* KeychainAccess in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -1125,15 +1203,19 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
A8C6D5172D1EE95B00DF01F1 /* OpenSSL.xcframework in Frameworks */,
|
A8C6D5172D1EE95B00DF01F1 /* OpenSSL.xcframework in Frameworks */,
|
||||||
|
A83FE3D42EC92495005ACE9A /* libEmotionalDamage.a in Frameworks */,
|
||||||
|
A83FE36C2EC904FD005ACE9A /* AppCenterCrashes in Frameworks */,
|
||||||
A8A543302D04F14400D72399 /* libfragmentzip.a in Frameworks */,
|
A8A543302D04F14400D72399 /* libfragmentzip.a in Frameworks */,
|
||||||
A8B646012D70C23E00125819 /* MarkdownKit in Frameworks */,
|
A8B646012D70C23E00125819 /* MarkdownKit in Frameworks */,
|
||||||
A805C3CD2D0C316A00E76BDD /* Pods_SideStore.framework in Frameworks */,
|
A8C2260E2EC9039A00047C0D /* Nuke in Frameworks */,
|
||||||
A8F838942D048ECE00ED425D /* libimobiledevice.a in Frameworks */,
|
A8F838942D048ECE00ED425D /* libimobiledevice.a in Frameworks */,
|
||||||
A8F838932D048E8F00ED425D /* libminimuxer.a in Frameworks */,
|
A8F838932D048E8F00ED425D /* libminimuxer.a in Frameworks */,
|
||||||
D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */,
|
D533E8B72727841800A9B5DD /* libAppleArchive.tbd in Frameworks */,
|
||||||
|
A83FE36A2EC904FD005ACE9A /* AppCenterAnalytics in Frameworks */,
|
||||||
D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */,
|
D533E8BE2727BBF800A9B5DD /* libcurl.a in Frameworks */,
|
||||||
BF1614F1250822F100767AEA /* Roxas.framework in Frameworks */,
|
BF1614F1250822F100767AEA /* Roxas.framework in Frameworks */,
|
||||||
A8B645FF2D70C1AD00125819 /* MarkdownKit in Frameworks */,
|
A8B645FF2D70C1AD00125819 /* MarkdownKit in Frameworks */,
|
||||||
|
A83FE3672EC90482005ACE9A /* Starscream in Frameworks */,
|
||||||
BF66EE852501AE50007EE018 /* AltStoreCore.framework in Frameworks */,
|
BF66EE852501AE50007EE018 /* AltStoreCore.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -1242,6 +1324,15 @@
|
|||||||
path = datastructures;
|
path = datastructures;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
A83FE4082EC93DCD005ACE9A /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
A83FE40D2EC93DCD005ACE9A /* libem_proxy_static.a */,
|
||||||
|
A83FE40F2EC93DCD005ACE9A /* run */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
A85ACB942D1F31C400AA3DE7 /* xcconfigs */ = {
|
A85ACB942D1F31C400AA3DE7 /* xcconfigs */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1448,8 +1539,12 @@
|
|||||||
A8F66C072D04C025009689E6 /* SideStore */ = {
|
A8F66C072D04C025009689E6 /* SideStore */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
0E214ADD2E6DD75200B3D63D /* SideStoreDebug.entitlements */,
|
||||||
A8B645F82D70C0DD00125819 /* Views */,
|
A8B645F82D70C0DD00125819 /* Views */,
|
||||||
A8E2DB352D6850A9009E5D31 /* Tests */,
|
A8E2DB352D6850A9009E5D31 /* Tests */,
|
||||||
|
A83FE3A22EC91F35005ACE9A /* em_proxy */,
|
||||||
|
A83FE3A32EC91F35005ACE9A /* em_proxy.xcodeproj */,
|
||||||
|
A83FE3A52EC91F35005ACE9A /* EmotionalDamage */,
|
||||||
A8F66C5C2D04D433009689E6 /* minimuxer */,
|
A8F66C5C2D04D433009689E6 /* minimuxer */,
|
||||||
A8F66C602D04D464009689E6 /* minimuxer.xcodeproj */,
|
A8F66C602D04D464009689E6 /* minimuxer.xcodeproj */,
|
||||||
B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */,
|
B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */,
|
||||||
@@ -1515,6 +1610,7 @@
|
|||||||
BF3D648922E79A7700E9056B /* Types */ = {
|
BF3D648922E79A7700E9056B /* Types */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
0ED4AECA2E6DDDAE0039E2C0 /* ImportedAccount.swift */,
|
||||||
A8FD917A2D0472DD00322782 /* DeprecatedAPIs.swift */,
|
A8FD917A2D0472DD00322782 /* DeprecatedAPIs.swift */,
|
||||||
BF41B807233433C100C593A3 /* LoadingState.swift */,
|
BF41B807233433C100C593A3 /* LoadingState.swift */,
|
||||||
);
|
);
|
||||||
@@ -1988,7 +2084,6 @@
|
|||||||
D586D39928EF58B0000E101F /* AltTests */,
|
D586D39928EF58B0000E101F /* AltTests */,
|
||||||
BFD247852284BB3300981D42 /* Frameworks */,
|
BFD247852284BB3300981D42 /* Frameworks */,
|
||||||
BFD2476B2284B9A500981D42 /* Products */,
|
BFD2476B2284B9A500981D42 /* Products */,
|
||||||
C2B79346E83FCBDE76D501CB /* Pods */,
|
|
||||||
A85ACB942D1F31C400AA3DE7 /* xcconfigs */,
|
A85ACB942D1F31C400AA3DE7 /* xcconfigs */,
|
||||||
B3C39607284F4C8400DA9E2F /* Build.xcconfig */,
|
B3C39607284F4C8400DA9E2F /* Build.xcconfig */,
|
||||||
B3C39606284F4C8400DA9E2F /* CodeSigning.xcconfig */,
|
B3C39606284F4C8400DA9E2F /* CodeSigning.xcconfig */,
|
||||||
@@ -2008,6 +2103,7 @@
|
|||||||
D586D39828EF58B0000E101F /* AltTests.xctest */,
|
D586D39828EF58B0000E101F /* AltTests.xctest */,
|
||||||
A8E2DB212D684CBD009E5D31 /* UITests.xctest */,
|
A8E2DB212D684CBD009E5D31 /* UITests.xctest */,
|
||||||
A81A8CC52D68BA610086C96F /* DataStructureTests.xctest */,
|
A81A8CC52D68BA610086C96F /* DataStructureTests.xctest */,
|
||||||
|
A83FE3CD2EC9217F005ACE9A /* libEmotionalDamage.a */,
|
||||||
);
|
);
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2017,6 +2113,7 @@
|
|||||||
children = (
|
children = (
|
||||||
B39F16112918D7B5002E9404 /* Consts */,
|
B39F16112918D7B5002E9404 /* Consts */,
|
||||||
BF219A7E22CAC431007676A6 /* AltStore.entitlements */,
|
BF219A7E22CAC431007676A6 /* AltStore.entitlements */,
|
||||||
|
0ED4AECC2E6DF17B0039E2C0 /* AltStoreFree.entitlements */,
|
||||||
BFD2476D2284B9A500981D42 /* AppDelegate.swift */,
|
BFD2476D2284B9A500981D42 /* AppDelegate.swift */,
|
||||||
BF4B78FD24B3D1DB008AB4AC /* SceneDelegate.swift */,
|
BF4B78FD24B3D1DB008AB4AC /* SceneDelegate.swift */,
|
||||||
BFD247732284B9A500981D42 /* Main.storyboard */,
|
BFD247732284B9A500981D42 /* Main.storyboard */,
|
||||||
@@ -2049,14 +2146,16 @@
|
|||||||
BFD247852284BB3300981D42 /* Frameworks */ = {
|
BFD247852284BB3300981D42 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
A83FE3D02EC921B2005ACE9A /* libresolv.tbd */,
|
||||||
|
A83FE3CE2EC9219C005ACE9A /* libem_proxy_static.a */,
|
||||||
|
0ED4AEC22E6DD9FC0039E2C0 /* KeychainAccess.framework */,
|
||||||
|
0ED4AEBC2E6DD9CE0039E2C0 /* KeychainAccess.framework */,
|
||||||
A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */,
|
A859ED5B2D1EE80D003DCC58 /* OpenSSL.xcframework */,
|
||||||
B343F86C295F759E002B1159 /* libresolv.tbd */,
|
B343F86C295F759E002B1159 /* libresolv.tbd */,
|
||||||
D533E8B62727841800A9B5DD /* libAppleArchive.tbd */,
|
D533E8B62727841800A9B5DD /* libAppleArchive.tbd */,
|
||||||
BF580497246A3D19008AE704 /* UIKit.framework */,
|
BF580497246A3D19008AE704 /* UIKit.framework */,
|
||||||
BFD247862284BB3B00981D42 /* Roxas.framework */,
|
BFD247862284BB3B00981D42 /* Roxas.framework */,
|
||||||
A805C3CC2D0C316A00E76BDD /* Pods_SideStore.framework */,
|
|
||||||
A8945AA52D059B6100D86CBE /* Roxas.framework */,
|
A8945AA52D059B6100D86CBE /* Roxas.framework */,
|
||||||
707E746318F0B6F1A44935D3 /* Pods_AltStoreCore.framework */,
|
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -2247,17 +2346,6 @@
|
|||||||
path = Connections;
|
path = Connections;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
C2B79346E83FCBDE76D501CB /* Pods */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
37C39DA99ADEE21E3BDD056F /* Pods-AltStoreCore.debug.xcconfig */,
|
|
||||||
7935E4499B2FC11DA8BAB2CC /* Pods-AltStoreCore.release.xcconfig */,
|
|
||||||
32741831F952989EC7E74FFA /* Pods-SideStore.debug.xcconfig */,
|
|
||||||
C0ED2BA78F87A9001A13E715 /* Pods-SideStore.release.xcconfig */,
|
|
||||||
);
|
|
||||||
path = Pods;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
D50107ED2ADF2E310069F2A1 /* Components */ = {
|
D50107ED2ADF2E310069F2A1 /* Components */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -2485,12 +2573,26 @@
|
|||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = DataStructureTests;
|
name = DataStructureTests;
|
||||||
packageProductDependencies = (
|
|
||||||
);
|
|
||||||
productName = DataStructuresTests;
|
productName = DataStructuresTests;
|
||||||
productReference = A81A8CC52D68BA610086C96F /* DataStructureTests.xctest */;
|
productReference = A81A8CC52D68BA610086C96F /* DataStructureTests.xctest */;
|
||||||
productType = "com.apple.product-type.bundle.unit-test";
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
};
|
};
|
||||||
|
A83FE3C22EC9217F005ACE9A /* EmotionalDamage */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = A83FE3CA2EC9217F005ACE9A /* Build configuration list for PBXNativeTarget "EmotionalDamage" */;
|
||||||
|
buildPhases = (
|
||||||
|
A83FE3C52EC9217F005ACE9A /* Sources */,
|
||||||
|
A83FE3C82EC9217F005ACE9A /* Frameworks */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = EmotionalDamage;
|
||||||
|
productName = minimuxer;
|
||||||
|
productReference = A83FE3CD2EC9217F005ACE9A /* libEmotionalDamage.a */;
|
||||||
|
productType = "com.apple.product-type.library.static";
|
||||||
|
};
|
||||||
A8E2DB202D684CBD009E5D31 /* UITests */ = {
|
A8E2DB202D684CBD009E5D31 /* UITests */ = {
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = A8E2DB292D684CBD009E5D31 /* Build configuration list for PBXNativeTarget "UITests" */;
|
buildConfigurationList = A8E2DB292D684CBD009E5D31 /* Build configuration list for PBXNativeTarget "UITests" */;
|
||||||
@@ -2505,8 +2607,6 @@
|
|||||||
A8E2DB282D684CBD009E5D31 /* PBXTargetDependency */,
|
A8E2DB282D684CBD009E5D31 /* PBXTargetDependency */,
|
||||||
);
|
);
|
||||||
name = UITests;
|
name = UITests;
|
||||||
packageProductDependencies = (
|
|
||||||
);
|
|
||||||
productName = UITests;
|
productName = UITests;
|
||||||
productReference = A8E2DB212D684CBD009E5D31 /* UITests.xctest */;
|
productReference = A8E2DB212D684CBD009E5D31 /* UITests.xctest */;
|
||||||
productType = "com.apple.product-type.bundle.ui-testing";
|
productType = "com.apple.product-type.bundle.ui-testing";
|
||||||
@@ -2550,7 +2650,6 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = BF66EE892501AE50007EE018 /* Build configuration list for PBXNativeTarget "AltStoreCore" */;
|
buildConfigurationList = BF66EE892501AE50007EE018 /* Build configuration list for PBXNativeTarget "AltStoreCore" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
AEDB4E9409D2CEE1EA126980 /* [CP] Check Pods Manifest.lock */,
|
|
||||||
BF66EE792501AE50007EE018 /* Headers */,
|
BF66EE792501AE50007EE018 /* Headers */,
|
||||||
BF66EE7A2501AE50007EE018 /* Sources */,
|
BF66EE7A2501AE50007EE018 /* Sources */,
|
||||||
BF66EE7B2501AE50007EE018 /* Frameworks */,
|
BF66EE7B2501AE50007EE018 /* Frameworks */,
|
||||||
@@ -2565,6 +2664,7 @@
|
|||||||
packageProductDependencies = (
|
packageProductDependencies = (
|
||||||
A82067C32D03E0DE00645C0D /* SemanticVersion */,
|
A82067C32D03E0DE00645C0D /* SemanticVersion */,
|
||||||
A8C6D50B2D1EE87600DF01F1 /* AltSign-Static */,
|
A8C6D50B2D1EE87600DF01F1 /* AltSign-Static */,
|
||||||
|
A83FE3762EC905E3005ACE9A /* KeychainAccess */,
|
||||||
);
|
);
|
||||||
productName = AltStoreCore;
|
productName = AltStoreCore;
|
||||||
productReference = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */;
|
productReference = BF66EE7E2501AE50007EE018 /* AltStoreCore.framework */;
|
||||||
@@ -2592,7 +2692,6 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = BFD2477E2284B9A700981D42 /* Build configuration list for PBXNativeTarget "SideStore" */;
|
buildConfigurationList = BFD2477E2284B9A700981D42 /* Build configuration list for PBXNativeTarget "SideStore" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
B0FAA6617CB97872E78D84CA /* [CP] Check Pods Manifest.lock */,
|
|
||||||
99F87D0629D8B51400B40039 /* ShellScript */,
|
99F87D0629D8B51400B40039 /* ShellScript */,
|
||||||
BFD247662284B9A500981D42 /* Sources */,
|
BFD247662284B9A500981D42 /* Sources */,
|
||||||
BFD247672284B9A500981D42 /* Frameworks */,
|
BFD247672284B9A500981D42 /* Frameworks */,
|
||||||
@@ -2600,15 +2699,19 @@
|
|||||||
BFD247682284B9A500981D42 /* Resources */,
|
BFD247682284B9A500981D42 /* Resources */,
|
||||||
BF088D2B2501A087008082D9 /* Embed Frameworks */,
|
BF088D2B2501A087008082D9 /* Embed Frameworks */,
|
||||||
BF98917B250AABF4002ACF50 /* Embed Foundation Extensions */,
|
BF98917B250AABF4002ACF50 /* Embed Foundation Extensions */,
|
||||||
884B4E831D26F2E18AF7916C /* [CP] Copy Pods Resources */,
|
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
A8E00D3E2D0C95B5000DD2C7 /* PBXTargetDependency */,
|
0ED4AEC92E6DDB2A0039E2C0 /* PBXTargetDependency */,
|
||||||
191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */,
|
191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */,
|
||||||
BF66EE842501AE50007EE018 /* PBXTargetDependency */,
|
BF66EE842501AE50007EE018 /* PBXTargetDependency */,
|
||||||
BF989176250AABF4002ACF50 /* PBXTargetDependency */,
|
BF989176250AABF4002ACF50 /* PBXTargetDependency */,
|
||||||
|
A83FE3D62EC92495005ACE9A /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
fileSystemSynchronizedGroups = (
|
||||||
|
A83FE3A22EC91F35005ACE9A /* em_proxy */,
|
||||||
|
A83FE3A52EC91F35005ACE9A /* EmotionalDamage */,
|
||||||
);
|
);
|
||||||
name = SideStore;
|
name = SideStore;
|
||||||
productName = AltStore;
|
productName = AltStore;
|
||||||
@@ -2676,10 +2779,18 @@
|
|||||||
D5FB7A2C2AA2859400EF863D /* XCRemoteSwiftPackageReference "swift-argument-parser" */,
|
D5FB7A2C2AA2859400EF863D /* XCRemoteSwiftPackageReference "swift-argument-parser" */,
|
||||||
A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */,
|
A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */,
|
||||||
A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */,
|
A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */,
|
||||||
|
A8C2260C2EC9039A00047C0D /* XCRemoteSwiftPackageReference "Nuke" */,
|
||||||
|
A83FE3652EC90482005ACE9A /* XCRemoteSwiftPackageReference "Starscream" */,
|
||||||
|
A83FE3682EC904FD005ACE9A /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */,
|
||||||
|
A83FE36D2EC90512005ACE9A /* XCRemoteSwiftPackageReference "KeychainAccess" */,
|
||||||
);
|
);
|
||||||
productRefGroup = BFD2476B2284B9A500981D42 /* Products */;
|
productRefGroup = BFD2476B2284B9A500981D42 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectReferences = (
|
projectReferences = (
|
||||||
|
{
|
||||||
|
ProductGroup = A83FE4082EC93DCD005ACE9A /* Products */;
|
||||||
|
ProjectRef = A83FE3A32EC91F35005ACE9A /* em_proxy.xcodeproj */;
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ProductGroup = A8A543222D04F0C100D72399 /* Products */;
|
ProductGroup = A8A543222D04F0C100D72399 /* Products */;
|
||||||
ProjectRef = B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */;
|
ProjectRef = B343F886295F7F9B002B1159 /* libfragmentzip.xcodeproj */;
|
||||||
@@ -2699,6 +2810,7 @@
|
|||||||
191E5FAA290A5D92001A3B7C /* minimuxer */,
|
191E5FAA290A5D92001A3B7C /* minimuxer */,
|
||||||
A8E2DB202D684CBD009E5D31 /* UITests */,
|
A8E2DB202D684CBD009E5D31 /* UITests */,
|
||||||
A81A8CC42D68BA610086C96F /* DataStructureTests */,
|
A81A8CC42D68BA610086C96F /* DataStructureTests */,
|
||||||
|
A83FE3C22EC9217F005ACE9A /* EmotionalDamage */,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
/* End PBXProject section */
|
/* End PBXProject section */
|
||||||
@@ -2711,6 +2823,20 @@
|
|||||||
remoteRef = A809F68D2D04D71200F0F0F3 /* PBXContainerItemProxy */;
|
remoteRef = A809F68D2D04D71200F0F0F3 /* PBXContainerItemProxy */;
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
};
|
};
|
||||||
|
A83FE40D2EC93DCD005ACE9A /* libem_proxy_static.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libem_proxy_static.a;
|
||||||
|
remoteRef = A83FE40C2EC93DCD005ACE9A /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
A83FE40F2EC93DCD005ACE9A /* run */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = "compiled.mach-o.executable";
|
||||||
|
path = run;
|
||||||
|
remoteRef = A83FE40E2EC93DCD005ACE9A /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
A8A543292D04F0C100D72399 /* libfragmentzip */ = {
|
A8A543292D04F0C100D72399 /* libfragmentzip */ = {
|
||||||
isa = PBXReferenceProxy;
|
isa = PBXReferenceProxy;
|
||||||
fileType = "compiled.mach-o.executable";
|
fileType = "compiled.mach-o.executable";
|
||||||
@@ -2798,6 +2924,7 @@
|
|||||||
D56D21422B7D9C41007641C5 /* AltIcons.plist in Resources */,
|
D56D21422B7D9C41007641C5 /* AltIcons.plist in Resources */,
|
||||||
A8D484D82D0CD306002C691D /* AltBackup.ipa in Resources */,
|
A8D484D82D0CD306002C691D /* AltBackup.ipa in Resources */,
|
||||||
BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */,
|
BF770E6922BD57DD002A40FE /* Silence.m4a in Resources */,
|
||||||
|
0ED4AECD2E6DF17B0039E2C0 /* AltStoreFree.entitlements in Resources */,
|
||||||
BFD247772284B9A700981D42 /* Assets.xcassets in Resources */,
|
BFD247772284B9A700981D42 /* Assets.xcassets in Resources */,
|
||||||
BFF0B6922321A305007A79E1 /* AboutPatreonHeaderView.xib in Resources */,
|
BFF0B6922321A305007A79E1 /* AboutPatreonHeaderView.xib in Resources */,
|
||||||
BFB6B22423187A3D0022A802 /* NewsCollectionViewCell.xib in Resources */,
|
BFB6B22423187A3D0022A802 /* NewsCollectionViewCell.xib in Resources */,
|
||||||
@@ -2812,23 +2939,6 @@
|
|||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
884B4E831D26F2E18AF7916C /* [CP] Copy Pods Resources */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-SideStore/Pods-SideStore-resources-${CONFIGURATION}-input-files.xcfilelist",
|
|
||||||
);
|
|
||||||
name = "[CP] Copy Pods Resources";
|
|
||||||
outputFileListPaths = (
|
|
||||||
"${PODS_ROOT}/Target Support Files/Pods-SideStore/Pods-SideStore-resources-${CONFIGURATION}-output-files.xcfilelist",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-SideStore/Pods-SideStore-resources.sh\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
99F87D0629D8B51400B40039 /* ShellScript */ = {
|
99F87D0629D8B51400B40039 /* ShellScript */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -2845,7 +2955,7 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "bash ./SideStore/fetch-prebuilt.sh minimuxer\n";
|
shellScript = "bash ./SideStore/fetch-prebuilt.sh minimuxer em_proxy\n";
|
||||||
};
|
};
|
||||||
A8E00D3F2D0C9C6D000DD2C7 /* Run Script */ = {
|
A8E00D3F2D0C9C6D000DD2C7 /* Run Script */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
@@ -2865,50 +2975,6 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "#!/bin/sh\n\necho \"Build directory: $BUILD_DIR\"\necho \"Configuration build directory: $CONFIGURATION_BUILD_DIR\"\n\n# diagnostics\n# echo \">>>>>>>>> Xcode-Derived-Data <<<<<<<<<<\"\n# find \"$BUILD_DIR\" -maxdepth 7 -exec ls -ld {} + || true # List contents if directory exists \n# # ls -la ~/Library/Developer/Xcode/DerivedData || true # List contents if directory exists \n# echo \"\"\n\n# diagnostics\n# exit 0\n\n# Define the path to your Makefile\nMAKEFILE_PATH=\"${PROJECT_DIR}/\"\n\n# Navigate to the directory containing the Makefile\ncd \"$MAKEFILE_PATH\" || exit 1\n\n# Run the make target 'ipa-altbackup'\nmake -B clean-altbackup copy-altbackup ipa-altbackup\n\n# Ensure that the ipa-altbackup process finishes before continuing\nif [ $? -ne 0 ]; then\n echo \"Error: ipa-altbackup failed\"\n exit 1\nelse\n echo \"ipa-altbackup completed successfully\"\nfi\n# Type a script or drag a script file from your workspace to insert its path.\n";
|
shellScript = "#!/bin/sh\n\necho \"Build directory: $BUILD_DIR\"\necho \"Configuration build directory: $CONFIGURATION_BUILD_DIR\"\n\n# diagnostics\n# echo \">>>>>>>>> Xcode-Derived-Data <<<<<<<<<<\"\n# find \"$BUILD_DIR\" -maxdepth 7 -exec ls -ld {} + || true # List contents if directory exists \n# # ls -la ~/Library/Developer/Xcode/DerivedData || true # List contents if directory exists \n# echo \"\"\n\n# diagnostics\n# exit 0\n\n# Define the path to your Makefile\nMAKEFILE_PATH=\"${PROJECT_DIR}/\"\n\n# Navigate to the directory containing the Makefile\ncd \"$MAKEFILE_PATH\" || exit 1\n\n# Run the make target 'ipa-altbackup'\nmake -B clean-altbackup copy-altbackup ipa-altbackup\n\n# Ensure that the ipa-altbackup process finishes before continuing\nif [ $? -ne 0 ]; then\n echo \"Error: ipa-altbackup failed\"\n exit 1\nelse\n echo \"ipa-altbackup completed successfully\"\nfi\n# Type a script or drag a script file from your workspace to insert its path.\n";
|
||||||
};
|
};
|
||||||
AEDB4E9409D2CEE1EA126980 /* [CP] Check Pods Manifest.lock */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
|
||||||
"${PODS_ROOT}/Manifest.lock",
|
|
||||||
);
|
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
"$(DERIVED_FILE_DIR)/Pods-AltStoreCore-checkManifestLockResult.txt",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
B0FAA6617CB97872E78D84CA /* [CP] Check Pods Manifest.lock */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
|
||||||
"${PODS_ROOT}/Manifest.lock",
|
|
||||||
);
|
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
"$(DERIVED_FILE_DIR)/Pods-SideStore-checkManifestLockResult.txt",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
|
||||||
showEnvVarsInLog = 0;
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
@@ -2934,6 +3000,13 @@
|
|||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
A83FE3C52EC9217F005ACE9A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
A8E2DB1D2D684CBD009E5D31 /* Sources */ = {
|
A8E2DB1D2D684CBD009E5D31 /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -3199,6 +3272,7 @@
|
|||||||
D5CD805F29CA755E00E591B0 /* SourceDetailViewController.swift in Sources */,
|
D5CD805F29CA755E00E591B0 /* SourceDetailViewController.swift in Sources */,
|
||||||
D57968CB29CB99EF00539069 /* VibrantButton.swift in Sources */,
|
D57968CB29CB99EF00539069 /* VibrantButton.swift in Sources */,
|
||||||
BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */,
|
BFB6B21E231870160022A802 /* NewsViewController.swift in Sources */,
|
||||||
|
0ED4AECB2E6DDDB50039E2C0 /* ImportedAccount.swift in Sources */,
|
||||||
BFC57A652416C72400EB891E /* DeactivateAppOperation.swift in Sources */,
|
BFC57A652416C72400EB891E /* DeactivateAppOperation.swift in Sources */,
|
||||||
D5CD805D29CA2C1E00E591B0 /* HeaderContentViewController.swift in Sources */,
|
D5CD805D29CA2C1E00E591B0 /* HeaderContentViewController.swift in Sources */,
|
||||||
D5FB28EC2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift in Sources */,
|
D5FB28EC2ADDF68D00A1C337 /* UIFontDescriptor+Bold.swift in Sources */,
|
||||||
@@ -3323,6 +3397,11 @@
|
|||||||
/* End PBXSourcesBuildPhase section */
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXTargetDependency section */
|
/* Begin PBXTargetDependency section */
|
||||||
|
0ED4AEC92E6DDB2A0039E2C0 /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = BF58047A246A28F7008AE704 /* AltBackup */;
|
||||||
|
targetProxy = 0ED4AEC82E6DDB2A0039E2C0 /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */ = {
|
191E5FB3290A5D9B001A3B7C /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = 191E5FAA290A5D92001A3B7C /* minimuxer */;
|
target = 191E5FAA290A5D92001A3B7C /* minimuxer */;
|
||||||
@@ -3333,10 +3412,10 @@
|
|||||||
name = "minimuxer-staticlib";
|
name = "minimuxer-staticlib";
|
||||||
targetProxy = A809F6A02D04D7CB00F0F0F3 /* PBXContainerItemProxy */;
|
targetProxy = A809F6A02D04D7CB00F0F0F3 /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
A8E00D3E2D0C95B5000DD2C7 /* PBXTargetDependency */ = {
|
A83FE3D62EC92495005ACE9A /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
target = BF58047A246A28F7008AE704 /* AltBackup */;
|
target = A83FE3C22EC9217F005ACE9A /* EmotionalDamage */;
|
||||||
targetProxy = A8E00D3D2D0C95B5000DD2C7 /* PBXContainerItemProxy */;
|
targetProxy = A83FE3D52EC92495005ACE9A /* PBXContainerItemProxy */;
|
||||||
};
|
};
|
||||||
A8E2DB282D684CBD009E5D31 /* PBXTargetDependency */ = {
|
A8E2DB282D684CBD009E5D31 /* PBXTargetDependency */ = {
|
||||||
isa = PBXTargetDependency;
|
isa = PBXTargetDependency;
|
||||||
@@ -3458,7 +3537,7 @@
|
|||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 18.2;
|
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
||||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
||||||
@@ -3486,7 +3565,7 @@
|
|||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 18.2;
|
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
||||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
||||||
@@ -3499,6 +3578,64 @@
|
|||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
A83FE3CB2EC9217F005ACE9A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = "$(inherited)";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
|
LD_WARN_DUPLICATE_LIBRARIES = YES;
|
||||||
|
LD_WARN_UNUSED_DYLIBS = YES;
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)/SideStore/em_proxy",
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"-ObjC",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = SideStore/em_proxy/em_proxy.h;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
A83FE3CC2EC9217F005ACE9A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||||
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
|
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = "$(inherited)";
|
||||||
|
CODE_SIGN_STYLE = Automatic;
|
||||||
|
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
|
LD_WARN_DUPLICATE_LIBRARIES = YES;
|
||||||
|
LD_WARN_UNUSED_DYLIBS = YES;
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(PROJECT_DIR)/SideStore/em_proxy",
|
||||||
|
);
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"-ObjC",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_OBJC_BRIDGING_HEADER = SideStore/em_proxy/em_proxy.h;
|
||||||
|
SWIFT_VERSION = 5.0;
|
||||||
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
A8E2DB2A2D684CBD009E5D31 /* Debug */ = {
|
A8E2DB2A2D684CBD009E5D31 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = A8E2DB2C2D684D39009E5D31 /* UITests.xcconfig */;
|
baseConfigurationReference = A8E2DB2C2D684D39009E5D31 /* UITests.xcconfig */;
|
||||||
@@ -3513,7 +3650,7 @@
|
|||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 18.2;
|
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
|
||||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
||||||
@@ -3540,7 +3677,7 @@
|
|||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 18.2;
|
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
|
||||||
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
||||||
@@ -3644,9 +3781,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = AltBackup/AltBackup.entitlements;
|
CODE_SIGN_ENTITLEMENTS = AltBackup/AltBackup.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
|
||||||
ENABLE_DEBUG_DYLIB = NO;
|
ENABLE_DEBUG_DYLIB = NO;
|
||||||
INFOPLIST_FILE = AltBackup/Info.plist;
|
INFOPLIST_FILE = AltBackup/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
@@ -3658,6 +3793,7 @@
|
|||||||
LD_WARN_UNUSED_DYLIBS = YES;
|
LD_WARN_UNUSED_DYLIBS = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
@@ -3669,9 +3805,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = AltBackup/AltBackup.entitlements;
|
CODE_SIGN_ENTITLEMENTS = AltBackup/AltBackup.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEVELOPMENT_TEAM = "$(DEVELOPMENT_TEAM)";
|
|
||||||
ENABLE_DEBUG_DYLIB = NO;
|
ENABLE_DEBUG_DYLIB = NO;
|
||||||
INFOPLIST_FILE = AltBackup/Info.plist;
|
INFOPLIST_FILE = AltBackup/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
|
||||||
@@ -3683,6 +3817,7 @@
|
|||||||
LD_WARN_UNUSED_DYLIBS = YES;
|
LD_WARN_UNUSED_DYLIBS = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
PRODUCT_BUNDLE_IDENTIFIER = "$(PRODUCT_BUNDLE_IDENTIFIER)";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
@@ -3797,6 +3932,7 @@
|
|||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$inherited WIDGET_EXTENSION";
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$inherited WIDGET_EXTENSION";
|
||||||
|
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
@@ -3831,6 +3967,7 @@
|
|||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$inherited WIDGET_EXTENSION";
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$inherited WIDGET_EXTENSION";
|
||||||
|
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
@@ -3872,6 +4009,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
DEVELOPMENT_TEAM = HXY2D2FQXT;
|
||||||
EAGER_LINKING = YES;
|
EAGER_LINKING = YES;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
@@ -3943,6 +4081,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
|
DEVELOPMENT_TEAM = HXY2D2FQXT;
|
||||||
EAGER_LINKING = YES;
|
EAGER_LINKING = YES;
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
@@ -3982,7 +4121,7 @@
|
|||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
ASSETCATALOG_COMPILER_OPTIMIZATION = space;
|
ASSETCATALOG_COMPILER_OPTIMIZATION = space;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = AltStore/AltStore.entitlements;
|
CODE_SIGN_ENTITLEMENTS = "$(CODE_SIGN_ENTITLEMENTS)";
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(inherited)";
|
CURRENT_PROJECT_VERSION = "$(inherited)";
|
||||||
@@ -4004,6 +4143,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/SideStore/libfragmentzip",
|
"$(PROJECT_DIR)/SideStore/libfragmentzip",
|
||||||
"$(PROJECT_DIR)/Dependencies/libcurl",
|
"$(PROJECT_DIR)/Dependencies/libcurl",
|
||||||
|
"$(PROJECT_DIR)/SideStore/em_proxy",
|
||||||
);
|
);
|
||||||
LLVM_LTO = YES_THIN;
|
LLVM_LTO = YES_THIN;
|
||||||
MARKETING_VERSION = "$(inherited)";
|
MARKETING_VERSION = "$(inherited)";
|
||||||
@@ -4012,6 +4152,7 @@
|
|||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||||
|
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
|
||||||
SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only";
|
SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "AltStore/AltStore-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "AltStore/AltStore-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
@@ -4028,7 +4169,7 @@
|
|||||||
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
|
||||||
ASSETCATALOG_COMPILER_OPTIMIZATION = space;
|
ASSETCATALOG_COMPILER_OPTIMIZATION = space;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = AltStore/AltStore.entitlements;
|
CODE_SIGN_ENTITLEMENTS = "$(CODE_SIGN_ENTITLEMENTS)";
|
||||||
CODE_SIGN_IDENTITY = "iPhone Developer";
|
CODE_SIGN_IDENTITY = "iPhone Developer";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = "$(inherited)";
|
CURRENT_PROJECT_VERSION = "$(inherited)";
|
||||||
@@ -4050,6 +4191,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/SideStore/libfragmentzip",
|
"$(PROJECT_DIR)/SideStore/libfragmentzip",
|
||||||
"$(PROJECT_DIR)/Dependencies/libcurl",
|
"$(PROJECT_DIR)/Dependencies/libcurl",
|
||||||
|
"$(PROJECT_DIR)/SideStore/em_proxy",
|
||||||
);
|
);
|
||||||
LLVM_LTO = YES_THIN;
|
LLVM_LTO = YES_THIN;
|
||||||
MARKETING_VERSION = "$(inherited)";
|
MARKETING_VERSION = "$(inherited)";
|
||||||
@@ -4059,6 +4201,7 @@
|
|||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||||
SWIFT_COMPILATION_MODE = singlefile;
|
SWIFT_COMPILATION_MODE = singlefile;
|
||||||
|
SWIFT_ENABLE_EXPLICIT_MODULES = NO;
|
||||||
SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only";
|
SWIFT_ENFORCE_EXCLUSIVE_ACCESS = "debug-only";
|
||||||
SWIFT_OBJC_BRIDGING_HEADER = "AltStore/AltStore-Bridging-Header.h";
|
SWIFT_OBJC_BRIDGING_HEADER = "AltStore/AltStore-Bridging-Header.h";
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Osize";
|
SWIFT_OPTIMIZATION_LEVEL = "-Osize";
|
||||||
@@ -4088,6 +4231,15 @@
|
|||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
|
A83FE3CA2EC9217F005ACE9A /* Build configuration list for PBXNativeTarget "EmotionalDamage" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
A83FE3CB2EC9217F005ACE9A /* Debug */,
|
||||||
|
A83FE3CC2EC9217F005ACE9A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
A8E2DB292D684CBD009E5D31 /* Build configuration list for PBXNativeTarget "UITests" */ = {
|
A8E2DB292D684CBD009E5D31 /* Build configuration list for PBXNativeTarget "UITests" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
buildConfigurations = (
|
buildConfigurations = (
|
||||||
@@ -4162,6 +4314,30 @@
|
|||||||
version = 0.4.0;
|
version = 0.4.0;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
A83FE3652EC90482005ACE9A /* XCRemoteSwiftPackageReference "Starscream" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/daltoniam/Starscream";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 4.0.8;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
A83FE3682EC904FD005ACE9A /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/microsoft/appcenter-sdk-apple";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 5.0.6;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
A83FE36D2EC90512005ACE9A /* XCRemoteSwiftPackageReference "KeychainAccess" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/kishikawakatsumi/KeychainAccess";
|
||||||
|
requirement = {
|
||||||
|
branch = master;
|
||||||
|
kind = branch;
|
||||||
|
};
|
||||||
|
};
|
||||||
A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */ = {
|
A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */ = {
|
||||||
isa = XCRemoteSwiftPackageReference;
|
isa = XCRemoteSwiftPackageReference;
|
||||||
repositoryURL = "https://github.com/bmoliveira/MarkdownKit.git";
|
repositoryURL = "https://github.com/bmoliveira/MarkdownKit.git";
|
||||||
@@ -4170,6 +4346,14 @@
|
|||||||
minimumVersion = 1.7.1;
|
minimumVersion = 1.7.1;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
A8C2260C2EC9039A00047C0D /* XCRemoteSwiftPackageReference "Nuke" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/kean/Nuke";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMinorVersion;
|
||||||
|
minimumVersion = 10.0.0;
|
||||||
|
};
|
||||||
|
};
|
||||||
D58D5F2C26DFE68E00E55E38 /* XCRemoteSwiftPackageReference "LaunchAtLogin" */ = {
|
D58D5F2C26DFE68E00E55E38 /* XCRemoteSwiftPackageReference "LaunchAtLogin" */ = {
|
||||||
isa = XCRemoteSwiftPackageReference;
|
isa = XCRemoteSwiftPackageReference;
|
||||||
repositoryURL = "https://github.com/sindresorhus/LaunchAtLogin.git";
|
repositoryURL = "https://github.com/sindresorhus/LaunchAtLogin.git";
|
||||||
@@ -4194,6 +4378,26 @@
|
|||||||
package = A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */;
|
package = A82067C22D03E0DE00645C0D /* XCRemoteSwiftPackageReference "SemanticVersion" */;
|
||||||
productName = SemanticVersion;
|
productName = SemanticVersion;
|
||||||
};
|
};
|
||||||
|
A83FE3662EC90482005ACE9A /* Starscream */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = A83FE3652EC90482005ACE9A /* XCRemoteSwiftPackageReference "Starscream" */;
|
||||||
|
productName = Starscream;
|
||||||
|
};
|
||||||
|
A83FE3692EC904FD005ACE9A /* AppCenterAnalytics */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = A83FE3682EC904FD005ACE9A /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */;
|
||||||
|
productName = AppCenterAnalytics;
|
||||||
|
};
|
||||||
|
A83FE36B2EC904FD005ACE9A /* AppCenterCrashes */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = A83FE3682EC904FD005ACE9A /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */;
|
||||||
|
productName = AppCenterCrashes;
|
||||||
|
};
|
||||||
|
A83FE3762EC905E3005ACE9A /* KeychainAccess */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = A83FE36D2EC90512005ACE9A /* XCRemoteSwiftPackageReference "KeychainAccess" */;
|
||||||
|
productName = KeychainAccess;
|
||||||
|
};
|
||||||
A8B645FE2D70C1AD00125819 /* MarkdownKit */ = {
|
A8B645FE2D70C1AD00125819 /* MarkdownKit */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
package = A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */;
|
package = A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */;
|
||||||
@@ -4204,6 +4408,11 @@
|
|||||||
package = A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */;
|
package = A8B645FD2D70C1AD00125819 /* XCRemoteSwiftPackageReference "MarkdownKit" */;
|
||||||
productName = MarkdownKit;
|
productName = MarkdownKit;
|
||||||
};
|
};
|
||||||
|
A8C2260D2EC9039A00047C0D /* Nuke */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = A8C2260C2EC9039A00047C0D /* XCRemoteSwiftPackageReference "Nuke" */;
|
||||||
|
productName = Nuke;
|
||||||
|
};
|
||||||
A8C6D50B2D1EE87600DF01F1 /* AltSign-Static */ = {
|
A8C6D50B2D1EE87600DF01F1 /* AltSign-Static */ = {
|
||||||
isa = XCSwiftPackageProductDependency;
|
isa = XCSwiftPackageProductDependency;
|
||||||
productName = "AltSign-Static";
|
productName = "AltSign-Static";
|
||||||
|
|||||||
3
AltStore.xcworkspace/contents.xcworkspacedata
generated
3
AltStore.xcworkspace/contents.xcworkspacedata
generated
@@ -10,7 +10,4 @@
|
|||||||
<FileRef
|
<FileRef
|
||||||
location = "group:Dependencies/Roxas/Roxas.xcodeproj">
|
location = "group:Dependencies/Roxas/Roxas.xcodeproj">
|
||||||
</FileRef>
|
</FileRef>
|
||||||
<FileRef
|
|
||||||
location = "group:Pods/Pods.xcodeproj">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
</Workspace>
|
||||||
|
|||||||
@@ -2,24 +2,14 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<!-- <key>com.apple.security.files.user-selected.read-write</key>
|
<key>aps-environment</key>
|
||||||
<array>
|
<string>development</string>
|
||||||
<string></string>
|
|
||||||
</array>
|
|
||||||
<key>com.apple.developer.applesignin</key>
|
|
||||||
<array>
|
|
||||||
<string></string>
|
|
||||||
</array> -->
|
|
||||||
<key>com.apple.developer.kernel.extended-virtual-addressing</key>
|
<key>com.apple.developer.kernel.extended-virtual-addressing</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.developer.kernel.increased-debugging-memory-limit</key>
|
<key>com.apple.developer.kernel.increased-debugging-memory-limit</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>com.apple.developer.kernel.increased-memory-limit</key>
|
<key>com.apple.developer.kernel.increased-memory-limit</key>
|
||||||
<true/>
|
<true/>
|
||||||
<key>aps-environment</key>
|
|
||||||
<string>development</string>
|
|
||||||
<key>com.apple.developer.siri</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.application-groups</key>
|
<key>com.apple.security.application-groups</key>
|
||||||
<array>
|
<array>
|
||||||
<string>group.$(APP_GROUP_IDENTIFIER)</string>
|
<string>group.$(APP_GROUP_IDENTIFIER)</string>
|
||||||
|
|||||||
10
AltStore/AltStoreFree.entitlements
Normal file
10
AltStore/AltStoreFree.entitlements
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.application-groups</key>
|
||||||
|
<array>
|
||||||
|
<string>group.$(APP_GROUP_IDENTIFIER)</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -14,6 +14,7 @@ import Intents
|
|||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import AltSign
|
import AltSign
|
||||||
import Roxas
|
import Roxas
|
||||||
|
import EmotionalDamage
|
||||||
|
|
||||||
import Nuke
|
import Nuke
|
||||||
|
|
||||||
@@ -98,7 +99,9 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
self.prepareImageCache()
|
self.prepareImageCache()
|
||||||
|
|
||||||
// TODO: @mahee96: find if we need to start em_proxy as in altstore?
|
// TODO: @mahee96: find if we need to start em_proxy as in altstore?
|
||||||
// start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
||||||
|
}
|
||||||
|
|
||||||
SecureValueTransformer.register()
|
SecureValueTransformer.register()
|
||||||
|
|
||||||
@@ -123,7 +126,9 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
{
|
{
|
||||||
// Make sure to update SceneDelegate.sceneDidEnterBackground() as well.
|
// Make sure to update SceneDelegate.sceneDidEnterBackground() as well.
|
||||||
// TODO: @mahee96: find if we need to stop em_proxy as in altstore?
|
// TODO: @mahee96: find if we need to stop em_proxy as in altstore?
|
||||||
// stop_em_proxy()
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
stop_em_proxy()
|
||||||
|
}
|
||||||
guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return }
|
guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return }
|
||||||
|
|
||||||
let midnightOneMonthAgo = Calendar.current.startOfDay(for: oneMonthAgo)
|
let midnightOneMonthAgo = Calendar.current.startOfDay(for: oneMonthAgo)
|
||||||
@@ -140,6 +145,9 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
|
|||||||
func applicationWillEnterForeground(_ application: UIApplication)
|
func applicationWillEnterForeground(_ application: UIApplication)
|
||||||
{
|
{
|
||||||
AppManager.shared.update()
|
AppManager.shared.update()
|
||||||
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
||||||
|
}
|
||||||
|
|
||||||
PatreonAPI.shared.refreshPatreonAccount()
|
PatreonAPI.shared.refreshPatreonAccount()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -318,7 +318,7 @@
|
|||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable StosVPN and be able to use Sidestore on the go." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="4rk-ge-FSj">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable LocalDevVPN and use Sidestore on the go." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="4rk-ge-FSj">
|
||||||
<rect key="frame" x="0.0" y="25.5" width="264" height="38.5"/>
|
<rect key="frame" x="0.0" y="25.5" width="264" height="38.5"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" white="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
|||||||
@@ -532,6 +532,7 @@
|
|||||||
<rect key="frame" x="0.0" y="20" width="375" height="96"/>
|
<rect key="frame" x="0.0" y="20" width="375" height="96"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<color key="tintColor" name="Primary"/>
|
<color key="tintColor" name="Primary"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -561,6 +562,7 @@
|
|||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="CzO-Kt-BlZ" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="CzO-Kt-BlZ" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="20" width="375" height="96"/>
|
<rect key="frame" x="0.0" y="20" width="375" height="96"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -913,6 +915,7 @@
|
|||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="9sB-f3-Fnk">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="9sB-f3-Fnk">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="108"/>
|
<rect key="frame" x="0.0" y="0.0" width="375" height="108"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|||||||
@@ -8,86 +8,77 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import Roxas
|
import Roxas
|
||||||
|
import EmotionalDamage
|
||||||
import minimuxer
|
import minimuxer
|
||||||
import WidgetKit
|
import WidgetKit
|
||||||
|
|
||||||
|
import AltSign
|
||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
import UniformTypeIdentifiers
|
import UniformTypeIdentifiers
|
||||||
|
|
||||||
let pairingFileName = "ALTPairingFile.mobiledevicepairing"
|
let pairingFileName = "ALTPairingFile.mobiledevicepairing"
|
||||||
|
|
||||||
final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDelegate
|
final class LaunchViewController: UIViewController, UIDocumentPickerDelegate {
|
||||||
{
|
|
||||||
private var didFinishLaunching = false
|
private var didFinishLaunching = false
|
||||||
|
private var retries = 0
|
||||||
private var destinationViewController: TabBarController!
|
private var maxRetries = 3
|
||||||
|
private var splashView: SplashView!
|
||||||
override var launchConditions: [RSTLaunchCondition] {
|
private var destinationViewController: TabBarController?
|
||||||
let isDatabaseStarted = RSTLaunchCondition(condition: { DatabaseManager.shared.isStarted }) { (completionHandler) in
|
private var startTime: Date!
|
||||||
DatabaseManager.shared.start(completionHandler: completionHandler)
|
|
||||||
}
|
|
||||||
|
|
||||||
return [isDatabaseStarted]
|
override func viewDidLoad() {
|
||||||
}
|
|
||||||
|
|
||||||
override var childForStatusBarStyle: UIViewController? {
|
|
||||||
return self.children.first
|
|
||||||
}
|
|
||||||
|
|
||||||
override var childForStatusBarHidden: UIViewController? {
|
|
||||||
return self.children.first
|
|
||||||
}
|
|
||||||
|
|
||||||
override func viewDidLoad()
|
|
||||||
{
|
|
||||||
defer {
|
|
||||||
// Create destinationViewController now so view controllers can register for receiving Notifications.
|
|
||||||
self.destinationViewController = self.storyboard!.instantiateViewController(withIdentifier: "tabBarController") as! TabBarController
|
|
||||||
}
|
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
splashView = SplashView(frame: view.bounds, appName: "SideStore")
|
||||||
|
destinationViewController = storyboard!.instantiateViewController(withIdentifier: "tabBarController") as? TabBarController
|
||||||
|
view.addSubview(splashView)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewDidAppear(_ animated: Bool) {
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
super.viewDidAppear(true)
|
super.viewDidAppear(animated)
|
||||||
if #available(iOS 17, *), !UserDefaults.standard.sidejitenable {
|
guard !didFinishLaunching else { return }
|
||||||
DispatchQueue.global().async {
|
Task {
|
||||||
self.isSideJITServerDetected() { result in
|
startTime = Date()
|
||||||
DispatchQueue.main.async {
|
await runLaunchSequence()
|
||||||
switch result {
|
doPostLaunch()
|
||||||
case .success():
|
}
|
||||||
let dialogMessage = UIAlertController(title: "SideJITServer Detected", message: "Would you like to enable SideJITServer", preferredStyle: .alert)
|
}
|
||||||
|
|
||||||
// Create OK button with action handler
|
private func runLaunchSequence() async {
|
||||||
let ok = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in
|
guard retries < maxRetries else { return }
|
||||||
UserDefaults.standard.sidejitenable = true
|
retries += 1
|
||||||
})
|
|
||||||
|
await Task.detached {
|
||||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
if !DatabaseManager.shared.isStarted {
|
||||||
//Add OK button to a dialog message
|
await withCheckedContinuation { continuation in
|
||||||
dialogMessage.addAction(ok)
|
DatabaseManager.shared.start { error in
|
||||||
dialogMessage.addAction(cancel)
|
if let error {
|
||||||
|
Task { await self.handleLaunchError(error, retryCallback: self.runLaunchSequence) }
|
||||||
// Present Alert to
|
} else {
|
||||||
self.present(dialogMessage, animated: true, completion: nil)
|
Task { await self.finishLaunching() }
|
||||||
case .failure(_):
|
|
||||||
print("Cannot find sideJITServer")
|
|
||||||
}
|
}
|
||||||
|
continuation.resume(returning: ())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
await self.finishLaunching()
|
||||||
}
|
}
|
||||||
}
|
}.value
|
||||||
|
}
|
||||||
|
|
||||||
|
private func doPostLaunch() {
|
||||||
|
SideJITManager.shared.checkAndPromptIfNeeded(presentingVC: self)
|
||||||
if #available(iOS 17, *), UserDefaults.standard.sidejitenable {
|
if #available(iOS 17, *), UserDefaults.standard.sidejitenable {
|
||||||
DispatchQueue.global().async {
|
DispatchQueue.global().async { SideJITManager.shared.askForNetwork() }
|
||||||
self.askfornetwork()
|
|
||||||
}
|
|
||||||
print("SideJITServer Enabled")
|
print("SideJITServer Enabled")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if !targetEnvironment(simulator)
|
#if !targetEnvironment(simulator)
|
||||||
|
|
||||||
|
detectAndImportAccountFile()
|
||||||
|
|
||||||
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
||||||
|
}
|
||||||
guard let pf = fetchPairingFile() else {
|
guard let pf = fetchPairingFile() else {
|
||||||
displayError("Device pairing file not found.")
|
displayError("Device pairing file not found.")
|
||||||
return
|
return
|
||||||
@@ -95,216 +86,126 @@ final class LaunchViewController: RSTLaunchViewController, UIDocumentPickerDeleg
|
|||||||
start_minimuxer_threads(pf)
|
start_minimuxer_threads(pf)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
func askfornetwork() {
|
|
||||||
let address = UserDefaults.standard.textInputSideJITServerurl ?? ""
|
|
||||||
|
|
||||||
var SJSURL = address
|
|
||||||
|
|
||||||
if (UserDefaults.standard.textInputSideJITServerurl ?? "").isEmpty {
|
|
||||||
SJSURL = "http://sidejitserver._http._tcp.local:8080"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a network operation at launch to Refresh SideJITServer
|
|
||||||
let url = URL(string: "\(SJSURL)/re/")!
|
|
||||||
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
|
|
||||||
print(data)
|
|
||||||
}
|
|
||||||
task.resume()
|
|
||||||
}
|
|
||||||
|
|
||||||
func isSideJITServerDetected(completion: @escaping (Result<Void, Error>) -> Void) {
|
|
||||||
let address = UserDefaults.standard.textInputSideJITServerurl ?? ""
|
|
||||||
|
|
||||||
var SJSURL = address
|
|
||||||
|
|
||||||
if (UserDefaults.standard.textInputSideJITServerurl ?? "").isEmpty {
|
|
||||||
SJSURL = "http://sidejitserver._http._tcp.local:8080"
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a network operation at launch to Refresh SideJITServer
|
|
||||||
let url = URL(string: SJSURL)!
|
|
||||||
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
|
|
||||||
if let error = error {
|
|
||||||
print("No SideJITServer on Network")
|
|
||||||
completion(.failure(error))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
completion(.success(()))
|
|
||||||
}
|
|
||||||
task.resume()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func fetchPairingFile() -> String? {
|
|
||||||
let filename = "ALTPairingFile.mobiledevicepairing"
|
|
||||||
let fm = FileManager.default
|
|
||||||
let documentsPath = fm.documentsDirectory.appendingPathComponent("/\(filename)")
|
|
||||||
if fm.fileExists(atPath: documentsPath.path), let contents = try? String(contentsOf: documentsPath), !contents.isEmpty {
|
|
||||||
print("Loaded ALTPairingFile from \(documentsPath.path)")
|
|
||||||
return contents
|
|
||||||
} else if
|
|
||||||
let appResourcePath = Bundle.main.url(forResource: "ALTPairingFile", withExtension: "mobiledevicepairing"),
|
|
||||||
fm.fileExists(atPath: appResourcePath.path),
|
|
||||||
let data = fm.contents(atPath: appResourcePath.path),
|
|
||||||
let contents = String(data: data, encoding: .utf8),
|
|
||||||
!contents.isEmpty,
|
|
||||||
!UserDefaults.standard.isPairingReset {
|
|
||||||
print("Loaded ALTPairingFile from \(appResourcePath.path)")
|
|
||||||
return contents
|
|
||||||
} else if let plistString = Bundle.main.object(forInfoDictionaryKey: "ALTPairingFile") as? String, !plistString.isEmpty, !plistString.contains("insert pairing file here"), !UserDefaults.standard.isPairingReset{
|
|
||||||
print("Loaded ALTPairingFile from Info.plist")
|
|
||||||
return plistString
|
|
||||||
} else {
|
|
||||||
// Show an alert explaining the pairing file
|
|
||||||
// Create new Alert
|
|
||||||
let dialogMessage = UIAlertController(title: "Pairing File", message: "Select the pairing file or select \"Help\" for help.", preferredStyle: .alert)
|
|
||||||
|
|
||||||
// Create OK button with action handler
|
|
||||||
let ok = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in
|
|
||||||
// Try to load it from a file picker
|
|
||||||
var types = UTType.types(tag: "plist", tagClass: UTTagClass.filenameExtension, conformingTo: nil)
|
|
||||||
types.append(contentsOf: UTType.types(tag: "mobiledevicepairing", tagClass: UTTagClass.filenameExtension, conformingTo: UTType.data))
|
|
||||||
types.append(.xml)
|
|
||||||
let documentPickerController = UIDocumentPickerViewController(forOpeningContentTypes: types)
|
|
||||||
documentPickerController.shouldShowFileExtensions = true
|
|
||||||
documentPickerController.delegate = self
|
|
||||||
self.present(documentPickerController, animated: true, completion: nil)
|
|
||||||
UserDefaults.standard.isPairingReset = false
|
|
||||||
})
|
|
||||||
|
|
||||||
//Add "help" button to take user to wiki
|
|
||||||
let wikiOption = UIAlertAction(title: "Help", style: .default) { (action) in
|
|
||||||
let wikiURL: String = "https://docs.sidestore.io/docs/installation/pairing-file"
|
|
||||||
if let url = URL(string: wikiURL) {
|
|
||||||
UIApplication.shared.open(url)
|
|
||||||
}
|
|
||||||
sleep(2)
|
|
||||||
exit(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
//Add buttons to dialog message
|
|
||||||
dialogMessage.addAction(wikiOption)
|
|
||||||
dialogMessage.addAction(ok)
|
|
||||||
|
|
||||||
// Present Alert to
|
|
||||||
self.present(dialogMessage, animated: true, completion: nil)
|
|
||||||
|
|
||||||
let dialogMessage2 = UIAlertController(title: "Analytics", message: "This app contains anonymous analytics for research and project development. By continuing to use this app, you are consenting to this data collection", preferredStyle: .alert)
|
|
||||||
|
|
||||||
let ok2 = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in})
|
|
||||||
|
|
||||||
dialogMessage2.addAction(ok2)
|
|
||||||
self.present(dialogMessage2, animated: true, completion: nil)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func displayError(_ msg: String) {
|
|
||||||
print(msg)
|
|
||||||
// Create a new alert
|
|
||||||
let dialogMessage = UIAlertController(title: "Error launching SideStore", message: msg, preferredStyle: .alert)
|
|
||||||
|
|
||||||
// Present alert to user
|
|
||||||
self.present(dialogMessage, animated: true, completion: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
|
|
||||||
let url = urls[0]
|
|
||||||
let isSecuredURL = url.startAccessingSecurityScopedResource() == true
|
|
||||||
|
|
||||||
do {
|
|
||||||
// Read to a string
|
|
||||||
let data1 = try Data(contentsOf: urls[0])
|
|
||||||
let pairing_string = String(bytes: data1, encoding: .utf8)
|
|
||||||
if pairing_string == nil {
|
|
||||||
displayError("Unable to read pairing file")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Save to a file for next launch
|
|
||||||
let pairingFile = FileManager.default.documentsDirectory.appendingPathComponent("\(pairingFileName)")
|
|
||||||
try pairing_string?.write(to: pairingFile, atomically: true, encoding: String.Encoding.utf8)
|
|
||||||
|
|
||||||
// Start minimuxer now that we have a file
|
|
||||||
start_minimuxer_threads(pairing_string!)
|
|
||||||
} catch {
|
|
||||||
displayError("Unable to read pairing file")
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isSecuredURL) {
|
|
||||||
url.stopAccessingSecurityScopedResource()
|
|
||||||
}
|
|
||||||
controller.dismiss(animated: true, completion: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
|
|
||||||
displayError("Choosing a pairing file was cancelled. Please re-open the app and try again.")
|
|
||||||
}
|
|
||||||
|
|
||||||
func start_minimuxer_threads(_ pairing_file: String) {
|
func start_minimuxer_threads(_ pairing_file: String) {
|
||||||
target_minimuxer_address()
|
target_minimuxer_address()
|
||||||
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
||||||
do {
|
do {
|
||||||
// enable minimuxer console logging only if enabled in settings
|
let loggingEnabled = UserDefaults.standard.isMinimuxerConsoleLoggingEnabled
|
||||||
let isMinimuxerConsoleLoggingEnabled = UserDefaults.standard.isMinimuxerConsoleLoggingEnabled
|
try minimuxer.startWithLogger(pairing_file, documentsDirectory, loggingEnabled)
|
||||||
try minimuxer.startWithLogger(pairing_file, documentsDirectory, isMinimuxerConsoleLoggingEnabled)
|
|
||||||
} catch {
|
} catch {
|
||||||
try! FileManager.default.removeItem(at: FileManager.default.documentsDirectory.appendingPathComponent("\(pairingFileName)"))
|
try! FileManager.default.removeItem(at: FileManager.default.documentsDirectory.appendingPathComponent(pairingFileName))
|
||||||
displayError("minimuxer failed to start, please restart SideStore. \((error as? LocalizedError)?.failureReason ?? "UNKNOWN ERROR!!!!!! REPORT TO GITHUB ISSUES!")")
|
displayError("minimuxer failed to start, please restart SideStore. \((error as? LocalizedError)?.failureReason ?? "UNKNOWN ERROR")")
|
||||||
}
|
}
|
||||||
start_auto_mounter(documentsDirectory)
|
start_auto_mounter(documentsDirectory)
|
||||||
// Create destinationViewController now so view controllers can register for receiving Notifications.
|
|
||||||
self.destinationViewController = self.storyboard!.instantiateViewController(withIdentifier: "tabBarController") as? TabBarController
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
extension LaunchViewController
|
func fetchPairingFile() -> String? { PairingFileManager.shared.fetchPairingFile(presentingVC: self) }
|
||||||
{
|
|
||||||
override func handleLaunchError(_ error: Error)
|
func displayError(_ msg: String) {
|
||||||
{
|
print(msg)
|
||||||
do
|
let alert = UIAlertController(title: "Error launching SideStore", message: msg, preferredStyle: .alert)
|
||||||
{
|
self.present(alert, animated: true)
|
||||||
throw error
|
}
|
||||||
|
|
||||||
|
func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
|
||||||
|
let url = urls[0]
|
||||||
|
let isSecuredURL = url.startAccessingSecurityScopedResource() == true
|
||||||
|
defer {
|
||||||
|
if (isSecuredURL) {
|
||||||
|
url.stopAccessingSecurityScopedResource()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch let error as NSError
|
|
||||||
{
|
do {
|
||||||
let title = error.userInfo[NSLocalizedFailureErrorKey] as? String ?? NSLocalizedString("Unable to Launch SideStore", comment: "")
|
let data = try Data(contentsOf: url)
|
||||||
|
guard let pairingString = String(data: data, encoding: .utf8) else {
|
||||||
let errorDescription: String
|
displayError("Unable to read pairing file")
|
||||||
|
return
|
||||||
if #available(iOS 14.5, *)
|
|
||||||
{
|
|
||||||
let errorMessages = [error.debugDescription] + error.underlyingErrors.map { ($0 as NSError).debugDescription }
|
|
||||||
errorDescription = errorMessages.joined(separator: "\n\n")
|
|
||||||
}
|
}
|
||||||
else
|
try pairingString.write(to: FileManager.default.documentsDirectory.appendingPathComponent(pairingFileName), atomically: true, encoding: .utf8)
|
||||||
{
|
start_minimuxer_threads(pairingString)
|
||||||
errorDescription = error.debugDescription
|
} catch {
|
||||||
}
|
displayError("Unable to read pairing file")
|
||||||
|
}
|
||||||
let alertController = UIAlertController(title: title, message: errorDescription, preferredStyle: .alert)
|
|
||||||
alertController.addAction(UIAlertAction(title: NSLocalizedString("Retry", comment: ""), style: .default, handler: { (action) in
|
controller.dismiss(animated: true, completion: nil)
|
||||||
self.handleLaunchConditions()
|
}
|
||||||
}))
|
|
||||||
self.present(alertController, animated: true, completion: nil)
|
func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
|
||||||
|
displayError("Choosing a pairing file was cancelled. Please re-open the app and try again.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func importAccountAtFile(_ file: URL, remove: Bool = false) {
|
||||||
|
_ = file.startAccessingSecurityScopedResource()
|
||||||
|
defer { file.stopAccessingSecurityScopedResource() }
|
||||||
|
guard let accountD = try? Data(contentsOf: file) else {
|
||||||
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
|
}
|
||||||
|
guard let account = try? Foundation.JSONDecoder().decode(ImportedAccount.self, from: accountD) else {
|
||||||
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
|
}
|
||||||
|
print("We want to import this account probably: \(account)")
|
||||||
|
if remove {
|
||||||
|
try? FileManager.default.removeItem(at: file)
|
||||||
|
}
|
||||||
|
Keychain.shared.appleIDEmailAddress = account.email
|
||||||
|
Keychain.shared.appleIDPassword = account.password
|
||||||
|
Keychain.shared.adiPb = account.adiPB
|
||||||
|
Keychain.shared.identifier = account.local_user
|
||||||
|
if let altCert = ALTCertificate(p12Data: account.cert, password: account.certpass) {
|
||||||
|
Keychain.shared.signingCertificate = altCert.encryptedP12Data(withPassword: "")!
|
||||||
|
Keychain.shared.signingCertificatePassword = account.certpass
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Successfully imported '\(account.email)'!", comment: ""), detailText: "SideStore should be fully operational!")
|
||||||
|
return toastView.show(in: self)
|
||||||
|
} else {
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Failed to import account certificate!", comment: ""), detailText: "Failed to create ALTCertificate. Check if the password is correct. Still imported account/adi.pb details!")
|
||||||
|
return toastView.show(in: self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func finishLaunching()
|
func detectAndImportAccountFile() {
|
||||||
{
|
let accountFileURL = FileManager.default.documentsDirectory.appendingPathComponent("Account.sideconf")
|
||||||
super.finishLaunching()
|
#if !DEBUG
|
||||||
|
importAccountAtFile(accountFileURL, remove: true)
|
||||||
guard !self.didFinishLaunching else { return }
|
#else
|
||||||
|
importAccountAtFile(accountFileURL)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension LaunchViewController {
|
||||||
|
@MainActor
|
||||||
|
func handleLaunchError(_ error: Error, retryCallback: (() async -> Void)? = nil) {
|
||||||
|
do { throw error } catch let error as NSError {
|
||||||
|
let title = error.userInfo[NSLocalizedFailureErrorKey] as? String ?? NSLocalizedString("Unable to Launch SideStore", comment: "")
|
||||||
|
let desc: String
|
||||||
|
if #available(iOS 14.5, *) {
|
||||||
|
desc = ([error.debugDescription] + error.underlyingErrors.map { ($0 as NSError).debugDescription }).joined(separator: "\n\n")
|
||||||
|
} else {
|
||||||
|
desc = error.debugDescription
|
||||||
|
}
|
||||||
|
let alert = UIAlertController(title: title, message: desc, preferredStyle: .alert)
|
||||||
|
alert.addAction(UIAlertAction(title: NSLocalizedString("Retry", comment: ""), style: .default) { _ in
|
||||||
|
Task { await retryCallback?() }
|
||||||
|
})
|
||||||
|
present(alert, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@MainActor
|
||||||
|
func finishLaunching() async {
|
||||||
|
guard !didFinishLaunching else { return }
|
||||||
|
didFinishLaunching = true
|
||||||
|
|
||||||
AppManager.shared.update()
|
AppManager.shared.update()
|
||||||
AppManager.shared.updatePatronsIfNeeded()
|
AppManager.shared.updatePatronsIfNeeded()
|
||||||
PatreonAPI.shared.refreshPatreonAccount()
|
PatreonAPI.shared.refreshPatreonAccount()
|
||||||
|
|
||||||
AppManager.shared.updateAllSources { result in
|
AppManager.shared.updateAllSources { result in
|
||||||
guard case .failure(let error) = result else { return }
|
guard case .failure(let error) = result else { return }
|
||||||
Logger.main.error("Failed to update sources on launch. \(error.localizedDescription, privacy: .public)")
|
Logger.main.error("Failed to update sources on launch. \(error.localizedDescription, privacy: .public)")
|
||||||
|
|
||||||
|
|
||||||
let errorDesc = ErrorProcessing(.fullError).getDescription(error: error as NSError)
|
let errorDesc = ErrorProcessing(.fullError).getDescription(error: error as NSError)
|
||||||
print("Failed to update sources on launch. \(errorDesc)")
|
print("Failed to update sources on launch. \(errorDesc)")
|
||||||
|
|
||||||
@@ -312,63 +213,64 @@ extension LaunchViewController
|
|||||||
if String(describing: error).contains("The Internet connection appears to be offline"){
|
if String(describing: error).contains("The Internet connection appears to be offline"){
|
||||||
mode = .localizedDescription // dont make noise!
|
mode = .localizedDescription // dont make noise!
|
||||||
}
|
}
|
||||||
|
|
||||||
let toastView = ToastView(error: error, mode: mode)
|
let toastView = ToastView(error: error, mode: mode)
|
||||||
toastView.addTarget(self.destinationViewController, action: #selector(TabBarController.presentSources), for: .touchUpInside)
|
toastView.addTarget(self.destinationViewController, action: #selector(TabBarController.presentSources), for: .touchUpInside)
|
||||||
toastView.show(in: self.destinationViewController.selectedViewController ?? self.destinationViewController)
|
toastView.show(in: self.destinationViewController!.selectedViewController ?? self.destinationViewController!)
|
||||||
}
|
}
|
||||||
|
updateKnownSources()
|
||||||
self.updateKnownSources()
|
|
||||||
|
|
||||||
// Ask widgets to be refreshed
|
|
||||||
WidgetCenter.shared.reloadAllTimelines()
|
WidgetCenter.shared.reloadAllTimelines()
|
||||||
|
didFinishLaunching = true
|
||||||
|
|
||||||
// Add view controller as child (rather than presenting modally)
|
let destinationVC = destinationViewController!
|
||||||
// so tint adjustment + card presentations works correctly.
|
|
||||||
self.destinationViewController.view.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)
|
|
||||||
self.destinationViewController.view.alpha = 0.0
|
|
||||||
self.addChild(self.destinationViewController)
|
|
||||||
self.view.addSubview(self.destinationViewController.view, pinningEdgesWith: .zero)
|
|
||||||
self.destinationViewController.didMove(toParent: self)
|
|
||||||
|
|
||||||
UIView.animate(withDuration: 0.2) {
|
let elapsed = abs(startTime.timeIntervalSinceNow)
|
||||||
self.destinationViewController.view.alpha = 1.0
|
let remaining = elapsed >= 1 ? 0 : 1 - elapsed
|
||||||
}
|
try? await Task.sleep(nanoseconds: UInt64(remaining * 1_000_000_000))
|
||||||
|
|
||||||
self.didFinishLaunching = true
|
destinationVC.loadViewIfNeeded()
|
||||||
}
|
addChild(destinationVC)
|
||||||
}
|
destinationVC.view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
view.addSubview(destinationVC.view)
|
||||||
|
destinationVC.didMove(toParent: self)
|
||||||
|
|
||||||
|
// Pin edges BEFORE animation
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
destinationVC.view.topAnchor.constraint(equalTo: view.topAnchor),
|
||||||
|
destinationVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
||||||
|
destinationVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||||
|
destinationVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
|
||||||
|
])
|
||||||
|
|
||||||
private extension LaunchViewController
|
// Set initial alpha for fade-in
|
||||||
{
|
destinationVC.view.alpha = 0
|
||||||
func updateKnownSources()
|
|
||||||
{
|
UIView.transition(with: view, duration: 0.3, options: .transitionCrossDissolve) { [self] in
|
||||||
|
self.splashView.alpha = 0
|
||||||
|
destinationVC.view.alpha = 1
|
||||||
|
} completion: { _ in
|
||||||
|
self.splashView.removeFromSuperview()
|
||||||
|
self.destinationViewController = destinationVC
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateKnownSources() {
|
||||||
AppManager.shared.updateKnownSources { result in
|
AppManager.shared.updateKnownSources { result in
|
||||||
switch result
|
switch result {
|
||||||
{
|
|
||||||
case .failure(let error): print("[ALTLog] Failed to update known sources:", error)
|
case .failure(let error): print("[ALTLog] Failed to update known sources:", error)
|
||||||
case .success((_, let blockedSources)):
|
case .success((_, let blockedSources)):
|
||||||
DatabaseManager.shared.persistentContainer.performBackgroundTask { context in
|
DatabaseManager.shared.persistentContainer.performBackgroundTask { context in
|
||||||
let blockedSourceIDs = Set(blockedSources.lazy.map { $0.identifier })
|
let blockedSourceIDs = Set(blockedSources.lazy.map { $0.identifier })
|
||||||
let blockedSourceURLs = Set(blockedSources.lazy.compactMap { $0.sourceURL })
|
let blockedSourceURLs = Set(blockedSources.lazy.compactMap { $0.sourceURL })
|
||||||
|
let predicate = NSPredicate(format: "%K IN %@ OR %K IN %@", #keyPath(Source.identifier), blockedSourceIDs, #keyPath(Source.sourceURL), blockedSourceURLs)
|
||||||
let predicate = NSPredicate(format: "%K IN %@ OR %K IN %@",
|
let sourceErrors = Source.all(satisfying: predicate, in: context).map { source in
|
||||||
#keyPath(Source.identifier), blockedSourceIDs,
|
let blocked = blockedSources.first { $0.identifier == source.identifier }
|
||||||
#keyPath(Source.sourceURL), blockedSourceURLs)
|
return SourceError.blocked(source, bundleIDs: blocked?.bundleIDs, existingSource: source)
|
||||||
|
|
||||||
let sourceErrors = Source.all(satisfying: predicate, in: context).map { (source) in
|
|
||||||
let blockedSource = blockedSources.first { $0.identifier == source.identifier }
|
|
||||||
return SourceError.blocked(source, bundleIDs: blockedSource?.bundleIDs, existingSource: source)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
guard !sourceErrors.isEmpty else { return }
|
guard !sourceErrors.isEmpty else { return }
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
for error in sourceErrors
|
for error in sourceErrors {
|
||||||
{
|
|
||||||
let title = String(format: NSLocalizedString("“%@” Blocked", comment: ""), error.$source.name)
|
let title = String(format: NSLocalizedString("“%@” Blocked", comment: ""), error.$source.name)
|
||||||
let message = [error.localizedDescription, error.recoverySuggestion].compactMap { $0 }.joined(separator: "\n\n")
|
let message = [error.localizedDescription, error.recoverySuggestion].compactMap { $0 }.joined(separator: "\n\n")
|
||||||
|
|
||||||
await self.presentAlert(title: title, message: message)
|
await self.presentAlert(title: title, message: message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -377,3 +279,142 @@ private extension LaunchViewController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - SplashView
|
||||||
|
final class SplashView: UIView {
|
||||||
|
let iconView = UIImageView()
|
||||||
|
let titleLabel = UILabel()
|
||||||
|
|
||||||
|
init(frame: CGRect, appName: String) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
backgroundColor = .systemBackground
|
||||||
|
setupIcon()
|
||||||
|
setupTitle(appName: appName)
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) { fatalError() }
|
||||||
|
|
||||||
|
private func setupIcon() {
|
||||||
|
let container = UIView()
|
||||||
|
container.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
container.layer.shadowColor = UIColor.black.cgColor
|
||||||
|
container.layer.shadowOpacity = 0.25
|
||||||
|
container.layer.shadowOffset = CGSize(width: 0, height: 4)
|
||||||
|
container.layer.shadowRadius = 8
|
||||||
|
addSubview(container)
|
||||||
|
|
||||||
|
iconView.image = UIImage(named: "AppIcon") ?? UIImage(named: "AppIcon60x60") ?? UIImage(systemName: "app.fill")
|
||||||
|
iconView.contentMode = .scaleAspectFit
|
||||||
|
iconView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
iconView.layer.cornerRadius = 24
|
||||||
|
iconView.clipsToBounds = true
|
||||||
|
container.addSubview(iconView)
|
||||||
|
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
container.centerXAnchor.constraint(equalTo: centerXAnchor),
|
||||||
|
container.centerYAnchor.constraint(equalTo: centerYAnchor, constant: -20),
|
||||||
|
container.widthAnchor.constraint(equalToConstant: 120),
|
||||||
|
container.heightAnchor.constraint(equalToConstant: 120),
|
||||||
|
iconView.topAnchor.constraint(equalTo: container.topAnchor),
|
||||||
|
iconView.bottomAnchor.constraint(equalTo: container.bottomAnchor),
|
||||||
|
iconView.leadingAnchor.constraint(equalTo: container.leadingAnchor),
|
||||||
|
iconView.trailingAnchor.constraint(equalTo: container.trailingAnchor)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
private func setupTitle(appName: String) {
|
||||||
|
titleLabel.text = appName
|
||||||
|
titleLabel.font = .systemFont(ofSize: 24, weight: .bold)
|
||||||
|
titleLabel.textColor = .label
|
||||||
|
titleLabel.textAlignment = .center
|
||||||
|
titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
addSubview(titleLabel)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
titleLabel.topAnchor.constraint(equalTo: iconView.bottomAnchor, constant: 12),
|
||||||
|
titleLabel.centerXAnchor.constraint(equalTo: centerXAnchor)
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - PairingFileManager
|
||||||
|
final class PairingFileManager {
|
||||||
|
static let shared = PairingFileManager()
|
||||||
|
func fetchPairingFile(presentingVC: UIViewController) -> String? {
|
||||||
|
let fm = FileManager.default
|
||||||
|
let filename = pairingFileName
|
||||||
|
let documentsPath = fm.documentsDirectory.appendingPathComponent("/\(filename)")
|
||||||
|
if fm.fileExists(atPath: documentsPath.path),
|
||||||
|
let contents = try? String(contentsOf: documentsPath), !contents.isEmpty {
|
||||||
|
return contents
|
||||||
|
}
|
||||||
|
if let url = Bundle.main.url(forResource: "ALTPairingFile", withExtension: "mobiledevicepairing"),
|
||||||
|
fm.fileExists(atPath: url.path),
|
||||||
|
let data = fm.contents(atPath: url.path),
|
||||||
|
let contents = String(data: data, encoding: .utf8),
|
||||||
|
!contents.isEmpty, !UserDefaults.standard.isPairingReset { return contents }
|
||||||
|
if let plistString = Bundle.main.object(forInfoDictionaryKey: "ALTPairingFile") as? String,
|
||||||
|
!plistString.isEmpty, !plistString.contains("insert pairing file here"), !UserDefaults.standard.isPairingReset { return plistString }
|
||||||
|
|
||||||
|
presentPairingFileAlert(on: presentingVC)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func presentPairingFileAlert(on vc: UIViewController) {
|
||||||
|
let alert = UIAlertController(title: "Pairing File", message: "Select the pairing file or select \"Help\" for help.", preferredStyle: .alert)
|
||||||
|
alert.addAction(UIAlertAction(title: "Help", style: .default) { _ in
|
||||||
|
if let url = URL(string: "https://docs.sidestore.io/docs/advanced/pairing-file") { UIApplication.shared.open(url) }
|
||||||
|
sleep(2); exit(0)
|
||||||
|
})
|
||||||
|
alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in
|
||||||
|
var types = UTType.types(tag: "plist", tagClass: .filenameExtension, conformingTo: nil)
|
||||||
|
types.append(contentsOf: UTType.types(tag: "mobiledevicepairing", tagClass: .filenameExtension, conformingTo: .data))
|
||||||
|
types.append(.xml)
|
||||||
|
let picker = UIDocumentPickerViewController(forOpeningContentTypes: types)
|
||||||
|
picker.delegate = vc as? UIDocumentPickerDelegate
|
||||||
|
picker.shouldShowFileExtensions = true
|
||||||
|
vc.present(picker, animated: true)
|
||||||
|
UserDefaults.standard.isPairingReset = false
|
||||||
|
})
|
||||||
|
vc.present(alert, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - SideJITManager
|
||||||
|
final class SideJITManager {
|
||||||
|
static let shared = SideJITManager()
|
||||||
|
func checkAndPromptIfNeeded(presentingVC: UIViewController) {
|
||||||
|
guard #available(iOS 17, *), !UserDefaults.standard.sidejitenable else { return }
|
||||||
|
DispatchQueue.global().async {
|
||||||
|
self.isSideJITServerDetected { result in
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
switch result {
|
||||||
|
case .success():
|
||||||
|
let alert = UIAlertController(title: "SideJITServer Detected", message: "Would you like to enable SideJITServer", preferredStyle: .alert)
|
||||||
|
alert.addAction(UIAlertAction(title: "OK", style: .default) { _ in UserDefaults.standard.sidejitenable = true })
|
||||||
|
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
|
||||||
|
presentingVC.present(alert, animated: true)
|
||||||
|
case .failure(_): print("Cannot find sideJITServer")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func askForNetwork() {
|
||||||
|
let address = UserDefaults.standard.textInputSideJITServerurl ?? ""
|
||||||
|
let SJSURL = address.isEmpty ? "http://sidejitserver._http._tcp.local:8080" : address
|
||||||
|
URLSession.shared.dataTask(with: URL(string: "\(SJSURL)/re/")!) { data, resp, err in
|
||||||
|
print("data: \(String(describing: data)), response: \(String(describing: resp)), error: \(String(describing: err))")
|
||||||
|
}.resume()
|
||||||
|
}
|
||||||
|
|
||||||
|
func isSideJITServerDetected(completion: @escaping (Result<Void, Error>) -> Void) {
|
||||||
|
let address = UserDefaults.standard.textInputSideJITServerurl ?? ""
|
||||||
|
let SJSURL = address.isEmpty ? "http://sidejitserver._http._tcp.local:8080" : address
|
||||||
|
guard let url = URL(string: SJSURL) else { return }
|
||||||
|
URLSession.shared.dataTask(with: url) { _, _, error in
|
||||||
|
if let error = error { completion(.failure(error)); return }
|
||||||
|
completion(.success(()))
|
||||||
|
}.resume()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -170,7 +170,7 @@ class MyAppsViewController: UICollectionViewController, PeekPopPreviewing
|
|||||||
var minimuxerStatus: Bool {
|
var minimuxerStatus: Bool {
|
||||||
// added isMinimuxerStatusCheckEnabled to forcefully ignore minimuxer status if status check is disabled in settings
|
// added isMinimuxerStatusCheckEnabled to forcefully ignore minimuxer status if status check is disabled in settings
|
||||||
guard !UserDefaults.standard.isMinimuxerStatusCheckEnabled || minimuxer.ready() else {
|
guard !UserDefaults.standard.isMinimuxerStatusCheckEnabled || minimuxer.ready() else {
|
||||||
ToastView(error: (OperationError.noWiFi as NSError).withLocalizedTitle("No WiFi or VPN!")).show(in: self)
|
ToastView(error: (OperationError.noWiFi as NSError).withLocalizedTitle("No Wi-Fi or VPN!")).show(in: self)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|||||||
@@ -84,71 +84,87 @@ final class AuthenticationOperation: ResultOperation<(ALTTeam, ALTCertificate, A
|
|||||||
self.finish(.failure(error))
|
self.finish(.failure(error))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign In
|
Task {
|
||||||
self.signIn() { (result) in
|
// try to use cached session
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
if
|
||||||
|
let certificate = Keychain.shared.certificate,
|
||||||
switch result
|
let session = Keychain.shared.session,
|
||||||
|
let team = Keychain.shared.team
|
||||||
{
|
{
|
||||||
case .failure(let error): self.finish(.failure(error))
|
if session.anisetteData.date.timeIntervalSinceNow < -40.0 {
|
||||||
case .success((let account, let session)):
|
let anisetteData = try await withUnsafeThrowingContinuation { (c: UnsafeContinuation<ALTAnisetteData, any Error>) in
|
||||||
self.context.session = session
|
let fetchAnisetteDataOperation = FetchAnisetteDataOperation(context: self.context)
|
||||||
self.progress.completedUnitCount += 1
|
fetchAnisetteDataOperation.resultHandler = { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
// Fetch Team
|
|
||||||
self.fetchTeam(for: account, session: session) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success(let team):
|
|
||||||
self.context.team = team
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
|
|
||||||
// Fetch Certificate
|
|
||||||
self.fetchCertificate(for: team, session: session) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success(let certificate):
|
|
||||||
self.context.certificate = certificate
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
|
|
||||||
// Register Device
|
|
||||||
self.registerCurrentDevice(for: team, session: session) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success:
|
|
||||||
self.progress.completedUnitCount += 1
|
|
||||||
|
|
||||||
// Save account/team to disk.
|
|
||||||
self.save(team) { (result) in
|
|
||||||
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
|
||||||
|
|
||||||
switch result
|
|
||||||
{
|
|
||||||
case .failure(let error): self.finish(.failure(error))
|
|
||||||
case .success:
|
|
||||||
// Must cache App IDs _after_ saving account/team to disk.
|
|
||||||
self.cacheAppIDs(team: team, session: session) { (result) in
|
|
||||||
let result = result.map { _ in (team, certificate, session) }
|
|
||||||
self.finish(result)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
self.operationQueue.addOperation(fetchAnisetteDataOperation)
|
||||||
|
}
|
||||||
|
session.anisetteData = anisetteData
|
||||||
|
}
|
||||||
|
self.context.team = team
|
||||||
|
self.context.session = session
|
||||||
|
self.context.certificate = certificate
|
||||||
|
self.finish(.success((team, certificate, session)))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// new login
|
||||||
|
do {
|
||||||
|
let (account, session) = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.signIn() { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.context.session = session
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
let team = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.fetchTeam(for: account, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.context.team = team
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
let certificate = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.fetchCertificate(for: team, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.context.certificate = certificate
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
let _ = try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.registerCurrentDevice(for: team, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.progress.completedUnitCount += 1
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.save(team) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
guard !self.isCancelled else { return self.finish(.failure(OperationError.cancelled)) }
|
||||||
|
|
||||||
|
try await withUnsafeThrowingContinuation { c in
|
||||||
|
self.cacheAppIDs(team: team, session: session) { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Keychain.shared.team = team
|
||||||
|
Keychain.shared.certificate = certificate
|
||||||
|
Keychain.shared.session = session
|
||||||
|
self.finish(.success((team, certificate, session)))
|
||||||
|
|
||||||
|
} catch {
|
||||||
|
self.finish(.failure(error))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -359,6 +375,29 @@ private extension AuthenticationOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let adsid = Keychain.shared.appleIDAdsid, let xcodeToken = Keychain.shared.appleIDXcodeToken {
|
||||||
|
Logger.sideload.notice("Authenticating Apple ID with tokens...")
|
||||||
|
let semaphore = DispatchSemaphore(value: 0)
|
||||||
|
var shouldContinue = true
|
||||||
|
Task {
|
||||||
|
defer {
|
||||||
|
semaphore.signal()
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
let (account, session) = try await self.authenticateWithToken(adsid: adsid, xcodeToken: xcodeToken)
|
||||||
|
completionHandler(.success((account, session)))
|
||||||
|
shouldContinue = false
|
||||||
|
} catch {
|
||||||
|
Logger.sideload.notice("Authentication failed with token. Fall back to email and password login: \(error)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
semaphore.wait()
|
||||||
|
if !shouldContinue {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let appleID = Keychain.shared.appleIDEmailAddress, let password = Keychain.shared.appleIDPassword
|
if let appleID = Keychain.shared.appleIDEmailAddress, let password = Keychain.shared.appleIDPassword
|
||||||
{
|
{
|
||||||
Logger.sideload.notice("Authenticating Apple ID...")
|
Logger.sideload.notice("Authenticating Apple ID...")
|
||||||
@@ -384,6 +423,25 @@ private extension AuthenticationOperation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func authenticateWithToken(adsid: String, xcodeToken: String) async throws -> (ALTAccount, ALTAppleAPISession) {
|
||||||
|
let anisetteData = try await withUnsafeThrowingContinuation { (c: UnsafeContinuation<ALTAnisetteData, any Error>) in
|
||||||
|
let fetchAnisetteDataOperation = FetchAnisetteDataOperation(context: self.context)
|
||||||
|
fetchAnisetteDataOperation.resultHandler = { (result) in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
self.operationQueue.addOperation(fetchAnisetteDataOperation)
|
||||||
|
}
|
||||||
|
|
||||||
|
let session = ALTAppleAPISession(dsid: adsid, authToken: xcodeToken, anisetteData: anisetteData)
|
||||||
|
let account = try await withUnsafeThrowingContinuation { (c: UnsafeContinuation<ALTAccount, any Error>) in
|
||||||
|
ALTAppleAPI.shared.fetchAccount2(session: session) { result in
|
||||||
|
c.resume(with: result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (account, session)
|
||||||
|
}
|
||||||
|
|
||||||
func authenticate(appleID: String, password: String, completionHandler: @escaping (Result<(ALTAccount, ALTAppleAPISession), Swift.Error>) -> Void)
|
func authenticate(appleID: String, password: String, completionHandler: @escaping (Result<(ALTAccount, ALTAppleAPISession), Swift.Error>) -> Void)
|
||||||
{
|
{
|
||||||
self.appleIDEmailAddress = appleID
|
self.appleIDEmailAddress = appleID
|
||||||
@@ -444,6 +502,8 @@ private extension AuthenticationOperation
|
|||||||
verificationHandler: verificationHandler) { (account, session, error) in
|
verificationHandler: verificationHandler) { (account, session, error) in
|
||||||
if let account = account, let session = session
|
if let account = account, let session = session
|
||||||
{
|
{
|
||||||
|
Keychain.shared.appleIDAdsid = session.dsid
|
||||||
|
Keychain.shared.appleIDXcodeToken = session.authToken
|
||||||
completionHandler(.success((account, session)))
|
completionHandler(.success((account, session)))
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -747,3 +807,30 @@ extension AuthenticationOperation
|
|||||||
self.submitCodeAction?.isEnabled = (textField.text ?? "").count == 6
|
self.submitCodeAction?.isEnabled = (textField.text ?? "").count == 6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extension ALTAppleAPI {
|
||||||
|
func fetchAccount2(session: ALTAppleAPISession, completionHandler: @escaping (Result<ALTAccount, Error>) -> Void)
|
||||||
|
{
|
||||||
|
let url = URL(string: "viewDeveloper.action", relativeTo: self.baseURL)!
|
||||||
|
|
||||||
|
self.sendRequest(with: url, additionalParameters: nil, session: session, team: nil) { (responseDictionary, requestError) in
|
||||||
|
do
|
||||||
|
{
|
||||||
|
guard let responseDictionary = responseDictionary else { throw requestError ?? ALTAppleAPIError.unknown() }
|
||||||
|
|
||||||
|
guard let account = try self.processResponse(responseDictionary, parseHandler: { () -> Any? in
|
||||||
|
guard let dictionary = responseDictionary["developer"] as? [String: Any] else { return nil }
|
||||||
|
let account = ALTAccount(responseDictionary: dictionary)
|
||||||
|
return account
|
||||||
|
}, resultCodeHandler: nil) as? ALTAccount else {
|
||||||
|
throw ALTAppleAPIError.unknown()
|
||||||
|
}
|
||||||
|
|
||||||
|
completionHandler(.success(account))
|
||||||
|
} catch {
|
||||||
|
completionHandler(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import UIKit
|
|||||||
import CoreData
|
import CoreData
|
||||||
|
|
||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
|
import EmotionalDamage
|
||||||
import minimuxer
|
import minimuxer
|
||||||
|
|
||||||
typealias RefreshError = RefreshErrorCode.Error
|
typealias RefreshError = RefreshErrorCode.Error
|
||||||
@@ -98,6 +99,10 @@ final class BackgroundRefreshAppsOperation: ResultOperation<[String: Result<Inst
|
|||||||
self.finish(.failure(RefreshError(.noInstalledApps)))
|
self.finish(.failure(RefreshError(.noInstalledApps)))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
||||||
|
}
|
||||||
target_minimuxer_address()
|
target_minimuxer_address()
|
||||||
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
let documentsDirectory = FileManager.default.documentsDirectory.absoluteString
|
||||||
do {
|
do {
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ struct OperationError: ALTLocalizedError {
|
|||||||
case .unknownResult: return NSLocalizedString("The operation returned an unknown result.", comment: "")
|
case .unknownResult: return NSLocalizedString("The operation returned an unknown result.", comment: "")
|
||||||
case .timedOut: return NSLocalizedString("The operation timed out.", comment: "")
|
case .timedOut: return NSLocalizedString("The operation timed out.", comment: "")
|
||||||
case .notAuthenticated: return NSLocalizedString("You are not signed in.", comment: "")
|
case .notAuthenticated: return NSLocalizedString("You are not signed in.", comment: "")
|
||||||
case .unknownUDID: return NSLocalizedString("SideStore could not determine this device's UDID.", comment: "")
|
case .unknownUDID: return NSLocalizedString("SideStore could not determine this device's UDID. Please replace your pairing using iloader.", comment: "")
|
||||||
case .invalidApp: return NSLocalizedString("The app is in an invalid format.", comment: "")
|
case .invalidApp: return NSLocalizedString("The app is in an invalid format.", comment: "")
|
||||||
case .maximumAppIDLimitReached: return NSLocalizedString("Cannot register more than 10 App IDs within a 7 day period.", comment: "")
|
case .maximumAppIDLimitReached: return NSLocalizedString("Cannot register more than 10 App IDs within a 7 day period.", comment: "")
|
||||||
case .noSources: return NSLocalizedString("There are no SideStore sources.", comment: "")
|
case .noSources: return NSLocalizedString("There are no SideStore sources.", comment: "")
|
||||||
@@ -220,16 +220,16 @@ struct OperationError: ALTLocalizedError {
|
|||||||
case .openAppFailed:
|
case .openAppFailed:
|
||||||
let appName = self.appName ?? NSLocalizedString("The app", comment: "")
|
let appName = self.appName ?? NSLocalizedString("The app", comment: "")
|
||||||
return String(format: NSLocalizedString("SideStore was denied permission to launch %@.", comment: ""), appName)
|
return String(format: NSLocalizedString("SideStore was denied permission to launch %@.", comment: ""), appName)
|
||||||
case .noWiFi: return NSLocalizedString("You do not appear to be connected to WiFi and/or StosVPN!\nSideStore will never be able to install or refresh applications without WiFi and the StosVPN.", comment: "")
|
case .noWiFi: return NSLocalizedString("You do not appear to be connected to Wi-Fi and/or LocalDevVPN!\nSideStore cannot install or refresh applications without Wi-Fi and LocalDevVPN. If both are connected, replace your pairing with iloader.", comment: "")
|
||||||
case .tooNewError: return NSLocalizedString("iOS 17 has changed how JIT is enabled therefore SideStore cannot enable it without SideJITServer at this time, sorry for any inconvenience.\nWe will let everyone know once we have a solution!", comment: "")
|
case .tooNewError: return NSLocalizedString("iOS 17.0-17.3.1 changed how JIT is enabled so SideStore cannot enable JIT without SideJITServer on these versions, sorry for any inconvenience.", comment: "")
|
||||||
case .unableToConnectSideJIT: return NSLocalizedString("Unable to connect to SideJITServer Please check that you are on the Same Wi-Fi and your Firewall has been set correctly", comment: "")
|
case .unableToConnectSideJIT: return NSLocalizedString("Unable to connect to SideJITServer. Please check that you are on the same Wi-Fi of and your Firewall has been set correctly on your server.", comment: "")
|
||||||
case .unableToRespondSideJITDevice: return NSLocalizedString("SideJITServer is unable to connect to your iDevice Please make sure you have paired your Device by doing 'SideJITServer -y' or try Refreshing SideJITServer from Settings", comment: "")
|
case .unableToRespondSideJITDevice: return NSLocalizedString("SideJITServer is unable to connect to your iDevice. Please make sure you have paired your iDevice by running 'SideJITServer -y', or try refreshing SideJITServer from Settings.", comment: "")
|
||||||
case .wrongSideJITIP: return NSLocalizedString("Incorrect SideJITServer IP Please make sure that you are on the Samw Wifi as SideJITServer", comment: "")
|
case .wrongSideJITIP: return NSLocalizedString("Incorrect SideJITServer IP. Please make sure that you are on the same Wi-Fi as SideJITServer", comment: "")
|
||||||
case .refreshsidejit: return NSLocalizedString("Unable to find App Please try Refreshing SideJITServer from Settings", comment: "")
|
case .refreshsidejit: return NSLocalizedString("Unable to find app; Please try refreshing SideJITServer from Settings.", comment: "")
|
||||||
case .anisetteV1Error: return NSLocalizedString("An error occurred when getting anisette data from a V1 server: %@. Try using another anisette server.", comment: "")
|
case .anisetteV1Error: return NSLocalizedString("An error occurred while getting anisette data from a V1 server: %@. Try using another anisette server.", comment: "")
|
||||||
case .provisioningError: return NSLocalizedString("An error occurred when provisioning: %@ %@. Please try again. If the issue persists, report it on GitHub Issues!", comment: "")
|
case .provisioningError: return NSLocalizedString("An error occurred while provisioning: %@ %@. Please try again. If the issue persists, report it on GitHub Issues!", comment: "")
|
||||||
case .anisetteV3Error: return NSLocalizedString("An error occurred when getting anisette data from a V3 server: %@. Please try again. If the issue persists, report it on GitHub Issues!", comment: "")
|
case .anisetteV3Error: return NSLocalizedString("An error occurred while getting anisette data from a V3 server: %@. Please try again. If the issue persists, report it on GitHub Issues!", comment: "")
|
||||||
case .cacheClearError: return NSLocalizedString("An error occurred while clearing cache: %@", comment: "")
|
case .cacheClearError: return NSLocalizedString("An error occurred while clearing the cache: %@", comment: "")
|
||||||
case .SideJITIssue: return NSLocalizedString("An error occurred while using SideJIT: %@", comment: "")
|
case .SideJITIssue: return NSLocalizedString("An error occurred while using SideJIT: %@", comment: "")
|
||||||
|
|
||||||
case .refreshAppFailed:
|
case .refreshAppFailed:
|
||||||
@@ -260,7 +260,7 @@ struct OperationError: ALTLocalizedError {
|
|||||||
var recoverySuggestion: String? {
|
var recoverySuggestion: String? {
|
||||||
switch self.code
|
switch self.code
|
||||||
{
|
{
|
||||||
case .noWiFi: return NSLocalizedString("Make sure the VPN is toggled on and you are connected to any WiFi network!", comment: "")
|
case .noWiFi: return NSLocalizedString("Make sure LocalDevVPN is connected and that you are connected to any Wi-Fi network!", comment: "")
|
||||||
case .serverNotFound: return NSLocalizedString("Make sure you're on the same Wi-Fi network as a computer running AltServer, or try connecting this device to your computer via USB.", comment: "")
|
case .serverNotFound: return NSLocalizedString("Make sure you're on the same Wi-Fi network as a computer running AltServer, or try connecting this device to your computer via USB.", comment: "")
|
||||||
case .maximumAppIDLimitReached:
|
case .maximumAppIDLimitReached:
|
||||||
let baseMessage = NSLocalizedString("Delete sideloaded apps to free up App ID slots.", comment: "")
|
let baseMessage = NSLocalizedString("Delete sideloaded apps to free up App ID slots.", comment: "")
|
||||||
@@ -308,9 +308,9 @@ extension MinimuxerError: LocalizedError {
|
|||||||
case .NoDevice:
|
case .NoDevice:
|
||||||
return NSLocalizedString("Cannot fetch the device from the muxer", comment: "")
|
return NSLocalizedString("Cannot fetch the device from the muxer", comment: "")
|
||||||
case .NoConnection:
|
case .NoConnection:
|
||||||
return NSLocalizedString("Unable to connect to the device, make sure StosVPN is enabled and you're connected to WiFi. This could mean an invalid pairing.", comment: "")
|
return NSLocalizedString("Unable to connect to the device, make sure LocalDevVPN is enabled and you're connected to Wi-Fi. This could mean an invalid pairing.", comment: "")
|
||||||
case .PairingFile:
|
case .PairingFile:
|
||||||
return NSLocalizedString("Invalid pairing file. Your pairing file either didn't have a UDID, or it wasn't a valid plist. Please use idevice_pair to regenerate it", comment: "")
|
return NSLocalizedString("Invalid pairing file. Your pairing file either didn't have a UDID, or it wasn't a valid plist. Please use iloader to replace it.", comment: "")
|
||||||
|
|
||||||
case .CreateDebug:
|
case .CreateDebug:
|
||||||
return self.createService(name: "debug")
|
return self.createService(name: "debug")
|
||||||
@@ -338,7 +338,7 @@ extension MinimuxerError: LocalizedError {
|
|||||||
case .CreateAfc:
|
case .CreateAfc:
|
||||||
return self.createService(name: "AFC")
|
return self.createService(name: "AFC")
|
||||||
case .RwAfc:
|
case .RwAfc:
|
||||||
return NSLocalizedString("AFC was unable to manage files on the device. This usually means an invalid pairing.", comment: "")
|
return NSLocalizedString("AFC was unable to manage files on the device. Ensure Wi-Fi and LocalDevVPN are connected. If they both are, replace your pairing using iloader.", comment: "")
|
||||||
case .InstallApp(let message):
|
case .InstallApp(let message):
|
||||||
return NSLocalizedString("Unable to install the app: \(message.toString())", comment: "")
|
return NSLocalizedString("Unable to install the app: \(message.toString())", comment: "")
|
||||||
case .UninstallApp:
|
case .UninstallApp:
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ final class FetchAnisetteDataOperation: ResultOperation<ALTAnisetteData>, WebSoc
|
|||||||
let formatter = DateFormatter()
|
let formatter = DateFormatter()
|
||||||
formatter.locale = Locale(identifier: "en_US_POSIX")
|
formatter.locale = Locale(identifier: "en_US_POSIX")
|
||||||
formatter.calendar = Calendar(identifier: .gregorian)
|
formatter.calendar = Calendar(identifier: .gregorian)
|
||||||
formatter.timeZone = TimeZone.current
|
formatter.timeZone = TimeZone.init(secondsFromGMT: 0)
|
||||||
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
|
||||||
let dateString = formatter.string(from: Date())
|
let dateString = formatter.string(from: Date())
|
||||||
formattedJSON["date"] = dateString
|
formattedJSON["date"] = dateString
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
import AltStoreCore
|
import AltStoreCore
|
||||||
|
import EmotionalDamage
|
||||||
|
|
||||||
@available(iOS 13, *)
|
@available(iOS 13, *)
|
||||||
final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
||||||
@@ -39,7 +40,10 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
|||||||
guard DatabaseManager.shared.isStarted else { return }
|
guard DatabaseManager.shared.isStarted else { return }
|
||||||
|
|
||||||
AppManager.shared.update()
|
AppManager.shared.update()
|
||||||
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
start_em_proxy(bind_addr: Consts.Proxy.serverURL)
|
||||||
|
}
|
||||||
|
|
||||||
PatreonAPI.shared.refreshPatreonAccount()
|
PatreonAPI.shared.refreshPatreonAccount()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +58,9 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate
|
|||||||
// Make sure to update AppDelegate.applicationDidEnterBackground() as well.
|
// Make sure to update AppDelegate.applicationDidEnterBackground() as well.
|
||||||
|
|
||||||
// TODO: @mahee96: find if we need to stop em_proxy as in altstore?
|
// TODO: @mahee96: find if we need to stop em_proxy as in altstore?
|
||||||
// stop_em_proxy()
|
if UserDefaults.standard.enableEMPforWireguard {
|
||||||
|
stop_em_proxy()
|
||||||
|
}
|
||||||
|
|
||||||
guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return }
|
guard let oneMonthAgo = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else { return }
|
||||||
|
|
||||||
|
|||||||
@@ -380,13 +380,8 @@ private extension ErrorLogViewController
|
|||||||
|
|
||||||
func searchFAQ(for loggedError: LoggedError)
|
func searchFAQ(for loggedError: LoggedError)
|
||||||
{
|
{
|
||||||
let baseURL = URL(string: "https://faq.altstore.io/getting-started/error-codes")!
|
let staticURL = URL(string: "https://docs.sidestore.io/docs/troubleshooting/error-codes")!
|
||||||
var components = URLComponents(url: baseURL, resolvingAgainstBaseURL: false)!
|
let safariViewController = SFSafariViewController(url: staticURL)
|
||||||
|
|
||||||
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
|
safariViewController.preferredControlTintColor = .altPrimary
|
||||||
self.present(safariViewController, animated: true)
|
self.present(safariViewController, animated: true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ final class AboutPatreonHeaderView: UICollectionReusableView
|
|||||||
imageView.layer.cornerRadius = imageView.bounds.midY
|
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.clipsToBounds = true
|
||||||
button.layer.cornerRadius = 16
|
button.layer.cornerRadius = 16
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="5Rz-4h-jJ8">
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="24412" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="5Rz-4h-jJ8">
|
||||||
<device id="retina6_3" orientation="portrait" appearance="light"/>
|
<device id="retina6_3" orientation="portrait" appearance="light"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24405"/>
|
||||||
<capability name="Image references" minToolsVersion="12.0"/>
|
<capability name="Image references" minToolsVersion="12.0"/>
|
||||||
<capability name="Named colors" minToolsVersion="9.0"/>
|
<capability name="Named colors" minToolsVersion="9.0"/>
|
||||||
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="separatorColor" white="1" alpha="0.25" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<stackView key="tableFooterView" opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalCentering" alignment="center" spacing="15" id="48g-cT-stR">
|
<stackView key="tableFooterView" opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalCentering" alignment="center" spacing="15" id="48g-cT-stR">
|
||||||
<rect key="frame" x="0.0" y="2040.3333358764648" width="402" height="125"/>
|
<rect key="frame" x="0.0" y="2352.3333301544189" width="402" height="125"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="900" text="Follow SideStore for updates" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XFa-MY-7cV">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="900" text="Follow SideStore for updates" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="XFa-MY-7cV">
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
<tableViewSection headerTitle="" id="flW-d4-bco">
|
<tableViewSection headerTitle="" id="flW-d4-bco">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="7lu-Yk-87t" rowHeight="51" style="IBUITableViewCellStyleDefault" id="DzJ-TL-jvR" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="7lu-Yk-87t" rowHeight="51" style="IBUITableViewCellStyleDefault" id="DzJ-TL-jvR" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="22.333333969116211" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="17.666666030883789" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="DzJ-TL-jvR" id="XnZ-bO-peM">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="DzJ-TL-jvR" id="XnZ-bO-peM">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -134,7 +134,7 @@
|
|||||||
<tableViewSection headerTitle="" id="CAI-9J-8fR">
|
<tableViewSection headerTitle="" id="CAI-9J-8fR">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="xvY-lN-Toz" detailTextLabel="CnN-M1-AYK" rowHeight="51" style="IBUITableViewCellStyleValue1" id="kCH-yh-bMk" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="xvY-lN-Toz" detailTextLabel="CnN-M1-AYK" rowHeight="51" style="IBUITableViewCellStyleValue1" id="kCH-yh-bMk" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="113.66666793823242" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="104.33333206176758" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="kCH-yh-bMk" id="MQ9-Qn-bWg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="kCH-yh-bMk" id="MQ9-Qn-bWg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="rAc-lQ-B1k" detailTextLabel="0uP-Cd-tNX" rowHeight="51" style="IBUITableViewCellStyleValue1" id="q11-3k-oIm" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="rAc-lQ-B1k" detailTextLabel="0uP-Cd-tNX" rowHeight="51" style="IBUITableViewCellStyleValue1" id="q11-3k-oIm" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="164.66666793823242" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="155.33333206176758" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="q11-3k-oIm" id="QCY-a8-Lhx">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="q11-3k-oIm" id="QCY-a8-Lhx">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -198,7 +198,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="Sge-cM-Fw9" detailTextLabel="434-MW-Den" rowHeight="51" style="IBUITableViewCellStyleValue1" id="vuc-eX-w3f" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="Sge-cM-Fw9" detailTextLabel="434-MW-Den" rowHeight="51" style="IBUITableViewCellStyleValue1" id="vuc-eX-w3f" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="215.66666793823242" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="206.33333206176758" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="vuc-eX-w3f" id="wpD-YB-mrf">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="vuc-eX-w3f" id="wpD-YB-mrf">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -234,7 +234,7 @@
|
|||||||
<tableViewSection id="YHi-gR-wed">
|
<tableViewSection id="YHi-gR-wed">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="R1C-Gr-xD4" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="R1C-Gr-xD4" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="302.66666793823242" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="293.33333206176758" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="R1C-Gr-xD4" id="Ojx-7f-z7E">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="R1C-Gr-xD4" id="Ojx-7f-z7E">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -275,7 +275,7 @@
|
|||||||
<tableViewSection id="RpS-Hn-sQU">
|
<tableViewSection id="RpS-Hn-sQU">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="9dU-Hl-NiJ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="9dU-Hl-NiJ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="389.66666793823242" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="380.33333206176758" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9dU-Hl-NiJ" id="w62-f1-Ody">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9dU-Hl-NiJ" id="w62-f1-Ody">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -316,7 +316,7 @@
|
|||||||
<tableViewSection headerTitle="" id="2dM-lg-cRI">
|
<tableViewSection headerTitle="" id="2dM-lg-cRI">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Rra-U5-kCd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Rra-U5-kCd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="481.00000190734863" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="466.99999809265137" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Rra-U5-kCd" id="8gV-kx-lGe">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Rra-U5-kCd" id="8gV-kx-lGe">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -329,7 +329,7 @@
|
|||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DPu-zD-Als">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DPu-zD-Als">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleIsBackgroundRefreshEnabled:" destination="aMk-Xp-UL8" eventType="valueChanged" id="gK5-Wr-8Hh"/>
|
<action selector="toggleIsBackgroundRefreshEnabled:" destination="aMk-Xp-UL8" eventType="valueChanged" id="gK5-Wr-8Hh"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -350,8 +350,43 @@
|
|||||||
</userDefinedRuntimeAttribute>
|
</userDefinedRuntimeAttribute>
|
||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7rt-MT-kFH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="517.99999809265137" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7rt-MT-kFH" id="mZL-UA-6V0">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable EMP for wireguard" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZH7-ZA-Epf" userLabel="Enable EMP for wireguard">
|
||||||
|
<rect key="frame" x="30" y="15.333333333333334" width="209" height="20.333333333333329"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8qE-hE-Ujn">
|
||||||
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="toggleEnableEMPforWireguard:" destination="aMk-Xp-UL8" eventType="valueChanged" id="B0Q-Jb-fox"/>
|
||||||
|
</connections>
|
||||||
|
</switch>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="trailingMargin" secondItem="8qE-hE-Ujn" secondAttribute="trailing" id="KgO-N1-7Bw"/>
|
||||||
|
<constraint firstItem="ZH7-ZA-Epf" firstAttribute="leading" secondItem="mZL-UA-6V0" secondAttribute="leadingMargin" id="MBP-lj-8f5"/>
|
||||||
|
<constraint firstItem="ZH7-ZA-Epf" firstAttribute="centerY" secondItem="mZL-UA-6V0" secondAttribute="centerY" id="Pht-1f-5K3"/>
|
||||||
|
<constraint firstItem="8qE-hE-Ujn" firstAttribute="centerY" secondItem="mZL-UA-6V0" secondAttribute="centerY" id="vhM-Am-Jpo"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
|
<integer key="value" value="2"/>
|
||||||
|
</userDefinedRuntimeAttribute>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="GYp-O0-pse" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="GYp-O0-pse" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="532.00000190734863" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="568.99999809265137" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="GYp-O0-pse" id="vDG-ZV-xRS">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="GYp-O0-pse" id="vDG-ZV-xRS">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -364,7 +399,7 @@
|
|||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="iQA-wm-5ag">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="iQA-wm-5ag">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleNoIdleTimeoutEnabled:" destination="aMk-Xp-UL8" eventType="valueChanged" id="WSl-Jc-g5J"/>
|
<action selector="toggleNoIdleTimeoutEnabled:" destination="aMk-Xp-UL8" eventType="valueChanged" id="WSl-Jc-g5J"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -386,7 +421,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="amC-sE-8O0" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="amC-sE-8O0" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="583.00000190734863" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="619.99999809265137" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="amC-sE-8O0" id="GEO-2e-E4k">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="amC-sE-8O0" id="GEO-2e-E4k">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -414,7 +449,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7PQ-AW-GcV" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7PQ-AW-GcV" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="634.00000190734863" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="670.99999809265137" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7PQ-AW-GcV" id="wQ8-9w-iiw">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7PQ-AW-GcV" id="wQ8-9w-iiw">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -427,7 +462,7 @@
|
|||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1aa-og-ZXD">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1aa-og-ZXD">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleDisableAppLimit:" destination="aMk-Xp-UL8" eventType="valueChanged" id="zYc-B2-JPg"/>
|
<action selector="toggleDisableAppLimit:" destination="aMk-Xp-UL8" eventType="valueChanged" id="zYc-B2-JPg"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -453,7 +488,7 @@
|
|||||||
<tableViewSection headerTitle="" id="eHy-qI-w5w">
|
<tableViewSection headerTitle="" id="eHy-qI-w5w">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="30h-59-88f" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="30h-59-88f" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="725.33333587646484" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="757.66666412353516" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="30h-59-88f" id="7qD-DW-Jls">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="30h-59-88f" id="7qD-DW-Jls">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -494,19 +529,19 @@
|
|||||||
<tableViewSection id="1fc-f1-ALD">
|
<tableViewSection id="1fc-f1-ALD">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7Ek-Ls-QVO" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="7Ek-Ls-QVO" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="812.33333587646484" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="844.66666412353516" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7Ek-Ls-QVO" id="KjD-M3-oNg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="7Ek-Ls-QVO" id="KjD-M3-oNg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="View Error Log" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vH6-7i-tCE">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="View Error Log" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="vH6-7i-tCE">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="119" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="119" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AeT-qF-bwB">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="AeT-qF-bwB">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -531,13 +566,13 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hFh-X1-ZAi" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hFh-X1-ZAi" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="863.33333587646484" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="895.66666412353516" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hFh-X1-ZAi" id="nCs-Ro-A6t">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hFh-X1-ZAi" id="nCs-Ro-A6t">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Clear Cache…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j4e-Mz-DlL">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Clear Cache…" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="j4e-Mz-DlL">
|
||||||
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="114.33333333333331" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999993" y="15.333333333333334" width="114.33333333333331" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -563,28 +598,28 @@
|
|||||||
<tableViewSection headerTitle="" id="J90-vn-u2O">
|
<tableViewSection headerTitle="" id="J90-vn-u2O">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="i4T-2q-jF3" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="i4T-2q-jF3" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="954.66666984558105" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="982.33333015441895" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="i4T-2q-jF3" id="VTQ-H4-aCM">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="i4T-2q-jF3" id="VTQ-H4-aCM">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Developers" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hRA-OK-Vjw">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Developers" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hRA-OK-Vjw">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="86" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="86" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="0.80000000000000004" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" ambiguous="YES" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="lx9-35-OSk">
|
<stackView opaque="NO" contentMode="scaleToFill" spacing="14" translatesAutoresizingMaskIntoConstraints="NO" id="lx9-35-OSk">
|
||||||
<rect key="frame" x="217" y="15.333333333333336" width="155" height="20.333333333333329"/>
|
<rect key="frame" x="217" y="15.333333333333334" width="155" height="20.333333333333329"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="SideStore Team" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAA-iZ-VGb">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="SideStore Team" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JAA-iZ-VGb">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="125.33333333333333" height="20.333333333333332"/>
|
<rect key="frame" x="0.0" y="0.0" width="125.33333333333333" height="20.333333333333332"/>
|
||||||
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mmj-3V-fTb">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Mmj-3V-fTb">
|
||||||
<rect key="frame" x="139.33333333333331" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
<rect key="frame" x="139.33333333333331" y="-1" width="15.666666666666657" height="22.333333333333332"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -608,7 +643,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="oHX-oR-nwJ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="oHX-oR-nwJ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1005.6666698455811" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1033.3333301544189" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="oHX-oR-nwJ" id="hN4-i5-igu">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="oHX-oR-nwJ" id="hN4-i5-igu">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -653,7 +688,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="0MT-ht-Sit" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="0MT-ht-Sit" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1056.6666698455811" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1084.3333301544189" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0MT-ht-Sit" id="OZp-WM-5H7">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="0MT-ht-Sit" id="OZp-WM-5H7">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -698,7 +733,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="O5R-Al-lGj" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="O5R-Al-lGj" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1107.6666698455811" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1135.3333301544189" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="O5R-Al-lGj" id="CrG-Mr-xQq">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="O5R-Al-lGj" id="CrG-Mr-xQq">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -739,7 +774,7 @@
|
|||||||
<tableViewSection headerTitle="" id="OMa-EK-hRI">
|
<tableViewSection headerTitle="" id="OMa-EK-hRI">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="FMZ-as-Ljo" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="FMZ-as-Ljo" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1199.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1221.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="FMZ-as-Ljo" id="JzL-Of-A3T">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="FMZ-as-Ljo" id="JzL-Of-A3T">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -773,7 +808,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Qca-pU-sJh" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Qca-pU-sJh" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1250.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1272.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Qca-pU-sJh" id="QtU-8J-VQN">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Qca-pU-sJh" id="QtU-8J-VQN">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -810,7 +845,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VrV-qI-zXF" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VrV-qI-zXF" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1301.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1323.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VrV-qI-zXF" id="w1r-uY-4pD">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VrV-qI-zXF" id="w1r-uY-4pD">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -844,7 +879,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VNn-u4-cN8" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="VNn-u4-cN8" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1352.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1374.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VNn-u4-cN8" id="4bh-qe-l2N">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VNn-u4-cN8" id="4bh-qe-l2N">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -878,7 +913,7 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="e7s-hL-kv9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="e7s-hL-kv9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1403.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1425.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="e7s-hL-kv9" id="yjL-Mu-HTk">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="e7s-hL-kv9" id="yjL-Mu-HTk">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
@@ -912,20 +947,20 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="XW5-Zc-nXH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="XW5-Zc-nXH" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1454.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1476.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="XW5-Zc-nXH" id="AtM-bL-8pS">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="XW5-Zc-nXH" id="AtM-bL-8pS">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable Beta Updates" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2px-HD-0UT">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Enable Beta Updates" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2px-HD-0UT">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="169" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="169" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="e32-w4-5fk">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="e32-w4-5fk">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleEnableBetaUpdates:" destination="aMk-Xp-UL8" eventType="valueChanged" id="uxG-df-7GK"/>
|
<action selector="toggleEnableBetaUpdates:" destination="aMk-Xp-UL8" eventType="valueChanged" id="uxG-df-7GK"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -947,19 +982,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qbY-8c-LYT" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qbY-8c-LYT" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1505.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1527.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qbY-8c-LYT" id="NxK-qB-w7Q">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qbY-8c-LYT" id="NxK-qB-w7Q">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Beta Updates Track" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5J9-vR-vhX" userLabel="Beta Track Label">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Beta Updates Track" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5J9-vR-vhX" userLabel="Beta Track Label">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="159.66666666666666" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="159.66666666666666" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<button opaque="NO" contentMode="scaleToFill" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="right" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" changesSelectionAsPrimaryAction="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oct-iT-NwP" userLabel="Beta Track Drop Down Button">
|
<button opaque="NO" contentMode="scaleToFill" ambiguous="YES" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="right" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" changesSelectionAsPrimaryAction="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Oct-iT-NwP" userLabel="Beta Track Drop Down Button">
|
||||||
<rect key="frame" x="301.66666666666669" y="8.3333333333333321" width="70.333333333333314" height="34.333333333333343"/>
|
<rect key="frame" x="301.66666666666669" y="8.3333333333333321" width="70.333333333333314" height="34.333333333333343"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="new-width-constraint"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="new-width-constraint"/>
|
||||||
@@ -987,14 +1022,70 @@
|
|||||||
</tableViewSection>
|
</tableViewSection>
|
||||||
<tableViewSection id="ZhW-yK-wdJ">
|
<tableViewSection id="ZhW-yK-wdJ">
|
||||||
<cells>
|
<cells>
|
||||||
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="qjD-UK-myl" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="1614.9999961853027" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qjD-UK-myl" id="bcu-KT-Xee">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Import Account..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jts-UA-M8d">
|
||||||
|
<rect key="frame" x="30" y="15.333333333333334" width="143" height="20.333333333333329"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="jts-UA-M8d" firstAttribute="centerY" secondItem="bcu-KT-Xee" secondAttribute="centerY" id="9Wq-8a-v4s"/>
|
||||||
|
<constraint firstItem="jts-UA-M8d" firstAttribute="leading" secondItem="bcu-KT-Xee" secondAttribute="leadingMargin" id="rTG-U2-MOH"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
|
<integer key="value" value="1"/>
|
||||||
|
</userDefinedRuntimeAttribute>
|
||||||
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</tableViewCell>
|
||||||
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dNh-fp-vBs" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
|
<rect key="frame" x="0.0" y="1665.9999961853027" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dNh-fp-vBs" id="Meb-tV-6br">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Export Account..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uHg-iq-d36">
|
||||||
|
<rect key="frame" x="30" y="15.333333333333334" width="142.33333333333334" height="20.333333333333329"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="uHg-iq-d36" firstAttribute="leading" secondItem="Meb-tV-6br" secondAttribute="leadingMargin" id="P8L-Yt-APv"/>
|
||||||
|
<constraint firstItem="uHg-iq-d36" firstAttribute="centerY" secondItem="Meb-tV-6br" secondAttribute="centerY" id="bkY-rp-t3t"/>
|
||||||
|
</constraints>
|
||||||
|
</tableViewCellContentView>
|
||||||
|
<color key="backgroundColor" white="1" alpha="0.14999999999999999" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
|
<userDefinedRuntimeAttributes>
|
||||||
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
|
<integer key="value" value="2"/>
|
||||||
|
</userDefinedRuntimeAttribute>
|
||||||
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
|
</userDefinedRuntimeAttributes>
|
||||||
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Y6h-Bo-yec" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="Y6h-Bo-yec" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1592.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1716.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Y6h-Bo-yec" id="4Jf-I6-v7z">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Y6h-Bo-yec" id="4Jf-I6-v7z">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Import Signing Certificate..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rv6-S1-2gw">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Import Signing Certificate..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rv6-S1-2gw">
|
||||||
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="227.33333333333337" height="20.333333333333329"/>
|
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="227.33333333333337" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -1010,19 +1101,19 @@
|
|||||||
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
<userDefinedRuntimeAttributes>
|
<userDefinedRuntimeAttributes>
|
||||||
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
<userDefinedRuntimeAttribute type="number" keyPath="style">
|
||||||
<integer key="value" value="1"/>
|
<integer key="value" value="2"/>
|
||||||
</userDefinedRuntimeAttribute>
|
</userDefinedRuntimeAttribute>
|
||||||
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
<userDefinedRuntimeAttribute type="boolean" keyPath="isSelectable" value="YES"/>
|
||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dLk-d6-X4T" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="dLk-d6-X4T" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1643.0000038146973" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1767.9999961853027" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dLk-d6-X4T" id="Okl-3m-rde">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="dLk-d6-X4T" id="Okl-3m-rde">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Export Signing Certificate..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WPe-mj-W7t">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Export Signing Certificate..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WPe-mj-W7t">
|
||||||
<rect key="frame" x="29.999999999999986" y="15.333333333333334" width="226.66666666666663" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999986" y="15.333333333333334" width="226.66666666666663" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -1048,20 +1139,20 @@
|
|||||||
<tableViewSection headerTitle="" id="lLQ-K0-XSb">
|
<tableViewSection headerTitle="" id="lLQ-K0-XSb">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="daQ-mk-yqC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="daQ-mk-yqC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1734.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1854.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="daQ-mk-yqC" id="ZkW-ZR-twy">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="daQ-mk-yqC" id="ZkW-ZR-twy">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Disable Response Caching" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jFh-36-AP2">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Disable Response Caching" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jFh-36-AP2">
|
||||||
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="215.33333333333337" height="20.333333333333329"/>
|
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="215.33333333333337" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AAh-cu-qw8">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="AAh-cu-qw8">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleDisableResponseCaching:" destination="aMk-Xp-UL8" eventType="valueChanged" id="lCm-qi-piH"/>
|
<action selector="toggleDisableResponseCaching:" destination="aMk-Xp-UL8" eventType="valueChanged" id="lCm-qi-piH"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -1083,20 +1174,20 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hRP-jU-2hd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="hRP-jU-2hd" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1785.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1905.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hRP-jU-2hd" id="JhE-O4-pRg">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="hRP-jU-2hd" id="JhE-O4-pRg">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Export Resigned Apps" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d5F-bf-6kB">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Export Resigned Apps" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="d5F-bf-6kB">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="180" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="180" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="GYP-qn-wzh">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="GYP-qn-wzh">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleResignedAppExport:" destination="aMk-Xp-UL8" eventType="valueChanged" id="Z1k-xh-sjD"/>
|
<action selector="toggleResignedAppExport:" destination="aMk-Xp-UL8" eventType="valueChanged" id="Z1k-xh-sjD"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -1118,20 +1209,20 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="JoN-Aj-XtZ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="JoN-Aj-XtZ" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1836.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="1956.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JoN-Aj-XtZ" id="v8Q-VQ-Q1h">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="JoN-Aj-XtZ" id="v8Q-VQ-Q1h">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Enable Verbose Ops Logging" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7bz-tI-tLY">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Enable Verbose Ops Logging" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7bz-tI-tLY">
|
||||||
<rect key="frame" x="29.999999999999986" y="15.333333333333334" width="232.66666666666663" height="20.333333333333329"/>
|
<rect key="frame" x="29.999999999999986" y="15.333333333333334" width="232.66666666666663" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Q5X-Mo-KpE">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Q5X-Mo-KpE">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="311" y="11.666666666666664" width="63" height="28"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleVerboseOperationsLogging:" destination="aMk-Xp-UL8" eventType="valueChanged" id="n9N-Gt-OY2"/>
|
<action selector="toggleVerboseOperationsLogging:" destination="aMk-Xp-UL8" eventType="valueChanged" id="n9N-Gt-OY2"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -1153,13 +1244,13 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="QOO-bO-4M5" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="QOO-bO-4M5" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1887.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2007.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QOO-bO-4M5" id="VTT-z5-C89">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="QOO-bO-4M5" id="VTT-z5-C89">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Export Database..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ho1-To-wve" userLabel="Export Database">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Export Database..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ho1-To-wve" userLabel="Export Database">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="151.66666666666666" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="151.66666666666666" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -1181,13 +1272,13 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="ToB-H7-2lR" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="ToB-H7-2lR" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1938.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2058.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ToB-H7-2lR" id="Acf-xV-Isn">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="ToB-H7-2lR" id="Acf-xV-Isn">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Delete Database..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CcF-9x-Eu8" userLabel="Delete Database Label">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Delete Database..." textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CcF-9x-Eu8" userLabel="Delete Database Label">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="150.33333333333334" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="150.33333333333334" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
@@ -1209,19 +1300,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="xtI-eU-LFb" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="xtI-eU-LFb" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="1989.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2109.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xtI-eU-LFb" id="bc9-41-6mE">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xtI-eU-LFb" id="bc9-41-6mE">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Operations Logging Control" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LW3-gm-lj5">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Operations Logging Control" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="LW3-gm-lj5">
|
||||||
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="224.33333333333337" height="20.333333333333329"/>
|
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="224.33333333333337" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="zl4-ti-HTW">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zl4-ti-HTW">
|
||||||
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
<rect key="frame" x="356.33333333333331" y="14.333333333333334" width="15.666666666666686" height="22.333333333333329"/>
|
||||||
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
<imageReference key="image" image="chevron.right" catalog="system" symbolScale="large"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
@@ -1243,19 +1334,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="pvu-IV-Poa" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="pvu-IV-Poa" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2040.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2160.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="pvu-IV-Poa" id="zck-an-8cK">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="pvu-IV-Poa" id="zck-an-8cK">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Recreate Database on Next Start" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZRk-8S-kBQ" userLabel="Recreate Database Label">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Recreate Database on Next Start" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZRk-8S-kBQ" userLabel="Recreate Database Label">
|
||||||
<rect key="frame" x="30" y="15.333333333333334" width="265.33333333333331" height="20.333333333333329"/>
|
<rect key="frame" x="30" y="15.333333333333334" width="265.33333333333331" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uGv-Lb-Ita" userLabel="Recreate DB switch">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uGv-Lb-Ita" userLabel="Recreate DB switch">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleRecreateDatabaseSwitch:" destination="aMk-Xp-UL8" eventType="valueChanged" id="vlf-Iz-kWr"/>
|
<action selector="toggleRecreateDatabaseSwitch:" destination="aMk-Xp-UL8" eventType="valueChanged" id="vlf-Iz-kWr"/>
|
||||||
@@ -1278,19 +1369,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="9By-QW-Jw9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="9By-QW-Jw9" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2091.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2211.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9By-QW-Jw9" id="Dzq-gE-zyT">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="9By-QW-Jw9" id="Dzq-gE-zyT">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Minimuxer Console Logging" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jW6-pb-xdP">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Minimuxer Console Logging" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jW6-pb-xdP">
|
||||||
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="225.33333333333337" height="20.333333333333329"/>
|
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="225.33333333333337" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="os8-7F-rSm" userLabel="Minimuxer logging Switch">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="os8-7F-rSm" userLabel="Minimuxer logging Switch">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleMinimuxerConsoleLogging:" destination="aMk-Xp-UL8" eventType="valueChanged" id="d0C-kx-aFV"/>
|
<action selector="toggleMinimuxerConsoleLogging:" destination="aMk-Xp-UL8" eventType="valueChanged" id="d0C-kx-aFV"/>
|
||||||
@@ -1313,19 +1404,19 @@
|
|||||||
</userDefinedRuntimeAttributes>
|
</userDefinedRuntimeAttributes>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="LzP-Qb-bmC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" rowHeight="51" id="LzP-Qb-bmC" customClass="InsetGroupTableViewCell" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="2142.3333377838135" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="2262.6666622161865" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LzP-Qb-bmC" id="3rE-h0-8kb">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="LzP-Qb-bmC" id="3rE-h0-8kb">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="51"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Minimuxer Status Check" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3BY-c1-QEV" userLabel="Minimuxer Status Check">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" text="Minimuxer Status Check" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3BY-c1-QEV" userLabel="Minimuxer Status Check">
|
||||||
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="198.33333333333337" height="20.333333333333329"/>
|
<rect key="frame" x="30.000000000000014" y="15.333333333333334" width="198.33333333333337" height="20.333333333333329"/>
|
||||||
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
|
||||||
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="AB6-Ok-Faf" userLabel="Minimuxer Check Switch">
|
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" ambiguous="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="AB6-Ok-Faf" userLabel="Minimuxer Check Switch">
|
||||||
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
<rect key="frame" x="323" y="10" width="51" height="31"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="toggleMinimuxerStatusCheck:" destination="aMk-Xp-UL8" eventType="valueChanged" id="Kwh-Km-aLj"/>
|
<action selector="toggleMinimuxerStatusCheck:" destination="aMk-Xp-UL8" eventType="valueChanged" id="Kwh-Km-aLj"/>
|
||||||
@@ -1366,6 +1457,7 @@
|
|||||||
<outlet property="betaUpdatesSwitch" destination="e32-w4-5fk" id="kdn-ZR-cNU"/>
|
<outlet property="betaUpdatesSwitch" destination="e32-w4-5fk" id="kdn-ZR-cNU"/>
|
||||||
<outlet property="disableAppLimitSwitch" destination="1aa-og-ZXD" id="oVL-Md-yZ8"/>
|
<outlet property="disableAppLimitSwitch" destination="1aa-og-ZXD" id="oVL-Md-yZ8"/>
|
||||||
<outlet property="disableResponseCachingSwitch" destination="AAh-cu-qw8" id="aVT-Md-yZ8"/>
|
<outlet property="disableResponseCachingSwitch" destination="AAh-cu-qw8" id="aVT-Md-yZ8"/>
|
||||||
|
<outlet property="enableEMPforWireguard" destination="8qE-hE-Ujn" id="VC2-PV-cea"/>
|
||||||
<outlet property="exportResignedAppsSwitch" destination="GYP-qn-wzh" id="aVL-Md-yZ8"/>
|
<outlet property="exportResignedAppsSwitch" destination="GYP-qn-wzh" id="aVL-Md-yZ8"/>
|
||||||
<outlet property="githubButton" destination="oqj-4S-I9l" id="sxB-LE-gA2"/>
|
<outlet property="githubButton" destination="oqj-4S-I9l" id="sxB-LE-gA2"/>
|
||||||
<outlet property="mastodonButton" destination="B8Q-e7-beR" id="Kbe-Og-rsg"/>
|
<outlet property="mastodonButton" destination="B8Q-e7-beR" id="Kbe-Og-rsg"/>
|
||||||
@@ -1390,8 +1482,9 @@
|
|||||||
<toolbarItems/>
|
<toolbarItems/>
|
||||||
<simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
|
<simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
|
||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" barStyle="black" largeTitles="YES" id="Jtn-cs-Tvp" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" barStyle="black" largeTitles="YES" id="Jtn-cs-Tvp" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="62" width="402" height="96"/>
|
<rect key="frame" x="0.0" y="124" width="402" height="106"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="tintColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<color key="barTintColor" name="SettingsBackground"/>
|
<color key="barTintColor" name="SettingsBackground"/>
|
||||||
<textAttributes key="titleTextAttributes">
|
<textAttributes key="titleTextAttributes">
|
||||||
@@ -1423,14 +1516,14 @@
|
|||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<prototypes>
|
<prototypes>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" id="8Xf-RE-QJx" customClass="RefreshAttemptTableViewCell">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" id="8Xf-RE-QJx" customClass="RefreshAttemptTableViewCell">
|
||||||
<rect key="frame" x="0.0" y="50" width="402" height="64.666664123535156"/>
|
<rect key="frame" x="0.0" y="50" width="402" height="73.333335876464844"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="8Xf-RE-QJx" id="r3G-oh-AyQ">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="8Xf-RE-QJx" id="r3G-oh-AyQ">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="64.666664123535156"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="73.333335876464844"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="SN9-pA-GDU">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="SN9-pA-GDU">
|
||||||
<rect key="frame" x="20" y="10.999999999999996" width="362" height="42.666666666666657"/>
|
<rect key="frame" x="20" y="15.000000000000004" width="362" height="43.333333333333343"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="SqJ-wP-gO1">
|
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" translatesAutoresizingMaskIntoConstraints="NO" id="SqJ-wP-gO1">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="362" height="20.333333333333332"/>
|
<rect key="frame" x="0.0" y="0.0" width="362" height="20.333333333333332"/>
|
||||||
@@ -1450,7 +1543,7 @@
|
|||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Could not connect to SideStore." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7L1-AA-2yo">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Could not connect to SideStore." textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7L1-AA-2yo">
|
||||||
<rect key="frame" x="0.0" y="24.333333333333336" width="362" height="18.333333333333336"/>
|
<rect key="frame" x="0.0" y="24.333333333333336" width="362" height="19"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
<fontDescription key="fontDescription" type="system" pointSize="15"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
@@ -1491,7 +1584,7 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" layoutMarginsFollowReadableWidth="YES" contentInsetAdjustmentBehavior="never" indicatorStyle="white" editable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oQQ-pR-oKc">
|
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" layoutMarginsFollowReadableWidth="YES" contentInsetAdjustmentBehavior="never" indicatorStyle="white" editable="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oQQ-pR-oKc">
|
||||||
<rect key="frame" x="0.0" y="106" width="402" height="685"/>
|
<rect key="frame" x="0.0" y="178" width="402" height="579"/>
|
||||||
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
<edgeInsets key="layoutMargins" top="8" left="30" bottom="8" right="30"/>
|
||||||
<string key="text">Jay Freeman (ldid)
|
<string key="text">Jay Freeman (ldid)
|
||||||
Copyright (C) 2007-2012 Jay Freeman (saurik)
|
Copyright (C) 2007-2012 Jay Freeman (saurik)
|
||||||
@@ -1690,17 +1783,17 @@ Settings by i cons from the Noun Project</string>
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<prototypes>
|
<prototypes>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" id="HAm-mA-O78" customClass="ErrorLogTableViewCell">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" id="HAm-mA-O78" customClass="ErrorLogTableViewCell">
|
||||||
<rect key="frame" x="20" y="55.333332061767578" width="362" height="107.33333587646484"/>
|
<rect key="frame" x="20" y="55.333332061767578" width="362" height="116"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="HAm-mA-O78" id="swa-et-rfA">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="HAm-mA-O78" id="swa-et-rfA">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="362" height="107.33333587646484"/>
|
<rect key="frame" x="0.0" y="0.0" width="362" height="116"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="mtw-JM-T70">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="mtw-JM-T70">
|
||||||
<rect key="frame" x="20" y="11" width="322" height="85.333333333333329"/>
|
<rect key="frame" x="16" y="15" width="330" height="86"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" alignment="top" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="bjU-TX-4lm" userLabel="Compact">
|
<stackView opaque="NO" contentMode="scaleToFill" alignment="top" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="bjU-TX-4lm" userLabel="Compact">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="322" height="43.333333333333336"/>
|
<rect key="frame" x="0.0" y="0.0" width="330" height="44"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sDZ-ZN-NT1" customClass="AppIconImageView" customModule="SideStore" customModuleProvider="target">
|
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="sDZ-ZN-NT1" customClass="AppIconImageView" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="43" height="43"/>
|
<rect key="frame" x="0.0" y="0.0" width="43" height="43"/>
|
||||||
@@ -1710,10 +1803,10 @@ Settings by i cons from the Noun Project</string>
|
|||||||
</constraints>
|
</constraints>
|
||||||
</imageView>
|
</imageView>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="82d-v0-RCp">
|
<stackView opaque="NO" contentMode="scaleToFill" axis="vertical" distribution="equalSpacing" spacing="4" translatesAutoresizingMaskIntoConstraints="NO" id="82d-v0-RCp">
|
||||||
<rect key="frame" x="51" y="0.0" width="271" height="39"/>
|
<rect key="frame" x="51" y="0.0" width="279" height="39"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Q2j-Tc-bp2">
|
<stackView opaque="NO" contentMode="scaleToFill" distribution="equalSpacing" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Q2j-Tc-bp2">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="271" height="18"/>
|
<rect key="frame" x="0.0" y="0.0" width="279" height="18"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Success" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="Na7-uj-XYZ">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Success" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="Na7-uj-XYZ">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="60" height="18"/>
|
<rect key="frame" x="0.0" y="0.0" width="60" height="18"/>
|
||||||
@@ -1722,7 +1815,7 @@ Settings by i cons from the Noun Project</string>
|
|||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="Date" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SGf-pP-RL0">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" horizontalCompressionResistancePriority="751" text="Date" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SGf-pP-RL0">
|
||||||
<rect key="frame" x="240.66666666666669" y="0.0" width="30.333333333333314" height="18"/>
|
<rect key="frame" x="248.66666666666671" y="0.0" width="30.333333333333343" height="18"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -1730,7 +1823,7 @@ Settings by i cons from the Noun Project</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Error Code" textAlignment="natural" lineBreakMode="headTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="R5a-wv-xHd">
|
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Error Code" textAlignment="natural" lineBreakMode="headTruncation" baselineAdjustment="alignBaselines" minimumScaleFactor="0.5" translatesAutoresizingMaskIntoConstraints="NO" id="R5a-wv-xHd">
|
||||||
<rect key="frame" x="0.0" y="22" width="271" height="17"/>
|
<rect key="frame" x="0.0" y="22" width="279" height="17"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
<fontDescription key="fontDescription" type="system" pointSize="14"/>
|
||||||
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
<color key="textColor" white="0.66666666669999997" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
@@ -1740,7 +1833,7 @@ Settings by i cons from the Noun Project</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="Error Description" textAlignment="natural" selectable="NO" layoutManager="textKit1" translatesAutoresizingMaskIntoConstraints="NO" id="1df-ri-hKN" customClass="CollapsingTextView" customModule="SideStore" customModuleProvider="target">
|
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" text="Error Description" textAlignment="natural" selectable="NO" layoutManager="textKit1" translatesAutoresizingMaskIntoConstraints="NO" id="1df-ri-hKN" customClass="CollapsingTextView" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="51.333333333333343" width="322" height="34"/>
|
<rect key="frame" x="0.0" y="52" width="330" height="34"/>
|
||||||
<accessibility key="accessibilityConfiguration">
|
<accessibility key="accessibilityConfiguration">
|
||||||
<accessibilityTraits key="traits" staticText="YES"/>
|
<accessibilityTraits key="traits" staticText="YES"/>
|
||||||
<bool key="isElement" value="NO"/>
|
<bool key="isElement" value="NO"/>
|
||||||
@@ -1752,7 +1845,7 @@ Settings by i cons from the Noun Project</string>
|
|||||||
</subviews>
|
</subviews>
|
||||||
</stackView>
|
</stackView>
|
||||||
<button opaque="NO" contentMode="scaleToFill" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ba2-EY-tf5" customClass="ErrorLogMenuButton">
|
<button opaque="NO" contentMode="scaleToFill" showsMenuAsPrimaryAction="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ba2-EY-tf5" customClass="ErrorLogMenuButton">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="362" height="107.33333333333333"/>
|
<rect key="frame" x="0.0" y="0.0" width="362" height="116"/>
|
||||||
<accessibility key="accessibilityConfiguration">
|
<accessibility key="accessibilityConfiguration">
|
||||||
<bool key="isElement" value="NO"/>
|
<bool key="isElement" value="NO"/>
|
||||||
</accessibility>
|
</accessibility>
|
||||||
@@ -1823,11 +1916,11 @@ Settings by i cons from the Noun Project</string>
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController id="xB2-Se-VVg" customClass="ErrorDetailsViewController" customModule="SideStore" customModuleProvider="target" sceneMemberID="viewController">
|
<viewController id="xB2-Se-VVg" customClass="ErrorDetailsViewController" customModule="SideStore" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<view key="view" contentMode="scaleToFill" id="eBQ-se-VIy">
|
<view key="view" contentMode="scaleToFill" id="eBQ-se-VIy">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="864"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="812"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="ctd-NB-4ov">
|
<textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" scrollEnabled="NO" editable="NO" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="ctd-NB-4ov">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="864"/>
|
<rect key="frame" x="0.0" y="0.0" width="402" height="812"/>
|
||||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||||
<color key="textColor" systemColor="labelColor"/>
|
<color key="textColor" systemColor="labelColor"/>
|
||||||
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
|
||||||
@@ -1865,8 +1958,9 @@ Settings by i cons from the Noun Project</string>
|
|||||||
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="7gm-d1-zWK" sceneMemberID="viewController">
|
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="7gm-d1-zWK" sceneMemberID="viewController">
|
||||||
<toolbarItems/>
|
<toolbarItems/>
|
||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="dI0-sh-yGf">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" id="dI0-sh-yGf">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="402" height="56"/>
|
<rect key="frame" x="0.0" y="16" width="402" height="54"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ extension SettingsViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileprivate enum SigningSettingsRow: Int, CaseIterable {
|
fileprivate enum SigningSettingsRow: Int, CaseIterable {
|
||||||
|
case importAccount
|
||||||
|
case exportAccount
|
||||||
case importCert
|
case importCert
|
||||||
case exportCert
|
case exportCert
|
||||||
}
|
}
|
||||||
@@ -119,6 +121,7 @@ final class SettingsViewController: UITableViewController
|
|||||||
@IBOutlet private var accountTypeLabel: UILabel!
|
@IBOutlet private var accountTypeLabel: UILabel!
|
||||||
|
|
||||||
@IBOutlet private var backgroundRefreshSwitch: UISwitch!
|
@IBOutlet private var backgroundRefreshSwitch: UISwitch!
|
||||||
|
@IBOutlet private var enableEMPforWireguard: UISwitch!
|
||||||
@IBOutlet private var noIdleTimeoutSwitch: UISwitch!
|
@IBOutlet private var noIdleTimeoutSwitch: UISwitch!
|
||||||
@IBOutlet private var disableAppLimitSwitch: UISwitch!
|
@IBOutlet private var disableAppLimitSwitch: UISwitch!
|
||||||
@IBOutlet private var betaUpdatesSwitch: UISwitch!
|
@IBOutlet private var betaUpdatesSwitch: UISwitch!
|
||||||
@@ -200,6 +203,16 @@ final class SettingsViewController: UITableViewController
|
|||||||
{
|
{
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
// --- iOS 26 fix ---
|
||||||
|
if #available(iOS 26.0, *) {
|
||||||
|
let appearance = UINavigationBarAppearance()
|
||||||
|
// appearance.configureWithOpaqueBackground() // or .defaultBackground if you want blur
|
||||||
|
// appearance.backgroundColor = UIColor(named: "SettingsBackground")
|
||||||
|
appearance.titleTextAttributes = [.foregroundColor: UIColor.white]
|
||||||
|
appearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
|
||||||
|
navigationController?.navigationBar.standardAppearance = appearance
|
||||||
|
navigationController?.navigationBar.scrollEdgeAppearance = appearance // required for iOS 26, maybe enforce it in storyboard?
|
||||||
|
}
|
||||||
let nib = UINib(nibName: "SettingsHeaderFooterView", bundle: nil)
|
let nib = UINib(nibName: "SettingsHeaderFooterView", bundle: nil)
|
||||||
self.prototypeHeaderFooterView = nib.instantiate(withOwner: nil, options: nil)[0] as? SettingsHeaderFooterView
|
self.prototypeHeaderFooterView = nib.instantiate(withOwner: nil, options: nil)[0] as? SettingsHeaderFooterView
|
||||||
|
|
||||||
@@ -245,6 +258,118 @@ final class SettingsViewController: UITableViewController
|
|||||||
}
|
}
|
||||||
|
|
||||||
configureReleaseChannelButton()
|
configureReleaseChannelButton()
|
||||||
|
#if !targetEnvironment(simulator)
|
||||||
|
detectAndImportAccountFile()
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func importAccountAtFile(_ file: URL, remove: Bool = false) {
|
||||||
|
_ = file.startAccessingSecurityScopedResource()
|
||||||
|
defer { file.stopAccessingSecurityScopedResource() }
|
||||||
|
guard let accountD = try? Data(contentsOf: file) else {
|
||||||
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
|
}
|
||||||
|
guard let account = try? Foundation.JSONDecoder().decode(ImportedAccount.self, from: accountD) else {
|
||||||
|
return Logger.main.notice("Could not parse data from file \(file)")
|
||||||
|
}
|
||||||
|
print("We want to import this account probably: \(account)")
|
||||||
|
if remove {
|
||||||
|
try? FileManager.default.removeItem(at: file)
|
||||||
|
}
|
||||||
|
Keychain.shared.appleIDEmailAddress = account.email
|
||||||
|
Keychain.shared.appleIDPassword = account.password
|
||||||
|
Keychain.shared.adiPb = account.adiPB
|
||||||
|
Keychain.shared.identifier = account.local_user
|
||||||
|
signIn()
|
||||||
|
update()
|
||||||
|
if let altCert = ALTCertificate(p12Data: account.cert, password: account.certpass) {
|
||||||
|
Keychain.shared.signingCertificate = altCert.encryptedP12Data(withPassword: "")!
|
||||||
|
Keychain.shared.signingCertificatePassword = account.certpass
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Successfully imported '\(account.email)'!", comment: ""), detailText: "SideStore should be fully operational!")
|
||||||
|
return toastView.show(in: self)
|
||||||
|
} else {
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Failed to import account certificate!", comment: ""), detailText: "Failed to create ALTCertificate. Check if the password is correct. Still imported account/adi.pb details!")
|
||||||
|
return toastView.show(in: self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func detectAndImportAccountFile() {
|
||||||
|
let accountFileURL = FileManager.default.documentsDirectory.appendingPathComponent("Account.sideconf")
|
||||||
|
#if !DEBUG
|
||||||
|
importAccountAtFile(accountFileURL, remove: true)
|
||||||
|
#else
|
||||||
|
importAccountAtFile(accountFileURL)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
func exportAccount(_ certpass: String) -> ImportedAccount? {
|
||||||
|
guard let email = Keychain.shared.appleIDEmailAddress,
|
||||||
|
let password = Keychain.shared.appleIDPassword,
|
||||||
|
let cert = Keychain.shared.signingCertificate,
|
||||||
|
let identifier = Keychain.shared.identifier,
|
||||||
|
let adiPB = Keychain.shared.adiPb else {
|
||||||
|
#if DEBUG
|
||||||
|
print(Keychain.shared.appleIDEmailAddress ?? "Empty email")
|
||||||
|
print(Keychain.shared.appleIDPassword ?? "Empty password")
|
||||||
|
print(Keychain.shared.signingCertificate ?? "Empty cert")
|
||||||
|
print(Keychain.shared.identifier ?? "Empty identifier")
|
||||||
|
print(Keychain.shared.adiPb ?? "Empty adiPb")
|
||||||
|
#endif
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return ImportedAccount(email: email, password: password, cert: cert, certpass: certpass, local_user: identifier, adiPB: adiPB)
|
||||||
|
}
|
||||||
|
|
||||||
|
func showExportAccount() {
|
||||||
|
|
||||||
|
Task {
|
||||||
|
guard let password = await withUnsafeContinuation({ (c: UnsafeContinuation<String?,Never>) in
|
||||||
|
let alertController = UIAlertController(title: NSLocalizedString("Please enter the password for the certificate.", comment: ""), message: nil, preferredStyle: .alert)
|
||||||
|
|
||||||
|
alertController.addTextField { (textField) in
|
||||||
|
textField.autocorrectionType = .no
|
||||||
|
textField.autocapitalizationType = .none
|
||||||
|
}
|
||||||
|
|
||||||
|
let submitAction = UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default) { (action) in
|
||||||
|
let textField = alertController.textFields?.first
|
||||||
|
|
||||||
|
let code = textField?.text ?? ""
|
||||||
|
c.resume(returning: code)
|
||||||
|
}
|
||||||
|
alertController.addAction(submitAction)
|
||||||
|
alertController.addAction(UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) { (action) in
|
||||||
|
c.resume(returning: nil)
|
||||||
|
})
|
||||||
|
|
||||||
|
self.present(alertController, animated: true)
|
||||||
|
}) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let account = exportAccount(password) else {
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Failed to export account!", comment: ""), detailText: "Account not found.")
|
||||||
|
return toastView.show(in: self)
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let accountData = try? Foundation.JSONEncoder().encode(account) else {
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Failed to export account data!", comment: ""), detailText: "Account malformed.")
|
||||||
|
toastView.show(in: self)
|
||||||
|
return
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let accountTmpPath = FileManager.default.temporaryDirectory.appendingPathComponent("\(account.email).sideconf")
|
||||||
|
do {
|
||||||
|
try accountData.write(to: accountTmpPath)
|
||||||
|
} catch {
|
||||||
|
let toastView = ToastView(text: NSLocalizedString("Failed to export account!", comment: ""), detailText: error.localizedDescription)
|
||||||
|
toastView.show(in: self)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let exportVC = UIDocumentPickerViewController(forExporting: [accountTmpPath], asCopy: false)
|
||||||
|
self.present(exportVC, animated: true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func viewWillAppear(_ animated: Bool)
|
override func viewWillAppear(_ animated: Bool)
|
||||||
@@ -344,6 +469,7 @@ private extension SettingsViewController
|
|||||||
|
|
||||||
// AppRefreshRow
|
// AppRefreshRow
|
||||||
self.backgroundRefreshSwitch.isOn = UserDefaults.standard.isBackgroundRefreshEnabled
|
self.backgroundRefreshSwitch.isOn = UserDefaults.standard.isBackgroundRefreshEnabled
|
||||||
|
self.enableEMPforWireguard.isOn = UserDefaults.standard.enableEMPforWireguard
|
||||||
self.noIdleTimeoutSwitch.isOn = UserDefaults.standard.isIdleTimeoutDisableEnabled
|
self.noIdleTimeoutSwitch.isOn = UserDefaults.standard.isIdleTimeoutDisableEnabled
|
||||||
self.disableAppLimitSwitch.isOn = UserDefaults.standard.isAppLimitDisabled
|
self.disableAppLimitSwitch.isOn = UserDefaults.standard.isAppLimitDisabled
|
||||||
|
|
||||||
@@ -621,6 +747,11 @@ private extension SettingsViewController
|
|||||||
UserDefaults.standard.isBackgroundRefreshEnabled = sender.isOn
|
UserDefaults.standard.isBackgroundRefreshEnabled = sender.isOn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func toggleEnableEMPforWireguard(_ sender: UISwitch)
|
||||||
|
{
|
||||||
|
UserDefaults.standard.enableEMPforWireguard = sender.isOn
|
||||||
|
}
|
||||||
|
|
||||||
@IBAction func toggleNoIdleTimeoutEnabled(_ sender: UISwitch)
|
@IBAction func toggleNoIdleTimeoutEnabled(_ sender: UISwitch)
|
||||||
{
|
{
|
||||||
UserDefaults.standard.isIdleTimeoutDisableEnabled = sender.isOn
|
UserDefaults.standard.isIdleTimeoutDisableEnabled = sender.isOn
|
||||||
@@ -1225,11 +1356,41 @@ extension SettingsViewController
|
|||||||
case .signing:
|
case .signing:
|
||||||
let row = SigningSettingsRow.allCases[indexPath.row]
|
let row = SigningSettingsRow.allCases[indexPath.row]
|
||||||
switch row {
|
switch row {
|
||||||
|
case .exportAccount: showExportAccount()
|
||||||
|
case .importAccount:
|
||||||
|
Task {
|
||||||
|
let confUrl = await withUnsafeContinuation { c in
|
||||||
|
let importVc = UIDocumentPickerViewController(forOpeningContentTypes: [UTType(filenameExtension: "sideconf")!], asCopy: false)
|
||||||
|
ImportExport.documentPickerHandler = DocumentPickerHandler { url in
|
||||||
|
c.resume(returning: url)
|
||||||
|
}
|
||||||
|
importVc.delegate = ImportExport.documentPickerHandler
|
||||||
|
|
||||||
|
self.present(importVc, animated: true)
|
||||||
|
|
||||||
|
}
|
||||||
|
guard let confUrl else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
importAccountAtFile(confUrl)
|
||||||
|
}
|
||||||
case .importCert:
|
case .importCert:
|
||||||
|
let importVc = UIDocumentPickerViewController(forOpeningContentTypes: [UTType(filenameExtension: "p12")!], asCopy: false)
|
||||||
|
ImportExport.documentPickerHandler = DocumentPickerHandler { url in
|
||||||
|
guard let url else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
importVc.delegate = ImportExport.documentPickerHandler
|
||||||
|
self.present(importVc, animated: true)
|
||||||
|
_ = url.startAccessingSecurityScopedResource()
|
||||||
|
defer { url.stopAccessingSecurityScopedResource() }
|
||||||
|
}
|
||||||
Task {
|
Task {
|
||||||
let certUrl = await withUnsafeContinuation { c in
|
let certUrl = await withUnsafeContinuation { c in
|
||||||
let importVc = UIDocumentPickerViewController(forOpeningContentTypes: [UTType(filenameExtension: "p12")!], asCopy: false)
|
let importVc = UIDocumentPickerViewController(forOpeningContentTypes: [UTType(filenameExtension: "p12")!], asCopy: false)
|
||||||
ImportExport.documentPickerHandler = DocumentPickerHandler { url in
|
ImportExport.documentPickerHandler = DocumentPickerHandler { url in
|
||||||
|
_ = url?.startAccessingSecurityScopedResource()
|
||||||
|
defer { url?.stopAccessingSecurityScopedResource() }
|
||||||
c.resume(returning: url)
|
c.resume(returning: url)
|
||||||
}
|
}
|
||||||
importVc.delegate = ImportExport.documentPickerHandler
|
importVc.delegate = ImportExport.documentPickerHandler
|
||||||
@@ -1266,7 +1427,7 @@ extension SettingsViewController
|
|||||||
guard let password else {
|
guard let password else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let _ = certUrl.startAccessingSecurityScopedResource()
|
_ = certUrl.startAccessingSecurityScopedResource()
|
||||||
defer {
|
defer {
|
||||||
certUrl.stopAccessingSecurityScopedResource()
|
certUrl.stopAccessingSecurityScopedResource()
|
||||||
}
|
}
|
||||||
@@ -1289,8 +1450,6 @@ extension SettingsViewController
|
|||||||
let toastView = ToastView(text: NSLocalizedString("Certificate imported successfully!", comment: ""), detailText: nil)
|
let toastView = ToastView(text: NSLocalizedString("Certificate imported successfully!", comment: ""), detailText: nil)
|
||||||
toastView.show(in: self)
|
toastView.show(in: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
break
|
|
||||||
case .exportCert:
|
case .exportCert:
|
||||||
Task {
|
Task {
|
||||||
guard let certData = Keychain.shared.signingCertificate else {
|
guard let certData = Keychain.shared.signingCertificate else {
|
||||||
@@ -1348,7 +1507,6 @@ extension SettingsViewController
|
|||||||
let exportVC = UIDocumentPickerViewController(forExporting: [newCertTmpPath], asCopy: false)
|
let exportVC = UIDocumentPickerViewController(forExporting: [newCertTmpPath], asCopy: false)
|
||||||
self.present(exportVC, animated: true)
|
self.present(exportVC, animated: true)
|
||||||
}
|
}
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case .diagnostics:
|
case .diagnostics:
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="xWh-1U-u0q" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="xWh-1U-u0q" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="59" width="393" height="96"/>
|
<rect key="frame" x="0.0" y="59" width="393" height="96"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
<connections>
|
<connections>
|
||||||
@@ -248,6 +249,7 @@
|
|||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" largeTitles="YES" id="HLe-3g-P8I" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" largeTitles="YES" id="HLe-3g-P8I" customClass="NavigationBar" customModule="SideStore" customModuleProvider="target">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="393" height="108"/>
|
<rect key="frame" x="0.0" y="0.0" width="393" height="108"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
|
<edgeInsets key="layoutMargins" top="8" left="20" bottom="8" right="8"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<nil name="viewControllers"/>
|
<nil name="viewControllers"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
|||||||
@@ -46,6 +46,14 @@ final class SourcesViewController: UICollectionViewController
|
|||||||
{
|
{
|
||||||
super.viewDidLoad()
|
super.viewDidLoad()
|
||||||
|
|
||||||
|
// Ensure large titles
|
||||||
|
navigationController?.navigationBar.prefersLargeTitles = true
|
||||||
|
navigationItem.largeTitleDisplayMode = .automatic
|
||||||
|
|
||||||
|
// Set title
|
||||||
|
navigationItem.title = "Sources"
|
||||||
|
navigationController?.navigationBar.layoutMargins.left = 20
|
||||||
|
|
||||||
let layout = self.makeLayout()
|
let layout = self.makeLayout()
|
||||||
self.collectionView.collectionViewLayout = layout
|
self.collectionView.collectionViewLayout = layout
|
||||||
|
|
||||||
|
|||||||
18
AltStore/Types/ImportedAccount.swift
Normal file
18
AltStore/Types/ImportedAccount.swift
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// ImportedAccount.swift
|
||||||
|
// AltStore
|
||||||
|
//
|
||||||
|
// Created by ny on 9/7/25.
|
||||||
|
// Copyright © 2025 SideStore. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct ImportedAccount: Codable {
|
||||||
|
let email: String
|
||||||
|
let password: String
|
||||||
|
let cert: Data
|
||||||
|
let certpass: String
|
||||||
|
let local_user: String
|
||||||
|
let adiPB: String
|
||||||
|
}
|
||||||
@@ -53,6 +53,12 @@ public class Keychain
|
|||||||
@KeychainItem(key: "appleIDPassword")
|
@KeychainItem(key: "appleIDPassword")
|
||||||
public var appleIDPassword: String?
|
public var appleIDPassword: String?
|
||||||
|
|
||||||
|
@KeychainItem(key: "appleIDAdsid")
|
||||||
|
public var appleIDAdsid: String?
|
||||||
|
|
||||||
|
@KeychainItem(key: "appleIDXcodeToken")
|
||||||
|
public var appleIDXcodeToken: String?
|
||||||
|
|
||||||
@KeychainItem(key: "signingCertificatePrivateKey")
|
@KeychainItem(key: "signingCertificatePrivateKey")
|
||||||
public var signingCertificatePrivateKey: Data?
|
public var signingCertificatePrivateKey: Data?
|
||||||
|
|
||||||
@@ -83,6 +89,12 @@ public class Keychain
|
|||||||
@KeychainItem(key: "adiPb")
|
@KeychainItem(key: "adiPb")
|
||||||
public var adiPb: String?
|
public var adiPb: String?
|
||||||
|
|
||||||
|
// for some reason authenticated cert/session/team is completely not cached, which result in logging in for every request
|
||||||
|
// we save it here so when user logs out we can clear cached account/session/team
|
||||||
|
public var certificate: ALTCertificate? = nil
|
||||||
|
public var session: ALTAppleAPISession? = nil
|
||||||
|
public var team: ALTTeam? = nil
|
||||||
|
|
||||||
private init()
|
private init()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -91,7 +103,13 @@ public class Keychain
|
|||||||
{
|
{
|
||||||
self.appleIDEmailAddress = nil
|
self.appleIDEmailAddress = nil
|
||||||
self.appleIDPassword = nil
|
self.appleIDPassword = nil
|
||||||
|
self.appleIDAdsid = nil
|
||||||
|
self.appleIDXcodeToken = nil
|
||||||
self.signingCertificatePrivateKey = nil
|
self.signingCertificatePrivateKey = nil
|
||||||
self.signingCertificateSerialNumber = nil
|
self.signingCertificateSerialNumber = nil
|
||||||
|
|
||||||
|
self.certificate = nil
|
||||||
|
self.session = nil
|
||||||
|
self.team = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public extension UserDefaults
|
|||||||
@NSManaged var preferredServerID: String?
|
@NSManaged var preferredServerID: String?
|
||||||
|
|
||||||
@NSManaged var isBackgroundRefreshEnabled: Bool
|
@NSManaged var isBackgroundRefreshEnabled: Bool
|
||||||
|
@NSManaged var enableEMPforWireguard: Bool
|
||||||
@NSManaged var isIdleTimeoutDisableEnabled: Bool
|
@NSManaged var isIdleTimeoutDisableEnabled: Bool
|
||||||
@NSManaged var isAppLimitDisabled: Bool
|
@NSManaged var isAppLimitDisabled: Bool
|
||||||
@NSManaged var isBetaUpdatesEnabled: Bool
|
@NSManaged var isBetaUpdatesEnabled: Bool
|
||||||
@@ -134,9 +135,10 @@ public extension UserDefaults
|
|||||||
#keyPath(UserDefaults.isDebugModeEnabled): false,
|
#keyPath(UserDefaults.isDebugModeEnabled): false,
|
||||||
#keyPath(UserDefaults.isVerboseOperationsLoggingEnabled): false,
|
#keyPath(UserDefaults.isVerboseOperationsLoggingEnabled): false,
|
||||||
#keyPath(UserDefaults.isMinimuxerConsoleLoggingEnabled): false, // minimuxer logging is disabled by default for console loggin
|
#keyPath(UserDefaults.isMinimuxerConsoleLoggingEnabled): false, // minimuxer logging is disabled by default for console loggin
|
||||||
#keyPath(UserDefaults.isMinimuxerStatusCheckEnabled): false, // minimuxer status check is disabled by default to support stosVPN based cellular refresh
|
#keyPath(UserDefaults.isMinimuxerStatusCheckEnabled): false, // minimuxer status check is disabled by default to support LocalDevVPN based cellular refresh
|
||||||
#keyPath(UserDefaults.recreateDatabaseOnNextStart): false,
|
#keyPath(UserDefaults.recreateDatabaseOnNextStart): false,
|
||||||
#keyPath(UserDefaults.isBackgroundRefreshEnabled): true,
|
#keyPath(UserDefaults.isBackgroundRefreshEnabled): true,
|
||||||
|
#keyPath(UserDefaults.enableEMPforWireguard): false,
|
||||||
#keyPath(UserDefaults.isIdleTimeoutDisableEnabled): true,
|
#keyPath(UserDefaults.isIdleTimeoutDisableEnabled): true,
|
||||||
#keyPath(UserDefaults.isPairingReset): true,
|
#keyPath(UserDefaults.isPairingReset): true,
|
||||||
#keyPath(UserDefaults.isLegacyDeactivationSupported): isLegacyDeactivationSupported,
|
#keyPath(UserDefaults.isLegacyDeactivationSupported): isLegacyDeactivationSupported,
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
// Configuration settings file format documentation can be found at:
|
// Configuration settings file format documentation can be found at:
|
||||||
// https://help.apple.com/xcode/#/dev745c5c974
|
// https://help.apple.com/xcode/#/dev745c5c974
|
||||||
|
|
||||||
MARKETING_VERSION = 0.6.2
|
MARKETING_VERSION = 0.6.3
|
||||||
CURRENT_PROJECT_VERSION = 0602
|
CURRENT_PROJECT_VERSION = 0603
|
||||||
|
|
||||||
// Vars to be overwritten by `CodeSigning.xcconfig` if exists
|
// Vars to be overwritten by `CodeSigning.xcconfig` if exists
|
||||||
DEVELOPMENT_TEAM = S32Z3HMYVQ
|
DEVELOPMENT_TEAM = S32Z3HMYVQ
|
||||||
ORG_IDENTIFIER = com.SideStore
|
ORG_IDENTIFIER = com.SideStore
|
||||||
|
|
||||||
|
// Default is free for CI builds, override it using CodeSigning.xcconfig if required
|
||||||
|
CODE_SIGN_ENTITLEMENTS = ./AltStore/AltStoreFree.entitlements
|
||||||
|
|
||||||
// Codesigning settings defined optionally, see `CodeSigning.xcconfig.example`
|
// Codesigning settings defined optionally, see `CodeSigning.xcconfig.example`
|
||||||
#include? "CodeSigning.xcconfig"
|
#include? "CodeSigning.xcconfig"
|
||||||
|
|
||||||
@@ -20,8 +23,10 @@ PRODUCT_NAME = SideStore
|
|||||||
//PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_PREFIX).SideStore$(BUNDLE_ID_SUFFIX)
|
//PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_PREFIX).SideStore$(BUNDLE_ID_SUFFIX)
|
||||||
//PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_PREFIX).SideStore
|
//PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_PREFIX).SideStore
|
||||||
// preserve unmodified bundle ID (without any extra suffixes)
|
// preserve unmodified bundle ID (without any extra suffixes)
|
||||||
GROUP_ID = $(ORG_PREFIX).SideStore$(BUNDLE_ID_SUFFIX)
|
PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.$(DEVELOPMENT_TEAM)
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = $(GROUP_ID)
|
PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore
|
||||||
|
GROUP_ID = $(ORG_IDENTIFIER).SideStore
|
||||||
|
GROUP_ID[config=Debug] = $(ORG_IDENTIFIER).SideStore.$(DEVELOPMENT_TEAM)
|
||||||
|
|
||||||
EXTENSION_PREFIX = $(PRODUCT_BUNDLE_IDENTIFIER)
|
EXTENSION_PREFIX = $(PRODUCT_BUNDLE_IDENTIFIER)
|
||||||
APP_GROUP_IDENTIFIER = $(GROUP_ID)
|
APP_GROUP_IDENTIFIER = $(GROUP_ID)
|
||||||
|
|||||||
@@ -3,6 +3,11 @@
|
|||||||
// https://developer.apple.com/account/#/membership
|
// https://developer.apple.com/account/#/membership
|
||||||
DEVELOPMENT_TEAM = XYZ0123456
|
DEVELOPMENT_TEAM = XYZ0123456
|
||||||
|
|
||||||
|
// If you have a free account use this following line
|
||||||
|
// CODE_SIGN_ENTITLEMENTS = ./AltStore/AltStoreFree.entitlements
|
||||||
|
// Paid accounts can use this following line
|
||||||
|
CODE_SIGN_ENTITLEMENTS = ./AltStore/AltStore.entitlements
|
||||||
|
|
||||||
// Set this for dev-local xcode builds
|
// Set this for dev-local xcode builds
|
||||||
//MARKETING_VERSION_SUFFIX = -local
|
//MARKETING_VERSION_SUFFIX = -local
|
||||||
|
|
||||||
|
|||||||
18
Makefile
18
Makefile
@@ -201,7 +201,7 @@ build-and-test:
|
|||||||
@echo ""
|
@echo ""
|
||||||
@echo "Performing a build and running tests..."
|
@echo "Performing a build and running tests..."
|
||||||
@xcodebuild test \
|
@xcodebuild test \
|
||||||
-destination 'platform=iOS Simulator,name=iPhone 16 Pro,OS=18.2' \
|
-destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=26.0' \
|
||||||
-resultBundlePath build/tests/test-results.xcresult \
|
-resultBundlePath build/tests/test-results.xcresult \
|
||||||
-enableCodeCoverage YES \
|
-enableCodeCoverage YES \
|
||||||
$(COMMON_BUILD_SETTINGS)
|
$(COMMON_BUILD_SETTINGS)
|
||||||
@@ -213,7 +213,7 @@ build-tests:
|
|||||||
@echo "Performing a build-for-testing..."
|
@echo "Performing a build-for-testing..."
|
||||||
@xcodebuild build-for-testing \
|
@xcodebuild build-for-testing \
|
||||||
-enableCodeCoverage YES \
|
-enableCodeCoverage YES \
|
||||||
-destination 'platform=iOS Simulator,name=iPhone 16 Pro,OS=18.2' \
|
-destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=26.0' \
|
||||||
$(COMMON_BUILD_SETTINGS)
|
$(COMMON_BUILD_SETTINGS)
|
||||||
|
|
||||||
run-tests:
|
run-tests:
|
||||||
@@ -224,22 +224,22 @@ run-tests:
|
|||||||
@xcodebuild test-without-building \
|
@xcodebuild test-without-building \
|
||||||
-enableCodeCoverage YES \
|
-enableCodeCoverage YES \
|
||||||
-resultBundlePath build/tests/test-results.xcresult \
|
-resultBundlePath build/tests/test-results.xcresult \
|
||||||
-destination 'platform=iOS Simulator,name=iPhone 16 Pro,OS=18.2' \
|
-destination 'platform=iOS Simulator,name=iPhone 17 Pro,OS=26.0' \
|
||||||
$(COMMON_BUILD_SETTINGS)
|
$(COMMON_BUILD_SETTINGS)
|
||||||
|
|
||||||
boot-sim-async:
|
boot-sim-async:
|
||||||
@if xcrun simctl list devices "iPhone 16 Pro" | grep -q "Booted"; then \
|
@if xcrun simctl list devices "iPhone 17 Pro" | grep -q "Booted"; then \
|
||||||
echo "Simulator 'iPhone 16 Pro' is already booted."; \
|
echo "Simulator 'iPhone 17 Pro' is already booted."; \
|
||||||
else \
|
else \
|
||||||
echo "Booting simulator 'iPhone 16 Pro' asynchronously..."; \
|
echo "Booting simulator 'iPhone 17 Pro' asynchronously..."; \
|
||||||
xcrun simctl boot "iPhone 16 Pro" & \
|
xcrun simctl boot "iPhone 17 Pro" & \
|
||||||
echo "Simulator boot command dispatched."; \
|
echo "Simulator boot command dispatched."; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
sim-boot-check:
|
sim-boot-check:
|
||||||
@echo "Checking simulator boot status..."
|
@echo "Checking simulator boot status..."
|
||||||
@if xcrun simctl list devices "iPhone 16 Pro" | grep -q "Booted"; then \
|
@if xcrun simctl list devices "iPhone 17 Pro" | grep -q "Booted"; then \
|
||||||
echo "Simulator 'iPhone 16 Pro' is booted."; \
|
echo "Simulator 'iPhone 17 Pro' is booted."; \
|
||||||
else \
|
else \
|
||||||
echo "Simulator bootup failed or is not booted yet."; \
|
echo "Simulator bootup failed or is not booted yet."; \
|
||||||
exit 1; \
|
exit 1; \
|
||||||
|
|||||||
37
Podfile
37
Podfile
@@ -1,37 +0,0 @@
|
|||||||
inhibit_all_warnings!
|
|
||||||
|
|
||||||
target 'SideStore' do
|
|
||||||
platform :ios, '15.0'
|
|
||||||
|
|
||||||
use_frameworks! :linkage => :static
|
|
||||||
|
|
||||||
# Pods for AltStore
|
|
||||||
pod 'Nuke', '~> 10.0'
|
|
||||||
pod 'AppCenter/Analytics', '~> 5.0'
|
|
||||||
pod 'AppCenter/Crashes', '~> 5.0'
|
|
||||||
pod 'Starscream', '~> 4.0.0'
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
target 'AltStoreCore' do
|
|
||||||
platform :ios, '15.0'
|
|
||||||
|
|
||||||
use_frameworks! :linkage => :static
|
|
||||||
|
|
||||||
# Pods for AltStoreCore
|
|
||||||
pod 'KeychainAccess', '~> 4.2.2'
|
|
||||||
# pod 'SemanticVersion', '~> 0.3.5'
|
|
||||||
# Add the Swift Package using the repository URL
|
|
||||||
# pod 'SemanticVersion', :git => 'https://github.com/SwiftPackageIndex/SemanticVersion.git', :tag => '0.4.0'
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
post_install do |installer|
|
|
||||||
installer.pods_project.targets.each do |target|
|
|
||||||
target.build_configurations.each do |config|
|
|
||||||
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '15.0'
|
|
||||||
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
33
Podfile.lock
33
Podfile.lock
@@ -1,33 +0,0 @@
|
|||||||
PODS:
|
|
||||||
- AppCenter/Analytics (5.0.5):
|
|
||||||
- AppCenter/Core
|
|
||||||
- AppCenter/Core (5.0.5)
|
|
||||||
- AppCenter/Crashes (5.0.5):
|
|
||||||
- AppCenter/Core
|
|
||||||
- KeychainAccess (4.2.2)
|
|
||||||
- Nuke (10.7.1)
|
|
||||||
- Starscream (4.0.8)
|
|
||||||
|
|
||||||
DEPENDENCIES:
|
|
||||||
- AppCenter/Analytics (~> 5.0)
|
|
||||||
- AppCenter/Crashes (~> 5.0)
|
|
||||||
- KeychainAccess (~> 4.2.2)
|
|
||||||
- Nuke (~> 10.0)
|
|
||||||
- Starscream (~> 4.0.0)
|
|
||||||
|
|
||||||
SPEC REPOS:
|
|
||||||
trunk:
|
|
||||||
- AppCenter
|
|
||||||
- KeychainAccess
|
|
||||||
- Nuke
|
|
||||||
- Starscream
|
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
|
||||||
AppCenter: 994875ea7941b9e168babb98299f900a94bcef13
|
|
||||||
KeychainAccess: c0c4f7f38f6fc7bbe58f5702e25f7bd2f65abf51
|
|
||||||
Nuke: 279f17a599fd1c83cf51de5e0e1f2db143a287b0
|
|
||||||
Starscream: 19b5533ddb925208db698f0ac508a100b884a1b9
|
|
||||||
|
|
||||||
PODFILE CHECKSUM: c0b9b55044ebe3d841c52647f4f74ad4169f97f1
|
|
||||||
|
|
||||||
COCOAPODS: 1.16.2
|
|
||||||
10
README.md
10
README.md
@@ -6,7 +6,7 @@
|
|||||||
[](https://makeapullrequest.com)
|
[](https://makeapullrequest.com)
|
||||||
[](https://github.com/SideStore/SideStore/actions/workflows/nightly.yml)
|
[](https://github.com/SideStore/SideStore/actions/workflows/nightly.yml)
|
||||||
[](https://github.com/SideStore/SideStore/actions/workflows/beta.yml)
|
[](https://github.com/SideStore/SideStore/actions/workflows/beta.yml)
|
||||||
[](https://discord.gg/sidestore)
|
[](https://dis.sidestore.io)
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -18,20 +18,20 @@ SideStore's goal is to provide an untethered sideloading experience. It's a comm
|
|||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
- Xcode 15
|
- Xcode 15
|
||||||
- iOS 15+
|
- iOS 14+
|
||||||
- Rustup (`brew install rustup`)
|
- Rustup (`brew install rustup`)
|
||||||
|
|
||||||
Why iOS 15? Targeting such a recent version of iOS allows us to accelerate development, especially since not many developers have older devices to test on. This is corrobated by the fact that SwiftUI support is much better, allowing us to transistion to a more modern UI codebase.
|
Why iOS 14? Targeting such a recent version of iOS allows us to accelerate development, especially since not many developers have older devices to test on. This is corrobated by the fact that SwiftUI support is much better, allowing us to transistion to a more modern UI codebase.
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|
||||||
### SideStore
|
### SideStore
|
||||||
SideStore is a just regular, sandboxed iOS application. The AltStore app target contains the vast majority of SideStore's functionality, including all the logic for downloading and updating apps through SideStore. SideStore makes heavy use of standard iOS frameworks and technologies most iOS developers are familiar with.
|
SideStore is a just regular, sandboxed iOS application. The AltStore app target contains the vast majority of SideStore's functionality, including all the logic for downloading and updating apps through SideStore. SideStore makes heavy use of standard iOS frameworks and technologies most iOS developers are familiar with.
|
||||||
|
|
||||||
### EM Proxy
|
### EM Proxy
|
||||||
[SideServer mobile](https://github.com/jkcoxson/em_proxy) powers the defining feature of SideStore: untethered app installation. By leveraging an App Store app with additional entitlements (WireGuard or StosVPN) to create the VPN tunnel for us, it allows SideStore to take advantage of [Jitterbug](https://github.com/osy/Jitterbug)'s loopback method without requiring a paid developer account.
|
[EM Proxy](https://github.com/jkcoxson/em_proxy) powers the defining feature of SideStore: untethered app installation. By leveraging a custom-built App Store app with additional entitlements ([LocalDevVPN](https://github.com/jkcoxson/LocalDevVPN)) to create the VPN tunnel for us, it allows SideStore to take advantage of [Jitterbug](https://github.com/osy/Jitterbug)'s loopback method without requiring a paid developer account.
|
||||||
|
|
||||||
### Minimuxer
|
### Minimuxer
|
||||||
[Minimuxer](https://github.com/jkcoxson/minimuxer) is a lockdown muxer that can run inside iOS’s sandbox. It replicates Apple’s usbmuxd protocol on MacOS to “discover” devices to interface with wireguard On-Device.
|
[Minimuxer](https://github.com/jkcoxson/minimuxer) is a lockdown muxer that can run inside iOS’s sandbox. It replicates Apple’s usbmuxd protocol on macOS to “discover” devices to interface with LocalDevVPN on-device.
|
||||||
|
|
||||||
### Roxas
|
### Roxas
|
||||||
[Roxas](https://github.com/rileytestut/roxas) is Riley Testut's internal framework from AltStore used across many of their iOS projects, developed to simplify a variety of common tasks used in iOS development.
|
[Roxas](https://github.com/rileytestut/roxas) is Riley Testut's internal framework from AltStore used across many of their iOS projects, developed to simplify a variety of common tasks used in iOS development.
|
||||||
|
|||||||
18
SideStore/EmotionalDamage/EmotionalDamage.swift
Normal file
18
SideStore/EmotionalDamage/EmotionalDamage.swift
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// EmotionalDamage.swift
|
||||||
|
// EmotionalDamage
|
||||||
|
//
|
||||||
|
// Created by Jackson Coxson on 10/26/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public func start_em_proxy(bind_addr: String) {
|
||||||
|
let host = NSString(string: bind_addr)
|
||||||
|
let host_pointer = UnsafeMutablePointer<CChar>(mutating: host.utf8String)
|
||||||
|
let _ = start_emotional_damage(host_pointer)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func stop_em_proxy() {
|
||||||
|
stop_emotional_damage()
|
||||||
|
}
|
||||||
@@ -19,7 +19,41 @@ final class UITests: XCTestCase {
|
|||||||
|
|
||||||
private static let APP_NAME = "SideStore"
|
private static let APP_NAME = "SideStore"
|
||||||
|
|
||||||
|
func printAllMethods(of className: String) {
|
||||||
|
guard let cls: AnyClass = objc_getClass(className) as? AnyClass else {
|
||||||
|
print("Class \(className) not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var methodCount: UInt32 = 0
|
||||||
|
if let methodList = class_copyMethodList(cls, &methodCount) {
|
||||||
|
for i in 0..<Int(methodCount) {
|
||||||
|
let method = methodList[i]
|
||||||
|
let sel = method_getName(method)
|
||||||
|
print(String(describing: sel))
|
||||||
|
}
|
||||||
|
free(methodList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override func setUpWithError() throws {
|
override func setUpWithError() throws {
|
||||||
|
// ensure the swizzle only happens once
|
||||||
|
if !Self.mockIdlingPrivateApiToNoOp {
|
||||||
|
let original = class_getInstanceMethod(
|
||||||
|
objc_getClass("XCUIApplicationProcess") as? AnyClass,
|
||||||
|
// this is the new method signature obtained via reflection
|
||||||
|
Selector(("waitForQuiescenceIncludingAnimationsIdle:isPreEvent:"))
|
||||||
|
)
|
||||||
|
let replaced = class_getInstanceMethod(type(of: self), #selector(Self.replace))
|
||||||
|
if let original, let replaced{
|
||||||
|
method_exchangeImplementations(original, replaced)
|
||||||
|
}
|
||||||
|
Self.mockIdlingPrivateApiToNoOp = true
|
||||||
|
}
|
||||||
|
|
||||||
|
/* UNCOMMENT below to enable the printing of private members of XCUIApplicationProcess */
|
||||||
|
// printAllMethods(of: "XCUIApplicationProcess")
|
||||||
|
|
||||||
// Put setup code here. This method is called before the invocation of each test method in the class.
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
// Self.dismissSpotlight()
|
// Self.dismissSpotlight()
|
||||||
// Self.deleteMyApp()
|
// Self.deleteMyApp()
|
||||||
@@ -47,7 +81,9 @@ final class UITests: XCTestCase {
|
|||||||
|
|
||||||
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
||||||
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
||||||
systemAlert.scrollViews.otherElements.buttons["Allow"].tap()
|
let allowButton = systemAlert.scrollViews.otherElements.buttons["Allow"]
|
||||||
|
_ = allowButton.exists || allowButton.waitForExistence(timeout: 0.5)
|
||||||
|
allowButton.tap()
|
||||||
|
|
||||||
// Do the actual validation
|
// Do the actual validation
|
||||||
try performBulkAddingRecommendedSources(for: app)
|
try performBulkAddingRecommendedSources(for: app)
|
||||||
@@ -55,6 +91,7 @@ final class UITests: XCTestCase {
|
|||||||
|
|
||||||
func testBulkAddInputSources() throws {
|
func testBulkAddInputSources() throws {
|
||||||
|
|
||||||
|
// let app = XCUIApplication()
|
||||||
let app = XCUIApplication()
|
let app = XCUIApplication()
|
||||||
app.launch()
|
app.launch()
|
||||||
|
|
||||||
@@ -62,8 +99,10 @@ final class UITests: XCTestCase {
|
|||||||
|
|
||||||
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
||||||
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
||||||
systemAlert.scrollViews.otherElements.buttons["Allow"].tap()
|
let allowButton = systemAlert.scrollViews.otherElements.buttons["Allow"]
|
||||||
|
_ = allowButton.exists || allowButton.waitForExistence(timeout: 0.5)
|
||||||
|
allowButton.tap()
|
||||||
|
|
||||||
// Do the actual validation
|
// Do the actual validation
|
||||||
try performBulkAddingInputSources(for: app)
|
try performBulkAddingInputSources(for: app)
|
||||||
}
|
}
|
||||||
@@ -77,8 +116,10 @@ final class UITests: XCTestCase {
|
|||||||
|
|
||||||
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
||||||
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
||||||
systemAlert.scrollViews.otherElements.buttons["Allow"].tap()
|
let allowButton = systemAlert.scrollViews.otherElements.buttons["Allow"]
|
||||||
|
_ = allowButton.exists || allowButton.waitForExistence(timeout: 0.5)
|
||||||
|
allowButton.tap()
|
||||||
|
|
||||||
// Do the actual validation
|
// Do the actual validation
|
||||||
try performRepeatabilityForStagingInputSources(for: app)
|
try performRepeatabilityForStagingInputSources(for: app)
|
||||||
}
|
}
|
||||||
@@ -92,8 +133,10 @@ final class UITests: XCTestCase {
|
|||||||
|
|
||||||
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
// if it exists keep going immediately else wait for upto 5 sec with polling every 1 sec for existence
|
||||||
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
XCTAssertTrue(systemAlert.exists || systemAlert.waitForExistence(timeout: 5), "Notifications alert did not appear")
|
||||||
systemAlert.scrollViews.otherElements.buttons["Allow"].tap()
|
let allowButton = systemAlert.scrollViews.otherElements.buttons["Allow"]
|
||||||
|
_ = allowButton.exists || allowButton.waitForExistence(timeout: 0.5)
|
||||||
|
allowButton.tap()
|
||||||
|
|
||||||
// Do the actual validation
|
// Do the actual validation
|
||||||
try performRepeatabilityForStagingRecommendedSources(for: app)
|
try performRepeatabilityForStagingRecommendedSources(for: app)
|
||||||
}
|
}
|
||||||
@@ -157,6 +200,13 @@ private extension UITests {
|
|||||||
springboard_app.tap()
|
springboard_app.tap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc func replace() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
static var mockIdlingPrivateApiToNoOp = false
|
||||||
|
|
||||||
|
|
||||||
class func deleteMyApp2() {
|
class func deleteMyApp2() {
|
||||||
XCUIApplication().terminate()
|
XCUIApplication().terminate()
|
||||||
dismissSpringboardAlerts()
|
dismissSpringboardAlerts()
|
||||||
@@ -171,16 +221,19 @@ private extension UITests {
|
|||||||
let button = springboard_app.buttons["Remove App"]
|
let button = springboard_app.buttons["Remove App"]
|
||||||
_ = button.exists || button.waitForExistence(timeout: 5)
|
_ = button.exists || button.waitForExistence(timeout: 5)
|
||||||
button.tap()
|
button.tap()
|
||||||
|
_ = springboard_app.waitForExistence(timeout: 0.5)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
let button = springboard_app.buttons["Delete App"]
|
let button = springboard_app.buttons["Delete App"]
|
||||||
_ = button.waitForExistence(timeout: 0.3)
|
_ = button.waitForExistence(timeout: 0.5)
|
||||||
button.tap()
|
button.tap()
|
||||||
|
_ = springboard_app.waitForExistence(timeout: 0.5)
|
||||||
}
|
}
|
||||||
do {
|
do {
|
||||||
let button = springboard_app.buttons["Delete"]
|
let button = springboard_app.buttons["Delete"]
|
||||||
_ = button.waitForExistence(timeout: 0.3)
|
_ = button.waitForExistence(timeout: 0.5)
|
||||||
button.tap()
|
button.tap()
|
||||||
|
_ = springboard_app.waitForExistence(timeout: 0.5)
|
||||||
}
|
}
|
||||||
|
|
||||||
// // Press home once to make the icons stop wiggling
|
// // Press home once to make the icons stop wiggling
|
||||||
@@ -230,20 +283,50 @@ private extension UITests {
|
|||||||
try tapAddForThesePickedSources(app: app, sourceMappings: sourceMappings, cellsQuery: cellsQuery)
|
try tapAddForThesePickedSources(app: app, sourceMappings: sourceMappings, cellsQuery: cellsQuery)
|
||||||
|
|
||||||
// Commit the changes by tapping "Done".
|
// Commit the changes by tapping "Done".
|
||||||
app.navigationBars["Add Source"].buttons["Done"].tap()
|
let doneButton = app.navigationBars["Add Source"].buttons["Done"]
|
||||||
|
_ = doneButton.waitForExistence(timeout: 0.5)
|
||||||
|
doneButton.tap()
|
||||||
|
|
||||||
// Accept each source addition via alert.
|
// Accept each source addition via alert.
|
||||||
for source in sourceMappings {
|
for source in sourceMappings {
|
||||||
let alertIdentifier = "Would you like to add the source “\(source.alertTitle)”?"
|
let alertIdentifier = "Would you like to add the source “\(source.alertTitle)”?"
|
||||||
let addSourceButton = app.alerts[alertIdentifier]
|
let addSourceButton = app.alerts[alertIdentifier]
|
||||||
.scrollViews.otherElements.buttons["Add Source"]
|
.scrollViews.otherElements.buttons["Add Source"]
|
||||||
_ = addSourceButton.exists || addSourceButton.waitForExistence(timeout: 0.3)
|
_ = addSourceButton.waitForExistence(timeout: 0.5)
|
||||||
addSourceButton.tap()
|
addSourceButton.tap()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private func performBulkAddingRecommendedSources(for app: XCUIApplication) throws {
|
||||||
|
// Navigate to the Sources screen and open the Add Source view.
|
||||||
|
let srcTab = app.tabBars["Tab Bar"].buttons["Sources"]
|
||||||
|
_ = srcTab.waitForExistence(timeout: 0.5)
|
||||||
|
srcTab.tap()
|
||||||
|
let srcAdd = app.navigationBars["Sources"].buttons["Add"]
|
||||||
|
_ = srcAdd.waitForExistence(timeout: 0.5)
|
||||||
|
srcAdd.tap()
|
||||||
|
|
||||||
|
let cellsQuery = app.collectionViews.cells
|
||||||
|
|
||||||
|
// Data model for recommended sources. NOTE: This list order is required to be the same as that of "Add Source" Screen
|
||||||
|
let recommendedSources: [(identifier: String, alertTitle: String, requiresSwipe: Bool)] = [
|
||||||
|
("SideStore Team Picks\ncommunity-apps.sidestore.io/sidecommunity.json", "SideStore Team Picks", false),
|
||||||
|
("Provenance EMU\nprovenance-emu.com/apps.json", "Provenance EMU", false),
|
||||||
|
("Countdown Respository\nneoarz.github.io/Countdown-App/Countdown.json", "Countdown Respository", false),
|
||||||
|
("OatmealDome's AltStore Source\naltstore.oatmealdome.me", "OatmealDome's AltStore Source", true),
|
||||||
|
("UTM Repository\nVirtual machines for iOS", "UTM Repository", false),
|
||||||
|
("Flyinghead\nflyinghead.github.io/flycast-builds/altstore.json", "Flyinghead", false),
|
||||||
|
// ("PojavLauncher Repository\nalt.crystall1ne.dev", "PojavLauncher Repository", false), // not a stable source, sometimes becomes unreachable, so disabled
|
||||||
|
("PokeMMO\npokemmo.eu/altstore/", "PokeMMO", true),
|
||||||
|
("Odyssey\ntheodyssey.dev/altstore/odysseysource.json", "Odyssey", false),
|
||||||
|
("Yattee\nrepos.yattee.stream/alt/apps.json", "Yattee", false),
|
||||||
|
("ThatStella7922 Source\nThe home for all apps ThatStella7922", "ThatStella7922 Source", false)
|
||||||
|
]
|
||||||
|
|
||||||
|
try performBulkAdd(app: app, sourceMappings: recommendedSources, cellsQuery: cellsQuery)
|
||||||
|
}
|
||||||
|
|
||||||
private func performBulkAddingInputSources(for app: XCUIApplication) throws {
|
private func performBulkAddingInputSources(for app: XCUIApplication) throws {
|
||||||
|
|
||||||
// set content into clipboard (for bulk add (paste))
|
// set content into clipboard (for bulk add (paste))
|
||||||
@@ -260,17 +343,23 @@ private extension UITests {
|
|||||||
https://bit.ly/Quantumsource
|
https://bit.ly/Quantumsource
|
||||||
""".trimmedIndentation
|
""".trimmedIndentation
|
||||||
|
|
||||||
let app = XCUIApplication()
|
let srcTab = app.tabBars["Tab Bar"].buttons["Sources"]
|
||||||
app.tabBars["Tab Bar"].buttons["Sources"].tap()
|
_ = srcTab.waitForExistence(timeout: 0.5)
|
||||||
app.navigationBars["Sources"].buttons["Add"].tap()
|
srcTab.tap()
|
||||||
|
let srcAdd = app.navigationBars["Sources"].buttons["Add"]
|
||||||
|
_ = srcAdd.waitForExistence(timeout: 0.5)
|
||||||
|
srcAdd.tap()
|
||||||
|
|
||||||
let collectionViewsQuery = app.collectionViews
|
let collectionViewsQuery = app.collectionViews
|
||||||
let appsSidestoreIoTextField = collectionViewsQuery.textFields["apps.sidestore.io"]
|
let appsSidestoreIoTextField = collectionViewsQuery.textFields["apps.sidestore.io"]
|
||||||
_ = appsSidestoreIoTextField.exists || appsSidestoreIoTextField.waitForExistence(timeout: 5)
|
_ = appsSidestoreIoTextField.waitForExistence(timeout: 0.5)
|
||||||
appsSidestoreIoTextField.tap()
|
appsSidestoreIoTextField.tap()
|
||||||
appsSidestoreIoTextField.tap()
|
appsSidestoreIoTextField.tap()
|
||||||
collectionViewsQuery.staticTexts["Paste"].tap()
|
_ = appsSidestoreIoTextField.waitForExistence(timeout: 0.5)
|
||||||
|
let pasteButton = collectionViewsQuery.staticTexts["Paste"]
|
||||||
|
_ = pasteButton.waitForExistence(timeout: 0.5)
|
||||||
|
pasteButton.tap()
|
||||||
|
|
||||||
// if app.keyboards.buttons["Return"].exists {
|
// if app.keyboards.buttons["Return"].exists {
|
||||||
// app.keyboards.buttons["Return"].tap()
|
// app.keyboards.buttons["Return"].tap()
|
||||||
// } else if app.keyboards.buttons["Done"].exists {
|
// } else if app.keyboards.buttons["Done"].exists {
|
||||||
@@ -282,6 +371,7 @@ private extension UITests {
|
|||||||
|
|
||||||
if app.keyboards.count > 0 {
|
if app.keyboards.count > 0 {
|
||||||
appsSidestoreIoTextField.typeText("\n") // Fallback to newline so that soft kb is dismissed
|
appsSidestoreIoTextField.typeText("\n") // Fallback to newline so that soft kb is dismissed
|
||||||
|
_ = app.exists || app.waitForExistence(timeout: 0.5)
|
||||||
}
|
}
|
||||||
|
|
||||||
let cellsQuery = collectionViewsQuery.cells
|
let cellsQuery = collectionViewsQuery.cells
|
||||||
@@ -302,7 +392,32 @@ private extension UITests {
|
|||||||
try performBulkAdd(app: app, sourceMappings: textInputSources, cellsQuery: cellsQuery)
|
try performBulkAdd(app: app, sourceMappings: textInputSources, cellsQuery: cellsQuery)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func performRepeatabilityForStagingRecommendedSources(for app: XCUIApplication) throws {
|
||||||
|
// Navigate to the Sources screen and open the Add Source view.
|
||||||
|
let srcTab = app.tabBars["Tab Bar"].buttons["Sources"]
|
||||||
|
srcTab.tap()
|
||||||
|
_ = srcTab.waitForExistence(timeout: 0.5)
|
||||||
|
let srcAdd = app.navigationBars["Sources"].buttons["Add"]
|
||||||
|
srcAdd.tap()
|
||||||
|
_ = srcAdd.waitForExistence(timeout: 0.5)
|
||||||
|
|
||||||
|
let cellsQuery = app.collectionViews.cells
|
||||||
|
|
||||||
|
// Data model for recommended sources. NOTE: This list order is required to be the same as that of "Add Source" Screen
|
||||||
|
let recommendedSources: [(identifier: String, alertTitle: String, requiresSwipe: Bool)] = [
|
||||||
|
("SideStore Team Picks\ncommunity-apps.sidestore.io/sidecommunity.json", "SideStore Team Picks", false),
|
||||||
|
("Provenance EMU\nprovenance-emu.com/apps.json", "Provenance EMU", false),
|
||||||
|
("Countdown Respository\nneoarz.github.io/Countdown-App/Countdown.json", "Countdown Respository", false),
|
||||||
|
("OatmealDome's AltStore Source\naltstore.oatmealdome.me", "OatmealDome's AltStore Source", false),
|
||||||
|
("UTM Repository\nVirtual machines for iOS", "UTM Repository", false),
|
||||||
|
]
|
||||||
|
|
||||||
|
let repeatCount = 3 // number of times to run the entire sequence
|
||||||
|
let timeSeed = UInt64(Date().timeIntervalSince1970) // time is unique (upto microseconds) - uncomment this to use non-deterministic seed based RNG (random number generator)
|
||||||
|
|
||||||
|
try repeatabilityTest(app: app, sourceMappings: recommendedSources, cellsQuery: cellsQuery, repeatCount: repeatCount, seed: timeSeed)
|
||||||
|
}
|
||||||
|
|
||||||
private func performRepeatabilityForStagingInputSources(for app: XCUIApplication) throws {
|
private func performRepeatabilityForStagingInputSources(for app: XCUIApplication) throws {
|
||||||
|
|
||||||
// set content into clipboard (for bulk add (paste))
|
// set content into clipboard (for bulk add (paste))
|
||||||
@@ -315,20 +430,28 @@ private extension UITests {
|
|||||||
https://bit.ly/40Isul6
|
https://bit.ly/40Isul6
|
||||||
""".trimmedIndentation
|
""".trimmedIndentation
|
||||||
|
|
||||||
let app = XCUIApplication()
|
let srcTab = app.tabBars["Tab Bar"].buttons["Sources"]
|
||||||
app.tabBars["Tab Bar"].buttons["Sources"].tap()
|
_ = srcTab.waitForExistence(timeout: 0.5)
|
||||||
app.navigationBars["Sources"].buttons["Add"].tap()
|
srcTab.tap()
|
||||||
|
let srcAdd = app.navigationBars["Sources"].buttons["Add"]
|
||||||
|
_ = srcAdd.waitForExistence(timeout: 0.5)
|
||||||
|
srcAdd.tap()
|
||||||
|
|
||||||
|
|
||||||
let collectionViewsQuery = app.collectionViews
|
let collectionViewsQuery = app.collectionViews
|
||||||
let appsSidestoreIoTextField = collectionViewsQuery.textFields["apps.sidestore.io"]
|
let appsSidestoreIoTextField = collectionViewsQuery.textFields["apps.sidestore.io"]
|
||||||
_ = appsSidestoreIoTextField.exists || appsSidestoreIoTextField.waitForExistence(timeout: 5)
|
_ = appsSidestoreIoTextField.waitForExistence(timeout: 0.5)
|
||||||
appsSidestoreIoTextField.tap()
|
appsSidestoreIoTextField.tap()
|
||||||
appsSidestoreIoTextField.tap()
|
appsSidestoreIoTextField.tap()
|
||||||
_ = appsSidestoreIoTextField.exists || appsSidestoreIoTextField.waitForExistence(timeout: 5)
|
_ = appsSidestoreIoTextField.waitForExistence(timeout: 0.5)
|
||||||
collectionViewsQuery.staticTexts["Paste"].tap()
|
let pasteButton = collectionViewsQuery.staticTexts["Paste"]
|
||||||
|
_ = pasteButton.waitForExistence(timeout: 0.5)
|
||||||
|
pasteButton.tap()
|
||||||
|
|
||||||
|
|
||||||
if app.keyboards.count > 0 {
|
if app.keyboards.count > 0 {
|
||||||
appsSidestoreIoTextField.typeText("\n") // Fallback to newline so that soft kb is dismissed
|
appsSidestoreIoTextField.typeText("\n") // Fallback to newline so that soft kb is dismissed
|
||||||
|
_ = app.exists || app.waitForExistence(timeout: 0.5)
|
||||||
}
|
}
|
||||||
|
|
||||||
let cellsQuery = collectionViewsQuery.cells
|
let cellsQuery = collectionViewsQuery.cells
|
||||||
@@ -380,64 +503,27 @@ private extension UITests {
|
|||||||
.containing(.button, identifier: source.identifier)
|
.containing(.button, identifier: source.identifier)
|
||||||
.children(matching: .button)[source.identifier]
|
.children(matching: .button)[source.identifier]
|
||||||
XCTAssert(sourceButton.exists || sourceButton.waitForExistence(timeout: 10), "Source preview for id: '\(source.alertTitle)' not found in the view")
|
XCTAssert(sourceButton.exists || sourceButton.waitForExistence(timeout: 10), "Source preview for id: '\(source.alertTitle)' not found in the view")
|
||||||
|
|
||||||
|
_ = sourceButton.exists || sourceButton.waitForExistence(timeout: 0.5)
|
||||||
|
|
||||||
// let addButton = sourceButton.children(matching: .button).firstMatch
|
// let addButton = sourceButton.children(matching: .button).firstMatch
|
||||||
|
// let addButton = sourceButton.descendants(matching: .button)["add"]
|
||||||
|
// XCTAssert(addButton.exists || addButton.waitForExistence(timeout: 0.5), " `+` button for id: '\(source.alertTitle)' not found in the preview container")
|
||||||
|
// addButton.tap()
|
||||||
|
|
||||||
let addButton = sourceButton.children(matching: .button)["add"]
|
let addButton = sourceButton.children(matching: .button)["add"]
|
||||||
XCTAssert(addButton.exists || addButton.waitForExistence(timeout: 0.3), " `+` button for id: '\(source.alertTitle)' not found in the preview container")
|
XCTAssert(addButton.waitForExistence(timeout: 1)) //TODO: fine tune down the value to make tests faster (but validate tests still works)
|
||||||
addButton.tap()
|
// addButton.tap()
|
||||||
|
|
||||||
|
let coord = addButton.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.5))
|
||||||
|
coord.tap()
|
||||||
|
|
||||||
if source.requiresSwipe {
|
if source.requiresSwipe {
|
||||||
sourceButton.swipeUp(velocity: .slow) // Swipe up if needed.
|
sourceButton.swipeUp(velocity: .slow) // Swipe up if needed.
|
||||||
|
_ = sourceButton.waitForExistence(timeout: 0.5)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func performBulkAddingRecommendedSources(for app: XCUIApplication) throws {
|
|
||||||
// Navigate to the Sources screen and open the Add Source view.
|
|
||||||
app.tabBars["Tab Bar"].buttons["Sources"].tap()
|
|
||||||
app.navigationBars["Sources"].buttons["Add"].tap()
|
|
||||||
|
|
||||||
let cellsQuery = app.collectionViews.cells
|
|
||||||
|
|
||||||
// Data model for recommended sources. NOTE: This list order is required to be the same as that of "Add Source" Screen
|
|
||||||
let recommendedSources: [(identifier: String, alertTitle: String, requiresSwipe: Bool)] = [
|
|
||||||
("SideStore Team Picks\ncommunity-apps.sidestore.io/sidecommunity.json", "SideStore Team Picks", false),
|
|
||||||
("Provenance EMU\nprovenance-emu.com/apps.json", "Provenance EMU", false),
|
|
||||||
("Countdown Respository\nneoarz.github.io/Countdown-App/Countdown.json", "Countdown Respository", false),
|
|
||||||
("OatmealDome's AltStore Source\naltstore.oatmealdome.me", "OatmealDome's AltStore Source", true),
|
|
||||||
("UTM Repository\nVirtual machines for iOS", "UTM Repository", false),
|
|
||||||
("Flyinghead\nflyinghead.github.io/flycast-builds/altstore.json", "Flyinghead", false),
|
|
||||||
// ("PojavLauncher Repository\nalt.crystall1ne.dev", "PojavLauncher Repository", false), // not a stable source, sometimes becomes unreachable, so disabled
|
|
||||||
("PokeMMO\npokemmo.eu/altstore/", "PokeMMO", true),
|
|
||||||
("Odyssey\ntheodyssey.dev/altstore/odysseysource.json", "Odyssey", false),
|
|
||||||
("Yattee\nrepos.yattee.stream/alt/apps.json", "Yattee", false),
|
|
||||||
("ThatStella7922 Source\nThe home for all apps ThatStella7922", "ThatStella7922 Source", false)
|
|
||||||
]
|
|
||||||
|
|
||||||
try performBulkAdd(app: app, sourceMappings: recommendedSources, cellsQuery: cellsQuery)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func performRepeatabilityForStagingRecommendedSources(for app: XCUIApplication) throws {
|
|
||||||
// Navigate to the Sources screen and open the Add Source view.
|
|
||||||
app.tabBars["Tab Bar"].buttons["Sources"].tap()
|
|
||||||
app.navigationBars["Sources"].buttons["Add"].tap()
|
|
||||||
|
|
||||||
let cellsQuery = app.collectionViews.cells
|
|
||||||
|
|
||||||
// Data model for recommended sources. NOTE: This list order is required to be the same as that of "Add Source" Screen
|
|
||||||
let recommendedSources: [(identifier: String, alertTitle: String, requiresSwipe: Bool)] = [
|
|
||||||
("SideStore Team Picks\ncommunity-apps.sidestore.io/sidecommunity.json", "SideStore Team Picks", false),
|
|
||||||
("Provenance EMU\nprovenance-emu.com/apps.json", "Provenance EMU", false),
|
|
||||||
("Countdown Respository\nneoarz.github.io/Countdown-App/Countdown.json", "Countdown Respository", false),
|
|
||||||
("OatmealDome's AltStore Source\naltstore.oatmealdome.me", "OatmealDome's AltStore Source", false),
|
|
||||||
("UTM Repository\nVirtual machines for iOS", "UTM Repository", false),
|
|
||||||
]
|
|
||||||
|
|
||||||
let repeatCount = 3 // number of times to run the entire sequence
|
|
||||||
let timeSeed = UInt64(Date().timeIntervalSince1970) // time is unique (upto microseconds) - uncomment this to use non-deterministic seed based RNG (random number generator)
|
|
||||||
|
|
||||||
try repeatabilityTest(app: app, sourceMappings: recommendedSources, cellsQuery: cellsQuery, repeatCount: repeatCount, seed: timeSeed)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,48 +59,97 @@ public class AbstractConsoleLogger<T: OutputStream>: ConsoleLogger{
|
|||||||
originalStdout = dup(STDOUT_FILENO)
|
originalStdout = dup(STDOUT_FILENO)
|
||||||
originalStderr = dup(STDERR_FILENO)
|
originalStderr = dup(STDERR_FILENO)
|
||||||
|
|
||||||
|
let redirectedOutStream = self.outPipe?.fileHandleForWriting.fileDescriptor ?? -1
|
||||||
|
let redirectedErrStream = self.errPipe?.fileHandleForWriting.fileDescriptor ?? -1
|
||||||
|
|
||||||
// Redirect stdout and stderr to our pipes
|
// Redirect stdout and stderr to our pipes
|
||||||
dup2(self.outPipe?.fileHandleForWriting.fileDescriptor ?? -1, STDOUT_FILENO)
|
dup2(redirectedOutStream, STDOUT_FILENO)
|
||||||
dup2(self.errPipe?.fileHandleForWriting.fileDescriptor ?? -1, STDERR_FILENO)
|
dup2(redirectedErrStream, STDERR_FILENO)
|
||||||
|
|
||||||
|
// Disable libc-level buffering
|
||||||
|
// (libc by default uses bufferring except its own console/TTYs such as for pipes)
|
||||||
|
// we do have our own buffering so we disable stdlib io level bufferring
|
||||||
|
setvbuf(stdout, nil, _IONBF, 0) // disable buffering for stdout
|
||||||
|
setvbuf(stderr, nil, _IONBF, 0) // disable buffering for stderr
|
||||||
|
|
||||||
// Setup readability handlers for raw data
|
// Setup readability handlers for raw data
|
||||||
setupReadabilityHandler(for: outputHandle, isError: false)
|
setupReadabilityHandler(for: outputHandle, isError: false)
|
||||||
setupReadabilityHandler(for: errorHandle, isError: true)
|
setupReadabilityHandler(for: errorHandle, isError: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let shutdownLock = NSLock()
|
||||||
|
|
||||||
private func setupReadabilityHandler(for handle: FileHandle?, isError: Bool) {
|
private func setupReadabilityHandler(for handle: FileHandle?, isError: Bool) {
|
||||||
handle?.readabilityHandler = { [weak self] handle in
|
handle?.readabilityHandler = readHandler(isError: isError)
|
||||||
let data = handle.availableData
|
}
|
||||||
if !data.isEmpty {
|
|
||||||
self?.writeQueue.async {
|
private func readHandler(isError: Bool) -> (FileHandle) -> Void {
|
||||||
try? self?.writeData(data)
|
return { [weak self] _ in
|
||||||
}
|
// Lock first before touching anything
|
||||||
|
self?.shutdownLock.lock()
|
||||||
// Forward to original std stream
|
defer { self?.shutdownLock.unlock() }
|
||||||
if let originalFD = isError ? self?.originalStderr : self?.originalStdout {
|
|
||||||
data.withUnsafeBytes { (bufferPointer) -> Void in
|
// Capture strong self *after* lock is acquired
|
||||||
if let baseAddress = bufferPointer.baseAddress, bufferPointer.count > 0 {
|
guard let self = self else { return }
|
||||||
write(originalFD, baseAddress, bufferPointer.count)
|
|
||||||
}
|
let handle = isError ? self.errorHandle : self.outputHandle
|
||||||
|
guard let data = handle?.availableData else { return }
|
||||||
|
|
||||||
|
writeQueue.async {
|
||||||
|
try? self.writeData(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. Echo to original stdout/stderr if still valid
|
||||||
|
guard let fd = isError ? self.originalStderr : self.originalStdout else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? "UnknownApp"
|
||||||
|
guard fcntl(fd, F_GETFD) != -1 else {
|
||||||
|
NSLog("[%@] ConsoleLogger: Original FD (%d) is invalid, skipping echo", appName, fd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data.withUnsafeBytes { rawBufferPointer in
|
||||||
|
guard let base = rawBufferPointer.baseAddress else { return }
|
||||||
|
var remaining = data.count
|
||||||
|
var offset = 0
|
||||||
|
let maxChunkSize = 16 * 1024 // 16 KB chunks
|
||||||
|
|
||||||
|
// write in chunks, else will throw 'Result too large'
|
||||||
|
while remaining > 0 {
|
||||||
|
let chunkSize = min(maxChunkSize, remaining)
|
||||||
|
let written = write(fd, base.advanced(by: offset), chunkSize)
|
||||||
|
|
||||||
|
if written < 0 {
|
||||||
|
NSLog("[%@] ConsoleLogger: Failed to re-echo to FD %d: %s", appName, fd, strerror(errno))
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remaining -= written
|
||||||
|
offset += written
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
func writeData(_ data: Data) throws {
|
func writeData(_ data: Data) throws {
|
||||||
throw AbstractClassError.abstractMethodInvoked
|
throw AbstractClassError.abstractMethodInvoked
|
||||||
}
|
}
|
||||||
|
|
||||||
func stopCapturing() {
|
func stopCapturing() {
|
||||||
|
shutdownLock.lock()
|
||||||
|
defer { shutdownLock.unlock() }
|
||||||
|
|
||||||
ostream.close()
|
ostream.close()
|
||||||
|
|
||||||
// Restore original stdout and stderr
|
// Restore original stdout and stderr
|
||||||
if let stdout = originalStdout {
|
if let stdout = originalStdout, stdout != STDOUT_FILENO {
|
||||||
dup2(stdout, STDOUT_FILENO)
|
dup2(stdout, STDOUT_FILENO)
|
||||||
close(stdout)
|
close(stdout)
|
||||||
}
|
}
|
||||||
if let stderr = originalStderr {
|
if let stderr = originalStderr, stderr != STDERR_FILENO {
|
||||||
dup2(stderr, STDERR_FILENO)
|
dup2(stderr, STDERR_FILENO)
|
||||||
close(stderr)
|
close(stderr)
|
||||||
}
|
}
|
||||||
|
|||||||
1
SideStore/em_proxy
Submodule
1
SideStore/em_proxy
Submodule
Submodule SideStore/em_proxy added at 24fdd245e6
343
SideStore/em_proxy.xcodeproj/project.pbxproj
Normal file
343
SideStore/em_proxy.xcodeproj/project.pbxproj
Normal file
@@ -0,0 +1,343 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 53;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
9987603429A4555300818586 /* em_proxy.h in Sources */ = {isa = PBXBuildFile; fileRef = 9999259129A45319005CF020 /* em_proxy.h */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXBuildRule section */
|
||||||
|
CA6094FFF692AC6C1400ACA8 /* PBXBuildRule */ = {
|
||||||
|
isa = PBXBuildRule;
|
||||||
|
compilerSpec = com.apple.compilers.proxy.script;
|
||||||
|
filePatterns = "*/em_proxy.h";
|
||||||
|
fileType = pattern.proxy;
|
||||||
|
inputFiles = (
|
||||||
|
);
|
||||||
|
isEditable = 0;
|
||||||
|
name = "Cargo project build";
|
||||||
|
outputFiles = (
|
||||||
|
"$(OBJECT_FILE_DIR)/$(CARGO_XCODE_TARGET_ARCH)-$(EXECUTABLE_NAME)",
|
||||||
|
);
|
||||||
|
script = "# generated with cargo-xcode 1.5.0\n# modified to use prebuilt binaries\n\nset -eu;\n\nBUILT_SRC=\"./em_proxy/$LIB_FILE_NAME.a\"\necho Generating Static lib: $BUILT_SRC\nln -f -- \"$BUILT_SRC\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\" || cp \"$BUILT_SRC\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\necho \"$BUILT_SRC -> $TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\n\n# xcode generates dep file, but for its own path, so append our rename to it\n#DEP_FILE_SRC=\"minimuxer/target/${CARGO_XCODE_TARGET_TRIPLE}/release/${CARGO_XCODE_CARGO_DEP_FILE_NAME}\"\n#if [ -f \"$DEP_FILE_SRC\" ]; then\n# DEP_FILE_DST=\"${DERIVED_FILE_DIR}/${CARGO_XCODE_TARGET_ARCH}-${EXECUTABLE_NAME}.d\"\n# cp -f \"$DEP_FILE_SRC\" \"$DEP_FILE_DST\"\n# echo >> \"$DEP_FILE_DST\" \"$SCRIPT_OUTPUT_FILE_0: $BUILT_SRC\"\n#fi\n\n# lipo script needs to know all the platform-specific files that have been built\n# archs is in the file name, so that paths don't stay around after archs change\n# must match input for LipoScript\n#FILE_LIST=\"${DERIVED_FILE_DIR}/${ARCHS}-${EXECUTABLE_NAME}.xcfilelist\"\n#touch \"$FILE_LIST\"\n#if ! egrep -q \"$SCRIPT_OUTPUT_FILE_0\" \"$FILE_LIST\" ; then\n# echo >> \"$FILE_LIST\" \"$SCRIPT_OUTPUT_FILE_0\"\n#fi\n";
|
||||||
|
};
|
||||||
|
/* End PBXBuildRule section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
9999259129A45319005CF020 /* em_proxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = em_proxy.h; path = em_proxy/em_proxy.h; sourceTree = "<group>"; };
|
||||||
|
ADDEDBA66A6E1 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; };
|
||||||
|
CA60058A9FBE4D17AF51A7D5 /* run */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = run; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
CA60C44C93D7916DE57E6EBD /* libem_proxy_static.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libem_proxy_static.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
ADDEDBA66A6E2 /* Required for static linking */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
ADDEDBA66A6E1 /* libresolv.tbd */,
|
||||||
|
);
|
||||||
|
name = "Required for static linking";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
CA6094FFF69222869D176AE5 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
CA60C44C93D7916DE57E6EBD /* libem_proxy_static.a */,
|
||||||
|
CA60058A9FBE4D17AF51A7D5 /* run */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
CA6094FFF69298AF0B5890DB /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
ADDEDBA66A6E2 /* Required for static linking */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
CA6094FFF692D65BC3C892A8 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
9999259129A45319005CF020 /* em_proxy.h */,
|
||||||
|
CA6094FFF69222869D176AE5 /* Products */,
|
||||||
|
CA6094FFF69298AF0B5890DB /* Frameworks */,
|
||||||
|
);
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
CA60058A9FBE37FC563E4BCC /* run-bin */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = CA603DD75FB437FC563E4BCC /* Build configuration list for PBXNativeTarget "run-bin" */;
|
||||||
|
buildPhases = (
|
||||||
|
CA60445C303637FC563E4BCC /* Sources */,
|
||||||
|
CA6094FFF692AF6EBB7F357C /* Universal Binary lipo */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
CA6094FFF692AC6C1400ACA8 /* PBXBuildRule */,
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "run-bin";
|
||||||
|
productName = run;
|
||||||
|
productReference = CA60058A9FBE4D17AF51A7D5 /* run */;
|
||||||
|
productType = "com.apple.product-type.tool";
|
||||||
|
};
|
||||||
|
CA60C44C93D7A30E3695DD59 /* em_proxy-staticlib */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = CA603DD75FB4A30E3695DD59 /* Build configuration list for PBXNativeTarget "em_proxy-staticlib" */;
|
||||||
|
buildPhases = (
|
||||||
|
9987603529A4610700818586 /* ShellScript */,
|
||||||
|
CA60445C3036A30E3695DD59 /* Sources */,
|
||||||
|
CA6094FFF692AF6EBB7F357C /* Universal Binary lipo */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
CA6094FFF692AC6C1400ACA8 /* PBXBuildRule */,
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = "em_proxy-staticlib";
|
||||||
|
productName = libem_proxy_static.a;
|
||||||
|
productReference = CA60C44C93D7916DE57E6EBD /* libem_proxy_static.a */;
|
||||||
|
productType = "com.apple.product-type.library.static";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
CA6094FFF692E04653AD465F /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 1300;
|
||||||
|
TargetAttributes = {
|
||||||
|
CA60058A9FBE37FC563E4BCC = {
|
||||||
|
CreatedOnToolsVersion = 9.2;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
};
|
||||||
|
CA60C44C93D7A30E3695DD59 = {
|
||||||
|
CreatedOnToolsVersion = 9.2;
|
||||||
|
ProvisioningStyle = Automatic;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = CA6094FFF69280E02D6C7F57 /* Build configuration list for PBXProject "em_proxy" */;
|
||||||
|
compatibilityVersion = "Xcode 11.4";
|
||||||
|
developmentRegion = en;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = CA6094FFF692D65BC3C892A8;
|
||||||
|
productRefGroup = CA6094FFF69222869D176AE5 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
CA60C44C93D7A30E3695DD59 /* em_proxy-staticlib */,
|
||||||
|
CA60058A9FBE37FC563E4BCC /* run-bin */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
9987603529A4610700818586 /* ShellScript */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
./em_proxy/em_proxy.h,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "bash ./fetch-prebuilt.sh em_proxy\n";
|
||||||
|
};
|
||||||
|
CA6094FFF692AF6EBB7F357C /* Universal Binary lipo */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/$(ARCHS)-$(EXECUTABLE_NAME).xcfilelist",
|
||||||
|
);
|
||||||
|
name = "Universal Binary lipo";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(TARGET_BUILD_DIR)/$(EXECUTABLE_PATH)",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "# generated with cargo-xcode 1.5.0\n\n#set -eux; cat \"$DERIVED_FILE_DIR/$ARCHS-$EXECUTABLE_NAME.xcfilelist\" | tr '\\n' '\\0' | xargs -0 lipo -create -output \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\n#if [ ${LD_DYLIB_INSTALL_NAME:+1} ]; then\n# install_name_tool -id \"$LD_DYLIB_INSTALL_NAME\" \"$TARGET_BUILD_DIR/$EXECUTABLE_PATH\"\n#fi\n";
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
CA60445C303637FC563E4BCC /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
CA60445C3036A30E3695DD59 /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
9987603429A4555300818586 /* em_proxy.h in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
CA604DFE779B37FC563E4BCC /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CARGO_XCODE_CARGO_DEP_FILE_NAME = run.d;
|
||||||
|
CARGO_XCODE_CARGO_FILE_NAME = run;
|
||||||
|
PRODUCT_NAME = run;
|
||||||
|
SUPPORTED_PLATFORMS = macosx;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
CA604DFE779BA30E3695DD59 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CARGO_XCODE_CARGO_DEP_FILE_NAME = libem_proxy.d;
|
||||||
|
CARGO_XCODE_CARGO_FILE_NAME = libem_proxy.a;
|
||||||
|
INSTALL_GROUP = "";
|
||||||
|
INSTALL_MODE_FLAG = "";
|
||||||
|
INSTALL_OWNER = "";
|
||||||
|
LIB_FILE_NAME = "";
|
||||||
|
"LIB_FILE_NAME[sdk=iphoneos*]" = "libem_proxy-ios";
|
||||||
|
"LIB_FILE_NAME[sdk=iphonesimulator*]" = "libem_proxy-sim";
|
||||||
|
PRODUCT_NAME = em_proxy_static;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
CA609A517351228BE02872F8 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target";
|
||||||
|
CARGO_XCODE_BUILD_MODE = debug;
|
||||||
|
CARGO_XCODE_FEATURES = "";
|
||||||
|
"CARGO_XCODE_TARGET_ARCH[arch=arm64*]" = aarch64;
|
||||||
|
"CARGO_XCODE_TARGET_ARCH[arch=i386]" = i686;
|
||||||
|
"CARGO_XCODE_TARGET_ARCH[arch=x86_64*]" = x86_64;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=appletvos*]" = tvos;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=appletvsimulator*]" = tvos;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=iphoneos*]" = ios;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*]" = "ios-sim";
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*][arch=x86_64*]" = ios;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=macosx*]" = darwin;
|
||||||
|
CURRENT_PROJECT_VERSION = 0.1;
|
||||||
|
MARKETING_VERSION = 0.1.0;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
PRODUCT_NAME = em_proxy;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SUPPORTS_MACCATALYST = YES;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
CA609A5173513CC16B37690B /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CARGO_TARGET_DIR = "$(PROJECT_TEMP_DIR)/cargo_target";
|
||||||
|
CARGO_XCODE_BUILD_MODE = release;
|
||||||
|
CARGO_XCODE_FEATURES = "";
|
||||||
|
"CARGO_XCODE_TARGET_ARCH[arch=arm64*]" = aarch64;
|
||||||
|
"CARGO_XCODE_TARGET_ARCH[arch=i386]" = i686;
|
||||||
|
"CARGO_XCODE_TARGET_ARCH[arch=x86_64*]" = x86_64;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=appletvos*]" = tvos;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=appletvsimulator*]" = tvos;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=iphoneos*]" = ios;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*]" = "ios-sim";
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=iphonesimulator*][arch=x86_64*]" = ios;
|
||||||
|
"CARGO_XCODE_TARGET_OS[sdk=macosx*]" = darwin;
|
||||||
|
CURRENT_PROJECT_VERSION = 0.1;
|
||||||
|
MARKETING_VERSION = 0.1.0;
|
||||||
|
PRODUCT_NAME = em_proxy;
|
||||||
|
SDKROOT = macosx;
|
||||||
|
SUPPORTS_MACCATALYST = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
CA60DE07A83F37FC563E4BCC /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CARGO_XCODE_CARGO_DEP_FILE_NAME = run.d;
|
||||||
|
CARGO_XCODE_CARGO_FILE_NAME = run;
|
||||||
|
PRODUCT_NAME = run;
|
||||||
|
SUPPORTED_PLATFORMS = macosx;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
CA60DE07A83FA30E3695DD59 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
CARGO_XCODE_CARGO_DEP_FILE_NAME = libem_proxy.d;
|
||||||
|
CARGO_XCODE_CARGO_FILE_NAME = libem_proxy.a;
|
||||||
|
INSTALL_GROUP = "";
|
||||||
|
INSTALL_MODE_FLAG = "";
|
||||||
|
INSTALL_OWNER = "";
|
||||||
|
LIB_FILE_NAME = "";
|
||||||
|
"LIB_FILE_NAME[sdk=iphoneos*]" = "libem_proxy-ios";
|
||||||
|
"LIB_FILE_NAME[sdk=iphonesimulator*]" = "libem_proxy-sim";
|
||||||
|
PRODUCT_NAME = em_proxy_static;
|
||||||
|
SKIP_INSTALL = YES;
|
||||||
|
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos appletvsimulator appletvos";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
CA603DD75FB437FC563E4BCC /* Build configuration list for PBXNativeTarget "run-bin" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
CA604DFE779B37FC563E4BCC /* Release */,
|
||||||
|
CA60DE07A83F37FC563E4BCC /* Debug */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
CA603DD75FB4A30E3695DD59 /* Build configuration list for PBXNativeTarget "em_proxy-staticlib" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
CA604DFE779BA30E3695DD59 /* Release */,
|
||||||
|
CA60DE07A83FA30E3695DD59 /* Debug */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
CA6094FFF69280E02D6C7F57 /* Build configuration list for PBXProject "em_proxy" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
CA609A5173513CC16B37690B /* Release */,
|
||||||
|
CA609A517351228BE02872F8 /* Debug */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = CA6094FFF692E04653AD465F /* Project object */;
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "2610"
|
||||||
|
version = "1.7">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES"
|
||||||
|
buildArchitectures = "Automatic">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "CA60C44C93D7A30E3695DD59"
|
||||||
|
BuildableName = "libem_proxy_static.a"
|
||||||
|
BlueprintName = "em_proxy-staticlib"
|
||||||
|
ReferencedContainer = "container:em_proxy.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
shouldAutocreateTestPlan = "YES">
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "CA60C44C93D7A30E3695DD59"
|
||||||
|
BuildableName = "libem_proxy_static.a"
|
||||||
|
BlueprintName = "em_proxy-staticlib"
|
||||||
|
ReferencedContainer = "container:em_proxy.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "2610"
|
||||||
|
version = "1.7">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES"
|
||||||
|
buildArchitectures = "Automatic">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "CA609C732349A560B9642892"
|
||||||
|
BuildableName = "libminimuxer_static.a"
|
||||||
|
BlueprintName = "minimuxer-staticlib"
|
||||||
|
ReferencedContainer = "container:minimuxer.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
shouldAutocreateTestPlan = "YES">
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
debugServiceExtension = "internal"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "CA609C732349A560B9642892"
|
||||||
|
BuildableName = "libminimuxer_static.a"
|
||||||
|
BlueprintName = "minimuxer-staticlib"
|
||||||
|
ReferencedContainer = "container:minimuxer.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@@ -8,6 +8,34 @@
|
|||||||
"identifier": "com.sidestoreapps.community",
|
"identifier": "com.sidestoreapps.community",
|
||||||
"sourceURL": "https://community-apps.sidestore.io/sidecommunity.json"
|
"sourceURL": "https://community-apps.sidestore.io/sidecommunity.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.stik.stikdebug",
|
||||||
|
"sourceURL": "https://stikdebug.xyz/index.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.livecontainer.source",
|
||||||
|
"sourceURL": "https://raw.githubusercontent.com/LiveContainer/LiveContainer/refs/heads/main/apps.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.aoshuang.manicemu",
|
||||||
|
"sourceURL": "https://apps.manicemu.site/altstore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.stossy11.MeloNX",
|
||||||
|
"sourceURL": "https://git.ryujinx.app/melonx/emu/-/raw/XC-ios-ht/source.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.chachirie.source",
|
||||||
|
"sourceURL": "https://github.com/chachillie/Flycast-iOS/raw/refs/heads/main/flycast-ios.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "org.geode-sdk.altsource",
|
||||||
|
"sourceURL": "https://ios-repo.geode-sdk.org/altsource/main.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.sbuga.retrosekai",
|
||||||
|
"sourceURL": "https://repo.untitledcharts.com"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identifier": "org.provenance-emu.provenance",
|
"identifier": "org.provenance-emu.provenance",
|
||||||
"sourceURL": "https://provenance-emu.com/apps.json"
|
"sourceURL": "https://provenance-emu.com/apps.json"
|
||||||
@@ -25,11 +53,7 @@
|
|||||||
"sourceURL": "https://alt.getutm.app"
|
"sourceURL": "https://alt.getutm.app"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identifier": "com.flyinghead.source",
|
"identifier": "dev.crystall1ne.alt",
|
||||||
"sourceURL": "https://flyinghead.github.io/flycast-builds/altstore.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identifier": "dev.crystall1ne.repos.PojavLauncher",
|
|
||||||
"sourceURL": "https://alt.crystall1ne.dev"
|
"sourceURL": "https://alt.crystall1ne.dev"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -61,6 +85,30 @@
|
|||||||
"identifier": "com.sidestoreapps.community",
|
"identifier": "com.sidestoreapps.community",
|
||||||
"sourceURL": "https://community-apps.sidestore.io/sidecommunity.json"
|
"sourceURL": "https://community-apps.sidestore.io/sidecommunity.json"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.stik.stikdebug",
|
||||||
|
"sourceURL": "https://stikdebug.xyz/index.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.livecontainer.source",
|
||||||
|
"sourceURL": "https://raw.githubusercontent.com/LiveContainer/LiveContainer/refs/heads/main/apps.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.aoshuang.manicemu",
|
||||||
|
"sourceURL": "https://apps.manicemu.site/altstore"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.stossy11.MeloNX",
|
||||||
|
"sourceURL": "https://git.ryujinx.app/melonx/emu/-/raw/XC-ios-ht/source.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "com.chachirie.source",
|
||||||
|
"sourceURL": "https://github.com/chachillie/Flycast-iOS/raw/refs/heads/main/flycast-ios.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"identifier": "org.geode-sdk.altsource",
|
||||||
|
"sourceURL": "https://ios-repo.geode-sdk.org/altsource/main.json"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"identifier": "org.provenance-emu.provenance",
|
"identifier": "org.provenance-emu.provenance",
|
||||||
"sourceURL": "https://provenance-emu.com/apps.json"
|
"sourceURL": "https://provenance-emu.com/apps.json"
|
||||||
@@ -78,11 +126,7 @@
|
|||||||
"sourceURL": "https://alt.getutm.app"
|
"sourceURL": "https://alt.getutm.app"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"identifier": "com.flyinghead.source",
|
"identifier": "dev.crystall1ne.alt",
|
||||||
"sourceURL": "https://flyinghead.github.io/flycast-builds/altstore.json"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identifier": "dev.crystall1ne.repos.PojavLauncher",
|
|
||||||
"sourceURL": "https://alt.crystall1ne.dev"
|
"sourceURL": "https://alt.crystall1ne.dev"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
#include "../Build.xcconfig"
|
#include "../Build.xcconfig"
|
||||||
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = $(PRODUCT_BUNDLE_IDENTIFIER).AltBackup
|
PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.AltBackup. //$(DEVELOPMENT_TEAM)
|
||||||
|
//PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
||||||
|
//PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore.AltBackup
|
||||||
|
|||||||
@@ -2,5 +2,4 @@
|
|||||||
|
|
||||||
// Since AltStoreCore is unsigned or the team is not configured, we re-define the bundle ID here to not have extra '.'
|
// Since AltStoreCore is unsigned or the team is not configured, we re-define the bundle ID here to not have extra '.'
|
||||||
// This bundle ID doesn't need to change since altStoreCore framework lives inside SideStore main app's address space and won't have conflicts with other instances
|
// This bundle ID doesn't need to change since altStoreCore framework lives inside SideStore main app's address space and won't have conflicts with other instances
|
||||||
BUNDLE_ID = $(ORG_PREFIX).SideStore
|
PRODUCT_BUNDLE_IDENTIFIER = $(ORG_IDENTIFIER).SideStore.AltStoreCore
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = $(BUNDLE_ID).AltStoreCore
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
#include "../Build.xcconfig"
|
#include "../Build.xcconfig"
|
||||||
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = $(PRODUCT_BUNDLE_IDENTIFIER).AltWidget
|
PRODUCT_BUNDLE_IDENTIFIER[config=Debug] = $(ORG_IDENTIFIER).SideStore.$(DEVELOPMENT_TEAM).AltWidget
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER[config=Release] = $(ORG_IDENTIFIER).SideStore.AltWidget
|
||||||
|
|||||||
Reference in New Issue
Block a user