Compare commits

...

38 Commits

Author SHA1 Message Date
Huge_Black
75edfad132 Fix AltBackup.ipa is not included
Added a symlink in AltSotore/Resources/AltBackup.ipa that points to build/AltBackup.ipa

It seems Xcode reads all contents in AltSotore/Resources before ipa-altbackup runs, so AltBackup.ipa is missing in the first build. Adding a symlink will cause Xcode to always include that file
2026-03-21 15:30:49 +08:00
Huge_Black
84c5bf40ca Merge pull request #1218 from LiveContainer/develop-lc
Fix widget not working & Only run turn off data shortcut when minimuxer is not ready and below 26.4
2026-03-21 12:08:32 +08:00
Huge_Black
01e73328f8 Only run turn off data shortcut when minimuxer is not ready and below 26.4 2026-03-21 12:01:16 +08:00
Huge_Black
a1f71a8149 Fix widget not working 2026-03-21 11:58:20 +08:00
suprstarrd
8624a8e919 feat: add Mona to Trusted Sources (#1210)
* feat: add Mona to Trusted Sources

Signed-off-by: suprstarrd <business@suprstarrd.com>
2026-03-17 12:28:56 -04:00
ny
6e9e0aee0a fix: revert 26.4 fix partially to fix everywhere 2026-02-28 18:03:35 -05:00
ny
a505d04215 fix: 26.4 patch, add correct dest
- update minimuxer
2026-02-27 22:21:41 -05:00
mahee96
95953ca0e9 IfManager: added String representation for readability 2026-02-28 06:45:12 +05:30
mahee96
3b9b45a06f pbxproj: was missing references to IfManager.swift 2026-02-28 04:41:33 +05:30
mahee96
ac277aa6eb minimuxer: added @nythepegasus's patch as-is 2026-02-28 04:24:03 +05:30
mahee96
7926452661 minimuxer: added @nythepegasus's patch as-is 2026-02-28 04:23:58 +05:30
mahee96
dfb01c2ae5 minimuxer: updated submodule to latest 2026-02-28 03:52:35 +05:30
mahee96
bff192be4e ALTSign cleanup 2026-02-25 08:16:42 +05:30
mahee96
a863b2f39a ALTSign cleanup 2026-02-25 08:15:43 +05:30
mahee96
bf72a0edfc CI: add what xcode is suggesting (xcode noise from auto create schemes) 2026-02-25 08:15:31 +05:30
mahee96
06ad6488cc CI: changelog in md was incorrect in release notes 2026-02-25 08:08:46 +05:30
mahee96
12f84b2365 CI: fixes for author 2026-02-25 07:46:54 +05:30
mahee96
118f64de8a CI: multiple fixes 2026-02-25 07:33:55 +05:30
mahee96
555bb3d985 CI: remove harcoded repo name and use incoming 2026-02-25 03:30:57 +05:30
mahee96
25925aceef CI: create tag if required 2026-02-25 03:18:31 +05:30
mahee96
5444fdd9bb CI: handle zipping irrespective of encryption is possible or not 2026-02-25 03:14:50 +05:30
mahee96
f91e0a6295 fix compilation issue after recent merge 2026-02-25 03:00:34 +05:30
mahee96
4e4f0f6a3f Merge branch 'cell-staging' into develop 2026-02-25 02:50:13 +05:30
mahee96
9706a43bc1 ci - decouple source_metadata.json generation from deploy 2026-02-25 02:41:58 +05:30
mahee96
d748a89b47 ci - do not encrypt build logs if password unavailable (forks CI friendly) 2026-02-25 01:45:23 +05:30
mahee96
f412f6df23 Merge branch 'cell-shortcut' into cell-staging
# Conflicts:
#	AltStore/Operations/SendAppOperation.swift
2026-02-25 01:20:56 +05:30
mahee96
b8354d3d0e cleanup - xcode brought these new entries for schemes 2026-02-25 01:18:09 +05:30
spidy123222
625389ab96 Add Exit Shortcut 2025-04-08 15:19:33 -07:00
spidy123222
f7e34cbbe9 Rewrite SendAppOperation execution to allow to wait for shortcut execution. 2025-04-08 15:19:33 -07:00
spidy123222
0fe8d7fed9 Move to SendAppOperation 2025-04-08 15:19:33 -07:00
spidy123222
1a1aa42e02 move it behind pendiungunitcount 60 2025-04-08 15:19:33 -07:00
spidy123222
7ff4b48223 Move attempt to a higher Stage. 2025-04-08 15:19:33 -07:00
spidy123222
4801f6e8f2 Attempt a million 2025-04-08 15:19:33 -07:00
Spidy123222
ff28f6fa8f Add files via upload
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
2d141afbaf remove from install apps
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
06e38aae00 Hopefully fix problem
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
d8783230a7 fix error for open link
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
Spidy123222
6c479bfede test open URL
Signed-off-by: Spidy123222 <64176728+Spidy123222@users.noreply.github.com>
2025-04-08 15:19:33 -07:00
20 changed files with 1176 additions and 143 deletions

View File

@@ -28,7 +28,7 @@ jobs:
- name: Find Last Successful commit
run: |
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
"${{ github.workflow }}" "${{ env.CHANNEL }}" || echo "")
"false" "${{ env.CHANNEL }}" || echo "")
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
- run: brew install ldid xcbeautify
@@ -143,24 +143,24 @@ jobs:
# --------------------------------------------------
- uses: actions/upload-artifact@v4
with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip
name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: build-logs.zip
- uses: actions/upload-artifact@v4
if: >
vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_BUILD == '1'
with:
name: encrypted-tests-build-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-build-logs.zip
name: tests-build-logs-${{ env.SHORT_COMMIT }}.zip
path: tests-build-logs.zip
- uses: actions/upload-artifact@v4
if: >
vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_RUN == '1'
with:
name: encrypted-tests-run-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-run-logs.zip
name: tests-run-logs-${{ env.SHORT_COMMIT }}.zip
path: tests-run-logs.zip
- uses: actions/upload-artifact@v4
with:
@@ -179,21 +179,14 @@ jobs:
token: ${{ secrets.CROSS_REPO_PUSH_KEY }}
path: "SideStore/apps-v2.json"
# --------------------------------------------------
# deploy
# --------------------------------------------------
- name: Deploy
if: env.DEPLOY_KEY != ''
- name: Generate Metadata
run: |
python3 scripts/ci/workflow.py dump-project-settings
PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name)
BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id)
SOURCE_JSON="_includes/source.json"
IPA_NAME="$PRODUCT_NAME.ipa"
python3 scripts/ci/workflow.py deploy \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
python3 scripts/ci/workflow.py generate-metadata \
"$CHANNEL" \
"$SHORT_COMMIT" \
"$MARKETING_VERSION" \
@@ -202,8 +195,20 @@ jobs:
"$IPA_NAME" \
"$LAST_SUCCESSFUL_COMMIT"
- name: Deploy
if: env.DEPLOY_KEY != ''
run: |
SOURCE_JSON="_includes/source.json"
python3 scripts/ci/workflow.py deploy \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
"$CHANNEL" \
"$MARKETING_VERSION"
# --------------------------------------------------
# upload release
# upload release to GH
# --------------------------------------------------
- name: Upload Release
run: |

View File

