diff --git a/DeveloperDiskImages.json b/DeveloperDiskImages.json
new file mode 100644
index 0000000..46253d8
--- /dev/null
+++ b/DeveloperDiskImages.json
@@ -0,0 +1,519 @@
+{
+ ">0.0.0": {
+ "6.0": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/6.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/6.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "6.1": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/6.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/6.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "7.0": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/7.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/7.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "7.1": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/7.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/7.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "8.0": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "8.1": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "8.2": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "8.3": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.3/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.3/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "8.4": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/8.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "9.0": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "9.1": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "9.2": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "9.3": {
+ "Image": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.3%20(13E230)/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/filsv/iOSDeviceSupport/raw/master/9.3%20(13E230)/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "10.0": {
+ "Image": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.0%20(14A345)/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.0%20(14A345)/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "10.1": {
+ "Image": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.1%20(14B72)/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.1%20(14B72)/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "10.2": {
+ "Image": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.2%20(14C5062c)/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.2%20(14C5062c)/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "10.3": {
+ "Image": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/blob/master/Developer%20Disk%20Image/10.3%20(14E269)/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/blob/master/Developer%20Disk%20Image/10.3%20(14E269)/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "11.0": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "11.1": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "11.2": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "11.3": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.3/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.3/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "11.4": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "12.0": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "12.1": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "12.2": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "12.3": {
+ "Image": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.3/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.3/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "12.4": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "12.5": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.0": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.1": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.2": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.3": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.3/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.3/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.4": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.5": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.6": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.6/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.6/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "13.7": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.7/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.7/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.0": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.1": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.2": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.3": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.3/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.3/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.4": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.5": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
+ ]
+ },
+ "14.6": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.7": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "14.8": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.0": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.1": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.2": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.3": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.4": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.5": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.6": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.6/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.6/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.7": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.7/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.7/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "15.8": {
+ "Image": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.0": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.0/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.0/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.1": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.1/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.1/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.2": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.2/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.2/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.3": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.3/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.3/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.4": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.4/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.4/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.5": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.6": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "16.7": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg.signature"
+ ]
+ },
+ "17.0": {
+ "Image": [
+ "https://github.com/doronz88/DeveloperDiskImage/raw/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/Image.dmg"
+ ],
+ "Trustcache": [
+ "https://github.com/doronz88/DeveloperDiskImage/raw/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/Image.dmg.trustcache"
+ ],
+ "BuildManifest": [
+ "https://github.com/doronz88/DeveloperDiskImage/raw/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/BuildManifest.plist"
+ ]
+ },
+ "Fallback": {
+ "Image": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/%@/DeveloperDiskImage.dmg"
+ ],
+ "Signature": [
+ "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/%@/DeveloperDiskImage.dmg.signature"
+ ]
+ }
+ }
+}
diff --git a/lib/zupdater b/lib/zupdater
index bd50e5f..b292583 160000
--- a/lib/zupdater
+++ b/lib/zupdater
@@ -1 +1 @@
-Subproject commit bd50e5f76d2ead1acc2f625b4cc043b399e4815e
+Subproject commit b292583b66433020925091ee4086a443ad99c462
diff --git a/resources.qrc b/resources.qrc
index 14b0dfe..093436f 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -62,7 +62,7 @@
resources/connect.png
resources/airplayer-tutorial.mp4
resources/ipad-mockups/ipad.png
- resources/DeveloperDiskImages.json
+ DeveloperDiskImages.json
resources/keychain.mp4
resources/wireless-gallery-import.mp4
diff --git a/resources/DeveloperDiskImages.json b/resources/DeveloperDiskImages.json
deleted file mode 100644
index 39118b1..0000000
--- a/resources/DeveloperDiskImages.json
+++ /dev/null
@@ -1,413 +0,0 @@
-{
- "10.0": {
- "Image": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.0%20(14A345)/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.0%20(14A345)/DeveloperDiskImage.dmg.signature"
- ]
- },
- "10.1": {
- "Image": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.1%20(14B72)/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.1%20(14B72)/DeveloperDiskImage.dmg.signature"
- ]
- },
- "10.2": {
- "Image": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.2%20(14C5062c)/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/raw/master/Developer%20Disk%20Image/10.2%20(14C5062c)/DeveloperDiskImage.dmg.signature"
- ]
- },
- "10.3": {
- "Image": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/blob/master/Developer%20Disk%20Image/10.3%20(14E269)/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/xushuduo/Xcode-iOS-Developer-Disk-Image/blob/master/Developer%20Disk%20Image/10.3%20(14E269)/DeveloperDiskImage.dmg.signature"
- ]
- },
- "11.0": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "11.1": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.1/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.1/DeveloperDiskImage.dmg.signature"
- ]
- },
- "11.2": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "11.3": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.3/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.3/DeveloperDiskImage.dmg.signature"
- ]
- },
- "11.4": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/11.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "12.0": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "12.1": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.1/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.1/DeveloperDiskImage.dmg.signature"
- ]
- },
- "12.2": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "12.3": {
- "Image": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.3/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/luannguyenkhoa/LocationSimulator/raw/master/LocationSimulator/12.3/DeveloperDiskImage.dmg.signature"
- ]
- },
- "12.4": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "12.5": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/12/12.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.0": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.1": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.1/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.1/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.2": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.3": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.3/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.3/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.4": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.5": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.6": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.6/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.6/DeveloperDiskImage.dmg.signature"
- ]
- },
- "13.7": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.7/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/13/13.7/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.0": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.1": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.1/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.1/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.2": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.3": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.3/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.3/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.4": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.5": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
- ]
- },
- "14.6": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.7": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "14.8": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/14/14.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.0": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.1": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.2": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.3": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.4": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.5": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.6": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.6/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.6/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.7": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.7/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.7/DeveloperDiskImage.dmg.signature"
- ]
- },
- "15.8": {
- "Image": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/pdso/DeveloperDiskImage/raw/master/15/15.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.0": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.0/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.0/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.1": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.1/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.1/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.2": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.2/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.2/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.3": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.3/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.3/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.4": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.4/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.4/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.5": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.6": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "16.7": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/16.5/DeveloperDiskImage.dmg.signature"
- ]
- },
- "17.0": {
- "Image": [
- "https://github.com/doronz88/DeveloperDiskImage/raw/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/Image.dmg"
- ],
- "Trustcache": [
- "https://github.com/doronz88/DeveloperDiskImage/raw/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/Image.dmg.trustcache"
- ],
- "BuildManifest": [
- "https://github.com/doronz88/DeveloperDiskImage/raw/main/PersonalizedImages/Xcode_iOS_DDI_Personalized/BuildManifest.plist"
- ]
- },
- "Fallback": {
- "Image": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/%@/DeveloperDiskImage.dmg"
- ],
- "Signature": [
- "https://github.com/mspvirajpatel/Xcode_Developer_Disk_Images/raw/master/Developer%20Disk%20Image/%@/DeveloperDiskImage.dmg.signature"
- ]
- }
-}
diff --git a/sponsors.json b/sponsors.json
new file mode 100644
index 0000000..b5f721c
--- /dev/null
+++ b/sponsors.json
@@ -0,0 +1,78 @@
+{
+ ">0.0.0": {
+ "sponsors": {
+ "platinum": {
+ "members": [
+ {
+ "name": "Spotify",
+ "url": "https://www.spotify.com",
+ "logo": "sponsors/spotify.png",
+ "description": "Leading music streaming service.",
+ "bundleId": "com.spotify.client"
+ },
+ {
+ "name": "Shopify",
+ "url": "https://www.shopify.com",
+ "logo": "sponsors/shopify.png",
+ "description": "Create an online store within minutes and start selling.",
+ "bundleId": "com.jadedpixel.shopify"
+ }
+ ]
+ },
+ "gold": {
+ "members": [
+ {
+ "name": "Spotify",
+ "url": "https://www.spotify.com",
+ "logo": "sponsors/spotify.png",
+ "description": "Leading music streaming service.",
+ "bundleId": "com.spotify.client"
+ },
+ {
+ "name": "Shopify",
+ "url": "https://www.shopify.com",
+ "logo": "sponsors/shopify.png",
+ "description": "Create an online store within minutes and start selling.",
+ "bundleId": "com.jadedpixel.shopify"
+ }
+ ]
+ },
+ "silver": {
+ "members": [
+ {
+ "name": "Spotify",
+ "url": "https://www.spotify.com",
+ "logo": "sponsors/spotify.png",
+ "description": "Leading music streaming service.",
+ "bundleId": "com.spotify.client"
+ },
+ {
+ "name": "Shopify",
+ "url": "https://www.shopify.com",
+ "logo": "sponsors/shopify.png",
+ "description": "Create an online store within minutes and start selling.",
+ "bundleId": "com.jadedpixel.shopify"
+ }
+ ]
+ },
+ "bronze": {
+ "members": [
+ {
+ "name": "Spotify",
+ "url": "https://www.spotify.com",
+ "logo": "sponsors/spotify.png",
+ "description": "Leading music streaming service.",
+ "bundleId": "com.spotify.client"
+ },
+ {
+ "name": "Shopify",
+ "url": "https://www.shopify.com",
+ "logo": "sponsors/shopify.png",
+ "description": "Create an online store within minutes and start selling.",
+ "bundleId": "com.jadedpixel.shopify"
+ }
+ ]
+ }
+ }
+ }
+}
diff --git a/src/appswidget.cpp b/src/appswidget.cpp
index 0ffc1d3..28bfac8 100644
--- a/src/appswidget.cpp
+++ b/src/appswidget.cpp
@@ -25,6 +25,7 @@
#include "appstoremanager.h"
#include "creddialog.h"
#include "iDescriptor-ui.h"
+#include "iDescriptor.h"
#include "keychaindialog.h"
#include "logindialog.h"
#include "mainwindow.h"
@@ -56,7 +57,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -64,84 +64,7 @@
#include
#include
-// Helper struct for semantic version comparison
-struct AppVersion {
- int major = 0;
- int minor = 0;
- int patch = 0;
-
- static AppVersion fromString(QString versionString)
- {
- // Keep only digits and dots for comparison
- versionString.remove(QRegularExpression("[^\\d.]"));
- AppVersion v;
- QStringList parts = versionString.split('.');
- if (parts.size() > 0)
- v.major = parts[0].toInt();
- if (parts.size() > 1)
- v.minor = parts[1].toInt();
- if (parts.size() > 2)
- v.patch = parts[2].toInt();
- return v;
- }
-
- bool operator<(const AppVersion &other) const
- {
- if (major != other.major)
- return major < other.major;
- if (minor != other.minor)
- return minor < other.minor;
- return patch < other.patch;
- }
-
- bool operator==(const AppVersion &other) const
- {
- return major == other.major && minor == other.minor &&
- patch == other.patch;
- }
-
- bool operator>(const AppVersion &other) const
- {
- return !(*this < other || *this == other);
- }
- bool operator<=(const AppVersion &other) const
- {
- return (*this < other || *this == other);
- }
- bool operator>=(const AppVersion &other) const { return !(*this < other); }
-};
-
-// Checks if the current app version matches a given version condition
-bool versionMatches(const QString ¤tVersionStr,
- const QString &conditionStr)
-{
- AppVersion currentVersion = AppVersion::fromString(currentVersionStr);
- AppVersion conditionVersion = AppVersion::fromString(conditionStr);
-
- if (conditionStr.startsWith("<="))
- return currentVersion <= conditionVersion;
- if (conditionStr.startsWith(">="))
- return currentVersion >= conditionVersion;
- if (conditionStr.startsWith("<"))
- return currentVersion < conditionVersion;
- if (conditionStr.startsWith(">"))
- return currentVersion > conditionVersion;
-
- // Exact match
- return currentVersion == conditionVersion;
-}
-
-QJsonObject getVersionedConfig(const QJsonObject &rootObj)
-{
- QStringList keys = rootObj.keys();
- for (const QString &key : keys) {
- if (versionMatches(APP_VERSION, key)) {
- return rootObj[key].toObject();
- }
- }
-}
-
-// TODO: watch for login and logout events
+// FIXME: we dont watch for login and logout events because there is no such api
AppsWidget *AppsWidget::sharedInstance()
{
static AppsWidget *instance = new AppsWidget();
@@ -229,8 +152,7 @@ void AppsWidget::setupUI()
void AppsWidget::init()
{
- // FIXME:update url
- QUrl sponsorsUrl("http://localhost:5173/sponsors.json");
+ QUrl sponsorsUrl(SPONSORS_JSON_URL);
QNetworkRequest request(sponsorsUrl);
QNetworkReply *reply = m_networkManager->get(request);
connect(reply, &QNetworkReply::finished, this, [this, reply]() {
@@ -489,6 +411,38 @@ void AppsWidget::populateDefaultApps()
advanceGridPos();
}
+ for (const QJsonValue &sponsorValue : m_silverSponsors) {
+ QJsonObject sponsorObj = sponsorValue.toObject();
+ QString name = sponsorObj.value("name").toString();
+ QString bundleId = sponsorObj.value("bundleId").toString();
+ QString description = sponsorObj.value("description").toString();
+ QString url = sponsorObj.value("url").toString();
+ QString logoUrl = sponsorObj.value("logo").toString();
+ bool useBundleIdForIcon =
+ sponsorObj.value("useBundleIdForIcon").toBool(true);
+
+ createAppCard(name, bundleId, description, logoUrl, url, gridLayout,
+ row, col, useBundleIdForIcon,
+ SponsorType(SponsorType::Silver));
+ advanceGridPos();
+ }
+
+ for (const QJsonValue &sponsorValue : m_bronzeSponsors) {
+ QJsonObject sponsorObj = sponsorValue.toObject();
+ QString name = sponsorObj.value("name").toString();
+ QString bundleId = sponsorObj.value("bundleId").toString();
+ QString description = sponsorObj.value("description").toString();
+ QString url = sponsorObj.value("url").toString();
+ QString logoUrl = sponsorObj.value("logo").toString();
+
+ bool useBundleIdForIcon =
+ sponsorObj.value("useBundleIdForIcon").toBool(true);
+ createAppCard(name, bundleId, description, logoUrl, url, gridLayout,
+ row, col, useBundleIdForIcon,
+ SponsorType(SponsorType::Bronze));
+ advanceGridPos();
+ }
+
if (m_platinumSponsors.empty() && m_goldSponsors.empty()) {
createSponsorCard(gridLayout, row, col);
advanceGridPos();
@@ -525,37 +479,6 @@ void AppsWidget::populateDefaultApps()
col);
advanceGridPos();
- for (const QJsonValue &sponsorValue : m_silverSponsors) {
- QJsonObject sponsorObj = sponsorValue.toObject();
- QString name = sponsorObj.value("name").toString();
- QString bundleId = sponsorObj.value("bundleId").toString();
- QString description = sponsorObj.value("description").toString();
- QString url = sponsorObj.value("url").toString();
- QString logoUrl = sponsorObj.value("logo").toString();
- bool useBundleIdForIcon =
- sponsorObj.value("useBundleIdForIcon").toBool(true);
-
- createAppCard(name, bundleId, description, logoUrl, url, gridLayout,
- row, col, useBundleIdForIcon,
- SponsorType(SponsorType::Silver));
- advanceGridPos();
- }
-
- for (const QJsonValue &sponsorValue : m_bronzeSponsors) {
- QJsonObject sponsorObj = sponsorValue.toObject();
- QString name = sponsorObj.value("name").toString();
- QString bundleId = sponsorObj.value("bundleId").toString();
- QString description = sponsorObj.value("description").toString();
- QString url = sponsorObj.value("url").toString();
- QString logoUrl = sponsorObj.value("logo").toString();
-
- bool useBundleIdForIcon =
- sponsorObj.value("useBundleIdForIcon").toBool(true);
- createAppCard(name, bundleId, description, logoUrl, url, gridLayout,
- row, col, useBundleIdForIcon,
- SponsorType(SponsorType::Bronze));
- advanceGridPos();
- }
gridLayout->setRowStretch(gridLayout->rowCount(), 1);
}
@@ -688,18 +611,15 @@ void AppsWidget::createAppCard(
// Add sponsor type indicator
if (!sponsorType.isEmpty()) {
QLabel *sponsorLabel = new QLabel(sponsorType.name);
- QString textColor = (sponsorType.level == SponsorType::Platinum ||
- sponsorType.level == SponsorType::Silver)
- ? "#333"
- : "white";
sponsorLabel->setStyleSheet(QString("font-size: 10px; "
"font-weight: bold; "
- "color: %1; "
+ "color: #333; "
"background-color: %2; "
"border-radius: 4px; "
"padding: 2px 6px; "
"margin-left: 8px;")
- .arg(textColor, sponsorType.color));
+ .arg(sponsorType.color));
+ sponsorLabel->setFixedHeight(16);
sponsorLabel->setAlignment(Qt::AlignCenter);
nameLayout->addWidget(sponsorLabel);
}
diff --git a/src/devdiskmanager.cpp b/src/devdiskmanager.cpp
index a502a9d..3e05da1 100644
--- a/src/devdiskmanager.cpp
+++ b/src/devdiskmanager.cpp
@@ -80,7 +80,7 @@ void DevDiskManager::populateImageList()
connect(reply, &QNetworkReply::finished, this, [this, localPath, reply]() {
if (reply->error() == QNetworkReply::NoError) {
- // FIXME: better have this settings
+ // FIXME: better have this in settings
QDir().mkdir(QDir::homePath() + "/.idescriptor");
m_imageListJsonData = reply->readAll();
QFile file(localPath);
@@ -97,14 +97,19 @@ QMap> DevDiskManager::parseDiskDir()
{
QJsonDocument doc = QJsonDocument::fromJson(m_imageListJsonData);
if (!doc.isObject()) {
- qWarning() << "Invalid JSON response from image list API";
+ qWarning() << "parseDiskDir: Invalid JSON response from image list API";
return {};
}
QMap>
imageFiles; // version -> {type -> url}
- QJsonObject root = doc.object();
+ QJsonObject root = getVersionedConfig(doc.object());
+ if (root.isEmpty()) {
+ qWarning() << "parseDiskDir: No valid versioned config found in image "
+ "list JSON";
+ return {};
+ }
for (auto it = root.constBegin(); it != root.constEnd(); ++it) {
const QString version = it.key();
const QJsonObject versionData = it.value().toObject();
@@ -166,7 +171,7 @@ QList DevDiskManager::getImagesSorted(
uint64_t mounted_sig_len)
{
QList allImages;
- // TODO: what is this ?
+ // FIXME: i guess we could do better here but works for now
bool hasConnectedDevice = (deviceMajorVersion > 0);
for (auto it = imageFiles.constBegin(); it != imageFiles.constEnd(); ++it) {
diff --git a/src/deviceimagewidget.cpp b/src/deviceimagewidget.cpp
index f2af11b..6723686 100644
--- a/src/deviceimagewidget.cpp
+++ b/src/deviceimagewidget.cpp
@@ -128,8 +128,8 @@ QString DeviceImageWidget::getWallpaperPath() const
QString DeviceImageWidget::getMockupNameFromDisplayName(
const QString &displayName) const
{
- // Map device names to mockup files
- if (displayName.contains("iPhone 16", Qt::CaseInsensitive)) {
+ if (displayName.contains("iPhone 16", Qt::CaseInsensitive) ||
+ displayName.contains("iPhone 17", Qt::CaseInsensitive)) {
return "16";
} else if (displayName.contains("iPhone 15", Qt::CaseInsensitive) ||
displayName.contains("iPhone 14", Qt::CaseInsensitive)) {
diff --git a/src/iDescriptor.h b/src/iDescriptor.h
index c3ec18c..63c5e42 100644
--- a/src/iDescriptor.h
+++ b/src/iDescriptor.h
@@ -20,7 +20,9 @@
#pragma once
#include
#include
+#include
#include
+#include
#include
#include
#include
@@ -41,7 +43,11 @@
#define AFC2_SERVICE_NAME "com.apple.afc2"
#define RECOVERY_CLIENT_CONNECTION_TRIES 3
#define APPLE_VENDOR_ID 0x05ac
-#define REPO_URL "https://github.com/uncor3/iDescriptor"
+#define REPO_URL "https://github.com/iDescriptor/iDescriptor"
+#define SPONSORS_JSON_URL \
+ "https://raw.githubusercontent.com/iDescriptor/iDescriptor/refs/heads/" \
+ "main/sponsors.json"
+
// This is because afc_read_directory accepts "/var/mobile/Media" as "/"
#define POSSIBLE_ROOT "../../../../"
@@ -424,4 +430,83 @@ QByteArray read_afc_file_to_byte_array(afc_client_t afcClient,
bool isDarkMode();
instproxy_error_t install_IPA(idevice_t device, afc_client_t afc,
- const char *filePath);
\ No newline at end of file
+ const char *filePath);
+
+// Helper struct for semantic version comparison
+struct AppVersion {
+ int major = 0;
+ int minor = 0;
+ int patch = 0;
+
+ static AppVersion fromString(QString versionString)
+ {
+ // Keep only digits and dots for comparison
+ versionString.remove(QRegularExpression("[^\\d.]"));
+ AppVersion v;
+ QStringList parts = versionString.split('.');
+ if (parts.size() > 0)
+ v.major = parts[0].toInt();
+ if (parts.size() > 1)
+ v.minor = parts[1].toInt();
+ if (parts.size() > 2)
+ v.patch = parts[2].toInt();
+ return v;
+ }
+
+ bool operator<(const AppVersion &other) const
+ {
+ if (major != other.major)
+ return major < other.major;
+ if (minor != other.minor)
+ return minor < other.minor;
+ return patch < other.patch;
+ }
+
+ bool operator==(const AppVersion &other) const
+ {
+ return major == other.major && minor == other.minor &&
+ patch == other.patch;
+ }
+
+ bool operator>(const AppVersion &other) const
+ {
+ return !(*this < other || *this == other);
+ }
+ bool operator<=(const AppVersion &other) const
+ {
+ return (*this < other || *this == other);
+ }
+ bool operator>=(const AppVersion &other) const { return !(*this < other); }
+};
+
+// Checks if the current app version matches a given version condition
+inline bool versionMatches(const QString ¤tVersionStr,
+ const QString &conditionStr)
+{
+ AppVersion currentVersion = AppVersion::fromString(currentVersionStr);
+ AppVersion conditionVersion = AppVersion::fromString(conditionStr);
+
+ if (conditionStr.startsWith("<="))
+ return currentVersion <= conditionVersion;
+ if (conditionStr.startsWith(">="))
+ return currentVersion >= conditionVersion;
+ if (conditionStr.startsWith("<"))
+ return currentVersion < conditionVersion;
+ if (conditionStr.startsWith(">"))
+ return currentVersion > conditionVersion;
+
+ // Exact match
+ return currentVersion == conditionVersion;
+}
+
+inline QJsonObject getVersionedConfig(const QJsonObject &rootObj)
+{
+ QStringList keys = rootObj.keys();
+ for (const QString &key : keys) {
+ if (versionMatches(APP_VERSION, key)) {
+ qDebug() << "getVersionedConfig picked version:" << key;
+ return rootObj[key].toObject();
+ }
+ }
+ return QJsonObject();
+}
\ No newline at end of file
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 835ddae..d2bb234 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -246,7 +246,7 @@ MainWindow::MainWindow(QWidget *parent)
UpdateProcedure updateProcedure;
bool packageManagerManaged = false;
bool isPortable = false;
-
+ bool skipPrerelease = true;
#ifdef WIN32
// dynamic portable detection read .portable file in app dir on Windows
QString appDir = QApplication::applicationDirPath();
@@ -309,9 +309,9 @@ MainWindow::MainWindow(QWidget *parent)
}
// FIXME: fix repo name
- m_updater =
- new ZUpdater("uncor3/libtest", APP_VERSION, "iDescriptor",
- updateProcedure, isPortable, packageManagerManaged, this);
+ m_updater = new ZUpdater("uncor3/libtest", APP_VERSION, "iDescriptor",
+ updateProcedure, isPortable, packageManagerManaged,
+ skipPrerelease, this);
#if defined(PACKAGE_MANAGER_MANAGED) && defined(__linux__)
m_updater->setPackageManagerManagedMessage(
QString(