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(