@@ -30,7 +30,7 @@ jobs:
- name: Find Last Successful commit
run: |
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
"${{ github.workflow }}" "${{ env.CHANNEL }}" || echo "")
"false" "${{ env.CHANNEL }}" || echo "")
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
- name: Check for new changes (on schedule)
@@ -177,8 +177,8 @@ jobs:
- uses: actions/upload-artifact@v4
if: steps.build_gate.outputs.should_skip != 'true'
with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip
name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: build-logs.zip
- uses: actions/upload-artifact@v4
if: >
@@ -186,8 +186,8 @@ jobs:
vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_BUILD == '1'
with:
name: encrypted-tests-build-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-build-logs.zip
name: tests-build-logs-${{ env.SHORT_COMMIT }}.zip
path: tests-build-logs.zip
- uses: actions/upload-artifact@v4
if: >
@@ -195,8 +195,8 @@ jobs:
vars.ENABLE_TESTS == '1' &&
vars.ENABLE_TESTS_RUN == '1'
with:
name: encrypted-tests-run-logs-${{ env.SHORT_COMMIT }}.zip
path: encrypted-tests-run-logs.zip
name: tests-run-logs-${{ env.SHORT_COMMIT }}.zip
path: tests-run-logs.zip
- uses: actions/upload-artifact@v4
if: steps.build_gate.outputs.should_skip != 'true'
@@ -217,21 +217,15 @@ jobs:
token: ${{ secrets.CROSS_REPO_PUSH_KEY }}
path: "SideStore/apps-v2.json"
# --------------------------------------------------
# deploy
# --------------------------------------------------
- name: Deploy
if: steps.build_gate.outputs.should_skip != 'true' && env.DEPLOY_KEY != ''
- name: Generate Metadata
if: steps.build_gate.outputs.should_skip != 'true'
run: |
python3 scripts/ci/workflow.py dump-project-settings
PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name)
BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id)
SOURCE_JSON="_includes/source.json"
IPA_NAME="$PRODUCT_NAME.ipa"
python3 scripts/ci/workflow.py deploy \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
python3 scripts/ci/workflow.py generate-metadata \
"$CHANNEL" \
"$SHORT_COMMIT" \
"$MARKETING_VERSION" \
@@ -240,8 +234,20 @@ jobs:
"$IPA_NAME" \
"$LAST_SUCCESSFUL_COMMIT"
- name: Deploy
if: steps.build_gate.outputs.should_skip != 'true' && env.DEPLOY_KEY != ''
run: |
SOURCE_JSON="_includes/source.json"
python3 scripts/ci/workflow.py deploy \
SideStore/apps-v2.json \
"$SOURCE_JSON" \
"$CHANNEL" \
"$MARKETING_VERSION"
# --------------------------------------------------
# upload release
# upload release to GH
# --------------------------------------------------
- name: Upload Release
if: steps.build_gate.outputs.should_skip != 'true'

View File

@@ -76,8 +76,8 @@ jobs:
- uses: actions/upload-artifact@v4
with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip
name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: build-logs.zip
- uses: actions/upload-artifact@v4
with:

View File

@@ -16,7 +16,7 @@ jobs:
runs-on: macos-26
env:
RELEASE_NAME: Stable
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CHANNEL: stable
UPSTREAM_CHANNEL: ""
@@ -26,6 +26,12 @@ jobs:
submodules: recursive
fetch-depth: 0
- name: Find Last Successful commit
run: |
LAST_SUCCESSFUL_COMMIT=$(python3 scripts/ci/workflow.py last-successful-commit \
"true" || echo "")
echo "LAST_SUCCESSFUL_COMMIT=$LAST_SUCCESSFUL_COMMIT" | tee -a $GITHUB_ENV
- run: brew install ldid xcbeautify
- name: Setup Env
@@ -67,9 +73,6 @@ jobs:
~/Library/Caches/org.swift.swiftpm
key: xcode-build-cache-stable-
- name: Clean
run: python3 scripts/ci/workflow.py clean
- name: Build
id: build
env:
@@ -90,8 +93,8 @@ jobs:
- uses: actions/upload-artifact@v4
with:
name: encrypted-build-logs-${{ env.MARKETING_VERSION }}.zip
path: encrypted-build-logs.zip
name: build-logs-${{ env.MARKETING_VERSION }}.zip
path: build-logs.zip
- uses: actions/upload-artifact@v4
with:
@@ -103,12 +106,28 @@ jobs:
name: SideStore-${{ env.MARKETING_VERSION }}-dSYMs.zip
path: SideStore.dSYMs.zip
- name: Generate Metadata
run: |
python3 scripts/ci/workflow.py dump-project-settings
PRODUCT_NAME=$(python3 scripts/ci/workflow.py read-product-name)
BUNDLE_ID=$(python3 scripts/ci/workflow.py read-bundle-id)
IPA_NAME="$PRODUCT_NAME.ipa"
python3 scripts/ci/workflow.py generate-metadata \
"${{ github.ref_name }}" \
"$SHORT_COMMIT" \
"$MARKETING_VERSION" \
"$CHANNEL" \
"$BUNDLE_ID" \
"$IPA_NAME" \
"$LAST_SUCCESSFUL_COMMIT"
- name: Upload to releases
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
python3 scripts/ci/workflow.py upload-release \
"$RELEASE_NAME" \
"${{ github.ref_name }}" \
"${{ github.ref_name }}" \
"$GITHUB_SHA" \
"$GITHUB_REPOSITORY" \

View File

@@ -48,6 +48,90 @@
remoteGlobalIDString = BF58047A246A28F7008AE704;
remoteInfo = AltBackup;
};
A802C9F82F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C5DA2F525B910049FE2B /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87B8C3401E0E9C37002F817D;
remoteInfo = "fragmentzip-cli-macOS";
};
A802C9FA2F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C5DA2F525B910049FE2B /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB02866CCF8002E243C;
remoteInfo = "fragmentzip-cli-iOS";
};
A802C9FC2F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C5DA2F525B910049FE2B /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB52866CD91002E243C;
remoteInfo = "fragmentzip-macOS";
};
A802C9FE2F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C5DA2F525B910049FE2B /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
remoteInfo = "fragmentzip-iOS";
};
A802CA012F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C5B62F525B910049FE2B /* libgeneral.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87977F6F227C4B71004F31DA;
remoteInfo = libgeneral;
};
A802CA062F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C95A2F525B910049FE2B /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADAFF819AE7BB70050CF31;
remoteInfo = Roxas;
};
A802CA082F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C95A2F525B910049FE2B /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BF8624801BB742E700C12EEE;
remoteInfo = RoxasTV;
};
A802CA0A2F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C95A2F525B910049FE2B /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
remoteInfo = RoxasTests;
};
A802CA0E2F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C8B62F525B910049FE2B /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44B1EE7C23DB90D5004E2E29;
remoteInfo = SampleApp;
};
A802CA102F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C8B62F525B910049FE2B /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 445A906A2400612800B487B4;
remoteInfo = "NSAttributedString+MarkdownTests";
};
A802CA132F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C8CF2F525B910049FE2B /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44E8FA8923D90632009E1D13;
remoteInfo = SampleApp;
};
A802CA162F525C030049FE2B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A802C8DB2F525B910049FE2B /* SwiftSampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
remoteInfo = SwiftSampleApp;
};
A81173222F4B8DBD0013ABD0 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A811720B2F4B8BA80013ABD0 /* em_proxy.xcodeproj */;
@@ -1819,6 +1903,174 @@
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
remoteInfo = SwiftSampleApp;
};
A8F3C1312F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87B8C3401E0E9C37002F817D;
remoteInfo = "fragmentzip-cli-macOS";
};
A8F3C1332F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB02866CCF8002E243C;
remoteInfo = "fragmentzip-cli-iOS";
};
A8F3C1352F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB52866CD91002E243C;
remoteInfo = "fragmentzip-macOS";
};
A8F3C1372F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
remoteInfo = "fragmentzip-iOS";
};
A8F3C13A2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BCF12F4E3794006BC252 /* libgeneral.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87977F6F227C4B71004F31DA;
remoteInfo = libgeneral;
};
A8F3C13F2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADAFF819AE7BB70050CF31;
remoteInfo = Roxas;
};
A8F3C1412F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BF8624801BB742E700C12EEE;
remoteInfo = RoxasTV;
};
A8F3C1432F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
remoteInfo = RoxasTests;
};
A8F3C1472F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44B1EE7C23DB90D5004E2E29;
remoteInfo = SampleApp;
};
A8F3C1492F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 445A906A2400612800B487B4;
remoteInfo = "NSAttributedString+MarkdownTests";
};
A8F3C14C2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44E8FA8923D90632009E1D13;
remoteInfo = SampleApp;
};
A8F3C14F2F4E37A5006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
remoteInfo = SwiftSampleApp;
};
A8F3FC062F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87B8C3401E0E9C37002F817D;
remoteInfo = "fragmentzip-cli-macOS";
};
A8F3FC082F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB02866CCF8002E243C;
remoteInfo = "fragmentzip-cli-iOS";
};
A8F3FC0A2F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDB52866CD91002E243C;
remoteInfo = "fragmentzip-macOS";
};
A8F3FC0C2F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = B315FDCE2866CDD3002E243C;
remoteInfo = "fragmentzip-iOS";
};
A8F3FC0F2F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3F7C02F4E96D7006BC252 /* libgeneral.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 87977F6F227C4B71004F31DA;
remoteInfo = libgeneral;
};
A8F3FC142F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADAFF819AE7BB70050CF31;
remoteInfo = Roxas;
};
A8F3FC162F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BF8624801BB742E700C12EEE;
remoteInfo = RoxasTV;
};
A8F3FC182F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = BFADB00319AE7BB80050CF31;
remoteInfo = RoxasTests;
};
A8F3FC1B2F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FAD92F4E96D7006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44E8FA8923D90632009E1D13;
remoteInfo = SampleApp;
};
A8F3FC1F2F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44B1EE7C23DB90D5004E2E29;
remoteInfo = SampleApp;
};
A8F3FC212F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 445A906A2400612800B487B4;
remoteInfo = "NSAttributedString+MarkdownTests";
};
A8F3FC242F4E998F006BC252 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8F3FAE52F4E96D7006BC252 /* SwiftSampleApp.xcodeproj */;
proxyType = 2;
remoteGlobalIDString = 44962FDA23E7A54A00E2A598;
remoteInfo = SwiftSampleApp;
};
A8FAC1CE2F4B51980061A851 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = A8FAC0562F4B50D10061A851 /* em_proxy.xcodeproj */;
@@ -2187,6 +2439,12 @@
/* Begin PBXFileReference section */
191E5FAB290A5D92001A3B7C /* libminimuxer_swift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libminimuxer_swift.a; sourceTree = BUILT_PRODUCTS_DIR; };
A802C5B62F525B910049FE2B /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
A802C5DA2F525B910049FE2B /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libfragmentzip.xcodeproj; sourceTree = "<group>"; };
A802C8B62F525B910049FE2B /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
A802C8CF2F525B910049FE2B /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
A802C8DB2F525B910049FE2B /* SwiftSampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SwiftSampleApp.xcodeproj; sourceTree = "<group>"; };
A802C95A2F525B910049FE2B /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
A8116EAD2F4B8BA80013ABD0 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
A8116ED12F4B8BA80013ABD0 /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libfragmentzip.xcodeproj; sourceTree = "<group>"; };
A81171432F4B8BA80013ABD0 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
@@ -2375,6 +2633,18 @@
A8EEDA1E2F4B19B000F2436D /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
A8EEDA9B2F4B19B000F2436D /* em_proxy.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = em_proxy.xcodeproj; sourceTree = "<group>"; };
A8EEDA9D2F4B19B000F2436D /* minimuxer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = minimuxer.xcodeproj; sourceTree = "<group>"; };
A8F3BCF12F4E3794006BC252 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libfragmentzip.xcodeproj; sourceTree = "<group>"; };
A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SwiftSampleApp.xcodeproj; sourceTree = "<group>"; };
A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
A8F3F7C02F4E96D7006BC252 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libfragmentzip.xcodeproj; sourceTree = "<group>"; };
A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
A8F3FAD92F4E96D7006BC252 /* SampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SampleApp.xcodeproj; sourceTree = "<group>"; };
A8F3FAE52F4E96D7006BC252 /* SwiftSampleApp.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = SwiftSampleApp.xcodeproj; sourceTree = "<group>"; };
A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = Roxas.xcodeproj; sourceTree = "<group>"; };
A8FABA492F4B50D00061A851 /* libimobiledevice.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libimobiledevice.a; sourceTree = BUILT_PRODUCTS_DIR; };
A8FABA4A2F4B50D00061A851 /* libem_proxy_swift.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libem_proxy_swift.a; sourceTree = BUILT_PRODUCTS_DIR; };
A8FABCC32F4B50D10061A851 /* libgeneral.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = libgeneral.xcodeproj; sourceTree = "<group>"; };
@@ -2629,6 +2899,7 @@
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
EMProxyWrapper.swift,
IfManager.swift,
MinimuxerWrapper.swift,
Utils/common/AbstractClassError.swift,
Utils/common/BuildInfo.swift,
@@ -2666,6 +2937,13 @@
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
/* Begin PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
173100732F6E4550001FBB19 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */ = {
isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
buildPhase = BFD247682284B9A500981D42 /* Resources */;
membershipExceptions = (
Intents/ViewApp.intentdefinition,
);
};
A8EEC8CC2F4B146B00F2436D /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */ = {
isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
buildPhase = BFD247682284B9A500981D42 /* Resources */;
@@ -2688,7 +2966,7 @@
A8A5AFE32F4C343200572B4A /* .github */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = .github; sourceTree = "<group>"; };
A8A5AFEA2F4C343200572B4A /* keys */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = keys; sourceTree = "<group>"; };
A8A5C85B2F4C68BF00572B4A /* libfragmentzip */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = libfragmentzip; sourceTree = "<group>"; };
A8EEC0502F4AF7FB00F2436D /* AltStoreCore */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A8EEC0BF2F4AF7FB00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = AltStoreCore; sourceTree = "<group>"; };
A8EEC0502F4AF7FB00F2436D /* AltStoreCore */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (173100732F6E4550001FBB19 /* PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet */, A8EEC0BF2F4AF7FB00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = AltStoreCore; sourceTree = "<group>"; };
A8EEC3482F4B0D8600F2436D /* Shared */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A8EEC36A2F4B0D8700F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, A8EEC36C2F4B0D8700F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, A8EEC36B2F4B0D8700F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Shared; sourceTree = "<group>"; };
A8EEC3B92F4B0EFC00F2436D /* AltWidget */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A8EEC3CA2F4B0EFC00F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = AltWidget; sourceTree = "<group>"; };
A8EEC3D92F4B0FC800F2436D /* AltBackup */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (A8EEC3E22F4B0FC800F2436D /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = AltBackup; sourceTree = "<group>"; };
@@ -2764,6 +3042,60 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
A802C5E12F525B910049FE2B /* Products */ = {
isa = PBXGroup;
children = (
A802C9F92F525C030049FE2B /* libfragmentzip */,
A802C9FB2F525C030049FE2B /* libfragmentzip */,
A802C9FD2F525C030049FE2B /* libfragmentzip.a */,
A802C9FF2F525C030049FE2B /* libfragmentzip.a */,
);
name = Products;
sourceTree = "<group>";
};
A802C5E32F525B910049FE2B /* Products */ = {
isa = PBXGroup;
children = (
A802CA022F525C030049FE2B /* libgeneral */,
);
name = Products;
sourceTree = "<group>";
};
A802C8E32F525B910049FE2B /* Products */ = {
isa = PBXGroup;
children = (
A802CA142F525C030049FE2B /* SampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A802C8E52F525B910049FE2B /* Products */ = {
isa = PBXGroup;
children = (
A802CA0F2F525C030049FE2B /* SampleApp.app */,
A802CA112F525C030049FE2B /* NSAttributedString+MarkdownTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A802C8E72F525B910049FE2B /* Products */ = {
isa = PBXGroup;
children = (
A802CA172F525C030049FE2B /* SwiftSampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A802C95B2F525B910049FE2B /* Products */ = {
isa = PBXGroup;
children = (
A802CA072F525C030049FE2B /* Roxas.framework */,
A802CA092F525C030049FE2B /* Roxas.framework */,
A802CA0B2F525C030049FE2B /* RoxasTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A811720E2F4B8BA80013ABD0 /* Products */ = {
isa = PBXGroup;
children = (
@@ -4079,6 +4411,114 @@
name = Products;
sourceTree = "<group>";
};
A8F3BD1C2F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1322F4E37A5006BC252 /* libfragmentzip */,
A8F3C1342F4E37A5006BC252 /* libfragmentzip */,
A8F3C1362F4E37A5006BC252 /* libfragmentzip.a */,
A8F3C1382F4E37A5006BC252 /* libfragmentzip.a */,
);
name = Products;
sourceTree = "<group>";
};
A8F3BD1E2F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C13B2F4E37A5006BC252 /* libgeneral */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C01E2F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1482F4E37A5006BC252 /* SampleApp.app */,
A8F3C14A2F4E37A5006BC252 /* NSAttributedString+MarkdownTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C0202F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1502F4E37A5006BC252 /* SwiftSampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C0222F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C14D2F4E37A5006BC252 /* SampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A8F3C0962F4E3794006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3C1402F4E37A5006BC252 /* Roxas.framework */,
A8F3C1422F4E37A5006BC252 /* Roxas.framework */,
A8F3C1442F4E37A5006BC252 /* RoxasTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A8F3F7EB2F4E96D7006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3FC072F4E998F006BC252 /* libfragmentzip */,
A8F3FC092F4E998F006BC252 /* libfragmentzip */,
A8F3FC0B2F4E998F006BC252 /* libfragmentzip.a */,
A8F3FC0D2F4E998F006BC252 /* libfragmentzip.a */,
);
name = Products;
sourceTree = "<group>";
};
A8F3F7ED2F4E96D7006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3FC102F4E998F006BC252 /* libgeneral */,
);
name = Products;
sourceTree = "<group>";
};
A8F3FAED2F4E96D7006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3FC1C2F4E998F006BC252 /* SampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A8F3FAEF2F4E96D7006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3FC252F4E998F006BC252 /* SwiftSampleApp.app */,
);
name = Products;
sourceTree = "<group>";
};
A8F3FAF12F4E96D7006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3FC202F4E998F006BC252 /* SampleApp.app */,
A8F3FC222F4E998F006BC252 /* NSAttributedString+MarkdownTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A8F3FB652F4E96D7006BC252 /* Products */ = {
isa = PBXGroup;
children = (
A8F3FC152F4E998F006BC252 /* Roxas.framework */,
A8F3FC172F4E998F006BC252 /* Roxas.framework */,
A8F3FC192F4E998F006BC252 /* RoxasTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
A8FAC0592F4B50D10061A851 /* Products */ = {
isa = PBXGroup;
children = (
@@ -4648,6 +5088,10 @@
ProductGroup = A8A5B06A2F4C347700572B4A /* Products */;
ProjectRef = A8A5B0622F4C347700572B4A /* libfragmentzip.xcodeproj */;
},
{
ProductGroup = A8F3BD1C2F4E3794006BC252 /* Products */;
ProjectRef = A8F3BD152F4E3794006BC252 /* libfragmentzip.xcodeproj */;
},
{
ProductGroup = A8636E9B2F4CF74D00E66784 /* Products */;
ProjectRef = A8636E922F4CF74D00E66784 /* libfragmentzip.xcodeproj */;
@@ -4664,6 +5108,10 @@
ProductGroup = A85AEC6B2F4B22F6002E2E11 /* Products */;
ProjectRef = A85AE43E2F4B22F6002E2E11 /* libfragmentzip.xcodeproj */;
},
{
ProductGroup = A8F3F7EB2F4E96D7006BC252 /* Products */;
ProjectRef = A8F3F7E42F4E96D7006BC252 /* libfragmentzip.xcodeproj */;
},
{
ProductGroup = A8A5B3BA2F4C4C8600572B4A /* Products */;
ProjectRef = A8A5B3B32F4C4C8600572B4A /* libfragmentzip.xcodeproj */;
@@ -4692,6 +5140,10 @@
ProductGroup = A8CCC2482F4B654400B0089A /* Products */;
ProjectRef = A8CCBF072F4B654400B0089A /* libfragmentzip.xcodeproj */;
},
{
ProductGroup = A802C5E12F525B910049FE2B /* Products */;
ProjectRef = A802C5DA2F525B910049FE2B /* libfragmentzip.xcodeproj */;
},
{
ProductGroup = A811973F2F4C1C710013ABD0 /* Products */;
ProjectRef = A81194062F4C1C710013ABD0 /* libfragmentzip.xcodeproj */;
@@ -4744,6 +5196,10 @@
ProductGroup = A8A5B06C2F4C347700572B4A /* Products */;
ProjectRef = A8A5B03E2F4C347700572B4A /* libgeneral.xcodeproj */;
},
{
ProductGroup = A802C5E32F525B910049FE2B /* Products */;
ProjectRef = A802C5B62F525B910049FE2B /* libgeneral.xcodeproj */;
},
{
ProductGroup = A8CCD22A2F4B6B0000B0089A /* Products */;
ProjectRef = A8CCCEBF2F4B6B0000B0089A /* libgeneral.xcodeproj */;
@@ -4760,10 +5216,18 @@
ProductGroup = A8FAD7302F4B61310061A851 /* Products */;
ProjectRef = A8FAD38F2F4B61310061A851 /* libgeneral.xcodeproj */;
},
{
ProductGroup = A8F3F7ED2F4E96D7006BC252 /* Products */;
ProjectRef = A8F3F7C02F4E96D7006BC252 /* libgeneral.xcodeproj */;
},
{
ProductGroup = A8EEDA212F4B19B000F2436D /* Products */;
ProjectRef = A8EED1D72F4B19B000F2436D /* libgeneral.xcodeproj */;
},
{
ProductGroup = A8F3BD1E2F4E3794006BC252 /* Products */;
ProjectRef = A8F3BCF12F4E3794006BC252 /* libgeneral.xcodeproj */;
},
{
ProductGroup = A8636E992F4CF74D00E66784 /* Products */;
ProjectRef = A8636E6E2F4CF74D00E66784 /* libgeneral.xcodeproj */;
@@ -4888,6 +5352,10 @@
ProductGroup = A8A5BE7E2F4C4D6800572B4A /* Products */;
ProjectRef = A8A5BE7D2F4C4D6800572B4A /* Roxas.xcodeproj */;
},
{
ProductGroup = A8F3FB652F4E96D7006BC252 /* Products */;
ProjectRef = A8F3FB642F4E96D7006BC252 /* Roxas.xcodeproj */;
},
{
ProductGroup = A85AEC732F4B22F6002E2E11 /* Products */;
ProjectRef = A85AEC612F4B22F6002E2E11 /* Roxas.xcodeproj */;
@@ -4916,6 +5384,10 @@
ProductGroup = A8FACF9D2F4B5CD40061A851 /* Products */;
ProjectRef = A8FACF932F4B5CD40061A851 /* Roxas.xcodeproj */;
},
{
ProductGroup = A802C95B2F525B910049FE2B /* Products */;
ProjectRef = A802C95A2F525B910049FE2B /* Roxas.xcodeproj */;
},
{
ProductGroup = A85A27CA2F4B370D002E2E11 /* Products */;
ProjectRef = A85A27C02F4B370D002E2E11 /* Roxas.xcodeproj */;
@@ -4936,6 +5408,10 @@
ProductGroup = A86372122F4CF74D00E66784 /* Products */;
ProjectRef = A86372112F4CF74D00E66784 /* Roxas.xcodeproj */;
},
{
ProductGroup = A8F3C0962F4E3794006BC252 /* Products */;
ProjectRef = A8F3C0952F4E3794006BC252 /* Roxas.xcodeproj */;
},
{
ProductGroup = A8EEDA272F4B19B000F2436D /* Products */;
ProjectRef = A8EEDA1E2F4B19B000F2436D /* Roxas.xcodeproj */;
@@ -4956,6 +5432,10 @@
ProductGroup = A8CCE16B2F4B76CF00B0089A /* Products */;
ProjectRef = A8CCE15B2F4B76CF00B0089A /* Roxas.xcodeproj */;
},
{
ProductGroup = A8F3C01E2F4E3794006BC252 /* Products */;
ProjectRef = A8F3BFF12F4E3794006BC252 /* SampleApp.xcodeproj */;
},
{
ProductGroup = A811973D2F4C1C710013ABD0 /* Products */;
ProjectRef = A81196782F4C1C710013ABD0 /* SampleApp.xcodeproj */;
@@ -5024,6 +5504,10 @@
ProductGroup = A8A5C5EE2F4C4FEC00572B4A /* Products */;
ProjectRef = A8A5C5C12F4C4FEC00572B4A /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8F3C0222F4E3794006BC252 /* Products */;
ProjectRef = A8F3C00A2F4E3794006BC252 /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8118FCC2F4C1C250013ABD0 /* Products */;
ProjectRef = A8118F012F4C1C250013ABD0 /* SampleApp.xcodeproj */;
@@ -5068,6 +5552,14 @@
ProductGroup = A8FAC0632F4B50D10061A851 /* Products */;
ProjectRef = A8FABF722F4B50D10061A851 /* SampleApp.xcodeproj */;
},
{
ProductGroup = A802C8E52F525B910049FE2B /* Products */;
ProjectRef = A802C8B62F525B910049FE2B /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8F3FAED2F4E96D7006BC252 /* Products */;
ProjectRef = A8F3FAD92F4E96D7006BC252 /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8FACFA52F4B5CD40061A851 /* Products */;
ProjectRef = A8FACE982F4B5CD40061A851 /* SampleApp.xcodeproj */;
@@ -5088,6 +5580,10 @@
ProductGroup = A85A11E02F4B34EF002E2E11 /* Products */;
ProjectRef = A85A10DD2F4B34EF002E2E11 /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8F3FAF12F4E96D7006BC252 /* Products */;
ProjectRef = A8F3FAC02F4E96D7006BC252 /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8CCC24E2F4B654400B0089A /* Products */;
ProjectRef = A8CCC1792F4B654400B0089A /* SampleApp.xcodeproj */;
@@ -5108,6 +5604,10 @@
ProductGroup = A8CCD2222F4B6B0000B0089A /* Products */;
ProjectRef = A8CCD1552F4B6B0000B0089A /* SampleApp.xcodeproj */;
},
{
ProductGroup = A802C8E32F525B910049FE2B /* Products */;
ProjectRef = A802C8CF2F525B910049FE2B /* SampleApp.xcodeproj */;
},
{
ProductGroup = A8CCC2502F4B654400B0089A /* Products */;
ProjectRef = A8CCC1922F4B654400B0089A /* SampleApp.xcodeproj */;
@@ -5144,6 +5644,10 @@
ProductGroup = A81197392F4C1C710013ABD0 /* Products */;
ProjectRef = A811969D2F4C1C710013ABD0 /* SwiftSampleApp.xcodeproj */;
},
{
ProductGroup = A8F3C0202F4E3794006BC252 /* Products */;
ProjectRef = A8F3C0162F4E3794006BC252 /* SwiftSampleApp.xcodeproj */;
},
{
ProductGroup = A863719D2F4CF74D00E66784 /* Products */;
ProjectRef = A86371932F4CF74D00E66784 /* SwiftSampleApp.xcodeproj */;
@@ -5168,6 +5672,10 @@
ProductGroup = A85AEC752F4B22F6002E2E11 /* Products */;
ProjectRef = A85AE6D52F4B22F6002E2E11 /* SwiftSampleApp.xcodeproj */;
},
{
ProductGroup = A8F3FAEF2F4E96D7006BC252 /* Products */;
ProjectRef = A8F3FAE52F4E96D7006BC252 /* SwiftSampleApp.xcodeproj */;
},
{
ProductGroup = A8FACF9B2F4B5CD40061A851 /* Products */;
ProjectRef = A8FACEBD2F4B5CD40061A851 /* SwiftSampleApp.xcodeproj */;
@@ -5200,6 +5708,10 @@
ProductGroup = A8A5B6C02F4C4C8600572B4A /* Products */;
ProjectRef = A8A5B6B42F4C4C8600572B4A /* SwiftSampleApp.xcodeproj */;
},
{
ProductGroup = A802C8E72F525B910049FE2B /* Products */;
ProjectRef = A802C8DB2F525B910049FE2B /* SwiftSampleApp.xcodeproj */;
},
{
ProductGroup = A8A5ACE52F4C339400572B4A /* Products */;
ProjectRef = A8A5ACDC2F4C339400572B4A /* SwiftSampleApp.xcodeproj */;
@@ -5223,6 +5735,90 @@
/* End PBXProject section */
/* Begin PBXReferenceProxy section */
A802C9F92F525C030049FE2B /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A802C9F82F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802C9FB2F525C030049FE2B /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A802C9FA2F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802C9FD2F525C030049FE2B /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A802C9FC2F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802C9FF2F525C030049FE2B /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A802C9FE2F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA022F525C030049FE2B /* libgeneral */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libgeneral;
remoteRef = A802CA012F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA072F525C030049FE2B /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A802CA062F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA092F525C030049FE2B /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A802CA082F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA0B2F525C030049FE2B /* RoxasTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = RoxasTests.xctest;
remoteRef = A802CA0A2F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA0F2F525C030049FE2B /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A802CA0E2F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA112F525C030049FE2B /* NSAttributedString+MarkdownTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "NSAttributedString+MarkdownTests.xctest";
remoteRef = A802CA102F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA142F525C030049FE2B /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A802CA132F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A802CA172F525C030049FE2B /* SwiftSampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SwiftSampleApp.app;
remoteRef = A802CA162F525C030049FE2B /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A81173232F4B8DBD0013ABD0 /* libem_proxy_static.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
@@ -6959,6 +7555,174 @@
remoteRef = A8EEDAF12F4B1A0700F2436D /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1322F4E37A5006BC252 /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A8F3C1312F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1342F4E37A5006BC252 /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A8F3C1332F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1362F4E37A5006BC252 /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A8F3C1352F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1382F4E37A5006BC252 /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A8F3C1372F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C13B2F4E37A5006BC252 /* libgeneral */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libgeneral;
remoteRef = A8F3C13A2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1402F4E37A5006BC252 /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A8F3C13F2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1422F4E37A5006BC252 /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A8F3C1412F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1442F4E37A5006BC252 /* RoxasTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = RoxasTests.xctest;
remoteRef = A8F3C1432F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1482F4E37A5006BC252 /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A8F3C1472F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C14A2F4E37A5006BC252 /* NSAttributedString+MarkdownTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "NSAttributedString+MarkdownTests.xctest";
remoteRef = A8F3C1492F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C14D2F4E37A5006BC252 /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A8F3C14C2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3C1502F4E37A5006BC252 /* SwiftSampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SwiftSampleApp.app;
remoteRef = A8F3C14F2F4E37A5006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC072F4E998F006BC252 /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A8F3FC062F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC092F4E998F006BC252 /* libfragmentzip */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libfragmentzip;
remoteRef = A8F3FC082F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC0B2F4E998F006BC252 /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A8F3FC0A2F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC0D2F4E998F006BC252 /* libfragmentzip.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;
path = libfragmentzip.a;
remoteRef = A8F3FC0C2F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC102F4E998F006BC252 /* libgeneral */ = {
isa = PBXReferenceProxy;
fileType = "compiled.mach-o.executable";
path = libgeneral;
remoteRef = A8F3FC0F2F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC152F4E998F006BC252 /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A8F3FC142F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC172F4E998F006BC252 /* Roxas.framework */ = {
isa = PBXReferenceProxy;
fileType = wrapper.framework;
path = Roxas.framework;
remoteRef = A8F3FC162F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC192F4E998F006BC252 /* RoxasTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = RoxasTests.xctest;
remoteRef = A8F3FC182F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC1C2F4E998F006BC252 /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A8F3FC1B2F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC202F4E998F006BC252 /* SampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SampleApp.app;
remoteRef = A8F3FC1F2F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC222F4E998F006BC252 /* NSAttributedString+MarkdownTests.xctest */ = {
isa = PBXReferenceProxy;
fileType = wrapper.cfbundle;
path = "NSAttributedString+MarkdownTests.xctest";
remoteRef = A8F3FC212F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8F3FC252F4E998F006BC252 /* SwiftSampleApp.app */ = {
isa = PBXReferenceProxy;
fileType = wrapper.application;
path = SwiftSampleApp.app;
remoteRef = A8F3FC242F4E998F006BC252 /* PBXContainerItemProxy */;
sourceTree = BUILT_PRODUCTS_DIR;
};
A8FAC1CF2F4B51980061A851 /* libem_proxy_static.a */ = {
isa = PBXReferenceProxy;
fileType = archive.ar;

View File

@@ -997,6 +997,7 @@ extension AppManager
case .failure(let error): completionHandler(.failure(error))
case .success(let installedApp): completionHandler(.success(installedApp))
}
//UIApplication.shared.open(shortcutURLon, options: [:], completionHandler: nil)
}
installOperation.addDependency(sendAppOperation)

View File

@@ -11,6 +11,8 @@ import AltStoreCore
import AltSign
import Roxas
let shortcutURLonDelay = URL(string: "shortcuts://run-shortcut?name=TurnOnDataDelay")!
@objc(InstallAppOperation)
final class InstallAppOperation: ResultOperation<InstalledApp>
{
@@ -211,6 +213,11 @@ final class InstallAppOperation: ResultOperation<InstalledApp>
let alert = UIAlertController(title: "Finish Refresh", message: "Please reopen SideStore after the process is finished.To finish refreshing, SideStore must be moved to the background. To do this, you can either go to the Home Screen manually or by hitting Continue. Please reopen SideStore after doing this.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: NSLocalizedString("Continue", comment: ""), style: .default, handler: { _ in
print("Going home")
// Cell Shortcut
if self.context.shouldTurnOffData {
UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in
print("Cell OFF Shortcut finished execution.")}
}
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
}))
@@ -227,6 +234,10 @@ final class InstallAppOperation: ResultOperation<InstalledApp>
}
}
}
// Cell Shortcut
if self.context.shouldTurnOffData {
UIApplication.shared.open(shortcutURLonDelay, options: [:]) { _ in print("Cell OFF Shortcut finished execution.")}
}
UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
}
}

View File

@@ -123,6 +123,8 @@ class InstallAppOperationContext: AppOperationContext
var alternateIconURL: URL?
var shouldTurnOffData: Bool = false
// Non-nil when installing from a source.
@AsyncManaged
var appVersion: AppVersion?

View File

@@ -211,7 +211,6 @@ private extension PatchAppOperation
#if targetEnvironment(simulator)
throw PatchAppError.unsupportedOperatingSystemVersion(ProcessInfo.processInfo.operatingSystemVersion)
#else
let spotlightPath = "Applications/Spotlight.app/Spotlight"
let spotlightFileURL = self.patchDirectory.appendingPathComponent(spotlightPath)

View File

@@ -25,12 +25,10 @@ final class SendAppOperation: ResultOperation<()>
self.progress.totalUnitCount = 1
}
override func main()
{
override func main() {
super.main()
if let error = self.context.error
{
if let error = self.context.error {
return self.finish(.failure(error))
}
@@ -38,16 +36,46 @@ final class SendAppOperation: ResultOperation<()>
return self.finish(.failure(OperationError.invalidParameters("SendAppOperation.main: self.resignedApp is nil")))
}
// self.context.resignedApp.fileURL points to the app bundle, but we want the .ipa.
let shortcutURLoff = URL(string: "shortcuts://run-shortcut?name=TurnOffData")!
let app = AnyApp(name: resignedApp.name, bundleIdentifier: self.context.bundleIdentifier, url: resignedApp.fileURL, storeApp: nil)
let fileURL = InstalledApp.refreshedIPAURL(for: app)
print("AFC App `fileURL`: \(fileURL.absoluteString)")
if let data = NSData(contentsOf: fileURL) {
// only when minimuxer is not ready and below 26.4 should we turn off data
if #available(iOS 26.4, *) {
context.shouldTurnOffData = false
} else if !isMinimuxerReady {
context.shouldTurnOffData = true
} else {
context.shouldTurnOffData = false
}
if context.shouldTurnOffData {
// Wait for Shortcut to Finish Before Proceeding
UIApplication.shared.open(shortcutURLoff, options: [:]) { _ in
print("Shortcut finished execution. Proceeding with file transfer.")
DispatchQueue.global().async {
self.processFile(at: fileURL, for: app.bundleIdentifier)
}
}
} else {
DispatchQueue.global().async {
self.processFile(at: fileURL, for: app.bundleIdentifier)
}
}
}
private func processFile(at fileURL: URL, for bundleIdentifier: String) {
guard let data = NSData(contentsOf: fileURL) else {
print("IPA doesn't exist????")
return self.finish(.failure(OperationError(.appNotFound(name: bundleIdentifier))))
}
do {
let bytes = Data(data)
try yeetAppAFC(app.bundleIdentifier, bytes)
try yeetAppAFC(bundleIdentifier, bytes)
self.progress.completedUnitCount += 1
self.finish(.success(()))
} catch {
@@ -55,9 +83,5 @@ final class SendAppOperation: ResultOperation<()>
self.progress.completedUnitCount += 1
self.finish(.success(()))
}
} else {
print("IPA doesn't exist????")
self.finish(.failure(OperationError(.appNotFound(name: resignedApp.name))))
}
}
}

View File

@@ -0,0 +1 @@
../../build/AltBackup.ipa

View File

@@ -374,8 +374,7 @@ ipa-altbackup: checkPaths copy-altbackup
@echo " Copying from $(ALT_APP_SRC) into $(ALT_APP_PAYLOAD_DST)"
@cp -R -f "$(ALT_APP_SRC)/." "$(ALT_APP_PAYLOAD_DST)/$(TARGET_NAME)"
@pushd "$(ALT_APP_DST_ARCHIVE)" && zip -r "../../$(ALT_APP_IPA_DST)" Payload || popd
@cp -f "$(ALT_APP_IPA_DST)" AltStore/Resources
@echo " IPA created: AltStore/Resources/AltBackup.ipa"
@echo " IPA created: build/AltBackup.ipa"
clean-altbackup:
@echo ""

132
SideStore/IfManager.swift Normal file
View File

@@ -0,0 +1,132 @@
//
// IfManager.swift
// AltStore
//
// Created by ny on 2/27/26.
// Copyright © 2026 SideStore. All rights reserved.
//
import Foundation
import Network
fileprivate func uti(_ uint: UInt32) -> String? {
var buf = [CChar](repeating: 0, count: Int(NI_MAXHOST))
var addr = in_addr(s_addr: uint.bigEndian)
guard inet_ntop(AF_INET, &addr, &buf, UInt32(INET_ADDRSTRLEN)) != nil,
let str = String(utf8String: buf) else { return nil }
return str
}
fileprivate func socktouint(_ sock: inout sockaddr) -> UInt32 {
var buf = [CChar](repeating: 0, count: Int(NI_MAXHOST))
guard getnameinfo(&sock, socklen_t(sock.sa_len), &buf, socklen_t(buf.count), nil, socklen_t(0), NI_NUMERICHOST) == 0,
let name = String(utf8String: buf) else {
return 0
}
var addr = in_addr()
guard name.withCString({ cString in
inet_pton(AF_INET, cString, &addr)
}) == 1 else { return 0 }
return addr.s_addr.bigEndian
}
public struct NetInfo: Hashable, CustomStringConvertible {
public let name: String
public let hostIP: String
public let destIP: String
public let maskIP: String
private let host: UInt32
private let dest: UInt32
private let mask: UInt32
init(name: String, host: UInt32, dest: UInt32, mask: UInt32) {
self.name = name
self.host = host
self.dest = dest
self.mask = mask
self.hostIP = uti(host) ?? "10.7.0.0"
self.destIP = uti(dest) ?? "10.7.0.1"
self.maskIP = uti(mask) ?? "255.255.255.0"
}
init?(_ ifaddr: ifaddrs) {
guard
let ianame = String(utf8String: ifaddr.ifa_name)
else { return nil }
let host = socktouint(&ifaddr.ifa_addr.pointee)
let dest = socktouint(&ifaddr.ifa_dstaddr.pointee)
let mask = socktouint(&ifaddr.ifa_netmask.pointee)
self.init(name: ianame, host: host, dest: dest, mask: mask)
}
// computed networking values (still numeric internally)
public var minIP: UInt32 { host & mask }
public var maxIP: UInt32 { host | ~mask }
public var minIPString: String { uti(minIP) ?? "nil" }
public var maxIPString: String { uti(maxIP) ?? "nil" }
public var description: String {
"\(name) | ip=\(hostIP) dest=\(destIP) mask=\(maskIP) range=\(minIPString)-\(maxIPString)"
}
}
final class IfManager: Sendable {
public static let shared = IfManager()
nonisolated(unsafe) private(set) var addrs: Set<NetInfo> = Set()
private init() {
self.addrs = IfManager.query()
}
public func query() {
addrs = IfManager.query()
}
private static func query() -> Set<NetInfo> {
var addrs = Set<NetInfo>()
var head: UnsafeMutablePointer<ifaddrs>? = nil
guard getifaddrs(&head) == 0, let first = head else { return addrs }
defer { freeifaddrs(head) }
var cursor: UnsafeMutablePointer<ifaddrs>? = first
while let current = cursor {
// we only want v4 interfaces that aren't loopback and aren't masked 255.255.255.255
let entry = current.pointee
let flags = Int32(entry.ifa_flags)
let isIPv4 = entry.ifa_addr.pointee.sa_family == UInt8(AF_INET)
let isActive = (flags & (IFF_UP | IFF_RUNNING | IFF_LOOPBACK)) == (IFF_UP | IFF_RUNNING)
if isIPv4, isActive, let info = NetInfo(entry), info.maskIP != "255.255.255.255" {
addrs.insert(info)
}
cursor = entry.ifa_next
}
return addrs
}
private var nextLAN: NetInfo? {
addrs.first { $0.name.starts(with: "en") }
}
var nextProbableSideVPN: NetInfo? {
// try old 10.7.0.1 first, then fallback to next v4
// user should only be connected to StosVPN/LocalDevVPN
addrs.first {
$0.hostIP == "10.7.0.1" ||
$0.name.starts(with: "utun")
}
}
var sideVPNPatched: Bool {
nextLAN?.maskIP == nextProbableSideVPN?.maskIP &&
nextLAN?.maxIP == nextProbableSideVPN?.maxIP
}
}

View File

@@ -13,14 +13,21 @@ var isMinimuxerReady: Bool {
print("isMinimuxerReady property is always true on simulator")
return true
#else
IfManager.shared.query()
if #available(iOS 26.4, *) {
print("Running patched check")
return minimuxer.ready() && IfManager.shared.sideVPNPatched
} else {
return minimuxer.ready()
}
#endif
}
func minimuxerStartWithLogger(_ pairingFile: String,_ logPath: String,_ loggingEnabled: Bool) throws {
func minimuxerStartWithLogger(_ pairingFile: String, _ logPath: String, _ loggingEnabled: Bool) throws {
#if targetEnvironment(simulator)
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(loggingEnabled) is no-op on simulator")
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(loggingEnabled)) is no-op on simulator")
#else
print("minimuxerStartWithLogger(\(pairingFile), \(logPath), \(loggingEnabled))")
try minimuxer.startWithLogger(pairingFile, logPath, loggingEnabled)
#endif
}

View File

@@ -95,6 +95,7 @@ def resolve_start_commit(last_successful: str):
except Exception:
return first_commit()
def generate_release_notes(last_successful, tag, branch):
current = head_commit()
@@ -124,7 +125,12 @@ def generate_release_notes(last_successful, tag, branch):
for m in messages:
section += f"{fmt_msg(m)}\n"
prev_authors = authors(branch)
if commit_exists(branch):
previous_range = branch
else:
previous_range = last_successful
prev_authors = authors(previous_range)
recent_authors = authors(f"{last_successful}..{current}")
new_authors = recent_authors - prev_authors
@@ -137,13 +143,26 @@ def generate_release_notes(last_successful, tag, branch):
url = repo_url()
section += (
f"\n{HEADER_MARKER} Full Changelog: "
f"[{last_successful[:8]}...{current[:8]}]"
f"[{ref_display(last_successful)}...{ref_display(current)}]"
f"({url}/compare/{last_successful}...{current})\n"
)
return section
def ref_display(ref):
try:
tag = run(f'git describe --tags --exact-match "{ref}" 2>/dev/null || true').strip()
# allow only semantic version tags: X.Y.Z
if re.fullmatch(r'\d+\.\d+\.\d+', tag):
return tag
except Exception:
pass
return ref[:8]
# ----------------------------------------------------------
# markdown update
# ----------------------------------------------------------

View File

@@ -107,13 +107,13 @@ def main():
gen_cmd = (
f"python3 {script} "
f"{args.last_successful_commit} {args.release_tag} "
f"--output-dir \"{notes_dir}\""
f'--output-dir "{notes_dir}"'
)
else:
gen_cmd = (
f"python3 {script} "
f"{args.short_commit} {args.release_tag} "
f"--output-dir \"{notes_dir}\""
f'--output-dir "{notes_dir}"'
)
sh(gen_cmd, cwd=repo_root)

View File

@@ -7,6 +7,7 @@ from pathlib import Path
import time
import json
import re
from posix import getcwd
# REPO ROOT relative to script dir
ROOT = Path(__file__).resolve().parents[2]
@@ -214,13 +215,13 @@ def tests_run(model):
# ----------------------------------------------------------
def encrypt_logs(name):
default_pwd = "12345"
pwd = getenv("BUILD_LOG_ZIP_PASSWORD", default_pwd)
if pwd == default_pwd:
print("Warning: BUILD_LOG_ZIP_PASSWORD not set, using fallback password", file=sys.stderr)
run(f'cd build/logs && zip -e -P "{pwd}" ../../{name}.zip *')
pwd = getenv("BUILD_LOG_ZIP_PASSWORD")
cwd = getcwd()
if not pwd or not pwd.strip():
print("BUILD_LOG_ZIP_PASSWORD not set — logs will be uploaded UNENCRYPTED", file=sys.stderr)
run(f'cd {cwd}/build/logs && zip -r {cwd}/{name}.zip *')
return
run(f'cd {cwd}/build/logs && zip -e -P "{pwd}" {cwd}/{name}.zip *')
# ----------------------------------------------------------
# RELEASE NOTES
@@ -244,22 +245,13 @@ def retrieve_release_notes(tag):
# ----------------------------------------------------------
# DEPLOY SOURCE.JSON
# ----------------------------------------------------------
def deploy(repo, source_json, release_tag, short_commit, marketing_version, channel, bundle_id, ipa_name, last_successful_commit=None):
repo = (ROOT / repo).resolve()
def generate_metadata(release_tag, short_commit, marketing_version, channel, bundle_id, ipa_name, last_successful_commit=None):
ipa_path = ROOT / ipa_name
source_json_path = repo / source_json
metadata = 'source-metadata.json'
if not repo.exists():
raise SystemExit(f"{repo} repo missing")
if not ipa_path.exists():
raise SystemExit(f"{ipa_path} missing")
if not source_json_path.exists():
raise SystemExit(f"{source_json} missing inside repo")
cmd = (
f"python3 {SCRIPTS}/generate_source_metadata.py "
f"--repo-root {ROOT} "
@@ -274,12 +266,26 @@ def deploy(repo, source_json, release_tag, short_commit, marketing_version, chan
f"--bundle-id {bundle_id}"
)
# pass only if provided
if last_successful_commit:
cmd += f" --last-successful-commit {last_successful_commit}"
run(cmd)
def deploy(repo, source_json, release_tag, marketing_version):
repo = (ROOT / repo).resolve()
source_json_path = repo / source_json
metadata = 'source-metadata.json'
if not repo.exists():
raise SystemExit(f"{repo} repo missing")
if not (repo / ".git").exists():
print("Repo is not a git repository, skipping deploy", file=sys.stderr)
return
if not source_json_path.exists():
raise SystemExit(f"{source_json} missing inside repo")
run("git config user.name 'GitHub Actions'", check=False)
run("git config user.email 'github-actions@github.com'", check=False)
@@ -311,21 +317,33 @@ def deploy(repo, source_json, release_tag, short_commit, marketing_version, chan
else:
raise SystemExit("Deploy push failed after retries")
def last_successful_commit(workflow, branch):
import json
def last_successful_commit(is_stable, tag=None):
is_stable = str(is_stable).lower() in ("1", "true", "yes")
try:
out = runAndGet(
f'gh run list '
f'--workflow "{workflow}" '
f'--json headSha,conclusion,headBranch'
)
if is_stable:
prev_tag = runAndGet(
r'git tag --sort=-v:refname '
r'| grep -E "^[0-9]+\.[0-9]+\.[0-9]+$" '
r'| sed -n "2p" || true'
).strip()
runs = json.loads(out)
if prev_tag:
return runAndGet(f'git rev-parse "{prev_tag}^{{commit}}"')
for r in runs:
if r.get("conclusion") == "success" and r.get("headBranch") == branch:
return r["headSha"]
return None # ← changed
if tag:
exists = subprocess.call(
f'git rev-parse -q --verify "refs/tags/{tag}"',
shell=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
) == 0
if exists:
return runAndGet(f'git rev-parse "{tag}^{{commit}}"')
except Exception:
pass
@@ -334,15 +352,13 @@ def last_successful_commit(workflow, branch):
def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_recommended, is_stable=False):
is_stable = str(is_stable).lower() in ("1", "true", "yes")
draft = False
prerelease = True
latest = False
if is_stable:
draft = True # always create a draft for stable and let user publish release
update_tag = False
prerelease = False
else:
draft = False
update_tag = True # update existing
prerelease = True
latest = True
token = getenv("GH_TOKEN")
if token:
@@ -370,8 +386,9 @@ def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_rec
f"--output-dir {ROOT}"
)
if is_stable:
release_notes = re.sub(
r'^\s*#{1,6}\s*what(?:\'?s|\s+is)?\s+(?:new|changed).*',
r'(?im)^[ \t]*#{1,6}[ \t]*what[\']?s[ \t]+changed[ \t]*$',
"## What's Changed",
release_notes,
flags=re.IGNORECASE | re.MULTILINE,
@@ -382,7 +399,7 @@ def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_rec
tag = upstream_tag_recommended.strip()
upstream_block = (
f"If you want to try out new features early but want a lower chance of bugs, "
f"you can look at [SideStore {tag}]"
f"you can look at [{repo} {tag}]"
f"(https://github.com/{repo}/releases?q={tag}).\n\n"
)
@@ -398,18 +415,35 @@ def upload_release(release_name, release_tag, commit_sha, repo, upstream_tag_rec
draft_flag = "--draft" if draft else ""
prerelease_flag = "--prerelease" if prerelease else ""
latest_flag = "" if update_tag else "--latest=false"
latest_flag = "--latest=true" if latest else ""
# create release if it doesn't exist
exists = subprocess.call(
f'gh release view "{release_tag}"',
shell=True,
cwd=ROOT,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
) == 0
if exists:
run(
f'gh release edit "{release_tag}" '
f'--title "{release_name}" '
f'--notes-file "{body_file}" '
f'{draft_flag} {prerelease_flag} {latest_flag}'
)
else:
run(
f'gh release create "{release_tag}" '
f'--title "{release_name}" '
f'--notes-file "{body_file}" '
f'{draft_flag} {prerelease_flag} {latest_flag}'
)
run(
f'gh release upload "{release_tag}" '
f'SideStore.ipa SideStore.dSYMs.zip encrypted-build-logs.zip '
f'SideStore.ipa SideStore.dSYMs.zip build-logs.zip '
f'--clobber'
)
@@ -483,20 +517,22 @@ COMMANDS = {
# ----------------------------------------------------------
# LOG ENCRYPTION
# ----------------------------------------------------------
"encrypt-build" : (lambda: encrypt_logs("encrypted-build-logs"), 0, ""),
"encrypt-tests-build" : (lambda: encrypt_logs("encrypted-tests-build-logs"), 0, ""),
"encrypt-tests-run" : (lambda: encrypt_logs("encrypted-tests-run-logs"), 0, ""),
"encrypt-build" : (lambda: encrypt_logs("build-logs"), 0, ""),
"encrypt-tests-build" : (lambda: encrypt_logs("tests-build-logs"), 0, ""),
"encrypt-tests-run" : (lambda: encrypt_logs("tests-run-logs"), 0, ""),
# ----------------------------------------------------------
# RELEASE / DEPLOY
# ----------------------------------------------------------
"last-successful-commit" : (last_successful_commit, 2, "<workflow_name> <branch>"),
"last-successful-commit" : (last_successful_commit, 1, "<is_stable> [tag]"),
"release-notes" : (release_notes, 1, "<tag>"),
"retrieve-release-notes" : (retrieve_release_notes, 1, "<tag>"),
"deploy" : (deploy, 9,
"<repo> <source_json> <release_tag> <short_commit> <marketing_version> <channel> <bundle_id> <ipa_name> [last_successful_commit]"),
"upload-release" : (upload_release, 5, "<release_name> <release_tag> <commit_sha> <repo> <upstream_tag_recommended> [is_stable]"),
}
"generate-metadata" : (generate_metadata, 7,
"<release_tag> <short_commit> <marketing_version> <channel> <bundle_id> <ipa_name> [last_successful_commit]"),
"deploy" : (deploy, 4,
"<repo> <source_json> <release_tag> <marketing_version>"),
"upload-release" : (upload_release, 5,
"<release_name> <release_tag> <commit_sha> <repo> <upstream_tag_recommended> [is_stable]"),}
def main():
def usage():
@@ -522,9 +558,9 @@ def main():
suffix = f" {arg_usage}" if arg_usage else ""
raise SystemExit(f"Usage: workflow.py {cmd}{suffix}")
args = sys.argv[2:2 + argc]
args = sys.argv[2:]
result = func(*args) if argc else func()
result = func(*args) if args else func()
# ONLY real outputs go to stdout
if result is not None:

View File

@@ -75,6 +75,10 @@
{
"identifier": "thatstel.la.altsource",
"sourceURL": "https://alt.thatstel.la/"
},
{
"identifier": "com.deliacheminot.mona",
"sourceURL": "https://raw.githubusercontent.com/delia-cheminot/mona-hrt/refs/heads/main/ios_source.json"
}
],
"sources": [
@@ -148,6 +152,10 @@
{
"identifier": "thatstel.la.altsource",
"sourceURL": "https://alt.thatstel.la/"
},
{
"identifier": "com.deliacheminot.mona",
"sourceURL": "https://raw.githubusercontent.com/delia-cheminot/mona-hrt/refs/heads/main/ios_source.json"
}
]
}