From 52d4104632ad2a2053d0dcdce4232a89e95c1808 Mon Sep 17 00:00:00 2001 From: zeng Date: Tue, 28 Oct 2025 11:11:21 +0800 Subject: [PATCH] 1 --- .gitignore | 3 +- .../.github/ISSUE_TEMPLATE/bug_report.md | 24 + .../.github/ISSUE_TEMPLATE/feature_request.md | 14 + AppleParty/.gitignore | 99 + .../AppleParty.xcodeproj/project.pbxproj | 1368 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/swiftpm/Package.resolved | 96 + AppleParty/AppleParty/AppDelegate.swift | 52 + .../AppListView/APAppListAdapter.swift | 76 + .../AppListView/APAppListCell.swift | 44 + .../AppleParty/AppListView/APAppListCell.xib | 83 + .../AppListView/APAppListModel.swift | 83 + .../AppleParty/AppListView/APAppListVC.swift | 58 + .../AppListView/Base.lproj/AppList.storyboard | 48 + .../InAppPurchseView/APInAppPurchseCell.swift | 158 ++ .../APInAppPurchseVC.storyboard | 475 ++++ .../InAppPurchseView/APInAppPurchseVC.swift | 302 +++ .../InAppPurchseView/APInappPurchseCell.xib | 12 + .../InAppPurchseView/APUploadIAPListVC.swift | 806 +++++++ .../InAppPurchseView/DragView.swift | 64 + .../InAppPurchseView/IAPUploadImageVC.swift | 105 + .../InAppPurchseView.storyboard | 993 ++++++++ .../Models/IAPExcelParser.swift | 421 ++++ .../InAppPurchseView/Models/IAPModel.swift | 341 +++ .../InAppPurchseView/Models/XMLModel.swift | 364 +++ .../InAppPurchseView/OutputExcelVC.swift | 67 + .../ScreenShotHelpPopoverVC.swift | 18 + .../ScreenShotHelpPopoverVC.xib | 1824 ++++++++++++++ .../ScreenShotUpload.storyboard | 526 ++++ .../ScreenShotUploadCell.swift | 74 + .../ScreenShotsView/ScreenShotUploadVC.swift | 515 ++++ .../AppListView/zh-Hans.lproj/AppList.strings | 3 + .../AppSettingView/APSettingVC.swift | 49 + .../AppleParty/AppSettingView/APSettingVC.xib | 102 + .../AppleParty/AppleParty-Bridging-Header.h | 7 + AppleParty/AppleParty/AppleParty.entitlements | 5 + .../EmailToolView/EmailSettingVC.swift | 61 + .../EmailToolView/EmailSettingVC.xib | 131 + .../EmailToolView/EmailTool.storyboard | 251 ++ .../EmailToolView/EmailToolVC.swift | 247 ++ .../AppleParty/IPAUpload/APIPAUploadVC.swift | 174 ++ .../AppleParty/IPAUpload/IPAUpload.storyboard | 159 ++ AppleParty/AppleParty/Info.plist | 15 + .../AppleParty/LoginView/APLogin2FAVC.swift | 199 ++ .../AppleParty/LoginView/APLogin2FAVC.xib | 201 ++ .../AppleParty/LoginView/APLoginVC.swift | 234 ++ AppleParty/AppleParty/LoginView/APLoginVC.xib | 258 ++ .../AppleParty/LoginView/APWebLoginVC.swift | 137 ++ .../AppleParty/LoginView/APWebLoginVC.xib | 109 + .../AppleWebLogin/AppleWebLoginCore.swift | 127 + .../AppleParty/LoginView/PhoneNumbers.swift | 27 + .../AppleParty/QRcodeView/APQRcode.storyboard | 271 +++ .../AppleParty/QRcodeView/APQRcodeVC.swift | 199 ++ .../37M-logo.imageset/37M-logo.png | Bin 0 -> 134741 bytes .../37M-logo.imageset/Contents.json | 21 + .../37M-slogan.imageset/37M-slogan.png | Bin 0 -> 81460 bytes .../37M-slogan.imageset/Contents.json | 21 + .../37iOSTeam-Round.png | Bin 0 -> 80328 bytes .../37iOSTeam-Round.imageset/Contents.json | 21 + .../37MobileGames/Contents.json | 6 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 172635 bytes .../AppIcon.appiconset/icon-128.png | Bin 0 -> 13093 bytes .../AppIcon.appiconset/icon-16.png | Bin 0 -> 1545 bytes .../AppIcon.appiconset/icon-256.png | Bin 0 -> 33695 bytes .../AppIcon.appiconset/icon-32.png | Bin 0 -> 2504 bytes .../AppIcon.appiconset/icon-512.png | Bin 0 -> 91431 bytes .../AppIcon.appiconset/icon-64.png | Bin 0 -> 5382 bytes .../ApplePartyIcon.imageset/Contents.json | 22 + .../ApplePartyIcon.imageset/icon-256.png | Bin 0 -> 33695 bytes .../ApplePartyIcon.imageset/icon-512.png | Bin 0 -> 91431 bytes .../Resources/Assets.xcassets/Contents.json | 6 + .../AppAnalytics.imageset/AppAnalytics@2x.png | Bin 0 -> 4873 bytes .../AppAnalytics.imageset/Contents.json | 21 + .../RootView/Apps.imageset/Apps@2x.png | Bin 0 -> 8124 bytes .../RootView/Apps.imageset/Contents.json | 21 + .../Assets.xcassets/RootView/Contents.json | 6 + .../FinancialReports.imageset/Contents.json | 21 + .../FinancialReports@2x.png | Bin 0 -> 5119 bytes .../RootView/IPAUpload.imageset/Contents.json | 21 + .../IPAUpload.imageset/IPAUpload@2x.png | Bin 0 -> 19960 bytes .../PlaceholderIcon.imageset/Contents.json | 52 + .../PlaceholderIcon@2x.png | Bin 0 -> 21664 bytes .../PlaceholderIcon_white@2x.png | Bin 0 -> 28927 bytes .../RootView/QRcode.imageset/Contents.json | 21 + .../RootView/QRcode.imageset/QRcode@2x.png | Bin 0 -> 12509 bytes .../RootView/SendEmail.imageset/Contents.json | 21 + .../SendEmail.imageset/SendEmail@2x.png | Bin 0 -> 13361 bytes .../VerifyReceipt.imageset/Contents.json | 21 + .../VerifyReceipt@2x.png | Bin 0 -> 9850 bytes .../Resources/InAppPurchase/example.xlsx | Bin 0 -> 80278 bytes .../Resources/Transporter/iap_metadata.xml | 119 + .../Resources/Transporter/ipa_metadata.xml | 12 + .../Resources/Transporter/shot_metadata.xml | 36 + .../RootView/APRootCollectionAdapter.swift | 61 + .../RootView/APRootCollectionCell.swift | 25 + .../RootView/APRootCollectionCell.xib | 55 + .../RootView/APRootCollectionModel.swift | 17 + AppleParty/AppleParty/RootView/APRootVC.swift | 59 + AppleParty/AppleParty/RootView/APRootWC.swift | 139 ++ .../RootView/APSwichAccountPopover.swift | 64 + .../RootView/APSwichAccountPopover.xib | 127 + .../RootView/Base.lproj/Main.storyboard | 790 ++++++ .../AppleParty/RootView/en.lproj/Main.strings | 423 ++++ .../RootView/zh-Hans.lproj/Main.strings | 435 ++++ .../AppleParty/Shared/Info/APConstants.swift | 15 + .../AppleParty/Shared/Info/InfoCenter.swift | 126 + .../AppleParty/Shared/Info/UserCenter.swift | 129 + .../AppleParty/Shared/Network/APClient.swift | 536 +++++ .../Shared/Network/AppStoreConnectAPI.swift | 1334 +++++++++++ .../Shared/UI/APASCKeysEditVC.swift | 95 + .../AppleParty/Shared/UI/APASCKeysEditVC.xib | 223 ++ .../Shared/UI/APASCKeysSettingVC.swift | 189 ++ .../Shared/UI/APASCKeysSettingVC.xib | 286 +++ .../Shared/UI/APCollectionView.swift | 79 + .../AppleParty/Shared/UI/APDebugVC.storyboard | 130 + .../AppleParty/Shared/UI/APDebugVC.swift | 140 ++ .../Shared/UI/APSPasswordEditVC.swift | 59 + .../Shared/UI/APSPasswordEditVC.xib | 149 ++ .../Shared/UI/APSPasswordSettingVC.swift | 178 ++ .../Shared/UI/APSPasswordSettingVC.xib | 222 ++ .../AppleParty/Shared/UI/DropZoneView.swift | 316 +++ .../AppleParty/Shared/UI/UIExtension.swift | 43 + .../AppleParty/Shared/Utils/APHUD.swift | 64 + .../AppleParty/Shared/Utils/APUtil.swift | 98 + .../AppleParty/Shared/Utils/ARLogs.swift | 61 + .../AppleParty/Shared/Utils/EmailUtils.swift | 79 + .../Shared/Utils/FoundationUtil.swift | 303 +++ .../SparkleUpdate/AppleParty-release.html | 278 +++ .../AppleParty/SparkleUpdate/update.xml | 22 + .../AppleParty/Vendors/ITMS/GDataXMLNode.h | 225 ++ .../AppleParty/Vendors/ITMS/GDataXMLNode.m | 1837 ++++++++++++++ .../AppleParty/Vendors/ITMS/XMLManager.swift | 101 + .../Vendors/MBProgressHUD-OSX/MBProgressHUD.h | 748 ++++++ .../Vendors/MBProgressHUD-OSX/MBProgressHUD.m | 2110 +++++++++++++++++ AppleParty/AppleParty/Vendors/QrcodeUtil.h | 16 + AppleParty/AppleParty/Vendors/QrcodeUtil.m | 102 + .../VerifyReceipt/APVerifyReceipt.storyboard | 224 ++ .../VerifyReceipt/APVerifyReceiptVC.swift | 84 + .../AppleParty/en.lproj/InfoPlist.strings | 7 + .../AppleParty/en.lproj/Localizable.strings | 7 + .../zh-Hans.lproj/InfoPlist.strings | 10 + .../zh-Hans.lproj/Localizable.strings | 7 + .../ApplePartyTests/ApplePartyTests.swift | 37 + .../ApplePartyUITests/ApplePartyUITests.swift | 43 + .../ApplePartyUITestsLaunchTests.swift | 33 + AppleParty/LICENSE | 674 ++++++ AppleParty/Podfile | 35 + AppleParty/README.md | 132 ++ AppleParty/icon.png | Bin 0 -> 172635 bytes AppleParty/screenshot/01.png | Bin 0 -> 12283 bytes AppleParty/screenshot/02.png | Bin 0 -> 68869 bytes AppleParty/screenshot/03.png | Bin 0 -> 100807 bytes AppleParty/screenshot/04.png | Bin 0 -> 104006 bytes AppleParty/screenshot/05.png | Bin 0 -> 68504 bytes AppleParty/screenshot/06.png | Bin 0 -> 71409 bytes AppleParty/screenshot/07.png | Bin 0 -> 20657 bytes AppleParty/screenshot/08.png | Bin 0 -> 41638 bytes AppleParty/screenshot/09.png | Bin 0 -> 104420 bytes AppleParty/screenshot/10.png | Bin 0 -> 126865 bytes IAP-20251024_142831.xlsx | Bin 0 -> 84640 bytes 165 files changed, 26440 insertions(+), 1 deletion(-) create mode 100644 AppleParty/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 AppleParty/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 AppleParty/.gitignore create mode 100644 AppleParty/AppleParty.xcodeproj/project.pbxproj create mode 100644 AppleParty/AppleParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AppleParty/AppleParty.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AppleParty/AppleParty.xcworkspace/contents.xcworkspacedata create mode 100644 AppleParty/AppleParty.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AppleParty/AppleParty.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 AppleParty/AppleParty/AppDelegate.swift create mode 100644 AppleParty/AppleParty/AppListView/APAppListAdapter.swift create mode 100644 AppleParty/AppleParty/AppListView/APAppListCell.swift create mode 100644 AppleParty/AppleParty/AppListView/APAppListCell.xib create mode 100644 AppleParty/AppleParty/AppListView/APAppListModel.swift create mode 100644 AppleParty/AppleParty/AppListView/APAppListVC.swift create mode 100644 AppleParty/AppleParty/AppListView/Base.lproj/AppList.storyboard create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseCell.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.storyboard create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/APInappPurchseCell.xib create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/APUploadIAPListVC.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/DragView.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/IAPUploadImageVC.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/InAppPurchseView.storyboard create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPExcelParser.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPModel.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/Models/XMLModel.swift create mode 100644 AppleParty/AppleParty/AppListView/InAppPurchseView/OutputExcelVC.swift create mode 100644 AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.swift create mode 100644 AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.xib create mode 100644 AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUpload.storyboard create mode 100644 AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadCell.swift create mode 100644 AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadVC.swift create mode 100644 AppleParty/AppleParty/AppListView/zh-Hans.lproj/AppList.strings create mode 100644 AppleParty/AppleParty/AppSettingView/APSettingVC.swift create mode 100644 AppleParty/AppleParty/AppSettingView/APSettingVC.xib create mode 100644 AppleParty/AppleParty/AppleParty-Bridging-Header.h create mode 100644 AppleParty/AppleParty/AppleParty.entitlements create mode 100644 AppleParty/AppleParty/EmailToolView/EmailSettingVC.swift create mode 100644 AppleParty/AppleParty/EmailToolView/EmailSettingVC.xib create mode 100644 AppleParty/AppleParty/EmailToolView/EmailTool.storyboard create mode 100644 AppleParty/AppleParty/EmailToolView/EmailToolVC.swift create mode 100644 AppleParty/AppleParty/IPAUpload/APIPAUploadVC.swift create mode 100644 AppleParty/AppleParty/IPAUpload/IPAUpload.storyboard create mode 100644 AppleParty/AppleParty/Info.plist create mode 100644 AppleParty/AppleParty/LoginView/APLogin2FAVC.swift create mode 100644 AppleParty/AppleParty/LoginView/APLogin2FAVC.xib create mode 100644 AppleParty/AppleParty/LoginView/APLoginVC.swift create mode 100644 AppleParty/AppleParty/LoginView/APLoginVC.xib create mode 100644 AppleParty/AppleParty/LoginView/APWebLoginVC.swift create mode 100644 AppleParty/AppleParty/LoginView/APWebLoginVC.xib create mode 100644 AppleParty/AppleParty/LoginView/AppleWebLogin/AppleWebLoginCore.swift create mode 100644 AppleParty/AppleParty/LoginView/PhoneNumbers.swift create mode 100644 AppleParty/AppleParty/QRcodeView/APQRcode.storyboard create mode 100644 AppleParty/AppleParty/QRcodeView/APQRcodeVC.swift create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/37M-logo.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-slogan.imageset/37M-slogan.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-slogan.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37iOSTeam-Round.imageset/37iOSTeam-Round.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37iOSTeam-Round.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-128.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-16.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-256.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-32.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-512.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-64.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/ApplePartyIcon.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/ApplePartyIcon.imageset/icon-256.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/ApplePartyIcon.imageset/icon-512.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/AppAnalytics.imageset/AppAnalytics@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/AppAnalytics.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/Apps.imageset/Apps@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/Apps.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/FinancialReports.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/FinancialReports.imageset/FinancialReports@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/IPAUpload.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/IPAUpload.imageset/IPAUpload@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/PlaceholderIcon.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/PlaceholderIcon.imageset/PlaceholderIcon@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/PlaceholderIcon.imageset/PlaceholderIcon_white@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/QRcode.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/QRcode.imageset/QRcode@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/SendEmail.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/SendEmail.imageset/SendEmail@2x.png create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/VerifyReceipt.imageset/Contents.json create mode 100644 AppleParty/AppleParty/Resources/Assets.xcassets/RootView/VerifyReceipt.imageset/VerifyReceipt@2x.png create mode 100644 AppleParty/AppleParty/Resources/InAppPurchase/example.xlsx create mode 100644 AppleParty/AppleParty/Resources/Transporter/iap_metadata.xml create mode 100644 AppleParty/AppleParty/Resources/Transporter/ipa_metadata.xml create mode 100644 AppleParty/AppleParty/Resources/Transporter/shot_metadata.xml create mode 100644 AppleParty/AppleParty/RootView/APRootCollectionAdapter.swift create mode 100644 AppleParty/AppleParty/RootView/APRootCollectionCell.swift create mode 100644 AppleParty/AppleParty/RootView/APRootCollectionCell.xib create mode 100644 AppleParty/AppleParty/RootView/APRootCollectionModel.swift create mode 100644 AppleParty/AppleParty/RootView/APRootVC.swift create mode 100644 AppleParty/AppleParty/RootView/APRootWC.swift create mode 100644 AppleParty/AppleParty/RootView/APSwichAccountPopover.swift create mode 100644 AppleParty/AppleParty/RootView/APSwichAccountPopover.xib create mode 100644 AppleParty/AppleParty/RootView/Base.lproj/Main.storyboard create mode 100644 AppleParty/AppleParty/RootView/en.lproj/Main.strings create mode 100644 AppleParty/AppleParty/RootView/zh-Hans.lproj/Main.strings create mode 100644 AppleParty/AppleParty/Shared/Info/APConstants.swift create mode 100644 AppleParty/AppleParty/Shared/Info/InfoCenter.swift create mode 100644 AppleParty/AppleParty/Shared/Info/UserCenter.swift create mode 100644 AppleParty/AppleParty/Shared/Network/APClient.swift create mode 100644 AppleParty/AppleParty/Shared/Network/AppStoreConnectAPI.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APASCKeysEditVC.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APASCKeysEditVC.xib create mode 100644 AppleParty/AppleParty/Shared/UI/APASCKeysSettingVC.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APASCKeysSettingVC.xib create mode 100644 AppleParty/AppleParty/Shared/UI/APCollectionView.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APDebugVC.storyboard create mode 100644 AppleParty/AppleParty/Shared/UI/APDebugVC.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APSPasswordEditVC.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APSPasswordEditVC.xib create mode 100644 AppleParty/AppleParty/Shared/UI/APSPasswordSettingVC.swift create mode 100644 AppleParty/AppleParty/Shared/UI/APSPasswordSettingVC.xib create mode 100644 AppleParty/AppleParty/Shared/UI/DropZoneView.swift create mode 100644 AppleParty/AppleParty/Shared/UI/UIExtension.swift create mode 100644 AppleParty/AppleParty/Shared/Utils/APHUD.swift create mode 100644 AppleParty/AppleParty/Shared/Utils/APUtil.swift create mode 100644 AppleParty/AppleParty/Shared/Utils/ARLogs.swift create mode 100644 AppleParty/AppleParty/Shared/Utils/EmailUtils.swift create mode 100644 AppleParty/AppleParty/Shared/Utils/FoundationUtil.swift create mode 100644 AppleParty/AppleParty/SparkleUpdate/AppleParty-release.html create mode 100644 AppleParty/AppleParty/SparkleUpdate/update.xml create mode 100644 AppleParty/AppleParty/Vendors/ITMS/GDataXMLNode.h create mode 100644 AppleParty/AppleParty/Vendors/ITMS/GDataXMLNode.m create mode 100644 AppleParty/AppleParty/Vendors/ITMS/XMLManager.swift create mode 100755 AppleParty/AppleParty/Vendors/MBProgressHUD-OSX/MBProgressHUD.h create mode 100755 AppleParty/AppleParty/Vendors/MBProgressHUD-OSX/MBProgressHUD.m create mode 100644 AppleParty/AppleParty/Vendors/QrcodeUtil.h create mode 100644 AppleParty/AppleParty/Vendors/QrcodeUtil.m create mode 100644 AppleParty/AppleParty/VerifyReceipt/APVerifyReceipt.storyboard create mode 100644 AppleParty/AppleParty/VerifyReceipt/APVerifyReceiptVC.swift create mode 100644 AppleParty/AppleParty/en.lproj/InfoPlist.strings create mode 100644 AppleParty/AppleParty/en.lproj/Localizable.strings create mode 100644 AppleParty/AppleParty/zh-Hans.lproj/InfoPlist.strings create mode 100644 AppleParty/AppleParty/zh-Hans.lproj/Localizable.strings create mode 100644 AppleParty/ApplePartyTests/ApplePartyTests.swift create mode 100644 AppleParty/ApplePartyUITests/ApplePartyUITests.swift create mode 100644 AppleParty/ApplePartyUITests/ApplePartyUITestsLaunchTests.swift create mode 100644 AppleParty/LICENSE create mode 100644 AppleParty/Podfile create mode 100644 AppleParty/README.md create mode 100644 AppleParty/icon.png create mode 100644 AppleParty/screenshot/01.png create mode 100644 AppleParty/screenshot/02.png create mode 100644 AppleParty/screenshot/03.png create mode 100644 AppleParty/screenshot/04.png create mode 100644 AppleParty/screenshot/05.png create mode 100644 AppleParty/screenshot/06.png create mode 100644 AppleParty/screenshot/07.png create mode 100644 AppleParty/screenshot/08.png create mode 100644 AppleParty/screenshot/09.png create mode 100644 AppleParty/screenshot/10.png create mode 100644 IAP-20251024_142831.xlsx diff --git a/.gitignore b/.gitignore index 3542e5b..56620a1 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,8 @@ playground.xcworkspace # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # -# Pods/ +Pods/ +Podfile.lock # # Add this line if you want to avoid checking in source code from the Xcode workspace # *.xcworkspace diff --git a/AppleParty/.github/ISSUE_TEMPLATE/bug_report.md b/AppleParty/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..1567503 --- /dev/null +++ b/AppleParty/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,24 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Version** + - OS: + - AppleParty: diff --git a/AppleParty/.github/ISSUE_TEMPLATE/feature_request.md b/AppleParty/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..93c4953 --- /dev/null +++ b/AppleParty/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,14 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: enhancement +assignees: '' + +--- + +**Tell us how we can improve AppleParty** + +**Is your feature request related to a problem? Please describe.** + +**What would you like to see? How would you like it to work?** diff --git a/AppleParty/.gitignore b/AppleParty/.gitignore new file mode 100644 index 0000000..d8c50d0 --- /dev/null +++ b/AppleParty/.gitignore @@ -0,0 +1,99 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## User settings +xcuserdata/ + +## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) +*.xcscmblueprint +*.xccheckout + +## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) +build/ +DerivedData/ +*.moved-aside +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 + +## Obj-C/Swift specific +*.hmap + +## App packaging +*.ipa +*.dSYM.zip +*.dSYM + +## Playgrounds +timeline.xctimeline +playground.xcworkspace + +# Swift Package Manager +# +# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. +# Packages/ +# Package.pins +# Package.resolved +# *.xcodeproj +# +# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata +# hence it is not needed unless you have added a package configuration file to your project +# .swiftpm + +.build/ + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# +Pods/ + + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + + +# Accio dependency management +Dependencies/ +.accio/ + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. +# Instead, use fastlane to re-generate the screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/#source-control + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots/**/*.png +fastlane/test_output + +# Code Injection +# +# After new code Injection tools there's a generated folder /iOSInjectionProject +# https://github.com/johnno1962/injectionforxcode + +iOSInjectionProject/ + + +## Other +*.xcuserstate + +## Obj-C/Swift specific +*.hmap +*.ipa +*.swp +.DS_Store \ No newline at end of file diff --git a/AppleParty/AppleParty.xcodeproj/project.pbxproj b/AppleParty/AppleParty.xcodeproj/project.pbxproj new file mode 100644 index 0000000..07b2691 --- /dev/null +++ b/AppleParty/AppleParty.xcodeproj/project.pbxproj @@ -0,0 +1,1368 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 35249A13BD02FE59DD5561A9 /* Pods_AppleParty_ApplePartyUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6CE565FD4718E20367C0FBF5 /* Pods_AppleParty_ApplePartyUITests.framework */; }; + 6D09315A2957154B00AE66EF /* IAPExcelParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0931582957154B00AE66EF /* IAPExcelParser.swift */; }; + 6D09315E295715DD00AE66EF /* APUploadIAPListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D09315D295715DD00AE66EF /* APUploadIAPListVC.swift */; }; + 6D0931602957160B00AE66EF /* AppStoreConnectAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D09315F2957160B00AE66EF /* AppStoreConnectAPI.swift */; }; + 6D0931652957312C00AE66EF /* APASCKeysEditVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D0931612957312C00AE66EF /* APASCKeysEditVC.xib */; }; + 6D0931662957312C00AE66EF /* APASCKeysEditVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0931622957312C00AE66EF /* APASCKeysEditVC.swift */; }; + 6D0931672957312C00AE66EF /* APASCKeysSettingVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D0931632957312C00AE66EF /* APASCKeysSettingVC.xib */; }; + 6D0931682957312C00AE66EF /* APASCKeysSettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0931642957312C00AE66EF /* APASCKeysSettingVC.swift */; }; + 6D09316D295731D000AE66EF /* example.xlsx in Resources */ = {isa = PBXBuildFile; fileRef = 6D09316B295731D000AE66EF /* example.xlsx */; }; + 6D093171295732E000AE66EF /* IPAUpload.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D09316F295732E000AE66EF /* IPAUpload.storyboard */; }; + 6D093172295732E000AE66EF /* APIPAUploadVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D093170295732E000AE66EF /* APIPAUploadVC.swift */; }; + 6D0931772957345C00AE66EF /* APSPasswordSettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0931732957345C00AE66EF /* APSPasswordSettingVC.swift */; }; + 6D0931782957345C00AE66EF /* APSPasswordEditVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D0931742957345C00AE66EF /* APSPasswordEditVC.xib */; }; + 6D0931792957345C00AE66EF /* APSPasswordEditVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0931752957345C00AE66EF /* APSPasswordEditVC.swift */; }; + 6D09317A2957345C00AE66EF /* APSPasswordSettingVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D0931762957345C00AE66EF /* APSPasswordSettingVC.xib */; }; + 6D09317F295736D000AE66EF /* AppStoreConnect-Swift-SDK in Frameworks */ = {isa = PBXBuildFile; productRef = 6D09317E295736D000AE66EF /* AppStoreConnect-Swift-SDK */; }; + 6D36DE4827DAFACD00BBC931 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D36DE4727DAFACD00BBC931 /* AppDelegate.swift */; }; + 6D36DE4C27DAFACE00BBC931 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6D36DE4B27DAFACE00BBC931 /* Assets.xcassets */; }; + 6D36DE5A27DAFACE00BBC931 /* ApplePartyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D36DE5927DAFACE00BBC931 /* ApplePartyTests.swift */; }; + 6D36DE6427DAFACE00BBC931 /* ApplePartyUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D36DE6327DAFACE00BBC931 /* ApplePartyUITests.swift */; }; + 6D36DE6627DAFACE00BBC931 /* ApplePartyUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D36DE6527DAFACE00BBC931 /* ApplePartyUITestsLaunchTests.swift */; }; + 6D36DE7C27DB775800BBC931 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6D36DE7E27DB775800BBC931 /* InfoPlist.strings */; }; + 6D36DE8527DB77C600BBC931 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6D36DE8727DB77C600BBC931 /* Localizable.strings */; }; + 6D3ECCC927F16145005E4597 /* APHUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCC827F16145005E4597 /* APHUD.swift */; }; + 6D3ECCCC27F193AF005E4597 /* PhoneNumbers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCCB27F193AF005E4597 /* PhoneNumbers.swift */; }; + 6D3ECCCF27F1A9FE005E4597 /* APSwichAccountPopover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCCD27F1A9FE005E4597 /* APSwichAccountPopover.swift */; }; + 6D3ECCD027F1A9FE005E4597 /* APSwichAccountPopover.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D3ECCCE27F1A9FE005E4597 /* APSwichAccountPopover.xib */; }; + 6D3ECCD727F1CAD6005E4597 /* ScreenShotHelpPopoverVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCD227F1CAD6005E4597 /* ScreenShotHelpPopoverVC.swift */; }; + 6D3ECCD827F1CAD6005E4597 /* ScreenShotHelpPopoverVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D3ECCD327F1CAD6005E4597 /* ScreenShotHelpPopoverVC.xib */; }; + 6D3ECCD927F1CAD6005E4597 /* ScreenShotUpload.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D3ECCD427F1CAD6005E4597 /* ScreenShotUpload.storyboard */; }; + 6D3ECCDA27F1CAD6005E4597 /* ScreenShotUploadVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCD527F1CAD6005E4597 /* ScreenShotUploadVC.swift */; }; + 6D3ECCDB27F1CAD6005E4597 /* ScreenShotUploadCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCD627F1CAD6005E4597 /* ScreenShotUploadCell.swift */; }; + 6D3ECCDE27F1D027005E4597 /* XMLModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCDD27F1D027005E4597 /* XMLModel.swift */; }; + 6D3ECCE027F1D2A0005E4597 /* APDebugVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D3ECCDF27F1D2A0005E4597 /* APDebugVC.storyboard */; }; + 6D3ECCE227F1D322005E4597 /* APDebugVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCE127F1D322005E4597 /* APDebugVC.swift */; }; + 6D3ECCE827F1D6BB005E4597 /* IAPModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCE727F1D6BB005E4597 /* IAPModel.swift */; }; + 6D3ECCEC27F1E97F005E4597 /* APInAppPurchseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3ECCEB27F1E97F005E4597 /* APInAppPurchseVC.swift */; }; + 6D3ECCEE27F1E989005E4597 /* APInAppPurchseVC.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D3ECCED27F1E989005E4597 /* APInAppPurchseVC.storyboard */; }; + 6D584B5627F20A4D00924BFE /* APInappPurchseCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D584B5527F20A4D00924BFE /* APInappPurchseCell.xib */; }; + 6D584B5827F20A8000924BFE /* APInAppPurchseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D584B5727F20A8000924BFE /* APInAppPurchseCell.swift */; }; + 6D59A20B27F29DB600C7D8F5 /* SwiftSMTP in Frameworks */ = {isa = PBXBuildFile; productRef = 6D59A20A27F29DB600C7D8F5 /* SwiftSMTP */; }; + 6D59A20F27F29E8B00C7D8F5 /* EmailTool.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D59A20C27F29E8B00C7D8F5 /* EmailTool.storyboard */; }; + 6D59A21027F29E8B00C7D8F5 /* EmailToolVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A20D27F29E8B00C7D8F5 /* EmailToolVC.swift */; }; + 6D59A21127F29E8B00C7D8F5 /* DropZoneView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A20E27F29E8B00C7D8F5 /* DropZoneView.swift */; }; + 6D59A21327F29F4C00C7D8F5 /* EmailUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A21227F29F4C00C7D8F5 /* EmailUtils.swift */; }; + 6D59A21527F2C46100C7D8F5 /* InAppPurchseView.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D59A21427F2C46100C7D8F5 /* InAppPurchseView.storyboard */; }; + 6D59A21927F2D3C600C7D8F5 /* IAPUploadImageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A21827F2D3C600C7D8F5 /* IAPUploadImageVC.swift */; }; + 6D59A21B27F2D49000C7D8F5 /* DragView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A21A27F2D49000C7D8F5 /* DragView.swift */; }; + 6D59A21D27F2D77700C7D8F5 /* OutputExcelVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A21C27F2D77700C7D8F5 /* OutputExcelVC.swift */; }; + 6D59A22127F3055300C7D8F5 /* APQRcodeVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A22027F3055300C7D8F5 /* APQRcodeVC.swift */; }; + 6D59A22327F3056B00C7D8F5 /* APQRcode.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D59A22227F3056B00C7D8F5 /* APQRcode.storyboard */; }; + 6D59A22627F306A900C7D8F5 /* QrcodeUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A22527F306A900C7D8F5 /* QrcodeUtil.m */; }; + 6D59A22F27F31E7000C7D8F5 /* APSettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A22D27F31E7000C7D8F5 /* APSettingVC.swift */; }; + 6D59A23027F31E7000C7D8F5 /* APSettingVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D59A22E27F31E7000C7D8F5 /* APSettingVC.xib */; }; + 6D59A23A27F3395900C7D8F5 /* EmailSettingVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A23827F3395900C7D8F5 /* EmailSettingVC.swift */; }; + 6D59A23B27F3395A00C7D8F5 /* EmailSettingVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D59A23927F3395900C7D8F5 /* EmailSettingVC.xib */; }; + 6D59A24727FE833800C7D8F5 /* APConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D59A24627FE833800C7D8F5 /* APConstants.swift */; }; + 6D7065B8298A544800031916 /* MBProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D7065B6298A544800031916 /* MBProgressHUD.m */; }; + 6D8F184A27F07E97001A30BF /* APAppListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F182D27F07E97001A30BF /* APAppListVC.swift */; }; + 6D8F184D27F07E97001A30BF /* APRootVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F183927F07E97001A30BF /* APRootVC.swift */; }; + 6D8F184F27F07E97001A30BF /* APRootWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F183D27F07E97001A30BF /* APRootWC.swift */; }; + 6D8F185027F07E97001A30BF /* APRootCollectionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D8F183E27F07E97001A30BF /* APRootCollectionCell.xib */; }; + 6D8F185127F07E97001A30BF /* APRootCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F183F27F07E97001A30BF /* APRootCollectionCell.swift */; }; + 6D8F185227F07E97001A30BF /* APRootCollectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F184027F07E97001A30BF /* APRootCollectionModel.swift */; }; + 6D8F185327F07E97001A30BF /* APRootCollectionAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F184127F07E97001A30BF /* APRootCollectionAdapter.swift */; }; + 6D8F185427F07E97001A30BF /* UIExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F184427F07E97001A30BF /* UIExtension.swift */; }; + 6D8F185527F07E97001A30BF /* APCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F184527F07E97001A30BF /* APCollectionView.swift */; }; + 6D8F185627F07E97001A30BF /* APUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F184827F07E97001A30BF /* APUtil.swift */; }; + 6D8F185927F07F4B001A30BF /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D8F185727F07F4B001A30BF /* Main.storyboard */; }; + 6D8F185C27F08161001A30BF /* AppList.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6D8F185E27F08161001A30BF /* AppList.storyboard */; }; + 6D8F186327F081D3001A30BF /* APAppListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F186127F081D3001A30BF /* APAppListCell.swift */; }; + 6D8F186427F081D3001A30BF /* APAppListCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D8F186227F081D3001A30BF /* APAppListCell.xib */; }; + 6D8F186627F081ED001A30BF /* APAppListAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F186527F081ED001A30BF /* APAppListAdapter.swift */; }; + 6D8F186827F08201001A30BF /* APAppListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F186727F08201001A30BF /* APAppListModel.swift */; }; + 6D8F186F27F08F65001A30BF /* APLoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F186D27F08F65001A30BF /* APLoginVC.swift */; }; + 6D8F187027F08F65001A30BF /* APLoginVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D8F186E27F08F65001A30BF /* APLoginVC.xib */; }; + 6D8F187327F0A070001A30BF /* UserCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F187227F0A070001A30BF /* UserCenter.swift */; }; + 6D8F187527F0A0B3001A30BF /* InfoCenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F187427F0A0B3001A30BF /* InfoCenter.swift */; }; + 6D8F187827F0A2DD001A30BF /* APLogin2FAVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F187627F0A2DD001A30BF /* APLogin2FAVC.swift */; }; + 6D8F187927F0A2DD001A30BF /* APLogin2FAVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6D8F187727F0A2DD001A30BF /* APLogin2FAVC.xib */; }; + 6D8F188427F0AC83001A30BF /* XMLManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F188027F0AC83001A30BF /* XMLManager.swift */; }; + 6D8F188827F0ACA5001A30BF /* GDataXMLNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F188727F0ACA5001A30BF /* GDataXMLNode.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 6D8F188A27F0ADC2001A30BF /* FoundationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F188927F0ADC2001A30BF /* FoundationUtil.swift */; }; + 6D8F188E27F0C121001A30BF /* APClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F188D27F0C121001A30BF /* APClient.swift */; }; + 6D8F189027F0C3CB001A30BF /* ARLogs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D8F188F27F0C3CB001A30BF /* ARLogs.swift */; }; + 6DA62AB029FBD1AC0093E1C2 /* APVerifyReceipt.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6DA62AAE29FBD1AC0093E1C2 /* APVerifyReceipt.storyboard */; }; + 6DA62AB129FBD1AC0093E1C2 /* APVerifyReceiptVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DA62AAF29FBD1AC0093E1C2 /* APVerifyReceiptVC.swift */; }; + 6DC6B0852CD0E6FB00E4C0D7 /* AppleWebLoginCore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC6B0832CD0E6FB00E4C0D7 /* AppleWebLoginCore.swift */; }; + 6DC6B0882CD0E70900E4C0D7 /* APWebLoginVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DC6B0862CD0E70900E4C0D7 /* APWebLoginVC.swift */; }; + 6DC6B0892CD0E70900E4C0D7 /* APWebLoginVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6DC6B0872CD0E70900E4C0D7 /* APWebLoginVC.xib */; }; + 814E3C3BB5538B3ED396D7DF /* Pods_ApplePartyTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46A4FD1F5C0341D48CF4D106 /* Pods_ApplePartyTests.framework */; }; + BA7B4461DBCFDE92C6C0DDA8 /* Pods_AppleParty.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8DDC8A0206F410C17653E3A /* Pods_AppleParty.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 6D36DE5627DAFACE00BBC931 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6D36DE3C27DAFACD00BBC931 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6D36DE4327DAFACD00BBC931; + remoteInfo = AppleParty; + }; + 6D36DE6027DAFACE00BBC931 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6D36DE3C27DAFACD00BBC931 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6D36DE4327DAFACD00BBC931; + remoteInfo = AppleParty; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1D3D597799DB4DF597EDC003 /* Pods-ApplePartyTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApplePartyTests.debug.xcconfig"; path = "Target Support Files/Pods-ApplePartyTests/Pods-ApplePartyTests.debug.xcconfig"; sourceTree = ""; }; + 4140E6B7075C708364368BBC /* Pods-AppleParty-ApplePartyUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleParty-ApplePartyUITests.release.xcconfig"; path = "Target Support Files/Pods-AppleParty-ApplePartyUITests/Pods-AppleParty-ApplePartyUITests.release.xcconfig"; sourceTree = ""; }; + 45F1FE2A4C13D7D378FD2C07 /* Pods-ApplePartyTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ApplePartyTests.release.xcconfig"; path = "Target Support Files/Pods-ApplePartyTests/Pods-ApplePartyTests.release.xcconfig"; sourceTree = ""; }; + 46A4FD1F5C0341D48CF4D106 /* Pods_ApplePartyTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ApplePartyTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 526A86591D63E15605829ECE /* Pods-AppleParty.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleParty.release.xcconfig"; path = "Target Support Files/Pods-AppleParty/Pods-AppleParty.release.xcconfig"; sourceTree = ""; }; + 63F4DCD655332D4AA5E2ECF5 /* Pods-AppleParty-ApplePartyUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleParty-ApplePartyUITests.debug.xcconfig"; path = "Target Support Files/Pods-AppleParty-ApplePartyUITests/Pods-AppleParty-ApplePartyUITests.debug.xcconfig"; sourceTree = ""; }; + 6CE565FD4718E20367C0FBF5 /* Pods_AppleParty_ApplePartyUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AppleParty_ApplePartyUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D0931582957154B00AE66EF /* IAPExcelParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IAPExcelParser.swift; sourceTree = ""; }; + 6D09315D295715DD00AE66EF /* APUploadIAPListVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APUploadIAPListVC.swift; sourceTree = ""; }; + 6D09315F2957160B00AE66EF /* AppStoreConnectAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppStoreConnectAPI.swift; sourceTree = ""; }; + 6D0931612957312C00AE66EF /* APASCKeysEditVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APASCKeysEditVC.xib; sourceTree = ""; }; + 6D0931622957312C00AE66EF /* APASCKeysEditVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APASCKeysEditVC.swift; sourceTree = ""; }; + 6D0931632957312C00AE66EF /* APASCKeysSettingVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APASCKeysSettingVC.xib; sourceTree = ""; }; + 6D0931642957312C00AE66EF /* APASCKeysSettingVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APASCKeysSettingVC.swift; sourceTree = ""; }; + 6D09316B295731D000AE66EF /* example.xlsx */ = {isa = PBXFileReference; lastKnownFileType = file; path = example.xlsx; sourceTree = ""; }; + 6D09316F295732E000AE66EF /* IPAUpload.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = IPAUpload.storyboard; sourceTree = ""; }; + 6D093170295732E000AE66EF /* APIPAUploadVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APIPAUploadVC.swift; sourceTree = ""; }; + 6D0931732957345C00AE66EF /* APSPasswordSettingVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APSPasswordSettingVC.swift; sourceTree = ""; }; + 6D0931742957345C00AE66EF /* APSPasswordEditVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APSPasswordEditVC.xib; sourceTree = ""; }; + 6D0931752957345C00AE66EF /* APSPasswordEditVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APSPasswordEditVC.swift; sourceTree = ""; }; + 6D0931762957345C00AE66EF /* APSPasswordSettingVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APSPasswordSettingVC.xib; sourceTree = ""; }; + 6D09317B295735D100AE66EF /* ipa_metadata.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ipa_metadata.xml; sourceTree = ""; }; + 6D36DE4427DAFACD00BBC931 /* AppleParty.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppleParty.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D36DE4727DAFACD00BBC931 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 6D36DE4B27DAFACE00BBC931 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 6D36DE5527DAFACE00BBC931 /* ApplePartyTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApplePartyTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D36DE5927DAFACE00BBC931 /* ApplePartyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePartyTests.swift; sourceTree = ""; }; + 6D36DE5F27DAFACE00BBC931 /* ApplePartyUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApplePartyUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6D36DE6327DAFACE00BBC931 /* ApplePartyUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePartyUITests.swift; sourceTree = ""; }; + 6D36DE6527DAFACE00BBC931 /* ApplePartyUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplePartyUITestsLaunchTests.swift; sourceTree = ""; }; + 6D36DE7327DAFB5F00BBC931 /* AppleParty.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = AppleParty.entitlements; path = AppleParty/AppleParty.entitlements; sourceTree = ""; }; + 6D36DE7427DAFB6C00BBC931 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 6D36DE7D27DB775800BBC931 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; + 6D36DE8027DB777400BBC931 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6D36DE8627DB77C600BBC931 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; + 6D36DE8827DB77C700BBC931 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; + 6D36DE8927DEEA6E00BBC931 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = AppleParty/Info.plist; sourceTree = ""; }; + 6D3ECCC827F16145005E4597 /* APHUD.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APHUD.swift; sourceTree = ""; }; + 6D3ECCCB27F193AF005E4597 /* PhoneNumbers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneNumbers.swift; sourceTree = ""; }; + 6D3ECCCD27F1A9FE005E4597 /* APSwichAccountPopover.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APSwichAccountPopover.swift; sourceTree = ""; }; + 6D3ECCCE27F1A9FE005E4597 /* APSwichAccountPopover.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = APSwichAccountPopover.xib; sourceTree = ""; }; + 6D3ECCD227F1CAD6005E4597 /* ScreenShotHelpPopoverVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenShotHelpPopoverVC.swift; sourceTree = ""; }; + 6D3ECCD327F1CAD6005E4597 /* ScreenShotHelpPopoverVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ScreenShotHelpPopoverVC.xib; sourceTree = ""; }; + 6D3ECCD427F1CAD6005E4597 /* ScreenShotUpload.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = ScreenShotUpload.storyboard; sourceTree = ""; }; + 6D3ECCD527F1CAD6005E4597 /* ScreenShotUploadVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenShotUploadVC.swift; sourceTree = ""; }; + 6D3ECCD627F1CAD6005E4597 /* ScreenShotUploadCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScreenShotUploadCell.swift; sourceTree = ""; }; + 6D3ECCDD27F1D027005E4597 /* XMLModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLModel.swift; sourceTree = ""; }; + 6D3ECCDF27F1D2A0005E4597 /* APDebugVC.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = APDebugVC.storyboard; sourceTree = ""; }; + 6D3ECCE127F1D322005E4597 /* APDebugVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APDebugVC.swift; sourceTree = ""; }; + 6D3ECCE727F1D6BB005E4597 /* IAPModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IAPModel.swift; sourceTree = ""; }; + 6D3ECCEB27F1E97F005E4597 /* APInAppPurchseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APInAppPurchseVC.swift; sourceTree = ""; }; + 6D3ECCED27F1E989005E4597 /* APInAppPurchseVC.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = APInAppPurchseVC.storyboard; sourceTree = ""; }; + 6D3ECCF027F1ECE2005E4597 /* iap_metadata.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = iap_metadata.xml; sourceTree = ""; }; + 6D3ECCF227F1ECF8005E4597 /* shot_metadata.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = shot_metadata.xml; sourceTree = ""; }; + 6D584B5527F20A4D00924BFE /* APInappPurchseCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = APInappPurchseCell.xib; sourceTree = ""; }; + 6D584B5727F20A8000924BFE /* APInAppPurchseCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APInAppPurchseCell.swift; sourceTree = ""; }; + 6D59A20C27F29E8B00C7D8F5 /* EmailTool.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = EmailTool.storyboard; sourceTree = ""; }; + 6D59A20D27F29E8B00C7D8F5 /* EmailToolVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailToolVC.swift; sourceTree = ""; }; + 6D59A20E27F29E8B00C7D8F5 /* DropZoneView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DropZoneView.swift; sourceTree = ""; }; + 6D59A21227F29F4C00C7D8F5 /* EmailUtils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EmailUtils.swift; sourceTree = ""; }; + 6D59A21427F2C46100C7D8F5 /* InAppPurchseView.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = InAppPurchseView.storyboard; sourceTree = ""; }; + 6D59A21827F2D3C600C7D8F5 /* IAPUploadImageVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IAPUploadImageVC.swift; sourceTree = ""; }; + 6D59A21A27F2D49000C7D8F5 /* DragView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DragView.swift; sourceTree = ""; }; + 6D59A21C27F2D77700C7D8F5 /* OutputExcelVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OutputExcelVC.swift; sourceTree = ""; }; + 6D59A22027F3055300C7D8F5 /* APQRcodeVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APQRcodeVC.swift; sourceTree = ""; }; + 6D59A22227F3056B00C7D8F5 /* APQRcode.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = APQRcode.storyboard; sourceTree = ""; }; + 6D59A22427F306A900C7D8F5 /* QrcodeUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QrcodeUtil.h; sourceTree = ""; }; + 6D59A22527F306A900C7D8F5 /* QrcodeUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QrcodeUtil.m; sourceTree = ""; }; + 6D59A22D27F31E7000C7D8F5 /* APSettingVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APSettingVC.swift; sourceTree = ""; }; + 6D59A22E27F31E7000C7D8F5 /* APSettingVC.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APSettingVC.xib; sourceTree = ""; }; + 6D59A23327F321BA00C7D8F5 /* update.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = update.xml; sourceTree = ""; }; + 6D59A23527F321CA00C7D8F5 /* AppleParty-release.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "AppleParty-release.html"; sourceTree = ""; }; + 6D59A23827F3395900C7D8F5 /* EmailSettingVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailSettingVC.swift; sourceTree = ""; }; + 6D59A23927F3395900C7D8F5 /* EmailSettingVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EmailSettingVC.xib; sourceTree = ""; }; + 6D59A24627FE833800C7D8F5 /* APConstants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APConstants.swift; sourceTree = ""; }; + 6D7065B6298A544800031916 /* MBProgressHUD.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBProgressHUD.m; sourceTree = ""; }; + 6D7065B7298A544800031916 /* MBProgressHUD.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBProgressHUD.h; sourceTree = ""; }; + 6D8F182D27F07E97001A30BF /* APAppListVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APAppListVC.swift; sourceTree = ""; }; + 6D8F183927F07E97001A30BF /* APRootVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APRootVC.swift; sourceTree = ""; }; + 6D8F183D27F07E97001A30BF /* APRootWC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APRootWC.swift; sourceTree = ""; }; + 6D8F183E27F07E97001A30BF /* APRootCollectionCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = APRootCollectionCell.xib; sourceTree = ""; }; + 6D8F183F27F07E97001A30BF /* APRootCollectionCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APRootCollectionCell.swift; sourceTree = ""; }; + 6D8F184027F07E97001A30BF /* APRootCollectionModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APRootCollectionModel.swift; sourceTree = ""; }; + 6D8F184127F07E97001A30BF /* APRootCollectionAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APRootCollectionAdapter.swift; sourceTree = ""; }; + 6D8F184427F07E97001A30BF /* UIExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UIExtension.swift; sourceTree = ""; }; + 6D8F184527F07E97001A30BF /* APCollectionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APCollectionView.swift; sourceTree = ""; }; + 6D8F184827F07E97001A30BF /* APUtil.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APUtil.swift; sourceTree = ""; }; + 6D8F185827F07F4B001A30BF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 6D8F185B27F07F58001A30BF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Main.strings"; sourceTree = ""; }; + 6D8F185D27F08161001A30BF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AppList.storyboard; sourceTree = ""; }; + 6D8F186027F08162001A30BF /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/AppList.strings"; sourceTree = ""; }; + 6D8F186127F081D3001A30BF /* APAppListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APAppListCell.swift; sourceTree = ""; }; + 6D8F186227F081D3001A30BF /* APAppListCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = APAppListCell.xib; sourceTree = ""; }; + 6D8F186527F081ED001A30BF /* APAppListAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APAppListAdapter.swift; sourceTree = ""; }; + 6D8F186727F08201001A30BF /* APAppListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APAppListModel.swift; sourceTree = ""; }; + 6D8F186D27F08F65001A30BF /* APLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APLoginVC.swift; sourceTree = ""; }; + 6D8F186E27F08F65001A30BF /* APLoginVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = APLoginVC.xib; sourceTree = ""; }; + 6D8F187227F0A070001A30BF /* UserCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserCenter.swift; sourceTree = ""; }; + 6D8F187427F0A0B3001A30BF /* InfoCenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfoCenter.swift; sourceTree = ""; }; + 6D8F187627F0A2DD001A30BF /* APLogin2FAVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APLogin2FAVC.swift; sourceTree = ""; }; + 6D8F187727F0A2DD001A30BF /* APLogin2FAVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = APLogin2FAVC.xib; sourceTree = ""; }; + 6D8F188027F0AC83001A30BF /* XMLManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XMLManager.swift; sourceTree = ""; }; + 6D8F188527F0ACA4001A30BF /* AppleParty-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AppleParty-Bridging-Header.h"; sourceTree = ""; }; + 6D8F188627F0ACA5001A30BF /* GDataXMLNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDataXMLNode.h; sourceTree = ""; }; + 6D8F188727F0ACA5001A30BF /* GDataXMLNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GDataXMLNode.m; sourceTree = ""; }; + 6D8F188927F0ADC2001A30BF /* FoundationUtil.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FoundationUtil.swift; sourceTree = ""; }; + 6D8F188D27F0C121001A30BF /* APClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APClient.swift; sourceTree = ""; }; + 6D8F188F27F0C3CB001A30BF /* ARLogs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ARLogs.swift; sourceTree = ""; }; + 6DA62AAE29FBD1AC0093E1C2 /* APVerifyReceipt.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = APVerifyReceipt.storyboard; sourceTree = ""; }; + 6DA62AAF29FBD1AC0093E1C2 /* APVerifyReceiptVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APVerifyReceiptVC.swift; sourceTree = ""; }; + 6DC6B0832CD0E6FB00E4C0D7 /* AppleWebLoginCore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleWebLoginCore.swift; sourceTree = ""; }; + 6DC6B0862CD0E70900E4C0D7 /* APWebLoginVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APWebLoginVC.swift; sourceTree = ""; }; + 6DC6B0872CD0E70900E4C0D7 /* APWebLoginVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = APWebLoginVC.xib; sourceTree = ""; }; + 6E2329117B30DC9F72DC1E3E /* Pods-AppleParty.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppleParty.debug.xcconfig"; path = "Target Support Files/Pods-AppleParty/Pods-AppleParty.debug.xcconfig"; sourceTree = ""; }; + F8DDC8A0206F410C17653E3A /* Pods_AppleParty.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AppleParty.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6D36DE4127DAFACD00BBC931 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D59A20B27F29DB600C7D8F5 /* SwiftSMTP in Frameworks */, + BA7B4461DBCFDE92C6C0DDA8 /* Pods_AppleParty.framework in Frameworks */, + 6D09317F295736D000AE66EF /* AppStoreConnect-Swift-SDK in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D36DE5227DAFACE00BBC931 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 814E3C3BB5538B3ED396D7DF /* Pods_ApplePartyTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D36DE5C27DAFACE00BBC931 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 35249A13BD02FE59DD5561A9 /* Pods_AppleParty_ApplePartyUITests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 263330C868F2CFAF4C8A67BC /* Pods */ = { + isa = PBXGroup; + children = ( + 6E2329117B30DC9F72DC1E3E /* Pods-AppleParty.debug.xcconfig */, + 526A86591D63E15605829ECE /* Pods-AppleParty.release.xcconfig */, + 63F4DCD655332D4AA5E2ECF5 /* Pods-AppleParty-ApplePartyUITests.debug.xcconfig */, + 4140E6B7075C708364368BBC /* Pods-AppleParty-ApplePartyUITests.release.xcconfig */, + 1D3D597799DB4DF597EDC003 /* Pods-ApplePartyTests.debug.xcconfig */, + 45F1FE2A4C13D7D378FD2C07 /* Pods-ApplePartyTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 6D093169295731D000AE66EF /* InAppPurchase */ = { + isa = PBXGroup; + children = ( + 6D09316B295731D000AE66EF /* example.xlsx */, + ); + path = InAppPurchase; + sourceTree = ""; + }; + 6D09316E295732D100AE66EF /* IPAUpload */ = { + isa = PBXGroup; + children = ( + 6D093170295732E000AE66EF /* APIPAUploadVC.swift */, + 6D09316F295732E000AE66EF /* IPAUpload.storyboard */, + ); + path = IPAUpload; + sourceTree = ""; + }; + 6D36DE3B27DAFACD00BBC931 = { + isa = PBXGroup; + children = ( + 6D36DE7427DAFB6C00BBC931 /* README.md */, + 6D36DE7327DAFB5F00BBC931 /* AppleParty.entitlements */, + 6D36DE8927DEEA6E00BBC931 /* Info.plist */, + 6D36DE7E27DB775800BBC931 /* InfoPlist.strings */, + 6D36DE8727DB77C600BBC931 /* Localizable.strings */, + 6D36DE4627DAFACD00BBC931 /* AppleParty */, + 6D36DE5827DAFACE00BBC931 /* ApplePartyTests */, + 6D36DE6227DAFACE00BBC931 /* ApplePartyUITests */, + 6D36DE4527DAFACD00BBC931 /* Products */, + 263330C868F2CFAF4C8A67BC /* Pods */, + BD41E9D291F096DAD93AE347 /* Frameworks */, + ); + sourceTree = ""; + }; + 6D36DE4527DAFACD00BBC931 /* Products */ = { + isa = PBXGroup; + children = ( + 6D36DE4427DAFACD00BBC931 /* AppleParty.app */, + 6D36DE5527DAFACE00BBC931 /* ApplePartyTests.xctest */, + 6D36DE5F27DAFACE00BBC931 /* ApplePartyUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 6D36DE4627DAFACD00BBC931 /* AppleParty */ = { + isa = PBXGroup; + children = ( + 6D36DE4727DAFACD00BBC931 /* AppDelegate.swift */, + 6D8F188527F0ACA4001A30BF /* AppleParty-Bridging-Header.h */, + 6D8F183627F07E97001A30BF /* RootView */, + 6D36DE7527DAFCD900BBC931 /* LoginView */, + 6D8F182B27F07E97001A30BF /* AppListView */, + 6D8F183027F07E97001A30BF /* EmailToolView */, + 6D09316E295732D100AE66EF /* IPAUpload */, + 6D8F183427F07E97001A30BF /* QRcodeView */, + 6DA62AAD29FBD19C0093E1C2 /* VerifyReceipt */, + 6D8F183127F07E97001A30BF /* AppSettingView */, + 6D8F184227F07E97001A30BF /* Shared */, + 6D8F187A27F0AC74001A30BF /* Vendors */, + 6D8F183327F07E97001A30BF /* SparkleUpdate */, + 6D36DE7627DAFCFD00BBC931 /* Resources */, + ); + path = AppleParty; + sourceTree = ""; + }; + 6D36DE5827DAFACE00BBC931 /* ApplePartyTests */ = { + isa = PBXGroup; + children = ( + 6D36DE5927DAFACE00BBC931 /* ApplePartyTests.swift */, + ); + path = ApplePartyTests; + sourceTree = ""; + }; + 6D36DE6227DAFACE00BBC931 /* ApplePartyUITests */ = { + isa = PBXGroup; + children = ( + 6D36DE6327DAFACE00BBC931 /* ApplePartyUITests.swift */, + 6D36DE6527DAFACE00BBC931 /* ApplePartyUITestsLaunchTests.swift */, + ); + path = ApplePartyUITests; + sourceTree = ""; + }; + 6D36DE7527DAFCD900BBC931 /* LoginView */ = { + isa = PBXGroup; + children = ( + 6DC6B0862CD0E70900E4C0D7 /* APWebLoginVC.swift */, + 6DC6B0872CD0E70900E4C0D7 /* APWebLoginVC.xib */, + 6D8F186D27F08F65001A30BF /* APLoginVC.swift */, + 6D8F186E27F08F65001A30BF /* APLoginVC.xib */, + 6D8F187627F0A2DD001A30BF /* APLogin2FAVC.swift */, + 6D8F187727F0A2DD001A30BF /* APLogin2FAVC.xib */, + 6D3ECCCB27F193AF005E4597 /* PhoneNumbers.swift */, + 6DC6B0842CD0E6FB00E4C0D7 /* AppleWebLogin */, + ); + path = LoginView; + sourceTree = ""; + }; + 6D36DE7627DAFCFD00BBC931 /* Resources */ = { + isa = PBXGroup; + children = ( + 6D36DE4B27DAFACE00BBC931 /* Assets.xcassets */, + 6D093169295731D000AE66EF /* InAppPurchase */, + 6D3ECCEF27F1ECD3005E4597 /* Transporter */, + ); + path = Resources; + sourceTree = ""; + }; + 6D3ECCD127F1CAC5005E4597 /* ScreenShotsView */ = { + isa = PBXGroup; + children = ( + 6D3ECCD527F1CAD6005E4597 /* ScreenShotUploadVC.swift */, + 6D3ECCD427F1CAD6005E4597 /* ScreenShotUpload.storyboard */, + 6D3ECCD627F1CAD6005E4597 /* ScreenShotUploadCell.swift */, + 6D3ECCD227F1CAD6005E4597 /* ScreenShotHelpPopoverVC.swift */, + 6D3ECCD327F1CAD6005E4597 /* ScreenShotHelpPopoverVC.xib */, + ); + path = ScreenShotsView; + sourceTree = ""; + }; + 6D3ECCDC27F1D00B005E4597 /* Models */ = { + isa = PBXGroup; + children = ( + 6D3ECCE727F1D6BB005E4597 /* IAPModel.swift */, + 6D3ECCDD27F1D027005E4597 /* XMLModel.swift */, + 6D0931582957154B00AE66EF /* IAPExcelParser.swift */, + ); + path = Models; + sourceTree = ""; + }; + 6D3ECCEF27F1ECD3005E4597 /* Transporter */ = { + isa = PBXGroup; + children = ( + 6D3ECCF227F1ECF8005E4597 /* shot_metadata.xml */, + 6D3ECCF027F1ECE2005E4597 /* iap_metadata.xml */, + 6D09317B295735D100AE66EF /* ipa_metadata.xml */, + ); + path = Transporter; + sourceTree = ""; + }; + 6D7065B5298A544800031916 /* MBProgressHUD-OSX */ = { + isa = PBXGroup; + children = ( + 6D7065B7298A544800031916 /* MBProgressHUD.h */, + 6D7065B6298A544800031916 /* MBProgressHUD.m */, + ); + path = "MBProgressHUD-OSX"; + sourceTree = ""; + }; + 6D8F182B27F07E97001A30BF /* AppListView */ = { + isa = PBXGroup; + children = ( + 6D8F182D27F07E97001A30BF /* APAppListVC.swift */, + 6D8F185E27F08161001A30BF /* AppList.storyboard */, + 6D8F186527F081ED001A30BF /* APAppListAdapter.swift */, + 6D8F186127F081D3001A30BF /* APAppListCell.swift */, + 6D8F186227F081D3001A30BF /* APAppListCell.xib */, + 6D8F186727F08201001A30BF /* APAppListModel.swift */, + 6D8F183227F07E97001A30BF /* InAppPurchseView */, + 6D3ECCD127F1CAC5005E4597 /* ScreenShotsView */, + ); + path = AppListView; + sourceTree = ""; + }; + 6D8F183027F07E97001A30BF /* EmailToolView */ = { + isa = PBXGroup; + children = ( + 6D59A20D27F29E8B00C7D8F5 /* EmailToolVC.swift */, + 6D59A20C27F29E8B00C7D8F5 /* EmailTool.storyboard */, + 6D59A23827F3395900C7D8F5 /* EmailSettingVC.swift */, + 6D59A23927F3395900C7D8F5 /* EmailSettingVC.xib */, + ); + path = EmailToolView; + sourceTree = ""; + }; + 6D8F183127F07E97001A30BF /* AppSettingView */ = { + isa = PBXGroup; + children = ( + 6D59A22D27F31E7000C7D8F5 /* APSettingVC.swift */, + 6D59A22E27F31E7000C7D8F5 /* APSettingVC.xib */, + ); + path = AppSettingView; + sourceTree = ""; + }; + 6D8F183227F07E97001A30BF /* InAppPurchseView */ = { + isa = PBXGroup; + children = ( + 6D3ECCEB27F1E97F005E4597 /* APInAppPurchseVC.swift */, + 6D3ECCED27F1E989005E4597 /* APInAppPurchseVC.storyboard */, + 6D09315D295715DD00AE66EF /* APUploadIAPListVC.swift */, + 6D59A21827F2D3C600C7D8F5 /* IAPUploadImageVC.swift */, + 6D59A21C27F2D77700C7D8F5 /* OutputExcelVC.swift */, + 6D59A21427F2C46100C7D8F5 /* InAppPurchseView.storyboard */, + 6D584B5727F20A8000924BFE /* APInAppPurchseCell.swift */, + 6D584B5527F20A4D00924BFE /* APInappPurchseCell.xib */, + 6D59A21A27F2D49000C7D8F5 /* DragView.swift */, + 6D3ECCDC27F1D00B005E4597 /* Models */, + ); + path = InAppPurchseView; + sourceTree = ""; + }; + 6D8F183327F07E97001A30BF /* SparkleUpdate */ = { + isa = PBXGroup; + children = ( + 6D59A23327F321BA00C7D8F5 /* update.xml */, + 6D59A23527F321CA00C7D8F5 /* AppleParty-release.html */, + ); + path = SparkleUpdate; + sourceTree = ""; + }; + 6D8F183427F07E97001A30BF /* QRcodeView */ = { + isa = PBXGroup; + children = ( + 6D59A22027F3055300C7D8F5 /* APQRcodeVC.swift */, + 6D59A22227F3056B00C7D8F5 /* APQRcode.storyboard */, + ); + path = QRcodeView; + sourceTree = ""; + }; + 6D8F183627F07E97001A30BF /* RootView */ = { + isa = PBXGroup; + children = ( + 6D8F185727F07F4B001A30BF /* Main.storyboard */, + 6D8F183D27F07E97001A30BF /* APRootWC.swift */, + 6D8F183927F07E97001A30BF /* APRootVC.swift */, + 6D8F183F27F07E97001A30BF /* APRootCollectionCell.swift */, + 6D8F183E27F07E97001A30BF /* APRootCollectionCell.xib */, + 6D8F184027F07E97001A30BF /* APRootCollectionModel.swift */, + 6D8F184127F07E97001A30BF /* APRootCollectionAdapter.swift */, + 6D3ECCCD27F1A9FE005E4597 /* APSwichAccountPopover.swift */, + 6D3ECCCE27F1A9FE005E4597 /* APSwichAccountPopover.xib */, + ); + path = RootView; + sourceTree = ""; + }; + 6D8F184227F07E97001A30BF /* Shared */ = { + isa = PBXGroup; + children = ( + 6D8F184627F07E97001A30BF /* Network */, + 6D8F187127F0A028001A30BF /* Info */, + 6D8F184327F07E97001A30BF /* UI */, + 6D8F184727F07E97001A30BF /* Utils */, + ); + path = Shared; + sourceTree = ""; + }; + 6D8F184327F07E97001A30BF /* UI */ = { + isa = PBXGroup; + children = ( + 6D59A20E27F29E8B00C7D8F5 /* DropZoneView.swift */, + 6D8F184427F07E97001A30BF /* UIExtension.swift */, + 6D8F184527F07E97001A30BF /* APCollectionView.swift */, + 6D3ECCE127F1D322005E4597 /* APDebugVC.swift */, + 6D3ECCDF27F1D2A0005E4597 /* APDebugVC.storyboard */, + 6D0931752957345C00AE66EF /* APSPasswordEditVC.swift */, + 6D0931742957345C00AE66EF /* APSPasswordEditVC.xib */, + 6D0931732957345C00AE66EF /* APSPasswordSettingVC.swift */, + 6D0931762957345C00AE66EF /* APSPasswordSettingVC.xib */, + 6D0931622957312C00AE66EF /* APASCKeysEditVC.swift */, + 6D0931612957312C00AE66EF /* APASCKeysEditVC.xib */, + 6D0931642957312C00AE66EF /* APASCKeysSettingVC.swift */, + 6D0931632957312C00AE66EF /* APASCKeysSettingVC.xib */, + ); + path = UI; + sourceTree = ""; + }; + 6D8F184627F07E97001A30BF /* Network */ = { + isa = PBXGroup; + children = ( + 6D09315F2957160B00AE66EF /* AppStoreConnectAPI.swift */, + 6D8F188D27F0C121001A30BF /* APClient.swift */, + ); + path = Network; + sourceTree = ""; + }; + 6D8F184727F07E97001A30BF /* Utils */ = { + isa = PBXGroup; + children = ( + 6D59A21227F29F4C00C7D8F5 /* EmailUtils.swift */, + 6D3ECCC827F16145005E4597 /* APHUD.swift */, + 6D8F188F27F0C3CB001A30BF /* ARLogs.swift */, + 6D8F184827F07E97001A30BF /* APUtil.swift */, + 6D8F188927F0ADC2001A30BF /* FoundationUtil.swift */, + ); + path = Utils; + sourceTree = ""; + }; + 6D8F187127F0A028001A30BF /* Info */ = { + isa = PBXGroup; + children = ( + 6D8F187227F0A070001A30BF /* UserCenter.swift */, + 6D8F187427F0A0B3001A30BF /* InfoCenter.swift */, + 6D59A24627FE833800C7D8F5 /* APConstants.swift */, + ); + path = Info; + sourceTree = ""; + }; + 6D8F187A27F0AC74001A30BF /* Vendors */ = { + isa = PBXGroup; + children = ( + 6D59A22427F306A900C7D8F5 /* QrcodeUtil.h */, + 6D59A22527F306A900C7D8F5 /* QrcodeUtil.m */, + 6D8F187B27F0AC83001A30BF /* ITMS */, + 6D7065B5298A544800031916 /* MBProgressHUD-OSX */, + ); + path = Vendors; + sourceTree = ""; + }; + 6D8F187B27F0AC83001A30BF /* ITMS */ = { + isa = PBXGroup; + children = ( + 6D8F188627F0ACA5001A30BF /* GDataXMLNode.h */, + 6D8F188727F0ACA5001A30BF /* GDataXMLNode.m */, + 6D8F188027F0AC83001A30BF /* XMLManager.swift */, + ); + path = ITMS; + sourceTree = ""; + }; + 6DA62AAD29FBD19C0093E1C2 /* VerifyReceipt */ = { + isa = PBXGroup; + children = ( + 6DA62AAF29FBD1AC0093E1C2 /* APVerifyReceiptVC.swift */, + 6DA62AAE29FBD1AC0093E1C2 /* APVerifyReceipt.storyboard */, + ); + path = VerifyReceipt; + sourceTree = ""; + }; + 6DC6B0842CD0E6FB00E4C0D7 /* AppleWebLogin */ = { + isa = PBXGroup; + children = ( + 6DC6B0832CD0E6FB00E4C0D7 /* AppleWebLoginCore.swift */, + ); + path = AppleWebLogin; + sourceTree = ""; + }; + BD41E9D291F096DAD93AE347 /* Frameworks */ = { + isa = PBXGroup; + children = ( + F8DDC8A0206F410C17653E3A /* Pods_AppleParty.framework */, + 6CE565FD4718E20367C0FBF5 /* Pods_AppleParty_ApplePartyUITests.framework */, + 46A4FD1F5C0341D48CF4D106 /* Pods_ApplePartyTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6D36DE4327DAFACD00BBC931 /* AppleParty */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D36DE6927DAFACE00BBC931 /* Build configuration list for PBXNativeTarget "AppleParty" */; + buildPhases = ( + EF99C81E73B67DBE97EBBA39 /* [CP] Check Pods Manifest.lock */, + 6D36DE4027DAFACD00BBC931 /* Sources */, + 6D36DE4127DAFACD00BBC931 /* Frameworks */, + 6D36DE4227DAFACD00BBC931 /* Resources */, + 85A7106372C39938C2F612EE /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AppleParty; + packageProductDependencies = ( + 6D59A20A27F29DB600C7D8F5 /* SwiftSMTP */, + 6D09317E295736D000AE66EF /* AppStoreConnect-Swift-SDK */, + ); + productName = AppleParty; + productReference = 6D36DE4427DAFACD00BBC931 /* AppleParty.app */; + productType = "com.apple.product-type.application"; + }; + 6D36DE5427DAFACE00BBC931 /* ApplePartyTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D36DE6C27DAFACE00BBC931 /* Build configuration list for PBXNativeTarget "ApplePartyTests" */; + buildPhases = ( + B16E5E88FC9AC7770A136D10 /* [CP] Check Pods Manifest.lock */, + 6D36DE5127DAFACE00BBC931 /* Sources */, + 6D36DE5227DAFACE00BBC931 /* Frameworks */, + 6D36DE5327DAFACE00BBC931 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 6D36DE5727DAFACE00BBC931 /* PBXTargetDependency */, + ); + name = ApplePartyTests; + productName = ApplePartyTests; + productReference = 6D36DE5527DAFACE00BBC931 /* ApplePartyTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 6D36DE5E27DAFACE00BBC931 /* ApplePartyUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6D36DE6F27DAFACE00BBC931 /* Build configuration list for PBXNativeTarget "ApplePartyUITests" */; + buildPhases = ( + 72A6F575AC1CEEC6E868DAD7 /* [CP] Check Pods Manifest.lock */, + 6D36DE5B27DAFACE00BBC931 /* Sources */, + 6D36DE5C27DAFACE00BBC931 /* Frameworks */, + 6D36DE5D27DAFACE00BBC931 /* Resources */, + 5DA300C58850B75E97028554 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 6D36DE6127DAFACE00BBC931 /* PBXTargetDependency */, + ); + name = ApplePartyUITests; + productName = ApplePartyUITests; + productReference = 6D36DE5F27DAFACE00BBC931 /* ApplePartyUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6D36DE3C27DAFACD00BBC931 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + CLASSPREFIX = AP; + LastSwiftUpdateCheck = 1320; + LastUpgradeCheck = 1320; + ORGANIZATIONNAME = "37 Mobile Games"; + TargetAttributes = { + 6D36DE4327DAFACD00BBC931 = { + CreatedOnToolsVersion = 13.2.1; + LastSwiftMigration = 1330; + }; + 6D36DE5427DAFACE00BBC931 = { + CreatedOnToolsVersion = 13.2.1; + TestTargetID = 6D36DE4327DAFACD00BBC931; + }; + 6D36DE5E27DAFACE00BBC931 = { + CreatedOnToolsVersion = 13.2.1; + TestTargetID = 6D36DE4327DAFACD00BBC931; + }; + }; + }; + buildConfigurationList = 6D36DE3F27DAFACD00BBC931 /* Build configuration list for PBXProject "AppleParty" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + "zh-Hans", + ); + mainGroup = 6D36DE3B27DAFACD00BBC931; + packageReferences = ( + 6D59A20927F29DB600C7D8F5 /* XCRemoteSwiftPackageReference "Swift-SMTP" */, + 6D09317D295736D000AE66EF /* XCRemoteSwiftPackageReference "appstoreconnect-swift-sdk" */, + ); + productRefGroup = 6D36DE4527DAFACD00BBC931 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6D36DE4327DAFACD00BBC931 /* AppleParty */, + 6D36DE5427DAFACE00BBC931 /* ApplePartyTests */, + 6D36DE5E27DAFACE00BBC931 /* ApplePartyUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6D36DE4227DAFACD00BBC931 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D09317A2957345C00AE66EF /* APSPasswordSettingVC.xib in Resources */, + 6D59A21527F2C46100C7D8F5 /* InAppPurchseView.storyboard in Resources */, + 6D8F185C27F08161001A30BF /* AppList.storyboard in Resources */, + 6D8F187027F08F65001A30BF /* APLoginVC.xib in Resources */, + 6D3ECCEE27F1E989005E4597 /* APInAppPurchseVC.storyboard in Resources */, + 6D59A23027F31E7000C7D8F5 /* APSettingVC.xib in Resources */, + 6D8F186427F081D3001A30BF /* APAppListCell.xib in Resources */, + 6D8F187927F0A2DD001A30BF /* APLogin2FAVC.xib in Resources */, + 6D0931652957312C00AE66EF /* APASCKeysEditVC.xib in Resources */, + 6DA62AB029FBD1AC0093E1C2 /* APVerifyReceipt.storyboard in Resources */, + 6D0931782957345C00AE66EF /* APSPasswordEditVC.xib in Resources */, + 6D8F185027F07E97001A30BF /* APRootCollectionCell.xib in Resources */, + 6D3ECCD927F1CAD6005E4597 /* ScreenShotUpload.storyboard in Resources */, + 6D3ECCE027F1D2A0005E4597 /* APDebugVC.storyboard in Resources */, + 6D584B5627F20A4D00924BFE /* APInappPurchseCell.xib in Resources */, + 6D36DE4C27DAFACE00BBC931 /* Assets.xcassets in Resources */, + 6D59A20F27F29E8B00C7D8F5 /* EmailTool.storyboard in Resources */, + 6D59A22327F3056B00C7D8F5 /* APQRcode.storyboard in Resources */, + 6D09316D295731D000AE66EF /* example.xlsx in Resources */, + 6D8F185927F07F4B001A30BF /* Main.storyboard in Resources */, + 6D0931672957312C00AE66EF /* APASCKeysSettingVC.xib in Resources */, + 6D093171295732E000AE66EF /* IPAUpload.storyboard in Resources */, + 6D59A23B27F3395A00C7D8F5 /* EmailSettingVC.xib in Resources */, + 6D3ECCD027F1A9FE005E4597 /* APSwichAccountPopover.xib in Resources */, + 6D36DE8527DB77C600BBC931 /* Localizable.strings in Resources */, + 6D3ECCD827F1CAD6005E4597 /* ScreenShotHelpPopoverVC.xib in Resources */, + 6DC6B0892CD0E70900E4C0D7 /* APWebLoginVC.xib in Resources */, + 6D36DE7C27DB775800BBC931 /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D36DE5327DAFACE00BBC931 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D36DE5D27DAFACE00BBC931 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5DA300C58850B75E97028554 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AppleParty-ApplePartyUITests/Pods-AppleParty-ApplePartyUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AppleParty-ApplePartyUITests/Pods-AppleParty-ApplePartyUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AppleParty-ApplePartyUITests/Pods-AppleParty-ApplePartyUITests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 72A6F575AC1CEEC6E868DAD7 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AppleParty-ApplePartyUITests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 85A7106372C39938C2F612EE /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AppleParty/Pods-AppleParty-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AppleParty/Pods-AppleParty-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AppleParty/Pods-AppleParty-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + B16E5E88FC9AC7770A136D10 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-ApplePartyTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + EF99C81E73B67DBE97EBBA39 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AppleParty-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6D36DE4027DAFACD00BBC931 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D8F186827F08201001A30BF /* APAppListModel.swift in Sources */, + 6D8F186327F081D3001A30BF /* APAppListCell.swift in Sources */, + 6D3ECCC927F16145005E4597 /* APHUD.swift in Sources */, + 6D59A22F27F31E7000C7D8F5 /* APSettingVC.swift in Sources */, + 6DC6B0852CD0E6FB00E4C0D7 /* AppleWebLoginCore.swift in Sources */, + 6D8F187327F0A070001A30BF /* UserCenter.swift in Sources */, + 6D3ECCEC27F1E97F005E4597 /* APInAppPurchseVC.swift in Sources */, + 6D59A22127F3055300C7D8F5 /* APQRcodeVC.swift in Sources */, + 6D7065B8298A544800031916 /* MBProgressHUD.m in Sources */, + 6D59A21027F29E8B00C7D8F5 /* EmailToolVC.swift in Sources */, + 6D8F185527F07E97001A30BF /* APCollectionView.swift in Sources */, + 6D8F185227F07E97001A30BF /* APRootCollectionModel.swift in Sources */, + 6DA62AB129FBD1AC0093E1C2 /* APVerifyReceiptVC.swift in Sources */, + 6D59A21127F29E8B00C7D8F5 /* DropZoneView.swift in Sources */, + 6D8F185627F07E97001A30BF /* APUtil.swift in Sources */, + 6D09315E295715DD00AE66EF /* APUploadIAPListVC.swift in Sources */, + 6D3ECCD727F1CAD6005E4597 /* ScreenShotHelpPopoverVC.swift in Sources */, + 6D8F188427F0AC83001A30BF /* XMLManager.swift in Sources */, + 6D8F186627F081ED001A30BF /* APAppListAdapter.swift in Sources */, + 6D0931792957345C00AE66EF /* APSPasswordEditVC.swift in Sources */, + 6D584B5827F20A8000924BFE /* APInAppPurchseCell.swift in Sources */, + 6D3ECCDA27F1CAD6005E4597 /* ScreenShotUploadVC.swift in Sources */, + 6D59A24727FE833800C7D8F5 /* APConstants.swift in Sources */, + 6D59A21327F29F4C00C7D8F5 /* EmailUtils.swift in Sources */, + 6D0931602957160B00AE66EF /* AppStoreConnectAPI.swift in Sources */, + 6D3ECCCF27F1A9FE005E4597 /* APSwichAccountPopover.swift in Sources */, + 6D8F188827F0ACA5001A30BF /* GDataXMLNode.m in Sources */, + 6D8F189027F0C3CB001A30BF /* ARLogs.swift in Sources */, + 6D59A21B27F2D49000C7D8F5 /* DragView.swift in Sources */, + 6D3ECCE227F1D322005E4597 /* APDebugVC.swift in Sources */, + 6D3ECCDB27F1CAD6005E4597 /* ScreenShotUploadCell.swift in Sources */, + 6D8F185427F07E97001A30BF /* UIExtension.swift in Sources */, + 6D59A23A27F3395900C7D8F5 /* EmailSettingVC.swift in Sources */, + 6D8F187527F0A0B3001A30BF /* InfoCenter.swift in Sources */, + 6D0931772957345C00AE66EF /* APSPasswordSettingVC.swift in Sources */, + 6D8F186F27F08F65001A30BF /* APLoginVC.swift in Sources */, + 6D36DE4827DAFACD00BBC931 /* AppDelegate.swift in Sources */, + 6D093172295732E000AE66EF /* APIPAUploadVC.swift in Sources */, + 6DC6B0882CD0E70900E4C0D7 /* APWebLoginVC.swift in Sources */, + 6D59A21D27F2D77700C7D8F5 /* OutputExcelVC.swift in Sources */, + 6D3ECCDE27F1D027005E4597 /* XMLModel.swift in Sources */, + 6D8F184D27F07E97001A30BF /* APRootVC.swift in Sources */, + 6D3ECCE827F1D6BB005E4597 /* IAPModel.swift in Sources */, + 6D09315A2957154B00AE66EF /* IAPExcelParser.swift in Sources */, + 6D0931682957312C00AE66EF /* APASCKeysSettingVC.swift in Sources */, + 6D8F185127F07E97001A30BF /* APRootCollectionCell.swift in Sources */, + 6D3ECCCC27F193AF005E4597 /* PhoneNumbers.swift in Sources */, + 6D8F188E27F0C121001A30BF /* APClient.swift in Sources */, + 6D8F187827F0A2DD001A30BF /* APLogin2FAVC.swift in Sources */, + 6D59A21927F2D3C600C7D8F5 /* IAPUploadImageVC.swift in Sources */, + 6D8F184F27F07E97001A30BF /* APRootWC.swift in Sources */, + 6D8F184A27F07E97001A30BF /* APAppListVC.swift in Sources */, + 6D8F188A27F0ADC2001A30BF /* FoundationUtil.swift in Sources */, + 6D0931662957312C00AE66EF /* APASCKeysEditVC.swift in Sources */, + 6D59A22627F306A900C7D8F5 /* QrcodeUtil.m in Sources */, + 6D8F185327F07E97001A30BF /* APRootCollectionAdapter.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D36DE5127DAFACE00BBC931 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D36DE5A27DAFACE00BBC931 /* ApplePartyTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6D36DE5B27DAFACE00BBC931 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D36DE6627DAFACE00BBC931 /* ApplePartyUITestsLaunchTests.swift in Sources */, + 6D36DE6427DAFACE00BBC931 /* ApplePartyUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 6D36DE5727DAFACE00BBC931 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6D36DE4327DAFACD00BBC931 /* AppleParty */; + targetProxy = 6D36DE5627DAFACE00BBC931 /* PBXContainerItemProxy */; + }; + 6D36DE6127DAFACE00BBC931 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6D36DE4327DAFACD00BBC931 /* AppleParty */; + targetProxy = 6D36DE6027DAFACE00BBC931 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 6D36DE7E27DB775800BBC931 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 6D36DE7D27DB775800BBC931 /* zh-Hans */, + 6D36DE8027DB777400BBC931 /* en */, + ); + name = InfoPlist.strings; + path = AppleParty; + sourceTree = ""; + }; + 6D36DE8727DB77C600BBC931 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 6D36DE8627DB77C600BBC931 /* en */, + 6D36DE8827DB77C700BBC931 /* zh-Hans */, + ); + name = Localizable.strings; + path = AppleParty; + sourceTree = ""; + }; + 6D8F185727F07F4B001A30BF /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6D8F185827F07F4B001A30BF /* Base */, + 6D8F185B27F07F58001A30BF /* zh-Hans */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 6D8F185E27F08161001A30BF /* AppList.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6D8F185D27F08161001A30BF /* Base */, + 6D8F186027F08162001A30BF /* zh-Hans */, + ); + name = AppList.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6D36DE6727DAFACE00BBC931 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 6D36DE6827DAFACE00BBC931 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 6D36DE6A27DAFACE00BBC931 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6E2329117B30DC9F72DC1E3E /* Pods-AppleParty.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = AppleParty/AppleParty.entitlements; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 2025.09.29; + DEVELOPMENT_TEAM = ""; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = AppleParty/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = AppleParty; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSHumanReadableCopyright = "37 Mobile Games."; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = 3.8.0; + PRODUCT_BUNDLE_IDENTIFIER = cn.com.37iOS.AppleParty; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "AppleParty/AppleParty-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 6D36DE6B27DAFACE00BBC931 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 526A86591D63E15605829ECE /* Pods-AppleParty.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = AppleParty/AppleParty.entitlements; + CODE_SIGN_STYLE = Manual; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 2025.09.29; + DEVELOPMENT_TEAM = ""; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = AppleParty/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = AppleParty; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; + INFOPLIST_KEY_NSHumanReadableCopyright = "37 Mobile Games."; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + MACOSX_DEPLOYMENT_TARGET = 11.0; + MARKETING_VERSION = 3.8.0; + PRODUCT_BUNDLE_IDENTIFIER = cn.com.37iOS.AppleParty; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "AppleParty/AppleParty-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 6D36DE6D27DAFACE00BBC931 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1D3D597799DB4DF597EDC003 /* Pods-ApplePartyTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.1; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.37iOS.ApplePartyTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AppleParty.app/Contents/MacOS/AppleParty"; + }; + name = Debug; + }; + 6D36DE6E27DAFACE00BBC931 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 45F1FE2A4C13D7D378FD2C07 /* Pods-ApplePartyTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MACOSX_DEPLOYMENT_TARGET = 12.1; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.37iOS.ApplePartyTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AppleParty.app/Contents/MacOS/AppleParty"; + }; + name = Release; + }; + 6D36DE7027DAFACE00BBC931 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 63F4DCD655332D4AA5E2ECF5 /* Pods-AppleParty-ApplePartyUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.37iOS.ApplePartyUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = AppleParty; + }; + name = Debug; + }; + 6D36DE7127DAFACE00BBC931 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4140E6B7075C708364368BBC /* Pods-AppleParty-ApplePartyUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.37iOS.ApplePartyUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TEST_TARGET_NAME = AppleParty; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6D36DE3F27DAFACD00BBC931 /* Build configuration list for PBXProject "AppleParty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D36DE6727DAFACE00BBC931 /* Debug */, + 6D36DE6827DAFACE00BBC931 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6D36DE6927DAFACE00BBC931 /* Build configuration list for PBXNativeTarget "AppleParty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D36DE6A27DAFACE00BBC931 /* Debug */, + 6D36DE6B27DAFACE00BBC931 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6D36DE6C27DAFACE00BBC931 /* Build configuration list for PBXNativeTarget "ApplePartyTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D36DE6D27DAFACE00BBC931 /* Debug */, + 6D36DE6E27DAFACE00BBC931 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6D36DE6F27DAFACE00BBC931 /* Build configuration list for PBXNativeTarget "ApplePartyUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6D36DE7027DAFACE00BBC931 /* Debug */, + 6D36DE7127DAFACE00BBC931 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 6D09317D295736D000AE66EF /* XCRemoteSwiftPackageReference "appstoreconnect-swift-sdk" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/AvdLee/appstoreconnect-swift-sdk.git"; + requirement = { + kind = versionRange; + maximumVersion = 5.0.0; + minimumVersion = 4.0.2; + }; + }; + 6D59A20927F29DB600C7D8F5 /* XCRemoteSwiftPackageReference "Swift-SMTP" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/Kitura/Swift-SMTP"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 6.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 6D09317E295736D000AE66EF /* AppStoreConnect-Swift-SDK */ = { + isa = XCSwiftPackageProductDependency; + package = 6D09317D295736D000AE66EF /* XCRemoteSwiftPackageReference "appstoreconnect-swift-sdk" */; + productName = "AppStoreConnect-Swift-SDK"; + }; + 6D59A20A27F29DB600C7D8F5 /* SwiftSMTP */ = { + isa = XCSwiftPackageProductDependency; + package = 6D59A20927F29DB600C7D8F5 /* XCRemoteSwiftPackageReference "Swift-SMTP" */; + productName = SwiftSMTP; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 6D36DE3C27DAFACD00BBC931 /* Project object */; +} diff --git a/AppleParty/AppleParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AppleParty/AppleParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/AppleParty/AppleParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AppleParty/AppleParty.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AppleParty/AppleParty.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AppleParty/AppleParty.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AppleParty/AppleParty.xcworkspace/contents.xcworkspacedata b/AppleParty/AppleParty.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cbbfdbf --- /dev/null +++ b/AppleParty/AppleParty.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/AppleParty/AppleParty.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AppleParty/AppleParty.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AppleParty/AppleParty.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AppleParty/AppleParty.xcworkspace/xcshareddata/swiftpm/Package.resolved b/AppleParty/AppleParty.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..72f94e8 --- /dev/null +++ b/AppleParty/AppleParty.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,96 @@ +{ + "originHash" : "9d0d9b5cf3459d54c921a64b1bb7a803edf7e8255bc0e8227a135b3820aeee10", + "pins" : [ + { + "identity" : "appstoreconnect-swift-sdk", + "kind" : "remoteSourceControl", + "location" : "https://github.com/AvdLee/appstoreconnect-swift-sdk.git", + "state" : { + "revision" : "78b2be2f68f30141fca2f7bce45ca7866535cf28", + "version" : "4.0.2" + } + }, + { + "identity" : "bluecryptor", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kitura/BlueCryptor.git", + "state" : { + "revision" : "cec97c24b111351e70e448972a7d3fe68a756d6d", + "version" : "2.0.2" + } + }, + { + "identity" : "bluesocket", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kitura/BlueSocket.git", + "state" : { + "revision" : "7b23a867008e0027bfd6f4d398d44720707bc8ca", + "version" : "2.0.4" + } + }, + { + "identity" : "bluesslservice", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kitura/BlueSSLService.git", + "state" : { + "revision" : "b27a94d063962dfa1bba9f79814c4ef202cf33a4", + "version" : "2.0.2" + } + }, + { + "identity" : "loggerapi", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kitura/LoggerAPI.git", + "state" : { + "revision" : "e82d34eab3f0b05391082b11ea07d3b70d2f65bb", + "version" : "1.9.200" + } + }, + { + "identity" : "swift-asn1", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-asn1.git", + "state" : { + "revision" : "f70225981241859eb4aa1a18a75531d26637c8cc", + "version" : "1.4.0" + } + }, + { + "identity" : "swift-crypto", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-crypto.git", + "state" : { + "revision" : "95ba0316a9b733e92bb6b071255ff46263bbe7dc", + "version" : "3.15.1" + } + }, + { + "identity" : "swift-log", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-log.git", + "state" : { + "revision" : "6fe203dc33195667ce1759bf0182975e4653ba1c", + "version" : "1.4.4" + } + }, + { + "identity" : "swift-smtp", + "kind" : "remoteSourceControl", + "location" : "https://github.com/Kitura/Swift-SMTP", + "state" : { + "revision" : "4b7666bb8cee33f0cb367786af17b9a2ebb63047", + "version" : "6.0.0" + } + }, + { + "identity" : "urlqueryencoder", + "kind" : "remoteSourceControl", + "location" : "https://github.com/CreateAPI/URLQueryEncoder.git", + "state" : { + "revision" : "4ce950479707ea109f229d7230ec074a133b15d7", + "version" : "0.2.1" + } + } + ], + "version" : 3 +} diff --git a/AppleParty/AppleParty/AppDelegate.swift b/AppleParty/AppleParty/AppDelegate.swift new file mode 100644 index 0000000..59f7045 --- /dev/null +++ b/AppleParty/AppleParty/AppDelegate.swift @@ -0,0 +1,52 @@ +// +// AppDelegate.swift +// AppleParty +// +// Created by HTC on 2022/3/10. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa +import Sparkle + +@main +class AppDelegate: NSObject, NSApplicationDelegate { + + var mainWindow: NSWindow? + @IBOutlet weak var updaterController: SPUStandardUpdaterController! + + func applicationDidFinishLaunching(_ aNotification: Notification) { + // 后台检查更新 + updaterController.updater.checkForUpdatesInBackground() + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } + + func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } + + /// 当关闭最后一个窗口时,退出app + /// - Parameter sender: + /// - Returns: true-窗口程序两者都关闭,false-只关闭窗口 + func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + true + } + + /// 应用窗口重新打开时 + /// + /// - Parameters: + /// - sender: + /// - flag: + /// - Returns: + func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool { + return true + } + + @IBAction func showHelp(_ sender: Any) { + let url = URL(string: kApplePartyWiKi) + NSWorkspace.shared.open(url!) + } +} diff --git a/AppleParty/AppleParty/AppListView/APAppListAdapter.swift b/AppleParty/AppleParty/AppListView/APAppListAdapter.swift new file mode 100644 index 0000000..6ccff5f --- /dev/null +++ b/AppleParty/AppleParty/AppListView/APAppListAdapter.swift @@ -0,0 +1,76 @@ +// +// APAppListAdapter.swift +// AppleParty +// +// Created by HTC on 2022/3/17. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APAppListAdapter: NSObject { + + public var purchseHandle: ((_ app: App) -> Void)? + public var screenshotHandle: ((_ app: App) -> Void)? + + fileprivate static let numberOfSections = 1 + fileprivate static let itemId = "APAppListCell" + + fileprivate var items = [App]() { + didSet { + collectionView.reloadData() + } + } + private var collectionView: NSCollectionView + + init(collectionView: NSCollectionView) { + self.collectionView = collectionView + super.init() + self.collectionView.dataSource = self + self.collectionView.delegate = self + self.collectionView.register(APAppListCell.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: APAppListAdapter.itemId)) + + let itemWidth = CGFloat(350.0) + let itemHeight = CGFloat(150.0) + let itemSpacing = CGFloat(80.0) + let itemPadding = CGFloat(30.0) + + let flowLayout = NSCollectionViewFlowLayout() + flowLayout.scrollDirection = .vertical + flowLayout.itemSize = NSMakeSize(itemWidth, itemHeight) + flowLayout.minimumInteritemSpacing = itemSpacing + flowLayout.minimumLineSpacing = itemSpacing + flowLayout.sectionInset = NSEdgeInsetsMake(itemPadding, itemPadding, itemPadding, itemPadding) + self.collectionView.collectionViewLayout = flowLayout + } + + func set(items: [App]) { + self.items = items + } +} + + +extension APAppListAdapter: NSCollectionViewDataSource, NSCollectionViewDelegate { + func numberOfSectionsInCollectionView(collectionView: NSCollectionView) -> Int { + return APAppListAdapter.numberOfSections + } + + func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { + return items.count + } + + func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { + let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: APAppListAdapter.itemId), for: indexPath) + guard let collectionViewItem = item as? APAppListCell else { return item } + + collectionViewItem.configure(app: items[indexPath.item]) + collectionViewItem.purchseHandle = purchseHandle + collectionViewItem.screenshotHandle = screenshotHandle + + return item + } + + func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set) { + collectionView.deselectItems(at: indexPaths) + } +} diff --git a/AppleParty/AppleParty/AppListView/APAppListCell.swift b/AppleParty/AppleParty/AppListView/APAppListCell.swift new file mode 100644 index 0000000..22ebddc --- /dev/null +++ b/AppleParty/AppleParty/AppListView/APAppListCell.swift @@ -0,0 +1,44 @@ +// +// APAppListCell.swift +// AppleParty +// +// Created by HTC on 2022/3/17. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APAppListCell: NSCollectionViewItem { + + public var purchseHandle: ((_ app: App) -> Void)? + public var screenshotHandle: ((_ app: App) -> Void)? + + @IBOutlet weak var imgView: NSImageView! + @IBOutlet weak var nameView: NSTextField! + + private var app: App? + + override func viewDidLoad() { + super.viewDidLoad() + nameView.maximumNumberOfLines = 2 + imgView.wantsLayer = true + imgView.layer?.cornerRadius = 22 + imgView.layer?.masksToBounds = true + } + + @IBAction func clickedPurchseItem(_ sender: Any) { + purchseHandle?(app!) + } + + @IBAction func clickedScreenshotItem(_ sender: Any) { + screenshotHandle?(app!) + } + + func configure(app: App) { + self.app = app + nameView.stringValue = app.appName + imgView?.showWebImage(app.iconUrl) + } + + +} diff --git a/AppleParty/AppleParty/AppListView/APAppListCell.xib b/AppleParty/AppleParty/AppListView/APAppListCell.xib new file mode 100644 index 0000000..48d5c8b --- /dev/null +++ b/AppleParty/AppleParty/AppListView/APAppListCell.xib @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/APAppListModel.swift b/AppleParty/AppleParty/AppListView/APAppListModel.swift new file mode 100644 index 0000000..a140dfa --- /dev/null +++ b/AppleParty/AppleParty/AppListView/APAppListModel.swift @@ -0,0 +1,83 @@ +// +// APAppListModel.swift +// AppleParty +// +// Created by HTC on 2022/3/17. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Foundation + +// MARK: - 游戏列表 +struct AppList { + var games: [App] + + init(body: [String: Any]) { + games = [App]() + let included = dictionaryArray(body["included"]) + let apps = dictionaryArray(body["data"]) + for software in apps { + var game = App() + let attributes = dictionary(software["attributes"]) + game.appId = string(from: software["id"]) + game.appName = string(from: attributes["name"]) + game.platforms = string(from: attributes["distributionType"]) + game.bundleId = string(from: attributes["bundleId"]) + game.sku = string(from: attributes["sku"]) + game.primaryLocale = string(from: attributes["primaryLocale"]) + // icon 处理 + let appVersion = dictionaryArray( dictionary( dictionary(software["relationships"])["appStoreVersions"])["data"]).first + if let version = appVersion { + let vid = string(from: version["id"]) + for info in included { + let iid = string(from: info["id"]) + if vid == iid, vid.count > 0 { + let info_att = dictionary(info["attributes"]) + let storeIcon = dictionary(info_att["storeIcon"]) + let templateUrl = string(from: storeIcon["templateUrl"]) + if templateUrl.count > 0 { + game.iconUrl = templateUrl.replacingOccurrences(of: "{w}x{h}bb.{f}", with: "500x500bb.png") + } + break + } + } + } + games.append(game) + } + games = games.sorted(by: { (g1, g2) -> Bool in + g1.appName < g2.appName + }) + } +} + +struct App { + var appId: String = "" + var appName: String = "" + var platforms: String = "" + var iconUrl: String = "" + var bundleId: String = "" + var sku: String = "" + var primaryLocale: String = "" +} + +struct AppInfo { + var name: String = "" + var bundleId: String = "" + var bundleIdReferenceName: String = "" + var distributionType: String = "" + var educationDiscountType: String = "" + var sku: String = "" + var primaryLocale: String = "" + + init(body: [String: Any]) { + let data = dictionary(body["data"]) + let attributes = dictionary(data["attributes"]) + name = string(from: attributes["name"]) + bundleId = string(from: attributes["bundleId"]) + bundleIdReferenceName = string(from: attributes["bundleIdReferenceName"]) + distributionType = string(from: attributes["distributionType"]) + educationDiscountType = string(from: attributes["educationDiscountType"]) + sku = string(from: attributes["sku"]) + primaryLocale = string(from: attributes["primaryLocale"]) + } +} diff --git a/AppleParty/AppleParty/AppListView/APAppListVC.swift b/AppleParty/AppleParty/AppListView/APAppListVC.swift new file mode 100644 index 0000000..41ef4c0 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/APAppListVC.swift @@ -0,0 +1,58 @@ +// +// APAppListVC.swift +// AppleParty +// +// Created by HTC on 2022/3/17. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APAppListVC: NSViewController { + + fileprivate var adapter: APAppListAdapter? + + override func viewDidLoad() { + super.viewDidLoad() + configureCollectionView() + fetchAppList() + } + + /// 配置显示的功能列表 + func configureCollectionView() { + let colview = APCollectionView() + colview.configure(superView: view) + adapter = APAppListAdapter(collectionView: colview.collectionView) + adapter?.purchseHandle = { [weak self] app in + let sb = NSStoryboard(name: "APInAppPurchseVC", bundle: nil) + let wc = sb.instantiateController(withIdentifier: "APInAppPurchseVC") as! NSWindowController + let vc = wc.contentViewController as! APInAppPurchseVC + vc.currentApp = app + wc.showWindow(self) + } + adapter?.screenshotHandle = { [weak self] app in + let sb = NSStoryboard(name: "ScreenShotUpload", bundle: nil) + let wc = sb.instantiateController(withIdentifier: "ScreenShotUploadVC") as! NSWindowController + let vc = wc.contentViewController as! ScreenShotUploadVC + vc.currentApp = app + wc.showWindow(self) + } + } + +} + + +// MARK: - 网络请求 +extension APAppListVC { + + func fetchAppList() { + APClient.appList(status: .filter(nil)).request(showLoading: true, inView: self.view) { [weak self] result, response, error in + guard let err = error else { + let gamelist = AppList(body: result) + self?.adapter?.set(items: gamelist.games) + return + } + APHUD.hide(message: err.localizedDescription) + } + } +} diff --git a/AppleParty/AppleParty/AppListView/Base.lproj/AppList.storyboard b/AppleParty/AppleParty/AppListView/Base.lproj/AppList.storyboard new file mode 100644 index 0000000..224c596 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/Base.lproj/AppList.storyboard @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseCell.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseCell.swift new file mode 100644 index 0000000..4828389 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseCell.swift @@ -0,0 +1,158 @@ +// +// APInAppPurchseCell.swift +// AppleParty +// +// Created by HTC on 2022/3/28. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APInAppPurchseCell: NSTableCellView { + + +} + +class ImageViewCell: NSTableCellView { + + @IBOutlet weak var imgSel: NSImageView! + + override func awakeFromNib() { + super.awakeFromNib() + } +} + +class UploadCell: NSTableCellView { + + var row: Int = 0 + + @IBOutlet weak var imgSel: NSImageView! + @IBOutlet weak var dragView: DragView! + @IBOutlet weak var dragBox: NSView! + + typealias CallBackFunc = (_ path: String, _ row: Int) -> Void + var callBackFunc: CallBackFunc? + + override func awakeFromNib() { + super.awakeFromNib() + dragView.delegate = self + } +} + +extension UploadCell: DragViewDelegate { + func dragView(_ path: String?) { + if let path = path { + debugPrint(path) + imgSel.image = NSImage(contentsOfFile: path) + if let callBackFunc = callBackFunc { + callBackFunc(path, row) + } + } else { + imgSel.image = nil + } + } +} + + +enum ColumnIdetifier: String { + case id + case productID + case productName + case priceLevel + case appleid + case price + case type + case state + + // list + case productPds + case level + case status + case screenshot + case language + case upload + case picname + + var columnValue: NSUserInterfaceItemIdentifier { + return NSUserInterfaceItemIdentifier(rawValue: self.rawValue+"Column") + } + var cellValue: NSUserInterfaceItemIdentifier { + return NSUserInterfaceItemIdentifier(rawValue: self.rawValue+"Cell") + } +} + +extension NSUserInterfaceItemIdentifier { + func stringValue() -> String { + switch self { + case ColumnIdetifier.id.columnValue: + return ColumnIdetifier.id.rawValue + case ColumnIdetifier.productID.columnValue: + return ColumnIdetifier.productID.rawValue + case ColumnIdetifier.productName.columnValue: + return ColumnIdetifier.productName.rawValue + case ColumnIdetifier.price.columnValue: + return ColumnIdetifier.price.rawValue + case ColumnIdetifier.type.columnValue: + return ColumnIdetifier.type.rawValue + case ColumnIdetifier.state.columnValue: + return ColumnIdetifier.state.rawValue + case ColumnIdetifier.productPds.columnValue: + return ColumnIdetifier.productPds.rawValue + case ColumnIdetifier.level.columnValue: + return ColumnIdetifier.level.rawValue + case ColumnIdetifier.status.columnValue: + return ColumnIdetifier.status.rawValue + case ColumnIdetifier.appleid.columnValue: + return ColumnIdetifier.appleid.rawValue + case ColumnIdetifier.priceLevel.columnValue: + return ColumnIdetifier.priceLevel.rawValue + case ColumnIdetifier.screenshot.columnValue: + return ColumnIdetifier.screenshot.rawValue + case ColumnIdetifier.picname.columnValue: + return ColumnIdetifier.picname.rawValue + case ColumnIdetifier.upload.columnValue: + return ColumnIdetifier.upload.rawValue + case ColumnIdetifier.language.columnValue: + return ColumnIdetifier.language.rawValue + default: + return "none" + } + } + + func enumValue() -> NSUserInterfaceItemIdentifier { + switch self { + case ColumnIdetifier.id.columnValue: + return ColumnIdetifier.id.cellValue + case ColumnIdetifier.productID.columnValue: + return ColumnIdetifier.productID.cellValue + case ColumnIdetifier.productName.columnValue: + return ColumnIdetifier.productName.cellValue + case ColumnIdetifier.price.columnValue: + return ColumnIdetifier.price.cellValue + case ColumnIdetifier.type.columnValue: + return ColumnIdetifier.type.cellValue + case ColumnIdetifier.state.columnValue: + return ColumnIdetifier.state.cellValue + case ColumnIdetifier.productPds.columnValue: + return ColumnIdetifier.productPds.cellValue + case ColumnIdetifier.level.columnValue: + return ColumnIdetifier.level.cellValue + case ColumnIdetifier.status.columnValue: + return ColumnIdetifier.status.cellValue + case ColumnIdetifier.appleid.columnValue: + return ColumnIdetifier.appleid.cellValue + case ColumnIdetifier.priceLevel.columnValue: + return ColumnIdetifier.priceLevel.cellValue + case ColumnIdetifier.screenshot.columnValue: + return ColumnIdetifier.screenshot.cellValue + case ColumnIdetifier.picname.columnValue: + return ColumnIdetifier.picname.cellValue + case ColumnIdetifier.upload.columnValue: + return ColumnIdetifier.upload.cellValue + case ColumnIdetifier.language.columnValue: + return ColumnIdetifier.language.cellValue + default: + return NSUserInterfaceItemIdentifier(rawValue: "none") + } + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.storyboard b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.storyboard new file mode 100644 index 0000000..5ac3eb7 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.storyboard @@ -0,0 +1,475 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + 12 + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + 12 + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + 12 + 18 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.swift new file mode 100644 index 0000000..3ecafa3 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInAppPurchseVC.swift @@ -0,0 +1,302 @@ +// +// APInAppPurchseVC.swift +// AppleParty +// +// Created by HTC on 2022/3/28. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APInAppPurchseVC: NSViewController { + + public var currentApp: App? { + didSet { + fetchIAPs() + appNameView.stringValue = currentApp?.appName ?? "" + } + } + + var iapList: [IAPList.IAP] = [] + private var countryCode = "" + private var checkPrice = [String: String]() + + @IBOutlet weak var outputIAPListBtn: NSButton! + @IBOutlet weak var appNameView: NSTextField! + @IBOutlet weak var outlineView: NSOutlineView! + + override func viewDidLoad() { + super.viewDidLoad() + self.outlineView.delegate = self + self.outlineView.dataSource = self + self.outlineView.columnAutoresizingStyle = .uniformColumnAutoresizingStyle + self.outlineView.selectionHighlightStyle = .none + self.outlineView.allowsMultipleSelection = true + self.outlineView.sizeToFit() + } + + @IBAction func reloadIAPs(_ sender: Any) { + fetchIAPs() + } + + @IBAction func importExcel(_ sender: Any) { + let openPanel = NSOpenPanel() + openPanel.canChooseFiles = true + openPanel.canChooseDirectories = true + openPanel.allowsMultipleSelection = false + openPanel.beginSheetModal(for: self.view.window!) { [self] (modalResponse: NSApplication.ModalResponse) in + if modalResponse == .OK, let filePath = openPanel.url { + handelExcel(filePath) + } + } + } + + + @IBAction func outputExcel(_ sender: Any) { + + guard iapList.count > 0 else { + NSAlert.show("当前商品为空~") + return + } + + // 创建格式 + var iaps = "productId, 商品名称, 价格等级, 价格(\(countryCode)), AppleID, 商品类型, 状态, 送审图片\n" + let separator = "\",\"" + iaps += iapList.map { item -> String in + return "\"" + item.vendorId + separator + item.referenceName + separator + item.priceTier + separator + (checkPrice[item.priceTier] ?? "-") + separator + item.adamId + + separator + item.addOnType.CNValue() + separator + item.iTunesConnectStatus.statusValue.0 + separator + item.reviewScreenshot + "\"" + }.joined(separator: "\n") + + // 保存文件 + let dateFormatter : DateFormatter = DateFormatter() + dateFormatter.dateFormat = "yyyyMMdd_HHmm_" + let currentDate = dateFormatter.string(from: Date()) + let mySave = NSSavePanel() + mySave.allowedFileTypes = ["csv"] + mySave.nameFieldStringValue = "内购列表" + currentDate + currentApp!.appName.replacingOccurrences(of: " ", with: "-") + mySave.begin { (result) -> Void in + if result == .OK { + let filePath = mySave.url + do { + // 含有中文,excel在打开CSV文件时默认用ASNI打开,无BOM头的unicode文件会出现乱码 + var data = Data([0xEF, 0xBB, 0xBF]) + data.append(contentsOf: iaps.data(using: .utf8) ?? Data()) + try data.write(to: filePath!) + } catch { + NSAlert.show("导出失败:\(error.localizedDescription)") + } + } + } + } + + + @IBAction func outputProductID(_ sender: Any) { + let mainStoryboard = NSStoryboard(name: "InAppPurchseView", bundle: Bundle(for: self.classForCoder)) + let outputVC = mainStoryboard.instantiateController(withIdentifier: "OutputExcelVCID") as? OutputExcelVC + outputVC?.iapList = iapList + presentAsSheet(outputVC!) + } + + @IBAction func downloadExcel(_ sender: Any) { + XMLManager.copySimpleExel() + } +} + + +// MARK: - 网络请求 +extension APInAppPurchseVC { + + // 请求商品列表 + func fetchIAPs() { + APClient.iaps(appid: currentApp!.appId).request(showLoading: true, inView: self.view) { [weak self] result, response, error in + guard let err = error else { + guard let app = self?.currentApp else { return } //请求过程关闭页面可能导致为空 + let iapL = IAPList(body:result, app: app) + self?.iapList = iapL.iapList + self?.outlineView.reloadData() + self?.updateRowInfo() + return + } + APHUD.hide(message: err.localizedDescription, view: self?.view ?? currentView()) + } + } + + func updateRowInfo() { + // TODO: 接口请求失败 + return; + + guard self.iapList.count > 0 else { + return + } + + outputIAPListBtn.isEnabled = false + let group = DispatchGroup() + for i in 0.. NSView? { + if let item = item as? IAPList.IAP { + switch tableColumn?.identifier.enumValue() { + case ColumnIdetifier.id.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.id.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = String(item.curid) + return cell + case ColumnIdetifier.productID.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.productID.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = item.vendorId + return cell + case ColumnIdetifier.productName.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.productName.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = item.referenceName + return cell + case ColumnIdetifier.price.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.price.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = checkPrice[item.priceTier] ?? "-" + return cell + case ColumnIdetifier.priceLevel.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.priceLevel.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = item.priceTier + return cell + case ColumnIdetifier.appleid.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.appleid.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = item.adamId + return cell + case ColumnIdetifier.type.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.type.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = item.addOnType.CNValue() + return cell + case ColumnIdetifier.state.cellValue: + let cell = outlineView.makeView(withIdentifier: ColumnIdetifier.state.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = item.iTunesConnectStatus.statusValue.0 + cell?.textField?.textColor = item.iTunesConnectStatus.statusValue.1 + return cell + default: + return nil + } + }else if let item = item as? String { + switch tableColumn?.identifier.enumValue() { + case ColumnIdetifier.productID.cellValue: + let imgView = NSImageView() + imgView.showWebImage(item) + return imgView + default: + return nil + } + }else { + return nil + } + } + + func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int { + if item is IAPList.IAP { + return 1 + }else { + return iapList.count + } + } + + func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool { + if item is IAPList.IAP { + return true + }else { + return false + } + } + + func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any { + if let item = item as? IAPList.IAP { + return item.reviewScreenshot as Any + } + return iapList[index] + } + + func outlineView(_ outlineView: NSOutlineView, heightOfRowByItem item: Any) -> CGFloat { + if item is IAPList.IAP { + return 35 + }else { + return 100 + } + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/APInappPurchseCell.xib b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInappPurchseCell.xib new file mode 100644 index 0000000..0055c8f --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/APInappPurchseCell.xib @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/APUploadIAPListVC.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/APUploadIAPListVC.swift new file mode 100644 index 0000000..a636cd1 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/APUploadIAPListVC.swift @@ -0,0 +1,806 @@ +// +// InputTableListVC.swift +// AppleParty +// +// Created by 易承 on 2020/12/15. +// + +import Cocoa + +class APUploadIAPListVC: NSViewController { + + @IBOutlet weak var tableView: NSTableView! + @IBOutlet weak var enterBtn: NSButton! + @IBOutlet weak var preserveCurrentPriceBtn: NSButton! + @IBOutlet weak var showApiRateLimitLogsBtn: NSButton! + + public var currentApp: App? { + didSet { + setupUI() + } + } + public var iaps = [IAPProduct]() { + didSet { + self.tableView.reloadData() + } + } + + private var screenshotPaths = [String: String]() + + override func viewDidLoad() { + super.viewDidLoad() + + self.tableView.columnAutoresizingStyle = .uniformColumnAutoresizingStyle + self.tableView.selectionHighlightStyle = .none + self.tableView.sizeToFit() + } + + func setupUI() { + self.view.window?.title = "批量内购买项目上传 - " + (currentApp?.appName ?? "") + self.tableView.reloadData() + } + + func showUploadView() { + // 不能同时 present 出来 + DispatchQueue.main.asyncAfter(deadline: .now() + 0.25) { + let mainStoryboard = NSStoryboard(name: "InAppPurchseView", bundle: Bundle(for: self.classForCoder)) + let upVC = mainStoryboard.instantiateController(withIdentifier: "IAPUploadVCID") as? IAPUploadImageVC + let screenshot = self.iaps.filter({ $0.reviewScreenshot.count > 0 }).map({ $0.reviewScreenshot }) + // 去重后的图片名 + let uniquedshot = screenshot.enumerated().filter { (index, value) -> Bool in + return screenshot.firstIndex(of: value) == index + }.map { $0.element } + upVC?.picnames = uniquedshot + upVC?.callBackFunc = { paths in + self.screenshotPaths = paths + self.tableView.reloadData() + } + self.presentAsSheet(upVC!) + } + } + + @IBAction func clickedUploadShotBtn(_ sender: Any) { + showUploadView() + } + + @IBAction func clickedSPasswordBtn(_ sender: Any) { + let vc = APASCKeysSettingVC() + presentAsSheet(vc) + } + + @IBAction func createIAP(_ sender: Any) { + let list = self.iaps + guard list.count > 0 else { + APHUD.hide(message: "当前 App 无上传的内购商品!", delayTime: 1) + return + } + + + guard let appid = currentApp?.appId else { + APHUD.hide(message: "当前 App 的 appleid 为空!", delayTime: 1) + return + } + + enterBtn.isEnabled = false + APHUD.show(message: "上传中", view: self.view) + let uploadIAPs: ((AppStoreConnectKey) -> Void) = { [weak self] ascKey in + // 上传数据 + self?.updateInAppPurchse(iaps: list, appId: appid, ascKey: ascKey) + } + + guard let ascKey = InfoCenter.shared.currentASCKey else { + let vc = APASCKeysSettingVC() + vc.updateCompletion = { password in + if let ascKey = password { + uploadIAPs(ascKey) + } + } + presentAsSheet(vc) + return + } + + uploadIAPs(ascKey) + } + +} + +// MARK: - 网络请求 +extension APUploadIAPListVC { + + func updateInAppPurchse(iaps: [IAPProduct], appId: String, ascKey: AppStoreConnectKey) { + let showApiRateLimit = showApiRateLimitLogsBtn.state.rawValue == 1 + let ascAPI = APASCAPI.init(issuerID: ascKey.issuerID, + privateKeyID: ascKey.privateKeyID, + privateKey: ascKey.privateKey, + showApiRateLimit: showApiRateLimit) + ascAPI.addMessage("密钥信息:\(ascKey.issuerID), \(ascKey.privateKeyID), \(ascKey.privateKey)") + + Task { + // 1、获取当前账号下 app,判断是否包含当前 提交商品的 app + guard let apps = await ascAPI.apps() else { + self.enterBtn.isEnabled = true + APHUD.hide() + APHUD.hide(message: "当前请求异常,请检查密钥是否正确~", delayTime: 2) + return + } + let app = apps.filter { $0.id == appId } + guard app.count > 0 else { + self.enterBtn.isEnabled = true + APHUD.hide() + APHUD.hide(message: "当前的密钥没有查到App: \(appId),请检查~", delayTime: 2) + return + } + + // 2. 同步显示进度日志 + let sb = NSStoryboard(name: "APDebugVC", bundle: Bundle(for: self.classForCoder)) + let newWC = sb.instantiateController(withIdentifier: "APDebugWC") as? NSWindowController + newWC?.window?.title = "内购批量上传日志" + let logVC = newWC?.contentViewController as? APDebugVC + logVC?.debugLog = "开始上传" + newWC?.showWindow(self) + ascAPI.updateMsg = { messages in + logVC?.debugLog = messages.joined(separator: "\n") + } + + ascAPI.addMessage("开始处理内购商品,获取现有商品中...") + // 3、获取所有的内购商品,如果存在的商品就直接修改,如果不存在就创建 + let oldIAPs = await ascAPI.fetchInAppPurchasesList(appId: appId) + + // 4、遍历所有要上传的商品 + for product in iaps { + // 订阅类型与非订单类型不一样的处理逻辑 + if product.inAppPurchaseType == .AUTO_RENEWABLE { + await createRenewSubscription(appId: appId, product: product, ascAPI: ascAPI) + } else { + await createInAppPurchase(appId: appId, product: product, oldIAPs: oldIAPs, ascAPI: ascAPI) + } + } + + self.enterBtn.isEnabled = true + APHUD.hide() + ascAPI.addMessage("完成全部内购商品,可稍后在苹果后台查看!✅✅✅") + } + } + + // MARK: - 上传内购类型商品 + + /// 创建内购商品 + func createInAppPurchase(appId: String, product: IAPProduct, oldIAPs: [ASCInAppPurchaseV2], ascAPI: APASCAPI) async { + ascAPI.addMessage("开始上传内购商品:\(product.productId),\(product.name) ") + // 检查是否已经存在此商品,如果存在就修改信息,如果不存在就创建 + let iaps = oldIAPs.filter({ $0.attributes?.productID == product.productId }) + if let iap = iaps.first { + ascAPI.addMessage("内购已经存在:\(product.productId) ,开始更新信息中...") + // 0. 审核备注如果原来有值,而新字段无值,则使用原值 + var product = product + if let note = iap.attributes?.reviewNote, product.reviewNote.isEmpty { + product.reviewNote = note + } + // 1.修改原商品信息 + guard let iap = await ascAPI.updateInAppPurchases(iapId: iap.id, product: product) else { + // 修改失败 + ascAPI.addMessage("内购已经存在:\(product.productId) ,更新信息失败!❌ ") + return + } + // 2. 商品价格档位 + await updateIAPPricePoint(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 3. 商品本地化语言 + ascAPI.addMessage("开始更新内购本地化版本:\(product.productId)") + let localizations = await ascAPI.fetchInAppPurchasesLocalizations(iapId: iap.id) + for localization in product.localizations { + // 如果已经存在本地化语言,则更新 + if let locale = localizations.filter({ $0.attributes?.locale == localization.locale }).first { + // 更新 + ascAPI.addMessage("内购已存在本地化版本:\(localization.locale),开始更新信息中...") + if (await ascAPI.updateInAppPurchasesLocalization(iapLocaleId: locale.id, localization: localization)) != nil { + // 本地化语言更新成功 + ascAPI.addMessage("内购本地化版本:\(localization.locale) ,更新语言成功!✅ ") + } else { + // 本地化语言更新失败 + ascAPI.addMessage("内购本地化版本:\(localization.locale) ,更新语言失败!❌ ") + } + } else { + // 创建 + await createIAPLocalization(iapId: iap.id, localization: localization, product: product, ascAPI: ascAPI) + } + } + + // 4. 商品截图 + await createIAPScreenshot(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 5. 销售国家或地区 + await updateIAPAvailableTerritories(iapId: iap.id, product: product, ascAPI: ascAPI) + + } else { + // 1. 创建新的商品 + guard let iap = await ascAPI.createInAppPurchases(appId: appId, product: product) else { + // 创建失败 + ascAPI.addMessage("内购商品:\(product.productId) ,创建失败!❌ ") + return + } + // 2. 商品价格档位 + await updateIAPPricePoint(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 3. 商品本地化语言 + for localization in product.localizations { + await createIAPLocalization(iapId: iap.id, localization: localization, product: product, ascAPI: ascAPI) + } + + // 4. 商品截图 + await createIAPScreenshot(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 5. 销售国家或地区 + await updateIAPAvailableTerritories(iapId: iap.id, product: product, ascAPI: ascAPI) + } + + ascAPI.addMessage("内购商品:\(product.productId),\(product.name) ,上传完成!\n") + } + + /// 创建内购商品价格档位 + func updateIAPPricePoint(iapId: String, product: IAPProduct, ascAPI: APASCAPI) async { + guard let schedule = product.priceSchedules else { + ascAPI.addMessage("无价格计划表:\(product.productId) ,请确认!❌ ") + return + } + + let baseTerritory = schedule.baseTerritory + let baseCustomerPrice = schedule.baseCustomerPrice.normalizePrice() + + ascAPI.addMessage("开始更新价格计划表:\(product.productId),\(baseTerritory),\(baseCustomerPrice) \n") + + let points = await ascAPI.fetchPricePoints(iapId: iapId, territory: [baseTerritory]) + if let point = points.filter({ $0.attributes?.customerPrice!.normalizePrice() == baseCustomerPrice }).first { + var manualPrices: [Any] = [] + var included: [Any] = [] + + ascAPI.addMessage("开始构建基准国家和自定价格:") + // base Territory + manualPrices.append(["id": "${\(baseTerritory)-\(included.count)}", "type": "inAppPurchasePrices"]) + included.append(ascAPI.fetchInAppPurchasePriceSchedule(scheduleId: baseTerritory, pricePointId: point.id, iapId: iapId, index: included.count)) + + // customerPrice + for pricePoint in schedule.manualPrices { + let territory = pricePoint.territory + let customerPrice = pricePoint.customerPrice.normalizePrice() + let points = await ascAPI.fetchPricePoints(iapId: iapId, territory: [territory]) + if let point = points.filter({ $0.attributes?.customerPrice!.normalizePrice() == customerPrice }).first { + manualPrices.append(["id": "${\(territory)-\(included.count)}", "type": "inAppPurchasePrices"]) + included.append(ascAPI.fetchInAppPurchasePriceSchedule(scheduleId: territory, pricePointId: point.id, iapId: iapId, index: included.count)) + } else { + ascAPI.addMessage("自定价格的内购价格点:\(territory),\(customerPrice) ,未找到此档位!❌ ") + } + } + + ascAPI.saveLogs(log: "内购的基准国家和自定价格:\(manualPrices),\(included)") + + if (await ascAPI.updateInAppPurchasePricePoint(iapId: iapId, baseTerritoryId: baseTerritory, manualPrices: manualPrices, included: included)) != nil { + // 价格档位配置成功 + ascAPI.addMessage("内购价格点:\(baseTerritory),\(baseCustomerPrice) ,更新价格成功!✅ ") + } else { + // 价格档位配置失败 + ascAPI.addMessage("内购价格点:\(baseTerritory),\(baseCustomerPrice) ,更新价格失败!❌ ") + } + } else { + // 找不到价格档位 + ascAPI.addMessage("基准国家的内购价格点:\(baseTerritory),\(baseCustomerPrice) ,未找到此档位!❌ ") + } + } + + + /// 创建内购商品本地化信息 + func createIAPLocalization(iapId: String, localization: IAPLocalization, product: IAPProduct, ascAPI: APASCAPI) async { + ascAPI.addMessage("开始更新本地化版本:\(product.productId),\(localization.locale)") + if (await ascAPI.createInAppPurchasesLocalization(iapId: iapId, localization: localization)) != nil { + // 本地化语言配置成功 + ascAPI.addMessage("内购本地化版本:\(localization.locale) ,更新语言成功!✅ ") + } else { + // 本地化语言配置失败 + ascAPI.addMessage("内购本地化版本:\(localization.locale) ,更新语言失败!❌ ") + } + } + + /// 更新内购商品的送审截图 + func createIAPScreenshot(iapId: String, product: IAPProduct, ascAPI: APASCAPI) async { + ascAPI.addMessage("开始更新内购商品的送审截图:\(product.productId),\(product.reviewScreenshot)") + let imgName = product.reviewScreenshot + guard let imgPath = screenshotPaths[imgName] else { + ascAPI.addMessage("内购商品:\(product.productId) 无送审截图或未上传截图~") + return + } + + let imaUrl = URL.init(fileURLWithPath: imgPath) + guard let fileMD5 = URL.init(fileURLWithPath: imgPath).fileMD5() else { + ascAPI.addMessage("内购商品截图文件错误:\(imgPath) ,无法生成 md5 值~") + return + } + + let oldShot = await ascAPI.fetchInAppPurchasesScreenshot(iapId: iapId) + // 存在需要删除,避免文件名不一样或者过期文件 + if let ost = oldShot { + ascAPI.addMessage("删除旧的送审截图:\(ost.attributes?.fileName ?? "")") + let status = await ascAPI.deleteInAppPurchasesScreenshot(iapShotId: ost.id) + if status != 204 { + ascAPI.addMessage("内购商品截图创建失败:\(imgName) ,无法删除旧截图~") + } + } + + ascAPI.addMessage("创建新的送审截图:\(product.reviewScreenshot)") + // 创建截图 + let imaSize = imaUrl.fileSizeInt() + guard let shot = await ascAPI.createInAppPurchasesScreenshot(iapId: iapId, fileName: imgName, fileSize: imaSize) else { + // 创建失败 + ascAPI.addMessage("内购商品:\(product.productId) ,创建送审截图失败!❌ ") + return + } + + // 根据苹果接口返回的上传接口上传 + guard let method = shot.attributes?.uploadOperations?.first?.method, + let url = shot.attributes?.uploadOperations?.first?.url, + let requestHeaders = shot.attributes?.uploadOperations?.first?.requestHeaders, + let baseURL = URL(string: url) else { + ascAPI.addMessage("内购商品:\(product.productId) ,创建送审截图失败!苹果参数异常~ ❌ ") + return + } + + var request = URLRequest(url: baseURL) + request.httpMethod = method + for header in requestHeaders { + request.headers[header.name ?? ""] = header.value ?? "" + } + + ascAPI.addMessage("上传新的送审截图:\(product.reviewScreenshot)") + // 上传图片 + guard let response = try? await URLSession.shared.upload(for: request, fromFile: imaUrl) else { + ascAPI.addMessage("内购商品:\(product.productId) ,创建送审截图失败!上传图片异常~ ❌ ") + return + } + guard let responseCode = (response.1 as? HTTPURLResponse)?.statusCode, responseCode == 200 else { + ascAPI.addMessage("内购商品:\(product.productId) ,创建送审截图失败!上传图片异常 \(response.1.description)~ ❌ ") + return + } + + ascAPI.addMessage("提交新的送审截图:\(product.reviewScreenshot)") + // 确认图片 + if ((await ascAPI.updateInAppPurchasesScreenshot(iapShotId: shot.id, fileMD5: fileMD5)) != nil) { + ascAPI.addMessage("内购商品:\(product.productId) ,送审截图上传成功!✅ ") + } else { + ascAPI.addMessage("内购商品:\(product.productId) ,送审截图可能上传失败! ") + } + } + + /// 销售国家或地区 + func updateIAPAvailableTerritories(iapId: String, product: IAPProduct, ascAPI: APASCAPI) async { + let inAll = product.territories.availableInAllTerritories + let inNew = product.territories.availableInNewTerritories + let summary = territoryInfo(product: product) + let newTerritory = inNew ? "将来新国家(地区)时自动提供!" : "将来新国家(地区)时不自动提供!" + ascAPI.addMessage("开始更新内购商品的销售国家/地区:\(summary)") + + guard !inAll else { + var allTerritories: [[String: String]] = [] + if let territories = await ascAPI.territories() { + territories.forEach { territory in + allTerritories.append([ + "type": "territories", + "id": territory.id + ]) + } + // 更新全部国家地区 + if (await ascAPI.updateInAppPurchasesAvailabilityTerritories(iapId: iapId, availableTerritories: allTerritories, availableInNewTerritories: inNew)) != nil { + ascAPI.addMessage("选择:所有国家(地区)销售,\(newTerritory),更新成功!✅ ") + } else { + ascAPI.addMessage("选择:所有国家(地区)销售,\(newTerritory),更新失败!❌ ") + } + } else { + ascAPI.addMessage("选择:所有国家(地区)销售,\(newTerritory),无法设置!获取国家标识码失败!❌ ") + } + return + } + + /// 选择销售的国家或地区 + var territories: [[String: String]] = [] + product.territories.territories?.forEach({ territory in + territories.append([ + "type": "territories", + "id": territory.id + ]) + }) + + let customerTerritory = product.territories.territories?.map({ $0.id }).joined(separator: ",") ?? "无" + if (await ascAPI.updateInAppPurchasesAvailabilityTerritories(iapId: iapId, availableTerritories: territories, availableInNewTerritories: inNew)) != nil { + ascAPI.addMessage("内购商品的销售国家/地区:\(customerTerritory) ,更新成功!✅ ") + } else { + ascAPI.addMessage("内购商品的销售国家/地区:\(customerTerritory) ,更新失败!❌ ") + } + } + + + // MARK: - 上传订阅商品 + + /// 订阅商品创建或更新 + func createRenewSubscription(appId: String, product: IAPProduct, ascAPI: APASCAPI) async { + let groupName = product.groupName + var currentSubGroup: ASCSubscriptionGroup? + // 1、是否有订阅组,没有时要先创建 + var subGroups = await ascAPI.fetchSubscriptionGroups(appId: appId) +// if subGroups.isEmpty { +// } + + for subGroup in subGroups { + if subGroup.attributes?.referenceName == groupName { + currentSubGroup = subGroup + } + } + + // 创建订阅组 + if currentSubGroup == nil, let group = await ascAPI.createSubscriptionGroups(appId: appId, groupName: groupName) { + currentSubGroup = group + subGroups.append(group) + + for localization in product.localizations { + let _ = await ascAPI.createSubscriptionGroupLocalizations(iapGroupId: group.id, name: localization.name, locale: localization.locale, customAppName: nil) + } + } + + //订阅组设置国际化 + if let group = currentSubGroup { + for localization in product.localizations { + let _ = await ascAPI.createSubscriptionGroupLocalizations(iapGroupId: group.id, name: localization.name, locale: localization.locale, customAppName: nil) + } + } + + // 2、有订阅组,获取所有订阅组的所有订阅商品 + var subscriptions = [ASCSubscription]() + for subGroup in subGroups { + let subs = await ascAPI.fetchSubscriptionGroupSubscriptions(iapGroupId: subGroup.id) + subscriptions.append(contentsOf: subs) + } + + + + // 3、查看是否存在订阅商品,不存在就创建,存在就更新 + let subs = subscriptions.filter({ $0.attributes?.productID == product.productId }) + if let sub = subs.first { + ascAPI.addMessage("订阅商品已经存在:\(product.productId) ,开始更新信息中...") + // 0. 审核备注如果原来有值,而新字段无值,则使用原值 + var product = product + if let note = sub.attributes?.reviewNote, product.reviewNote.isEmpty { + product.reviewNote = note + } + // 1.修改原商品信息 + guard let iap = await ascAPI.updateSubscription(iapId: sub.id, product: product) else { + // 修改失败 + ascAPI.addMessage("订阅商品已经存在:\(product.productId) ,更新信息失败!❌ ") + return + } + + // 2. 商品本地化语言 + ascAPI.addMessage("开始更新订阅商品本地化版本:\(product.productId)") + let localizations = await ascAPI.fetchSubscriptionLocalizations(iapId: iap.id) + for localization in product.localizations { + // 如果已经存在本地化语言,则更新 + if let locale = localizations.filter({ $0.attributes?.locale == localization.locale }).first { + // 更新 + ascAPI.addMessage("订阅商品已存在本地化版本:\(localization.locale),开始更新信息中...") + if (await ascAPI.updateSubscriptionLocalization(iapLocaleId: locale.id, localization: localization)) != nil { + // 本地化语言更新成功 + ascAPI.addMessage("订阅商品本地化版本:\(localization.locale) ,更新语言成功!✅ ") + } else { + // 本地化语言更新失败 + ascAPI.addMessage("订阅商品本地化版本:\(localization.locale) ,更新语言失败!❌ ") + } + } else { + // 创建 + await createSubscriptionLocalization(iapId: iap.id, localization: localization, product: product, ascAPI: ascAPI) + } + } + + // 3. 商品价格档位 + await updateSubscriptionPricePoint(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 4. 商品截图 + await createSubscriptionScreenshot(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 5. 销售国家或地区 + await updateSubscriptionAvailableTerritories(iapId: iap.id, product: product, ascAPI: ascAPI) + + } else { + // 1. 创建新的商品 + guard let iapGroupId = currentSubGroup?.id, let iap = await ascAPI.createSubscription(iapGroupId: iapGroupId, product: product) else { + // 创建失败 + ascAPI.addMessage("订阅商品:\(product.productId) ,创建失败!❌ ") + return + } + + // 2. 商品本地化语言 + for localization in product.localizations { + await createSubscriptionLocalization(iapId: iap.id, localization: localization, product: product, ascAPI: ascAPI) + } + + // 3. 商品价格档位 + await updateSubscriptionPricePoint(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 4. 商品截图 + await createSubscriptionScreenshot(iapId: iap.id, product: product, ascAPI: ascAPI) + + // 5. 销售国家或地区 + await updateSubscriptionAvailableTerritories(iapId: iap.id, product: product, ascAPI: ascAPI) + } + + ascAPI.addMessage("订阅商品:\(product.productId),\(product.name) ,上传完成!\n") + } + + + /// 更新订阅商品的价格档位 + func updateSubscriptionPricePoint(iapId: String, product: IAPProduct, ascAPI: APASCAPI) async { + guard let schedule = product.priceSchedules else { + ascAPI.addMessage("无价格计划表:\(product.productId) ,请确认!❌ ") + return + } + + let baseTerritory = schedule.baseTerritory + let baseCustomerPrice = schedule.baseCustomerPrice.normalizePrice() + + ascAPI.addMessage("开始更新订阅商品价格点,基准国家:\(product.productId),\(baseTerritory),\(baseCustomerPrice) \n") + + let isPreservePrice = preserveCurrentPriceBtn.state.rawValue == 1 + ascAPI.addMessage("保留自动续期订阅者现有定价:\(isPreservePrice ? "是" : "否")") + + let points = await ascAPI.fetchSubscriptionPricePoints(iapId: iapId, territory: [baseTerritory]) + if let point = points.filter({ $0.attributes?.customerPrice!.normalizePrice() == baseCustomerPrice }).first { + + ascAPI.addMessage("开始更新自定价格:") + // 自定价格的国家或地区, 基准国家也算是自定价格 + var customerPriceSchedules = schedule.manualPrices + customerPriceSchedules.append(IAPPricePoint(territory: baseTerritory, customerPrice: baseCustomerPrice)) + let manualPricesTerritory: [String] = customerPriceSchedules.map({ $0.territory }) + // 设置自定价格 + for pricePoint in customerPriceSchedules { + let territory = pricePoint.territory + let customerPrice = pricePoint.customerPrice.normalizePrice() + let points = await ascAPI.fetchSubscriptionPricePoints(iapId: iapId, territory: [territory]) + if let point = points.filter({ $0.attributes?.customerPrice!.normalizePrice() == customerPrice }).first { + if (await ascAPI.updateSubscriptionPricePoint(iapId: iapId, pricePointId: point.id, preserveCurrentPrice: isPreservePrice)) != nil { + ascAPI.addMessage("自定价格的订阅商品的价格点:\(territory),\(customerPrice) ,更新价格成功!✅ ") + } else { + ascAPI.addMessage("自定价格的订阅商品的价格点:\(territory),\(customerPrice) ,更新价格失败!❌ ") + } + } else { + ascAPI.addMessage("自定价格的订阅商品价格点:\(territory),\(customerPrice) ,未找到此档位!❌ ") + } + } + + ascAPI.addMessage("开始更新全球均衡价格:") + // 剩余的所有的国家地区的订阅价格点,然后一个一个设置。API不支持全部国家一次配置 + let allPoints = await ascAPI.fetchSubscriptionPricePointsEqualizations(pointId: point.id, territory: nil) + for apoint in allPoints { + let territory = apoint.relationships?.territory?.data?.id ?? "" + // 自定价格的国家跳过 + if manualPricesTerritory.contains(territory) { + continue + } + let customerPrice = apoint.attributes?.customerPrice ?? "" + if (await ascAPI.updateSubscriptionPricePoint(iapId: iapId, pricePointId: apoint.id, preserveCurrentPrice: isPreservePrice)) != nil { + // 价格档位配置成功 + ascAPI.addMessage("全球均衡价格的订阅商品的价格点:\(territory),\(customerPrice) ,更新价格成功!✅ ") + } else { + // 价格档位配置失败 + ascAPI.addMessage("全球均衡价格的订阅商品的价格点:\(territory),\(customerPrice) ,更新价格失败!❌ ") + } + } + } else { + // 找不到价格档位 + ascAPI.addMessage("基准国家的订阅商品价格点:\(baseTerritory),\(baseCustomerPrice) ,未找到此档位!❌ ") + } + } + + + /// 更新订阅商品的本地化信息 + func createSubscriptionLocalization(iapId: String, localization: IAPLocalization, product: IAPProduct, ascAPI: APASCAPI) async { + ascAPI.addMessage("开始更新订阅商品本地化版本:\(product.productId),\(localization.locale)") + if (await ascAPI.createSubscriptionLocalization(iapId: iapId, localization: localization)) != nil { + // 本地化语言配置成功 + ascAPI.addMessage("订阅商品本地化版本:\(localization.locale) ,更新语言成功!✅ ") + } else { + // 本地化语言配置失败 + ascAPI.addMessage("订阅商品本地化版本:\(localization.locale) ,更新语言失败!❌ ") + } + } + + /// 更新订阅商品的送审截图 + func createSubscriptionScreenshot(iapId: String, product: IAPProduct, ascAPI: APASCAPI) async { + ascAPI.addMessage("开始更新订阅商品的送审截图:\(product.productId),\(product.reviewScreenshot)") + let imgName = product.reviewScreenshot + guard let imgPath = screenshotPaths[imgName] else { + ascAPI.addMessage("订阅商品:\(product.productId) 无送审截图或未上传截图~") + return + } + + let imaUrl = URL.init(fileURLWithPath: imgPath) + guard let fileMD5 = URL.init(fileURLWithPath: imgPath).fileMD5() else { + ascAPI.addMessage("订阅商品截图文件错误:\(imgPath) ,无法生成 md5 值~") + return + } + + let oldShot = await ascAPI.fetchSubscriptionScreenshot(iapId: iapId) + // 存在需要删除,避免文件名不一样或者过期文件 + if let ost = oldShot { + ascAPI.addMessage("删除旧的送审截图:\(ost.attributes?.fileName ?? "")") + let status = await ascAPI.deleteSubscriptionScreenshot(iapShotId: ost.id) + if status != 204 { + ascAPI.addMessage("订阅商品截图创建失败:\(imgName) ,无法删除旧截图~") + } + } + + ascAPI.addMessage("创建新的送审截图:\(product.reviewScreenshot)") + // 创建截图 + let imaSize = imaUrl.fileSizeInt() + guard let shot = await ascAPI.createSubscriptionScreenshot(iapId: iapId, fileName: imgName, fileSize: imaSize) else { + // 创建失败 + ascAPI.addMessage("订阅商品:\(product.productId) ,创建送审截图失败!❌ ") + return + } + + // 根据苹果接口返回的上传接口上传 + guard let method = shot.attributes?.uploadOperations?.first?.method, + let url = shot.attributes?.uploadOperations?.first?.url, + let requestHeaders = shot.attributes?.uploadOperations?.first?.requestHeaders, + let baseURL = URL(string: url) else { + ascAPI.addMessage("订阅商品:\(product.productId) ,创建送审截图失败!苹果参数异常~ ❌ ") + return + } + + var request = URLRequest(url: baseURL) + request.httpMethod = method + for header in requestHeaders { + request.headers[header.name ?? ""] = header.value ?? "" + } + + ascAPI.addMessage("上传新的送审截图:\(product.reviewScreenshot)") + // 上传图片 + guard let response = try? await URLSession.shared.upload(for: request, fromFile: imaUrl) else { + ascAPI.addMessage("订阅商品:\(product.productId) ,创建送审截图失败!上传图片异常~ ❌ ") + return + } + guard let responseCode = (response.1 as? HTTPURLResponse)?.statusCode, responseCode == 200 else { + ascAPI.addMessage("订阅商品:\(product.productId) ,创建送审截图失败!上传图片异常 \(response.1.description)~ ❌ ") + return + } + + ascAPI.addMessage("提交新的送审截图:\(product.reviewScreenshot)") + // 确认图片 + if ((await ascAPI.updateSubscriptionScreenshot(iapShotId: shot.id, fileMD5: fileMD5)) != nil) { + ascAPI.addMessage("订阅商品:\(product.productId) ,送审截图上传成功!✅ ") + } else { + ascAPI.addMessage("订阅商品:\(product.productId) ,送审截图可能上传失败! ") + } + } + + /// 销售国家或地区 + func updateSubscriptionAvailableTerritories(iapId: String, product: IAPProduct, ascAPI: APASCAPI) async { + let inAll = product.territories.availableInAllTerritories + let inNew = product.territories.availableInNewTerritories + let summary = territoryInfo(product: product) + let newTerritory = inNew ? "将来新国家(地区)时自动提供!" : "将来新国家(地区)时不自动提供!" + ascAPI.addMessage("开始更新订阅商品的销售国家/地区:\(summary)") + + guard !inAll else { + var allTerritories: [[String: String]] = [] + if let territories = await ascAPI.territories() { + territories.forEach { territory in + allTerritories.append([ + "type": "territories", + "id": territory.id + ]) + } + // 更新全部国家地区 + if (await ascAPI.updateSubscriptionAvailabilityTerritories(iapId: iapId, availableTerritories: allTerritories, availableInNewTerritories: inNew)) != nil { + ascAPI.addMessage("选择:所有国家(地区)销售,\(newTerritory),更新成功!✅ ") + } else { + ascAPI.addMessage("选择:所有国家(地区)销售,\(newTerritory),更新失败!❌ ") + } + } else { + ascAPI.addMessage("选择:所有国家(地区)销售,\(newTerritory),无法设置!获取国家标识码失败!❌ ") + } + return + } + + /// 选择销售的国家或地区 + var territories: [[String: String]] = [] + product.territories.territories?.forEach({ territory in + territories.append([ + "type": "territories", + "id": territory.id + ]) + }) + + let customerTerritory = product.territories.territories?.map({ $0.id }).joined(separator: ",") ?? "无" + if (await ascAPI.updateSubscriptionAvailabilityTerritories(iapId: iapId, availableTerritories: territories, availableInNewTerritories: inNew)) != nil { + ascAPI.addMessage("订阅商品的销售国家/地区:\(customerTerritory) ,更新成功!✅ ") + } else { + ascAPI.addMessage("订阅商品的销售国家/地区:\(customerTerritory) ,更新失败!❌ ") + } + } +} + +// MARK: - Privacy Method +extension APUploadIAPListVC { + + func territoryInfo(product: IAPProduct) -> String { + let inAll = product.territories.availableInAllTerritories + let inNew = product.territories.availableInNewTerritories + let customerTerritory = product.territories.territories?.map({ $0.id }).joined(separator: ",") ?? "" + let off = !inAll && !inNew && (product.territories.territories?.isEmpty ?? true) + let territory = off ? "下架" : (customerTerritory.isEmpty ? (inAll ? "全部" : "当前下架") : customerTerritory) + let stringValue = "在所有国家/地区销售:'\(inAll ? "是" : "否")'\n将来新国家/地区自动提供:'\(inNew ? "是" : "否")'\n指定国家/地区销售:\(territory)" + return stringValue + } +} + + +// MARK: - NSTableViewDelegate +extension APUploadIAPListVC: NSTableViewDelegate, NSTableViewDataSource { + func numberOfRows(in tableView: NSTableView) -> Int { + return iaps.count + } + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + let iap = iaps[row] + switch tableColumn?.identifier.enumValue() { + case ColumnIdetifier.id.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.id.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = String(row+1) + return cell + case ColumnIdetifier.productID.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.productID.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = iap.productId + return cell + case ColumnIdetifier.productName.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.productName.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = iap.name + return cell + case ColumnIdetifier.price.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.price.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = territoryInfo(product: iap) + return cell + case ColumnIdetifier.level.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.level.cellValue, owner: self) as? NSTableCellView + let territory = iap.priceSchedules?.baseTerritory ?? "-" + let price = iap.priceSchedules?.baseCustomerPrice ?? "-" + let customerPrice = iap.priceSchedules?.manualPrices.map({ pp in + "{'国家:'\(pp.territory)', '自定价格':'\(pp.customerPrice)'}\n" + }).joined() ?? "-" + cell?.textField?.stringValue = "基准国家:'\(territory)'\n基准价格:'\(price)'\n\(customerPrice)" + return cell + case ColumnIdetifier.productPds.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.productPds.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = iap.reviewNote + return cell + case ColumnIdetifier.state.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.state.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = iap.inAppPurchaseType.CNValue() + return cell + case ColumnIdetifier.screenshot.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.screenshot.cellValue, owner: self) as? ImageViewCell + let file_name = iap.reviewScreenshot + let imgPath = screenshotPaths[file_name] ?? "" + cell?.imgSel.image = NSImage(contentsOfFile: imgPath) + return cell + case ColumnIdetifier.language.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.language.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = iap.localizations.map({ lz in + "{'locale:'\(lz.locale)', 'title':'\(lz.name)', 'desc':'\(lz.description)'}\n" + }).joined() + return cell + default: + return nil + } + } + + func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat { + let prices = iaps[row].priceSchedules?.manualPrices.count ?? 0 + let count = max(prices + 2, 3) + return count > 10 ? CGFloat(20 * count) : CGFloat(25 * count) + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/DragView.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/DragView.swift new file mode 100644 index 0000000..b58ba64 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/DragView.swift @@ -0,0 +1,64 @@ +// +// DragView.swift +// AppleParty +// +// Created by 易承 on 2020/12/16. +// + +import Cocoa + +protocol DragViewDelegate { + func dragView(_ path: String?) +} + +class DragView: NSView { + + var delegate: DragViewDelegate? + + private var fileTypeIsOk = false + let NSFilenamesPboardType = NSPasteboard.PasteboardType("NSFilenamesPboardType") + let fileTypes = ["jpg", "jpeg", "png"] + var droppedFilePath: String? + + override func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + // Declare and register an array of accepted types + registerForDraggedTypes([NSPasteboard.PasteboardType(kUTTypeFileURL as String), + NSPasteboard.PasteboardType(kUTTypeItem as String)]) + } + + override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation { + fileTypeIsOk = checkExtension(drag: sender) + return [] + } + + override func draggingUpdated(_ sender: NSDraggingInfo) -> NSDragOperation { + return fileTypeIsOk ? .link : [] + } + + override func performDragOperation(_ sender: NSDraggingInfo) -> Bool { + if let board = sender.draggingPasteboard.propertyList(forType: NSFilenamesPboardType) as? NSArray, let imagePath = board[0] as? String { + // THIS IS WERE YOU GET THE PATH FOR THE DROPPED FILE + droppedFilePath = imagePath + if fileTypeIsOk { + delegate?.dragView(droppedFilePath) + } + return true + } + return false + } + + fileprivate func checkExtension(drag: NSDraggingInfo) -> Bool { + if let board = drag.draggingPasteboard.propertyList(forType: NSFilenamesPboardType) as? NSArray, let path = board[0] as? String { + let url = NSURL(fileURLWithPath: path) + if let fileExtension = url.pathExtension?.lowercased() { + return fileTypes.contains(fileExtension) + } + } + return false + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/IAPUploadImageVC.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/IAPUploadImageVC.swift new file mode 100644 index 0000000..c16b273 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/IAPUploadImageVC.swift @@ -0,0 +1,105 @@ +// +// UploadVC.swift +// AppleParty +// +// Created by 易承 on 2021/6/3. +// + +import AppKit +import Foundation + +class IAPUploadImageVC: NSViewController { + + @IBOutlet weak var tableView: NSTableView! + + @IBOutlet weak var cancelBtm: NSButton! + @IBOutlet weak var submitBtm: NSButton! + @IBOutlet weak var tipLb: NSTextField! + var picnames = [String]() + var resultPaths = [String: String]() + + typealias CallBackFunc = (_ paths: [String: String]) -> Void + var callBackFunc: CallBackFunc? + + fileprivate lazy var fileTypes: [String] = { + return ["jpg", "jpeg", "png"] + }() + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.delegate = self + tableView.dataSource = self + tipLb.stringValue = "需要上传\(picnames.count)张图片" + } + + @IBAction func clickedBatchUploadBtn(_ sender: Any) { + let openPanel = NSOpenPanel() + openPanel.canChooseFiles = true + openPanel.canChooseDirectories = false + openPanel.allowsMultipleSelection = true + openPanel.allowedFileTypes = fileTypes + openPanel.beginSheetModal(for: self.view.window!) { (modalResponse: NSApplication.ModalResponse) in + if modalResponse == .OK { + openPanel.urls.forEach { url in + let picname = url.lastPathComponent + debugPrint(picname) + if self.picnames.contains(picname) { + debugPrint("contains") + self.resultPaths[picname] = url.path + } + } + self.tableView.reloadData() + } + } + } + + + @IBAction func cancel(_ sender: Any) { + dismiss(self) + } + + @IBAction func submit(_ sender: Any) { + guard picnames.count == resultPaths.keys.count else { + APHUD.hide(message: "必须图片数量不正确!", view: self.view) + return + } + dismiss(self) + if let callBackFunc = callBackFunc { + callBackFunc(resultPaths) + } + } +} + +extension IAPUploadImageVC: NSTableViewDelegate, NSTableViewDataSource { + func numberOfRows(in tableView: NSTableView) -> Int { + return picnames.count + } + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + switch tableColumn?.identifier.enumValue() { + case ColumnIdetifier.picname.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.picname.cellValue, owner: self) as? NSTableCellView + cell?.textField?.stringValue = picnames[row] + return cell + case ColumnIdetifier.upload.cellValue: + let cell = tableView.makeView(withIdentifier: ColumnIdetifier.upload.cellValue, owner: self) as? UploadCell + cell?.row = row + cell?.dragView(resultPaths[picnames[row]]) + cell?.callBackFunc = { path,crow in + self.resultPaths[self.picnames[crow]] = path + } + return cell + default: + return nil + } + } + + func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat { + 100 + } + + func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + return false + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/InAppPurchseView.storyboard b/AppleParty/AppleParty/AppListView/InAppPurchseView/InAppPurchseView.storyboard new file mode 100644 index 0000000..b852f64 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/InAppPurchseView.storyboard @@ -0,0 +1,993 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSAllRomanInputSourcesLocaleIdentifier + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSAllRomanInputSourcesLocaleIdentifier + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSAllRomanInputSourcesLocaleIdentifier + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPExcelParser.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPExcelParser.swift new file mode 100644 index 0000000..13d07f6 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPExcelParser.swift @@ -0,0 +1,421 @@ +// +// IAPExcelParser.swift +// AppleParty +// +// Created by HTC on 2022/11/10. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Foundation +import CoreXLSX + + +/// 上传的商品类型 +enum IAPType: String { + case CONSUMABLE = "CONSUMABLE" + case NON_CONSUMABLE = "NON_CONSUMABLE" + case NON_RENEWING_SUBSCRIPTION = "NON_RENEWING_SUBSCRIPTION" + case AUTO_RENEWABLE = "auto-renewable" + case UNKNOW = "unknown" + + static func type(name: String) -> IAPType { + switch name { + case "消耗型": + return .CONSUMABLE + case "非消耗型": + return .NON_CONSUMABLE + case "非续期订阅": + return .NON_RENEWING_SUBSCRIPTION + case "自动续期订阅": + return .AUTO_RENEWABLE + default: + return .UNKNOW + } + } + + func CNValue() -> String { + switch self { + case .CONSUMABLE: + return "消耗型" + case .NON_CONSUMABLE: + return "非消耗型" + case .NON_RENEWING_SUBSCRIPTION: + return "非续期订阅" + case .AUTO_RENEWABLE: + return "自动续期订阅" + default: + return "未知" + } + } +} + +// 本地化名称和描述 +struct IAPLocalization { + var name: String = "" + var description: String = "" + var locale: String = "" +} + +// 订阅类型的子字段 +struct IAPSubscriptions { + var groupLevel: Int = 1 + var subscriptionPeriod: String = "ONE_MONTH" //ONE_WEEK, ONE_MONTH, TWO_MONTHS, THREE_MONTHS, SIX_MONTHS, ONE_YEAR +} + +/// 内购统一模型 +struct IAPProduct { + var name: String = "" + var groupName: String = "" + var productId: String = "" + var reviewNote: String = "" + var reviewScreenshot: String = "" + var familySharable: Bool = false + var inAppPurchaseType: IAPType = .UNKNOW //# CONSUMABLE、NON_CONSUMABLE、NON_RENEWING_SUBSCRIPTION + var localizations: [IAPLocalization] = [] + // 订阅类型的特有 + var subscriptions: IAPSubscriptions? + // 价格计划表 + var priceSchedules: IAPPriceSchedules? + // 销售的国家或地区 + var territories: IAPTerritories = IAPTerritories() +} + +/// 价格计划表 +struct IAPPriceSchedules { + var productId: String = "" + var baseTerritory: String = "" + var baseCustomerPrice: String = "" + var manualPrices: [IAPPricePoint] = [] +} + +/// 价格点 +struct IAPPricePoint { + var territory: String + var customerPrice: String +} + +/// 销售的国家或地区 +struct IAPTerritories { + var productId: String = "" + /// 所有国家或地区销售(包括将来新国家或地区) + var availableInAllTerritories: Bool = true + /// 将来新国家/地区自动提供销售 + var availableInNewTerritories: Bool = true + var territories: [IAPTerritory]? +} + +struct IAPTerritory { + var id: String +} + + +struct IAPExcelParser { + + static func parser(_ filePath: URL) -> [IAPProduct] { + guard let file = XLSXFile(filepath: filePath.path) else { + fatalError("XLSX file at \(filePath.path) is corrupted or does not exist") + } + + // 先读取价格计划表 + let priceSchedules = parserPricePoints(file) + // 销售的国家或地区 + let territories = parserTerritories(file) + + var result: [IAPProduct] = [] + for wbk in try! file.parseWorkbooks() { + for (name, path) in try! file.parseWorksheetPathsAndNames(workbook: wbk) { + if let worksheetName = name { + print("This worksheet has a name: \(worksheetName)") + } + + if name != "AppleParty" { + continue + } + + guard let worksheet = try? file.parseWorksheet(at: path), + let sharedStrings = try! file.parseSharedStrings() else { + print("This worksheet/sharedStrings is null") + return result + } + var index = 0 + var columnTitles = [String]() + var columnIndexs = [String]() + for row in worksheet.data?.rows ?? [] { + var columnValues = [String: String]() + index += 1 + for cell in row.cells { + let key = cell.reference.column.value + var columnStrings = cell.stringValue(sharedStrings) ?? "" + // 富文本读取 + var richStr = "" + let richColumnCString = cell.richStringValue(sharedStrings) + for richChar in richColumnCString { + richStr += string(from: richChar.text) + } + columnStrings += richStr + // 第一行作为标识行,用于多语言标识,默认信任此字段 + if index == 1 { + columnTitles.append(columnStrings) + columnIndexs.append(key) + } else { + columnValues[key] = columnStrings + } + } + + if index == 1 { + print(columnTitles) + print(columnIndexs) + continue + } + + // Product ID 参考名字 内购买类型 审核截图(可选) 审核备注(可选) zh-Hans zh-Hans ja ja ko ko + var iap = IAPProduct() + iap.groupName = columnValues["A"] ?? "" + iap.productId = columnValues["B"] ?? "" + iap.name = columnValues["C"] ?? "" + let productType = columnValues["D"] ?? "" + iap.inAppPurchaseType = IAPType.type(name: productType) + + // 订阅类型默认的字段 + if iap.inAppPurchaseType == .AUTO_RENEWABLE { + let period = columnValues["E"] ?? "" + iap.subscriptions = IAPSubscriptions() + iap.subscriptions?.subscriptionPeriod = period + } + + iap.reviewScreenshot = columnValues["F"] ?? "" + iap.reviewNote = columnValues["G"] ?? "" + + // 非法的行 + if iap.productId.isEmpty, iap.name.isEmpty { + continue + } + + // 【产品 ID】 可以由字母、数字、下划线(_)和句点(.)构成。 2 ~ 100 个字符) + if iap.productId.count < 2 || iap.productId.count > 100 { + NSAlert.show("Product ID 长度为:2~100 字符!") + } + // 参考名字 + if iap.name.count < 2 || iap.name.count > 64 { + NSAlert.show("\(iap.productId):“参考名字”长度超过 2~64 字符!") + } + + + + // 价格计划表 + let schedules = priceSchedules.filter({ $0.productId == iap.productId }) + if let schedule = schedules.first { + iap.priceSchedules = schedule + } + + //销售国家和地区 + let territorys = territories.filter({ $0.productId == iap.productId }) + if let territory = territorys.first { + iap.territories = territory + } + + // 商品本地化名称和描述 + var localizations: [IAPLocalization] = [] + // 本地化的标识,从下标7开始,奇数遍历,成对出现的 + let columeMax = columnIndexs.count + let columeEndIndex = columnIndexs.count - 1 + for idx in stride(from: 7, to: columeEndIndex, by: 2){ + if idx + 1 <= columeMax { + let locale = columnTitles[idx] + let key1 = columnIndexs[idx] + let key2 = columnIndexs[idx+1] + let name = columnValues[key1] ?? "" + let description = columnValues[key2] ?? "" + if !name.isEmpty && !description.isEmpty { + var localization = IAPLocalization() + localization.locale = locale + localization.name = name + localization.description = description + localizations.append(localization) + } + } + } + iap.localizations = localizations + result.append(iap) + } + } + } + return result + } + + /// 公共方法 + fileprivate static func handleRowContents(_ row: Row, _ sharedStrings: SharedStrings, _ index: Int, _ columnIndexs: inout [String], _ columnValues: inout [String : String]) { + for cell in row.cells { + let key = cell.reference.column.value + var columnStrings = cell.stringValue(sharedStrings) ?? "" + // 富文本读取 + var richStr = "" + let richColumnCString = cell.richStringValue(sharedStrings) + for richChar in richColumnCString { + richStr += string(from: richChar.text) + } + columnStrings += richStr + // 第一行作为标识行,用于多语言标识,默认信任此字段 + if index == 1 { + columnIndexs.append(key) + } else { + columnValues[key] = columnStrings + } + } + } + + /// 读取价格计划表 + static func parserPricePoints(_ file: XLSXFile) -> [IAPPriceSchedules] { + + var result: [IAPPriceSchedules] = [] + for wbk in try! file.parseWorkbooks() { + for (name, path) in try! file.parseWorksheetPathsAndNames(workbook: wbk) { + if let worksheetName = name { + print("This worksheet has a name: \(worksheetName)") + } + + if name != "PricePoints" { + continue + } + + guard let worksheet = try? file.parseWorksheet(at: path), + let sharedStrings = try! file.parseSharedStrings() else { + print("This worksheet/sharedStrings is null") + return result + } + var index = 0 + var columnIndexs = [String]() + for row in worksheet.data?.rows ?? [] { + var columnValues = [String: String]() + index += 1 + handleRowContents(row, sharedStrings, index, &columnIndexs, &columnValues) + + // 第一行是标题行,忽视 + if index == 1 { + print(columnIndexs) + continue + } + + // Product ID 基准国家(代码) 基准国价格 自定价格国家1 自定价格1 自定价格国家2 自定价格2 + let productId = columnValues["A"] ?? "" + let baseTerritory = columnValues["B"] ?? "" + let baseCustomerPrice = (columnValues["C"] ?? "").twoDecimalPrice() + + // 非法的行 + if productId.isEmpty, baseTerritory.isEmpty, baseCustomerPrice.isEmpty { + continue + } + + // 【产品 ID】 可以由字母、数字、下划线(_)和句点(.)构成。 2 ~ 100 个字符) + if productId.count < 2 || productId.count > 100 { + NSAlert.show("PricePoints Product ID 长度为:2~100 字符!") + } + + // 价格计划表 + var schedule = IAPPriceSchedules(productId: productId, baseTerritory: baseTerritory, baseCustomerPrice: baseCustomerPrice) + + // 自定价格的国家和价格 + var manualPrices: [IAPPricePoint] = [] + // 自定价格,从下标3开始,奇数遍历,成对出现的 + let columeMax = columnValues.count + let columeEndIndex = columnValues.count - 1 + for idx in stride(from: 3, to: columeEndIndex, by: 2) { + if idx + 1 <= columeMax, columnIndexs.count > idx+1 { + let key1 = columnIndexs[idx] + let key2 = columnIndexs[idx+1] + let name = columnValues[key1] ?? "" + let price = (columnValues[key2] ?? "").twoDecimalPrice() + if !name.isEmpty && !price.isEmpty { + let pricePoint = IAPPricePoint(territory: name, customerPrice: price) + manualPrices.append(pricePoint) + } + } + } + schedule.manualPrices = manualPrices + result.append(schedule) + } + } + } + return result + } + + + /// 读取销售的国家或地区 + static func parserTerritories(_ file: XLSXFile) -> [IAPTerritories] { + + var result: [IAPTerritories] = [] + for wbk in try! file.parseWorkbooks() { + for (name, path) in try! file.parseWorksheetPathsAndNames(workbook: wbk) { + if let worksheetName = name { + print("This worksheet has a name: \(worksheetName)") + } + + if name != "Territories" { + continue + } + + guard let worksheet = try? file.parseWorksheet(at: path), + let sharedStrings = try! file.parseSharedStrings() else { + print("This worksheet/sharedStrings is null") + return result + } + var index = 0 + var columnIndexs = [String]() + for row in worksheet.data?.rows ?? [] { + var columnValues = [String: String]() + index += 1 + handleRowContents(row, sharedStrings, index, &columnIndexs, &columnValues) + + // 第一行是标题行,忽视 + if index == 1 { + print(columnIndexs) + continue + } + + // Product ID 在所有国家/地区销售(1是,0否) 将来新国家/地区自动提供(1是,0否) 销售1 销售2 ... + let productId = columnValues["A"] ?? "" + let availableInAllTerritories = columnValues["B"] ?? "" + let availableInNewTerritories = columnValues["C"] ?? "" + let isInAll = availableInAllTerritories == "1" ? true : false + let isInNew = availableInNewTerritories == "1" ? true : false + + // 非法的行 + if productId.isEmpty { + continue + } + + // 【产品 ID】 可以由字母、数字、下划线(_)和句点(.)构成。 2 ~ 100 个字符) + if productId.count < 2 || productId.count > 100 { + NSAlert.show("Territories Product ID 长度为:2~100 字符!") + } + + // 销售的国家或地区 + var territory = IAPTerritories(productId: productId, availableInAllTerritories: isInAll, availableInNewTerritories: isInNew) + + // 如果在所有国家或地区销售,则不在读取自定销售国家或地区 + if isInAll { + territory.availableInNewTerritories = true + result.append(territory) + continue + } + + // 自定销售的国家或地区 + var territories: [IAPTerritory] = [] + // 从下标3开始 + let columeMax = columnValues.count + for idx in stride(from: 3, to: columeMax, by: 1) { + let key = columnIndexs[idx] + let name = columnValues[key] ?? "" + if !name.isEmpty { + let pricePoint = IAPTerritory(id: name) + territories.append(pricePoint) + } + } + territory.territories = territories + result.append(territory) + } + } + } + return result + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPModel.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPModel.swift new file mode 100644 index 0000000..8d9ea64 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/IAPModel.swift @@ -0,0 +1,341 @@ +// +// ITCResponseModel.swift +// AppleParty +// +// Created by 易承 on 2021/5/13. +// +// HTTP请求返回的数据解析类 + +import Foundation +import Cocoa + + +/* 消耗型项目consumable + 非消耗型non-consumable + 自动续期订阅auto-renewable + 非续期订阅subscription + */ +// 上传的商品类型 +enum InAppPurchaseType: String { + case CONSUMABLE = "consumable" + case NON_CONSUMABLE = "non-consumable" + case AUTO_RENEWABLE = "auto-renewable" + case FREE_SUBSCRIPTION = "free-subscription" + case SUBSCRIPTION = "subscription" + case UNKNOW = "unknown" + + func CNValue() -> String { + switch self { + case .CONSUMABLE: + return "消耗型" + case .NON_CONSUMABLE: + return "非消耗型" + case .SUBSCRIPTION: + return "非续订型" + case .AUTO_RENEWABLE: + return "自动续订型" + case .FREE_SUBSCRIPTION: + return "免费订阅型" + default: + return "未知" + } + } +} + + +/* + "ITC.addons.type.consumable": "消耗型项目", + "ITC.addons.type.freeSubscription": "免费订阅", + "ITC.addons.type.nonConsumable": "非消耗型项目", + "ITC.addons.type.recurring": "自动续期订阅", + "ITC.addons.type.subscription": "非续期订阅", + */ +// 苹果后台商品类型 +enum ITCAddOnType: String { + case consumable = "ITC.addons.type.consumable" + case subscription = "ITC.addons.type.subscription" + case free_subscription = "ITC.addons.type.freeSubscription" + case non_consumable = "ITC.addons.type.nonConsumable" + case auto_renewable = "ITC.addons.type.recurring" + case unknown + + func CNValue() -> String { + switch self { + case .consumable: + return "消耗型项目" + case .non_consumable: + return "非消耗型项目" + case .subscription: + return "非续期订阅" + case .auto_renewable: + return "自动续期订阅" + case .free_subscription: + return "免费订阅" + default: + return "未知" + } + } +} + + +/* + "approved": "已批准", + "created": "已创建", + "deleted": "已删除", + "deletePending": "正在删除", + "developerActionNeeded": "需要开发人员操作", + "developerRemovedFromSale": "被开发人员下架", + "developerSignedOff": "开发人员签名", + "inReview": "正在审核", + "missingMetadata": "元数据丢失", + "pendingBinaryApproval": "正在审核", + "pendingDeveloperRelease": "等待开发人员发布", + "pendingScreenshot": "正在等待屏幕快照", + "prepareForSubmission": "准备提交", + "processingContentUpload": "正在处理", + "readyForSale": "已批准", + "readyToSubmit": "准备提交", + "rejected": "被拒绝", + "removedFromSale": "被下架", + "replaced": "被替换", + "waitingForContentUpload": "正在等待上传", + "waitingForReview": "正在等待审核", + */ +// iap状态 +enum InAppPurchaseState: String { + case readyForSale + case missingMetadata + case developerActionNeeded + case developerRemovedFromSale + case readyToSubmit + case prepareForSubmission + case waitingForReview + case waitingForContentUpload + case inReview + case pendingBinaryApproval + case pendingDeveloperRelease + case rejected + case removedFromSale + case approved + case created + case deleted + case deletePending + case developerSignedOff + case pendingScreenshot + case processingContentUpload + case replaced + case unknown + + var statusValue: (String, NSColor) { + switch self { + case .readyForSale: + return ("可供销售", NSColor(calibratedRed: 0.23, green: 0.64, blue: 0.40, alpha: 1.00)) + case .missingMetadata: + return ("元数据丢失", NSColor(calibratedRed: 0.97, green: 0.50, blue: 0.19, alpha: 1.00)) + case .developerActionNeeded: + return ("需要开发人员操作", NSColor(calibratedRed: 0.95, green: 0.00, blue: 0.13, alpha: 1.00)) + case .developerRemovedFromSale: + return ("被开发人员下架", NSColor(calibratedRed: 0.95, green: 0.00, blue: 0.13, alpha: 1.00)) + case .readyToSubmit, .prepareForSubmission: + return ("准备提交", NSColor(calibratedRed: 0.23, green: 0.64, blue: 0.40, alpha: 1.00)) + case .waitingForReview: + return ("正在等待审核", NSColor(calibratedRed: 0.900, green:0.658, blue:0.625, alpha:1.000)) + case .waitingForContentUpload: + return ("正在等待上传", NSColor(calibratedRed: 0.23, green: 0.64, blue: 0.40, alpha: 1.00)) + case .inReview, .pendingBinaryApproval: + return ("正在审核", NSColor(calibratedRed: 0.999, green:0.775, blue:0.031, alpha:1.000)) + case .pendingDeveloperRelease: + return ("等待开发人员发布", NSColor(calibratedRed: 0.23, green: 0.64, blue: 0.40, alpha: 1.00)) + case .rejected: + return ("被拒绝", NSColor(calibratedRed:0.548, green:0.145, blue:0.781, alpha:1.000)) + case .removedFromSale: + return ("被下架", NSColor(calibratedRed:0.906, green:0.148, blue:0.155, alpha:1.000)) + default: + return (self.rawValue, NSColor.secondaryLabelColor) + } + } +} + +// MARK: - 内购列表-新 +struct Product { + var type: String = "" + var id: String = "" + var referenceName: String = "" + var productId: String = "" + var inAppPurchaseType: InAppPurchaseType = .UNKNOW + var state: InAppPurchaseState = .unknown +} + +struct ProductList { + var products: [Product] + + init(body: [String: Any]) { + products = [Product]() + let data = dictionaryArray(body["data"]) + for temp in data { + var product = Product() + product.type = string(from: temp["type"]) + product.id = string(from: temp["id"]) + let attributes = dictionary(temp["attributes"]) + product.referenceName = string(from: attributes["referenceName"]) + product.productId = string(from: attributes["productId"]) + product.inAppPurchaseType = InAppPurchaseType(rawValue: string(from: attributes["inAppPurchaseType"])) ?? .UNKNOW + product.state = InAppPurchaseState(rawValue: string(from: attributes["state"])) ?? .unknown + products.append(product) + } + } +} + +// MARK: - 内购列表-旧 +struct IAPList { + struct IAP { + struct Version { + var screenshotUrl: String = "" + var itunesConnectStatus: String = "" + var issuesCount: Int = 0 + var canSubmit: Bool = false + + init(dict: [String: Any]) { + screenshotUrl = string(from: dict["screenshotUrl"]) + itunesConnectStatus = string(from: dict["itunesConnectStatus"]) + issuesCount = int(from: dict["issuesCount"]) ?? 0 + canSubmit = bool(from: dict["canSubmit"]) + } + } + + var familyReferenceName: String = "" + var durationDays: Int = 0 + var numberOfCodes: Int = 0 + var maximumNumberOfCodes: Int = 0 + var appMaximumNumberOfCodes: Int = 0 + var isEditable: Bool = false + var isRequired: Bool = false + var canDeleteAddOn: Bool = false + var errorKeys: String = "" + var itcsubmitNextVersion: Bool = false + var isEmptyValue: Bool = false + var adamId: String = "" // appleid + var referenceName: String = "" // 商品名称 + var vendorId: String = "" // 商品id + var addOnType: ITCAddOnType = .unknown // 商品类型 + var versions: [Version] = [] + var purpleSoftwareAdamIds: [String] = [] + var lastModifiedDate: String = "" + var isNewsSubscription: Bool = false + var iTunesConnectStatus: InAppPurchaseState = .unknown + + // detail + var status: String = "" // 状态 + var familySharable: Bool = false // 家庭共享 + var availableInAllTerritories: Bool = true // 可供销售 + var reviewNote: String = "" // 截图 + var reviewScreenshot: String = "" // 截图 + var localizations: [IAPLocalization] = [] // 本地化描述 + + mutating func updateDetail(body: [String: Any]) { + let data = dictionary(body["data"]) + status = string(from: dictionary(dictionary(data)["attributes"])["state"]) + reviewNote = string(from: dictionary(dictionary(data)["attributes"])["reviewNote"]) + familySharable = bool(from: dictionary(dictionary(data)["attributes"])["familySharable"]) + + let included = dictionaryArray(body["included"]) + for include in included { + guard let type = include["type"] as? String else { + return + } + + if type == "inAppPurchaseLocalizations" { + let attr = dictionary(include["attributes"]) + let name = string(from: attr["name"]) + let locale = string(from: attr["locale"]) + let description = string(from: attr["description"]) + localizations.append(IAPLocalization(name: name, description: description, locale: locale)) + } + + if type == "inAppPurchaseAppStoreReviewScreenshots" { + let attr = dictionary(include["attributes"]) + let asset = dictionary(attr["imageAsset"]) + let width = string(from: asset["width"]) + let height = string(from: asset["height"]) + let templateUrl = string(from: asset["templateUrl"]) + // {w}x{h}bb.{f} + let reviewScreenshot = templateUrl + .replacingOccurrences(of: "{w}", with: width) + .replacingOccurrences(of: "{h}", with: height) + .replacingOccurrences(of: "{f}", with: "png") + self.reviewScreenshot = reviewScreenshot + } + } + } + + // price + var priceTier: String = "" // 价格等级 + + mutating func updatePrices(body: [String: Any]) { + let included = dictionaryArray(body["included"]) + for include in included { + let attr = dictionary(include["attributes"]) + self.priceTier = string(from: attr["priceTier"]) + } + } + + /// 本地属性 + var isSelected = false // 是否标记为批量选中 + var curid = 0 // 数组中的序号 + + var app: App + init(app: App) { + self.app = app + } + } + + var iapList: [IAP] + var app: App + + init(body: [String: Any], app: App) { + iapList = [IAP]() + let data = dictionaryArray(body["data"]) + for i in 0.. Bool in + let nonDigits = CharacterSet.decimalDigits.inverted + let numStr1 = iap1.vendorId.trimmingCharacters(in: nonDigits) + let numStr2 = iap2.vendorId.trimmingCharacters(in: nonDigits) + return int(from: numStr1) ?? 0 < int(from: numStr2) ?? 0 + }) + self.app = app + } +} + diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/XMLModel.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/XMLModel.swift new file mode 100644 index 0000000..649e254 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/Models/XMLModel.swift @@ -0,0 +1,364 @@ +// +// XMLModel.swift +// AppleParty +// +// Created by 易承 on 2021/5/26. +// + +import Foundation +import SWXMLHash + + +struct In_App_Purchase { + + var product_id = "" // 商品id + var reference_name = "" // 商品名称 + var type: InAppPurchaseType = .UNKNOW // 商品类型 + var wholesale_price_tier = 0 // 价格等级 + var title = "" // 本地化title + var description = "" // 本地化描述 + var file_name = "" // 截图文件名 + var size = "" // 截图大小 + var checksum = "" // 截图md5 + var review_notes = "" // 商品描述 + var lang = "zh-Hans" // 本地化语言 + + var inputPrice = "" // 表格的价格 +} + +struct Screen_Shot { + var file_name = "" // 文件名 + var size = "" // 大小 + var checksum = "" // md5 + var position = "0" // 位置 + var preview_time = "00:00:05:00" //设置默认视频时间节点 +} + +struct XMLModel { + var provider = UserCenter.shared.developerTeamId // 公司名称 + var team_id = UserCenter.shared.developerTeamId // 开发者teamid + var vendor_id = "" // sku 套装id + + // 内购品项 + var iaps: [In_App_Purchase] = [] + + // 商店截图 + var app_locale = "zh-Hans" // 本地化语言 + var app_platform = "ios" // ios 或 osx + var app_version = "" //当前版本 + var app_title = "" //商店应用名 + var shots: [String: [Screen_Shot]] = [:] + var videos: [String: [Screen_Shot]] = [:] + + // 上传ipa文件 + var apple_id = "" // apple id + var archive_type = "bundle" //上传文件类型 + var ipa_name = "ipa.ipa" //默认包名 + var ipa_size = "" + var ipa_md5 = "" + + // 需要复制的文件 [fileName: fileURL] + var filePaths: [String: String] = [:] + + func createIAP(directoryPath: String) { + // 根标签 + let root = GDataXMLNode.element(withName: "package") + // package属性 + let version = GDataXMLNode.attribute(withName: "version", stringValue: "software5.11") as? GDataXMLNode + let xmlns = GDataXMLNode.attribute(withName: "xmlns", stringValue: "http://apple.com/itunes/importer") as? GDataXMLNode + root?.addAttribute(version) + root?.addAttribute(xmlns) + // provider\team_id + let pro = GDataXMLNode.element(withName: "provider", stringValue: provider) + let tid = GDataXMLNode.element(withName: "team_id", stringValue: team_id) + root?.addChild(pro) + root?.addChild(tid) + // software + // vendor_id + let software = GDataXMLNode.element(withName: "software") + let vid = GDataXMLNode.element(withName: "vendor_id", stringValue: vendor_id) + software?.addChild(vid) + // software_metadata/in_app_purchases + let software_metadata = GDataXMLNode.element(withName: "software_metadata") + let in_app_purchases = GDataXMLNode.element(withName: "in_app_purchases") + // in_app_purchase array + for iap in iaps { + let in_app_purchase = GDataXMLNode.element(withName: "in_app_purchase") + // product_id/reference_name/type + let product_id = GDataXMLNode.element(withName: "product_id", stringValue: iap.product_id) + let reference_name = GDataXMLNode.element(withName: "reference_name", stringValue: iap.reference_name) + let type = GDataXMLNode.element(withName: "type", stringValue: iap.type.rawValue) + // products + let products = GDataXMLNode.element(withName: "products") + let product = GDataXMLNode.element(withName: "product") + let cleared_for_sale = GDataXMLNode.element(withName: "cleared_for_sale", stringValue: "true") + let wholesale_price_tier = GDataXMLNode.element(withName: "wholesale_price_tier", stringValue: String(iap.wholesale_price_tier)) + product?.addChild(cleared_for_sale) + product?.addChild(wholesale_price_tier) + products?.addChild(product) + // locales + let locales = GDataXMLNode.element(withName: "locales") + let locale = GDataXMLNode.element(withName: "locale") + let name = GDataXMLNode.attribute(withName: "name", stringValue: iap.lang) as? GDataXMLNode + locale?.addAttribute(name) + let title = GDataXMLNode.element(withName: "title", stringValue: iap.title) + let description = GDataXMLNode.element(withName: "description", stringValue: iap.description) + locale?.addChild(title) + locale?.addChild(description) + locales?.addChild(locale) + // review_screenshot + let review_screenshot = GDataXMLNode.element(withName: "review_screenshot") + let file_name = GDataXMLNode.element(withName: "file_name", stringValue: iap.file_name) + let size = GDataXMLNode.element(withName: "size", stringValue: iap.size) + let checksum = GDataXMLNode.element(withName: "checksum", stringValue: iap.checksum) + let checksum_type = GDataXMLNode.attribute(withName: "type", stringValue: "md5") as? GDataXMLNode + checksum?.addAttribute(checksum_type) + review_screenshot?.addChild(file_name) + review_screenshot?.addChild(size) + review_screenshot?.addChild(checksum) + // review_notes + let review_notes = GDataXMLNode.element(withName: "review_notes", stringValue: iap.review_notes) + // 合并到in_app_purchase + in_app_purchase?.addChild(product_id) + in_app_purchase?.addChild(reference_name) + in_app_purchase?.addChild(type) + in_app_purchase?.addChild(products) + in_app_purchase?.addChild(locales) + in_app_purchase?.addChild(review_screenshot) + in_app_purchase?.addChild(review_notes) + in_app_purchases?.addChild(in_app_purchase) + } + software_metadata?.addChild(in_app_purchases) + software?.addChild(software_metadata) + root?.addChild(software) + // 生成xml文件 + let xmlDoc = GDataXMLDocument(rootElement: root) + let data = xmlDoc?.xmlData() +// let xmlString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) + // 保存文件 + // 创建文件夹 + if !FileManager.default.fileExists(atPath: directoryPath) { + do { + try FileManager.default.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil) + } catch { + print(error.localizedDescription); + } + } + // 创建文件 + let filePath = directoryPath + "/metadata.xml" + debugPrint(filePath) + if !FileManager.default.fileExists(atPath: filePath) { + FileManager.default.createFile(atPath: filePath, contents: data, attributes: nil) + }else { + try? FileManager.default.removeItem(atPath: filePath) + FileManager.default.createFile(atPath: filePath, contents: data, attributes: nil) + } + + for name in filePaths.keys { + let path = filePaths[name] ?? "" + try? FileManager.default.copyItem(atPath: path, toPath: directoryPath + "/" + name) + } + } + + + func createShots(directoryPath: String) { + // 根标签 + let root = GDataXMLNode.element(withName: "package") + // package属性 + let version = GDataXMLNode.attribute(withName: "version", stringValue: "software5.11") as? GDataXMLNode + let xmlns = GDataXMLNode.attribute(withName: "xmlns", stringValue: "http://apple.com/itunes/importer") as? GDataXMLNode + root?.addAttribute(version) + root?.addAttribute(xmlns) + // provider\team_id + let pro = GDataXMLNode.element(withName: "provider", stringValue: provider) + let tid = GDataXMLNode.element(withName: "team_id", stringValue: team_id) + root?.addChild(pro) + root?.addChild(tid) + // software + // vendor_id + let software = GDataXMLNode.element(withName: "software") + let vid = GDataXMLNode.element(withName: "vendor_id", stringValue: vendor_id) + software?.addChild(vid) + // software_metadata/in_app_purchases + let software_metadata = GDataXMLNode.element(withName: "software_metadata") + let app_platform = GDataXMLNode.attribute(withName: "app_platform", stringValue: app_platform) as? GDataXMLNode + software_metadata?.addAttribute(app_platform) + // versions + let s_versions = GDataXMLNode.element(withName: "versions") + let s_version = GDataXMLNode.element(withName: "version") + let app_version = GDataXMLNode.attribute(withName: "string", stringValue: app_version) as? GDataXMLNode + s_version?.addAttribute(app_version) + // locales + let locales = GDataXMLNode.element(withName: "locales") + let locale = GDataXMLNode.element(withName: "locale") + let locale_name = GDataXMLNode.attribute(withName: "name", stringValue: app_locale) as? GDataXMLNode + locale?.addAttribute(locale_name) + let locale_title = GDataXMLNode.element(withName: "title", stringValue: app_title) + locale?.addChild(locale_title) + + // app_previews + if videos.filter({ $0.value.count > 0 }).count > 0 { + let app_previews = GDataXMLNode.element(withName: "app_previews") + videos.forEach { (key: String, value: [Screen_Shot]) in + // app_preview + value.forEach { video in + let app_preview = GDataXMLNode.element(withName: "app_preview") + // display_target + let display_target = GDataXMLNode.attribute(withName: "display_target", stringValue: key) as? GDataXMLNode + app_preview?.addAttribute(display_target) + let position = GDataXMLNode.attribute(withName: "position", stringValue: video.position) as? GDataXMLNode + app_preview?.addAttribute(position) + // data_file + let data_file = GDataXMLNode.element(withName: "data_file") + let file_role = GDataXMLNode.attribute(withName: "role", stringValue: "source") as? GDataXMLNode + data_file?.addAttribute(file_role) + let file_size = GDataXMLNode.element(withName: "size", stringValue: video.size) + data_file?.addChild(file_size) + let file_name = GDataXMLNode.element(withName: "file_name", stringValue: video.file_name) + data_file?.addChild(file_name) + let checksum = GDataXMLNode.element(withName: "checksum", stringValue: video.checksum) + data_file?.addChild(checksum) + // data_file + let preview_image_time = GDataXMLNode.element(withName: "preview_image_time", stringValue: video.preview_time) + let preview_format = GDataXMLNode.attribute(withName: "format", stringValue: "30/1:1/nonDrop") as? GDataXMLNode + preview_image_time?.addAttribute(preview_format) + // 最后添加 + app_preview?.addChild(data_file) + app_preview?.addChild(preview_image_time) + app_previews?.addChild(app_preview) + } + + } + locale?.addChild(app_previews) + } + + if shots.filter({ $0.value.count > 0 }).count > 0 { + let app_screenshots = GDataXMLNode.element(withName: "software_screenshots") + shots.forEach { (key: String, value: [Screen_Shot]) in + // app_preview + value.forEach { video in + let app_screenshot = GDataXMLNode.element(withName: "software_screenshot") + // display_target + let display_target = GDataXMLNode.attribute(withName: "display_target", stringValue: key) as? GDataXMLNode + app_screenshot?.addAttribute(display_target) + let position = GDataXMLNode.attribute(withName: "position", stringValue: video.position) as? GDataXMLNode + app_screenshot?.addAttribute(position) + // data_file + let file_size = GDataXMLNode.element(withName: "size", stringValue: video.size) + app_screenshot?.addChild(file_size) + let file_name = GDataXMLNode.element(withName: "file_name", stringValue: video.file_name) + app_screenshot?.addChild(file_name) + let checksum = GDataXMLNode.element(withName: "checksum", stringValue: video.checksum) + app_screenshot?.addChild(checksum) + let checksum_type = GDataXMLNode.attribute(withName: "type", stringValue: "md5") as? GDataXMLNode + checksum?.addAttribute(checksum_type) + // 最后添加 + app_screenshots?.addChild(app_screenshot) + } + } + locale?.addChild(app_screenshots) + } + + locales?.addChild(locale) + s_version?.addChild(locales) + s_versions?.addChild(s_version) + software_metadata?.addChild(s_versions) + software?.addChild(software_metadata) + root?.addChild(software) + + // 生成xml文件 + let xmlDoc = GDataXMLDocument(rootElement: root) + let data = xmlDoc?.xmlData() + //let xmlString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) + // 创建文件夹 + if !FileManager.default.fileExists(atPath: directoryPath) { + do { + try FileManager.default.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil) + } catch { + print(error.localizedDescription); + } + } + + // 创建文件 + let filePath = directoryPath + "/metadata.xml" + debugPrint(filePath) + if !FileManager.default.fileExists(atPath: filePath) { + FileManager.default.createFile(atPath: filePath, contents: data, attributes: nil) + }else { + try? FileManager.default.removeItem(atPath: filePath) + FileManager.default.createFile(atPath: filePath, contents: data, attributes: nil) + } + + // 文件复制 + for name in filePaths.keys { + let path = filePaths[name] ?? "" + try? FileManager.default.copyItem(atPath: path, toPath: directoryPath + "/" + name) + } + } + + + func createIpaFile(directoryPath: String) { + // 根标签 + let root = GDataXMLNode.element(withName: "package") + // package属性 + let version = GDataXMLNode.attribute(withName: "version", stringValue: "software5.11") as? GDataXMLNode + let xmlns = GDataXMLNode.attribute(withName: "xmlns", stringValue: "http://apple.com/itunes/importer") as? GDataXMLNode + root?.addAttribute(version) + root?.addAttribute(xmlns) + // software_assets + let software_assets = GDataXMLNode.element(withName: "software_assets") + let apple_id = GDataXMLNode.attribute(withName: "apple_id", stringValue: apple_id) as? GDataXMLNode + let app_platform = GDataXMLNode.attribute(withName: "app_platform", stringValue: app_platform) as? GDataXMLNode + software_assets?.addAttribute(apple_id) + software_assets?.addAttribute(app_platform) + // asset + let asset = GDataXMLNode.element(withName: "asset") + let asset_type = GDataXMLNode.attribute(withName: "type", stringValue: archive_type) as? GDataXMLNode + asset?.addAttribute(asset_type) + //data_file + let data_file = GDataXMLNode.element(withName: "data_file") + let size = GDataXMLNode.element(withName: "size", stringValue: ipa_size) + let file_name = GDataXMLNode.element(withName: "file_name", stringValue: ipa_name) + let checksum = GDataXMLNode.element(withName: "checksum", stringValue: ipa_md5) + let checksum_type = GDataXMLNode.attribute(withName: "type", stringValue: "md5") as? GDataXMLNode + checksum?.addAttribute(checksum_type) + // 逆序添加 + data_file?.addChild(size) + data_file?.addChild(file_name) + data_file?.addChild(checksum) + asset?.addChild(data_file) + software_assets?.addChild(asset) + root?.addChild(software_assets) + + // 生成xml文件 + let xmlDoc = GDataXMLDocument(rootElement: root) + let data = xmlDoc?.xmlData() + let xmlString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) + print(xmlString as Any) + // 创建文件夹 + if !FileManager.default.fileExists(atPath: directoryPath) { + do { + try FileManager.default.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil) + } catch { + print(error.localizedDescription); + } + } + + // 创建文件 + let filePath = directoryPath + "/metadata.xml" + debugPrint(filePath) + if !FileManager.default.fileExists(atPath: filePath) { + FileManager.default.createFile(atPath: filePath, contents: data, attributes: nil) + }else { + try? FileManager.default.removeItem(atPath: filePath) + FileManager.default.createFile(atPath: filePath, contents: data, attributes: nil) + } + + // 文件复制 + for name in filePaths.keys { + let path = filePaths[name] ?? "" + try? FileManager.default.copyItem(atPath: path, toPath: directoryPath + "/" + name) + } + + } +} diff --git a/AppleParty/AppleParty/AppListView/InAppPurchseView/OutputExcelVC.swift b/AppleParty/AppleParty/AppListView/InAppPurchseView/OutputExcelVC.swift new file mode 100644 index 0000000..52d0f49 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/InAppPurchseView/OutputExcelVC.swift @@ -0,0 +1,67 @@ +// +// OutputExcelVC.swift +// AppleParty +// +// Created by 易承 on 2020/12/23. +// + +import Cocoa + +class OutputExcelVC: NSViewController, NSTextViewDelegate { + + @IBOutlet var inputText: NSTextView! + @IBOutlet weak var outputView: NSScrollView! + @IBOutlet var outputText: NSTextView! + + @IBOutlet weak var inputCount: NSTextField! + @IBOutlet weak var outputCount: NSTextField! + + var inputs = [String]() + var outputs = [String]() + + var iapList: [IAPList.IAP] = [] + + override func viewDidLoad() { + super.viewDidLoad() + inputText.delegate = self + } + + @IBAction func close(_ sender: Any) { + dismiss(self) + } + + @IBAction func commit(_ sender: Any) { + outputs.removeAll() + for i in 0.. 0 } + inputCount.stringValue = String(inputs.count)+"/100" + } + + func checkCount() -> Bool { + guard inputs.count == outputs.count else { + inputCount.textColor = NSColor.red + outputCount.textColor = NSColor.red + return false + } + inputCount.textColor = NSColor.lightGray + outputCount.textColor = NSColor.lightGray + return true + } +} diff --git a/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.swift b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.swift new file mode 100644 index 0000000..c4af39a --- /dev/null +++ b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.swift @@ -0,0 +1,18 @@ +// +// ScreenShotHelpPopoverVC.swift +// AppleParty +// +// Created by HTC on 2022/2/28. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class ScreenShotHelpPopoverVC: NSViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + +} diff --git a/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.xib b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.xib new file mode 100644 index 0000000..20874a3 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotHelpPopoverVC.xib @@ -0,0 +1,1824 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +IAo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +- 5.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2208 x 1242 +- 6.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2688 x 1242 +- 12.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2732 x 2048 +- macOS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2880 x 1800 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +IAo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +- 5.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1920 x 1080 +- 6.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1920 x 886 +- 12.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1200 x 900 +- 12.9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1600 x 1200 +- macOS + + + + + + + + + + + + + + + + + + + + + + + + + 1920 x 1080 + + + + + + + + + + + + + + + 语言代码: +zh-Hans:中文(简体) +zh-Hant:中文(繁体) +ko:韩文 +ja:日文 + + + + + + + + + + + + + + + +Cg + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + + + + + + + + + + + + + + +2 + + + + + + + + + + + + + + + + + + + + + + + + + +3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +6 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 预览视频为可选项,可以不上传。 + + + + + + + + + + + + + + +Cg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUpload.storyboard b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUpload.storyboard new file mode 100644 index 0000000..05b939d --- /dev/null +++ b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUpload.storyboard @@ -0,0 +1,526 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadCell.swift b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadCell.swift new file mode 100644 index 0000000..53ee3ef --- /dev/null +++ b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadCell.swift @@ -0,0 +1,74 @@ +// +// ScreenShotUploadCell.swift +// AppleParty +// +// Created by HTC on 2022/2/25. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa +import Foundation + + +class ScreenShotDeleteCell: NSTableCellView { + + typealias CallFunc = (_ row: Int) -> Void + var deleteCell: CallFunc? + var row: Int = 0 + + @IBOutlet weak var deleteBtn: NSButton! + + @IBAction func clickedDeleteBtn(_ sender: NSButton) { + if let callBack = deleteCell { + callBack(row) + } + } +} + +class ScreenShotUploadCell: NSTableCellView { + + typealias CallBackHandler = (_ value: String, _ row: Int) -> Void + var changeSortIndex: CallBackHandler? + var changeVideoFrame: CallBackHandler? + var row: Int = 0 + + @IBOutlet weak var sortField: NSTextField! + @IBOutlet weak var videoField: NSTextField! + @IBOutlet weak var videoTitleField: NSTextField! + + @IBOutlet weak var cellTopConstraint: NSLayoutConstraint! + + override func awakeFromNib() { + super.awakeFromNib() + + sortField.delegate = self + videoField.delegate = self + } + + func updateData(sort: String, frame: String) { + sortField.stringValue = sort + videoField.stringValue = frame + } + + func showVideoView(_ show: Bool) { + videoField.isHidden = !show + videoTitleField.isHidden = !show + cellTopConstraint.constant = show ? 10.0 : 20.0 + } + +} + +extension ScreenShotUploadCell: NSTextFieldDelegate { + /// 内容改变 + func controlTextDidChange(_ obj: Notification) { + let textField = obj.object as! NSTextField + let value = textField.stringValue + if textField.tag == sortField.tag, let callBack = changeSortIndex { + callBack(value, row) + } + + if textField.tag == videoField.tag, let callBack = changeVideoFrame { + callBack(value, row) + } + } +} diff --git a/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadVC.swift b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadVC.swift new file mode 100644 index 0000000..ae69288 --- /dev/null +++ b/AppleParty/AppleParty/AppListView/ScreenShotsView/ScreenShotUploadVC.swift @@ -0,0 +1,515 @@ +// +// ScreenShotUploadVC.swift +// AppleParty +// +// Created by HTC on 2022/2/25. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa +import AVFoundation + +enum ScreenShotType: Int { + case iOS5_5 = 0 //iPhone 5.5 英寸显示屏 + case iOS6_5 = 1 //iPhone 6.5 英寸显示屏 + case iPad_Pro = 2 //iPad Pro 12.9 英寸显示屏 +} + +class ScreenShotUploadVC: NSViewController { + + public var currentApp: App? { + didSet { + fetchAppInfo() + fetchAppVersionData() + } + } + public var appInfo: AppInfo? + + @IBOutlet weak var appName: NSTextField! + @IBOutlet weak var appSKU: NSTextField! + @IBOutlet weak var appleID: NSTextField! + @IBOutlet weak var localButton: NSPopUpButton! + + @IBOutlet weak var tableView: NSTableView! + @IBOutlet weak var tips_title: NSTextField! + @IBOutlet weak var tips_count: NSTextField! + @IBOutlet weak var tips_desc: NSTextField! + + private var selectTag = 0 + private var filesData = [[[String:String]]](repeating: [[String:String]](), count: 3) + + private let imageTypes = ["jpg", "jpeg", "png", "JPG", "JPEG", "PNG"] + private let videoTypes = ["mov", "m4v", "mp4", "MOV", "M4V", "MP4"] + private let locales = ["zh-Hans", "zh-Hant", "ko", "ja"] + + private let imageSizes = ["0": ["1242x2208", "2208x1242"], + "1": ["1242x2688", "2688x1242"], + "2": ["2048x2732", "2732x2048"]] + + private let videoSizes = ["0": ["1080x1920", "1920x1080"], + "1": ["886x1920", "1920x886"], + "2": ["1200x1600", "1600x1200"]] + + private var app_name = "" + private var app_version = "" + private var uploadModel = XMLModel() + + override func viewDidLoad() { + super.viewDidLoad() + + setupView() + } + + func setupView() { + + tableView.delegate = self + tableView.dataSource = self + tableView.selectionHighlightStyle = .none + + localButton.removeAllItems() + for locale in locales { + localButton.addItem(withTitle: locale) + } + localButton.selectItem(at: 0) + + let teamId = UserCenter.shared.developerTeamId + if teamId.isEmpty { + fetchAccountTeamInfo() + } else { + appleID.stringValue = "Team ID: " + UserCenter.shared.developerTeamId + } + } + + @IBAction func clickedUploadButton(_ sender: NSButton) { + + guard filesData.filter({ $0.count > 0 }).count > 0 else { + APHUD.hide(message: "图片或视频不能为空!", view: self.view, delayTime: 1) + return + } + + guard app_name.count > 0, app_version.count > 0 else { + APHUD.hide(message: "应用名和版本获取失败!请刷新重试~", view: self.view, delayTime: 1) + return + } + + guard let sp = UserCenter.shared.currentSPassword else { + let vc = APSPasswordSettingVC() + vc.updateCompletion = { [weak self] spassword in + if let sp = spassword { + self?.uploadData(sp) + } + } + presentAsSheet(vc) + return + } + + uploadData(sp) + } + + @IBAction func reloadAppData(_ sender: Any) { + fetchAppVersionData() + } + + @IBAction func clickedHelp(_ sender: NSButton) { + let vc = ScreenShotHelpPopoverVC() + self.present(vc, asPopoverRelativeTo: sender.frame, of: self.view, preferredEdge: .maxX, behavior:.transient) + } + + + @IBAction func changeSegmentedControl(_ sender: NSSegmentedControl) { + selectTag = sender.selectedTag() + reloadTableView(ScreenShotType.init(rawValue: selectTag) ?? .iOS5_5) + } + + @IBAction func uploadFiles(_ sender: NSButton) { + + let openPanel = NSOpenPanel() + openPanel.canChooseFiles = true + openPanel.canChooseDirectories = true + openPanel.allowsMultipleSelection = true + openPanel.allowedFileTypes = imageTypes + videoTypes + + openPanel.beginSheetModal(for: self.view.window!) { [self] (modalResponse) in + if modalResponse == .OK { + handleAutoImages(openPanel.urls) + } + } + } + +} + +// MARK: - 网络请求 +extension ScreenShotUploadVC { + + func fetchAccountTeamInfo() { + // 获取开发者 Team id 信息 + APClient.ascProvider.request { [weak self] result, response, error in + guard let err = error else { + self?.appleID.stringValue = "Team ID: " + UserCenter.shared.developerTeamId + return + } + APHUD.hide(message: err.localizedDescription, delayTime: 2) + } + } + + func fetchAppInfo(_ replay: Int = 3) { + guard let appid = currentApp?.appId else { + APHUD.hide(message: "当前 App 的 appleid 为空!", delayTime: 1) + return + } + + APClient.appInfo(appid: appid).request(showLoading: true) { [weak self] result, response, error in + if let err = error { + if replay > 0 { + self?.fetchAppInfo(replay-1) + } else { + NSAlert.show(err.localizedDescription) + } + return + } + let info = AppInfo(body: result) + self?.appInfo = info + self?.appSKU.stringValue = "App SKU: \(info.sku)" + } + + } + + func fetchAppVersionData(_ replay: Int = 3) { + + guard let appid = currentApp?.appId else { + APHUD.hide(message: "当前 App 的 appleid 为空!", delayTime: 1) + return + } + + APClient.appVersion(appid: appid).request { [weak self] data, response, error in + + if let err = error { + if replay > 0 { + self?.fetchAppVersionData(replay-1) + } else { + NSAlert.show(err.localizedDescription) + } + return + } + + let data = data["data"] as? [String: Any] + var dict = [String: Any]() + if let data = data, let platforms = data["platforms"] as? [[String: Any]] { + platforms.forEach { pf in + let platformString = pf["platformString"] as! String + dict[platformString] = pf + } + } + + guard let ios = dict["ios"] as? [String: Any], let inFlightVersion = ios["inFlightVersion"] as? [String: Any] else { + NSAlert.show("当前 App 无待送审的版本,请检查确认!") + return + } + + self?.app_version = inFlightVersion["version"] as! String + + if let data = data, let titles = data["localizedMetadata"] as? [[String: Any]] { + if titles.count > 0 { + // 这里只读取第一个 + self?.app_name = titles[0]["name"] as! String + } + } + + DispatchQueue.main.async { [self] in + self?.appName.stringValue = "App Name: \(self!.app_name) (\(self!.app_version))" + } + + } + } +} + + +// MARK: - NSTableViewDelegate +extension ScreenShotUploadVC: NSTableViewDelegate, NSTableViewDataSource { + func numberOfRows(in tableView: NSTableView) -> Int { + return filesData[selectTag].count + } + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + + var data = filesData[selectTag][row] + let isImg = data["type"]! == "1" + + switch tableColumn!.identifier.rawValue { + case "review": + let imgView = NSImageView() + if let imageRef = NSImage(byReferencingFile: data["url"]!) { + imgView.image = imageRef + } + if !isImg { + let url = URL(fileURLWithPath: data["url"]!) + let videoImg = previewImageForLocalVideo(url) + imgView.image = videoImg + } + return imgView + case "fileName": + let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "fileName"), owner: self) as? NSTableCellView + cell?.textField?.stringValue = "\(isImg ? "图片" : "视频"):\n\(data["name"]!)" + return cell + case "setting": + let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "setting"), owner: self) as? ScreenShotUploadCell + cell?.row = row + cell?.showVideoView(!isImg) + cell?.updateData(sort: data["index"] ?? "", frame: data["frame"] ?? "00:00") + cell?.changeSortIndex = { index, crow in + data["index"] = index + self.filesData[self.selectTag][row] = data + } + cell?.changeVideoFrame = { frame, crow in + data["frame"] = frame + self.filesData[self.selectTag][row] = data + } + return cell + case "operation": + let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "operation"), owner: self) as? ScreenShotDeleteCell + cell?.row = row + cell?.deleteCell = { row in + self.filesData[self.selectTag].remove(at: row) + self.tableView.reloadData() + self.reloadTableView(ScreenShotType(rawValue: self.selectTag) ?? .iOS5_5) + } + return cell + default: + return nil + } + } + + func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat { + 80 + } + + func tableView(_ tableView: NSTableView, shouldSelectRow row: Int) -> Bool { + // macOS 11 以下,如果不能点击,textfield 也不能点击 + return true + } +} + + +// MARK: - Upload +extension ScreenShotUploadVC { + + func uploadData(_ sp: SPassword) { + + APHUD.show(message: "上传中", view: self.view) + + let localIndex = localButton.indexOfSelectedItem + + DispatchQueue.global(qos: .userInitiated).async { [self] in + + uploadModel = XMLModel() + + guard let info = appInfo else { + fetchAppInfo() + APHUD.hide(message: "加载数据异常,请刷新后重试~") + return + } + + uploadModel.vendor_id = info.sku + + // 获取创建 itms 文件的路径 + let filePath = XMLManager.getShotsPath(currentApp!.appId) + + // 先删除旧的文档 + XMLManager.deleteITMS(filePath) + + // 数据转模型 + handleDataToModel(localIndex) + + uploadModel.createShots(directoryPath: filePath) + + let result = XMLManager.uploadITMS(account: sp.account, pwd: sp.password, filePath: filePath) + + DispatchQueue.main.async { + APHUD.hide() + self.closeSelfAndCallBack(result) + } + } + } + + func handleDataToModel(_ localIndex: Int) { + + let locale = locales[localIndex] + uploadModel.app_locale = locale + uploadModel.app_title = app_name + uploadModel.app_version = app_version + + let iOS5_5 = filesData[0] + let iOS6_5 = filesData[1] + let iPad = filesData[2] + + //iPhone 5.5 英寸 + let (img5_5, video5_5, set5_5) = getScreenShotModel(iOS5_5) + uploadModel.shots["iOS-5.5-in"] = img5_5 + uploadModel.videos["iOS-5.5-in"] = video5_5 + + //iPhone 6.5 英寸 + let (img6_5, video6_5, set6_5) = getScreenShotModel(iOS6_5) + uploadModel.shots["iOS-6.5-in"] = img6_5 + uploadModel.videos["iOS-6.5-in"] = video6_5 + + let (imgiPad, videoiPad, setiPad) = getScreenShotModel(iPad) + //iPad Pro(第2代) 12.9 英寸 + uploadModel.shots["iOS-iPad-Pro"] = imgiPad + uploadModel.videos["iOS-iPad-Pro"] = videoiPad + //iPad Pro(第3代) 12.9 英寸 + uploadModel.shots["iOS-iPad-Pro-2018"] = imgiPad + uploadModel.videos["iOS-iPad-Pro-2018"] = videoiPad + + // 图片和视频资源 + let fileURLs = set5_5.union(set6_5).union(setiPad) + var dict = [String: String]() + fileURLs.forEach { value in + value.forEach { dict[$0] = $1 } + } + uploadModel.filePaths = dict + } + + func getScreenShotModel(_ shots: [[String: String]]) -> ([Screen_Shot], [Screen_Shot], Set<[String:String]>) { + var imageList = [Screen_Shot]() + var videoList = [Screen_Shot]() + var urlList: Set<[String:String]> = [] + shots.forEach { data in + let isImg = data["type"]! == "1" + let url = data["url"] ?? "" + let kind = data["kind"] ?? "" + let name = kind + (data["name"] ?? "") //kind+name:避免不同尺寸使用同一个图片名字,导致替换的问题 + let index = data["index"] ?? "" + let frame = "00:00:" + (data["frame"] ?? "00:00") + let size = URL.init(fileURLWithPath: url).fileSize() + let md5 = URL.init(fileURLWithPath: url).fileMD5() + let item = Screen_Shot(file_name: name, size: size, checksum: md5 ?? "", position: index, preview_time: frame) + urlList.insert([name: url]) + isImg ? imageList.append(item) : videoList.append(item) + } + return (imageList, videoList, urlList) + } + + func closeSelfAndCallBack(_ result: (Int32, String?)) { + + if result.0 == 0 { + NSAlert.show("上传成功!稍后可在苹果后台查看~") + // 删除旧的文档,避免占用空间过大 + let filePath = XMLManager.getShotsPath(currentApp!.appId) + XMLManager.deleteITMS(filePath) + } else { + let sb = NSStoryboard(name: "APDebugVC", bundle: Bundle(for: self.classForCoder)) + let newWC = sb.instantiateController(withIdentifier: "APDebugWC") as? NSWindowController + let logVC = newWC?.contentViewController as? APDebugVC + newWC?.window?.title = "上传错误日志" + logVC?.debugLog = result.1 ?? "" + newWC?.showWindow(self) + } + } +} + +// MARK: - 内部方法 +extension ScreenShotUploadVC { + + func handleAutoImages(_ files: [URL]) { + files.forEach { url in + // 如果是文件夹,则递归 + if url.hasDirectoryPath { + let urls = subFilesInDirectory(url: url) + handleAutoImages(urls) + return + } + var size = "0x0" + var sizes = [String: [String]]() + var type = "1" + let fileType = url.pathExtension + if imageTypes.contains(fileType) { + let image = NSImage(contentsOf: url) + guard let rep = image?.representations.first as? NSBitmapImageRep else { + return + } + size = "\(rep.pixelsWide)x\(rep.pixelsHigh)" + sizes = imageSizes + type = "1" + } else if videoTypes.contains(fileType) { + guard let track = AVURLAsset(url: url).tracks(withMediaType: AVMediaType.video).first else { + return + } + let rep = track.naturalSize.applying(track.preferredTransform) + size = "\(Int(rep.width))x\(Int(rep.height))" + sizes = videoSizes + type = "2" + } + + sizes.forEach { (index: String, value: [String]) in + if value.contains(size) { + // 处理数据 + var dict = [String: String]() + dict["url"] = url.path + dict["name"] = url.lastPathComponent + dict["type"] = type + dict["kind"] = index + // 更新数据 + var value = filesData[Int(index)!] + value.append(dict) + filesData[Int(index)!] = value + } + } + } + // 刷新列表 + reloadTableView(ScreenShotType.init(rawValue: selectTag) ?? .iOS5_5) + } + + func subFilesInDirectory(url: URL) -> [URL] { + var urls = [URL]() + // 迭代器,包含子目录 + let files = FileManager.default.enumerator(atPath: url.path) + while let file = files?.nextObject() { + if let file = file as? String { + let nextFile = url.appendingPathComponent(file) + if !nextFile.hasDirectoryPath { + urls.append(nextFile) + } + } + } + return urls + } + + func reloadTableView(_ index: ScreenShotType) { + let list = filesData[index.rawValue] + let images = list.filter({ $0["type"] == "1" }) + tips_count.stringValue = "\(list.count - images.count)/3 个 App 预览 | \(images.count)/10 张屏幕快照" + switch index { + case .iOS5_5: + tips_title.stringValue = "iPhone 5.5 英寸显示屏" + tips_desc.stringValue = "图片:1242 x 2208、2208 x 1242,视频:1080 x 1920、1920 x 1080" + case .iOS6_5: + tips_title.stringValue = "iPhone 6.5 英寸显示屏" + tips_desc.stringValue = "图片:1242 x 2688、2688 x 1242,视频:886 x 1920、1920 x 886" + case .iPad_Pro: + tips_title.stringValue = "iPad Pro 12.9 英寸显示屏" + tips_desc.stringValue = "图片:2048 x 2732、2732 x 2048,视频:1200 x 1600、1600 x 1200" + } + + tableView.reloadData() + } + + func previewImageForLocalVideo(_ url: URL) -> NSImage? { + let asset = AVAsset(url: url) + let imageGenerator = AVAssetImageGenerator(asset: asset) + imageGenerator.appliesPreferredTrackTransform = true + var time = asset.duration + //If possible - take not the first frame (it could be completely black or white on camara's videos) + time.value = min(time.value, 2) + do { + let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil) + let track = asset.tracks(withMediaType: AVMediaType.video).first + let rep = track?.naturalSize.applying(track?.preferredTransform ?? CGAffineTransform()) + return NSImage(cgImage: imageRef, size: NSSize(width: rep?.width ?? 120, height: rep?.height ?? 60)) + } + catch let error as NSError + { + print("Image generation failed with error \(error)") + return nil + } + } +} diff --git a/AppleParty/AppleParty/AppListView/zh-Hans.lproj/AppList.strings b/AppleParty/AppleParty/AppListView/zh-Hans.lproj/AppList.strings new file mode 100644 index 0000000..57ae3cb --- /dev/null +++ b/AppleParty/AppleParty/AppListView/zh-Hans.lproj/AppList.strings @@ -0,0 +1,3 @@ + +/* Class = "NSWindow"; title = "My Apps"; ObjectID = "mcp-fI-0bQ"; */ +"mcp-fI-0bQ.title" = "我的 App"; diff --git a/AppleParty/AppleParty/AppSettingView/APSettingVC.swift b/AppleParty/AppleParty/AppSettingView/APSettingVC.swift new file mode 100644 index 0000000..e66407d --- /dev/null +++ b/AppleParty/AppleParty/AppSettingView/APSettingVC.swift @@ -0,0 +1,49 @@ +// +// SettingVC.swift +// AppleParty +// +// Created by HTC on 2022/3/25. +// Copyright © 2021 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APSettingVC: NSViewController { + + var isLoginViewShow: Bool { + get { return false } + set { + sPasswordBtn.isHidden = newValue + clearCacheBtn.isHidden = !newValue + } + } + + @IBOutlet weak var trusDeviceBtn: NSButton! + @IBOutlet weak var sPasswordBtn: NSButton! + @IBOutlet weak var clearCacheBtn: NSButton! + + @IBAction func clickedTrusDeviceBtn(_ sender: NSButton) { + InfoCenter.shared.trusDevice = sender.state == .on ? true : false + } + + @IBAction func clickedSPasswordBtn(_ sender: Any) { + let vc = APSPasswordSettingVC() + presentAsSheet(vc) + } + + + @IBAction func clickedClearCacheBtn(_ sender: NSButton) { + // 清掉缓存 + HTTPCookieStorage.shared.cookies?.forEach(HTTPCookieStorage.shared.deleteCookie) + InfoCenter.shared.cookies = [] + APHUD.hide(message: "清掉缓存成功", view: self.view) + } + + + override func viewDidLoad() { + super.viewDidLoad() + title = "App设置" + trusDeviceBtn.state = InfoCenter.shared.trusDevice ? .on : .off + } + +} diff --git a/AppleParty/AppleParty/AppSettingView/APSettingVC.xib b/AppleParty/AppleParty/AppSettingView/APSettingVC.xib new file mode 100644 index 0000000..d4539bf --- /dev/null +++ b/AppleParty/AppleParty/AppSettingView/APSettingVC.xib @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/AppleParty-Bridging-Header.h b/AppleParty/AppleParty/AppleParty-Bridging-Header.h new file mode 100644 index 0000000..32e051f --- /dev/null +++ b/AppleParty/AppleParty/AppleParty-Bridging-Header.h @@ -0,0 +1,7 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "GDataXMLNode.h" +#import "QrcodeUtil.h" +#import "MBProgressHUD.h" diff --git a/AppleParty/AppleParty/AppleParty.entitlements b/AppleParty/AppleParty/AppleParty.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/AppleParty/AppleParty/AppleParty.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/AppleParty/AppleParty/EmailToolView/EmailSettingVC.swift b/AppleParty/AppleParty/EmailToolView/EmailSettingVC.swift new file mode 100644 index 0000000..4e1627e --- /dev/null +++ b/AppleParty/AppleParty/EmailToolView/EmailSettingVC.swift @@ -0,0 +1,61 @@ +// +// EmailSettingVC.swift +// AppleParty +// +// Created by HTC on 2022/3/29. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + + +struct EamilConfigs { + var name: String = "" + var addr: String = "" + var pwd: String = "" + var smtp: String = "" +} + +var eamilConfigs: EamilConfigs? { + get { + let value = (try? APUtil.keychain.getString("APEmailSetting_Key")) ?? "" + let arr = value.components(separatedBy: "|") + guard arr.count == 4 else { + return nil + } + return EamilConfigs(name: arr[0], addr: arr[1], pwd: arr[2], smtp: arr[3]) + } + set { + guard let newValue = newValue else { return } + let value = "\(newValue.name)|\(newValue.addr)|\(newValue.pwd)|\(newValue.smtp)" + try? APUtil.keychain.set(value, key: "APEmailSetting_Key") + } +} + +class EmailSettingVC: NSViewController { + + public var closeHandle: (() -> Void)? + + @IBOutlet weak var emailNameView: NSTextField! + @IBOutlet weak var emailAddrView: NSTextField! + @IBOutlet weak var emailPwdView: NSTextField! + @IBOutlet weak var emailSMTPView: NSTextField! + + + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + + @IBAction func clickedCancelBtn(_ sender: Any) { + closeHandle?() + } + + @IBAction func clickedSubmitBtn(_ sender: Any) { + + eamilConfigs = EamilConfigs(name: emailNameView.stringValue, addr: emailAddrView.stringValue, pwd: emailPwdView.stringValue, smtp: emailSMTPView.stringValue) + closeHandle?() + } + +} diff --git a/AppleParty/AppleParty/EmailToolView/EmailSettingVC.xib b/AppleParty/AppleParty/EmailToolView/EmailSettingVC.xib new file mode 100644 index 0000000..e781101 --- /dev/null +++ b/AppleParty/AppleParty/EmailToolView/EmailSettingVC.xib @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/EmailToolView/EmailTool.storyboard b/AppleParty/AppleParty/EmailToolView/EmailTool.storyboard new file mode 100644 index 0000000..751a1a1 --- /dev/null +++ b/AppleParty/AppleParty/EmailToolView/EmailTool.storyboard @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/EmailToolView/EmailToolVC.swift b/AppleParty/AppleParty/EmailToolView/EmailToolVC.swift new file mode 100644 index 0000000..2a48aac --- /dev/null +++ b/AppleParty/AppleParty/EmailToolView/EmailToolVC.swift @@ -0,0 +1,247 @@ +// +// EmailToolVC.swift +// AppleParty +// +// Created by iHTC on 20211025. +// Copyright © 2021 37 Mobile Games. All rights reserved. +// + +import Cocoa + + +class EmailToolVC: NSViewController { + + var emailTitle: String? { + didSet { + if let text = emailTitle { + emailTitleTF.stringValue = text + } + } + } + + var emailContent: String? { + didSet { + if let text = emailContent { + emailContentTextView.string = text + } + } + } + + var attachmentFileUrl: URL? { + didSet { + if let url = attachmentFileUrl { + fileURLs?.append(url) + fileDropZoneView.setFile(url) + } + } + } + + @IBOutlet weak var emailRecipientTF: NSTextField! + @IBOutlet weak var rememberEmailButton: NSButton! + @IBOutlet weak var emailTitleTF: NSTextField! + @IBOutlet weak var emailSendButton: NSButton! + @IBOutlet weak var emailContentTextView: NSTextView! + @IBOutlet weak var emialContentView: NSScrollView! + @IBOutlet weak var multipleFilesButton: NSButton! + @IBOutlet weak var selectFilesButton: NSButton! + @IBOutlet weak var clearnAllFilesButton: NSButton! + @IBOutlet weak var selectFilesView: NSScrollView! + @IBOutlet weak var selectilesTextView: NSTextView! + + private var fileDropZoneView = DropZoneView(fileTypes: [], text: "点击或拖拽文件到这里") + private var fileURLs: [URL]? + // 邮件地址 + private var emailsString: String { + get { string(from: UserDefaults.standard.object(forKey: "EmailToolVC_RememberEmailString")) } + set { UserDefaults.standard.setValue(newValue, forKey: "EmailToolVC_RememberEmailString") } + } + + private lazy var settingPopover: NSPopover = { + let settingPopover = NSPopover() + let vc = EmailSettingVC() + vc.closeHandle = { + settingPopover.close() + } + settingPopover.contentViewController = vc + return settingPopover + }() + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + } + + + func setupUI() { + + if emailsString.count > 0 { + emailRecipientTF.stringValue = emailsString + rememberEmailButton.state = .on + } else { + rememberEmailButton.state = .off + } + + fileDropZoneView.translatesAutoresizingMaskIntoConstraints = false + fileDropZoneView.delegate = self + view.addSubview(fileDropZoneView) + fileDropZoneView.snp.makeConstraints { (make) in + make.top.equalTo(multipleFilesButton.snp.bottom).offset(15) + make.left.equalToSuperview().offset(20) + make.right.equalToSuperview().offset(-20) + make.bottom.equalToSuperview().offset(-30) + } + + } + + + func validEmail() -> [String]? { + + let recipient = emailRecipientTF.stringValue + guard recipient.count > 0 else { + APHUD.hide(message: "收件人邮箱不能为空!", view: self.view, delayTime: 2) + return nil + } + + let allEmails = recipient.components(separatedBy: [";", ";", ",", ","]).filter({!$0.isEmpty}) + let emails = allEmails.filter({ isEmailValid($0) }) + if emails.isEmpty { + APHUD.hide(message: "收件人邮箱格式不正确!", view: self.view, delayTime: 2) + return nil + } + + return emails + } + + @IBAction func clickedEmailSettingButton(_ sender: NSButton) { + + if settingPopover.isShown { + settingPopover.performClose(self) + }else { + settingPopover.show(relativeTo: sender.bounds, of: sender, preferredEdge: NSRectEdge.minY) + } + } + + + @IBAction func sendEmailButton(_ sender: NSButton) { + guard let config = eamilConfigs else { + APHUD.hide(message: "请先设置邮箱服务器信息!", view: self.view, delayTime: 2) + return + } + + // 收件人 + guard let emails = validEmail() else { + return + } + + sender.isEnabled = false + + APHUD.show(message: "发送中...", view: self.view) + + var title = emailTitleTF.stringValue + if title.isEmpty { + title = "邮件助手" + } + + let contents = "

\(emailContentTextView.textStorage?.string ?? "")

".replacingOccurrences(of: "\n", with: "
") + + var files = [String]() + fileURLs?.forEach({ url in + files.append(url.path) + }) + + // 发送邮件 + EmailUtils.autoSendAtts(subject: "AppleParty — \(title)", recipients: emails, htmlContent: contents, attachmentFiles: files, config: config) { error in + DispatchQueue.main.async { + sender.isEnabled = true + APHUD.hide() + debugPrint(error as Any) + var msg = "邮箱发送成功~" + if let err = error { + msg = "邮箱发送失败:\(String(describing: err))" + } + NSAlert.show(msg) + } + } + } + + @IBAction func rememberEmail(_ sender: Any) { + // 收件人 + guard validEmail() != nil else { + return + } + + emailsString = emailRecipientTF.stringValue + } + + @IBAction func ChangeMultipleFiles(_ sender: NSButton) { + + clearnAllFiles(clearnAllFilesButton) + + if sender.state == .on { + fileDropZoneView.isHidden = true + selectFilesButton.isHidden = false + clearnAllFilesButton.isHidden = false + selectFilesView.isHidden = false + + } else { + fileDropZoneView.reset() + fileDropZoneView.isHidden = false + selectFilesButton.isHidden = true + clearnAllFilesButton.isHidden = true + selectFilesView.isHidden = true + } + } + + @IBAction func clearnAllFiles(_ sender: NSButton) { + fileURLs = [] + selectilesTextView.string = "" + } + + @IBAction func selectFiles(_ sender: Any) { + let openPanel = NSOpenPanel() + openPanel.canChooseFiles = true + openPanel.canChooseDirectories = false + openPanel.allowsMultipleSelection = true + + openPanel.beginSheetModal(for: self.view.window!) { [self] (modalResponse) in + if modalResponse == .OK { + self.fileURLs?.append(contentsOf: openPanel.urls) + self.updateFilesView() + } + } + } + + func updateFilesView() { + fileURLs?.forEach({ file in + let path = file.lastPathComponent + selectilesTextView.string.append(path + "\n") + }) + + selectilesTextView.scrollRangeToVisible(NSMakeRange(selectilesTextView.string.count, 0)) + } +} + + +// MARK: - DropZoneViewDelegate +extension EmailToolVC: DropZoneViewDelegate { + + func receivedFile(dropZoneView: DropZoneView, fileURL: URL) { + fileURLs = [fileURL] + } + + func receivedMouseDown(dropZoneView: DropZoneView, theEvent: NSEvent) { + let openPanel = NSOpenPanel() + openPanel.canChooseFiles = true + openPanel.canChooseDirectories = false + openPanel.allowsMultipleSelection = false + + openPanel.beginSheetModal(for: self.view.window!) { (modalResponse) in + if modalResponse == .OK { + if let fileURL = openPanel.url { + self.fileURLs = [fileURL] + dropZoneView.setFile(fileURL) + } + } + } + } +} diff --git a/AppleParty/AppleParty/IPAUpload/APIPAUploadVC.swift b/AppleParty/AppleParty/IPAUpload/APIPAUploadVC.swift new file mode 100644 index 0000000..358c404 --- /dev/null +++ b/AppleParty/AppleParty/IPAUpload/APIPAUploadVC.swift @@ -0,0 +1,174 @@ +// +// APIPAUploadVC.swift +// AppleParty +// +// Created by HTC on 2022/5/12. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APIPAUploadVC: NSViewController { + + @IBOutlet weak var appIdTextView: NSTextField! + @IBOutlet weak var appIdTextField: NSTextField! + @IBOutlet weak var spasswordLbl: NSTextField! + @IBOutlet weak var submitBtn: NSButton! + + //通过外界传入的 apple id时,不需要用户填写 + var apple_id: String? { + didSet { + if let appId = apple_id { + appIdTextView.stringValue = appId + appIdTextView.isHidden = false + appIdTextField.isHidden = true + } else { + appIdTextView.stringValue = "" + appIdTextView.isHidden = true + appIdTextField.isHidden = false + } + } + } + + private var ipaFileURL: URL? + private var fileDropZoneView = DropZoneView(fileTypes: [".ipa"], text: "点击或拖拽IPA到这里") + private var uploadModel = XMLModel() + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + updateSPasswordUI() + } + + func setupUI() { + + fileDropZoneView.translatesAutoresizingMaskIntoConstraints = false + fileDropZoneView.delegate = self + view.addSubview(fileDropZoneView) + fileDropZoneView.snp.makeConstraints { (make) in + make.top.equalTo(submitBtn.snp.bottom).offset(15) + make.left.equalToSuperview().offset(20) + make.right.equalToSuperview().offset(-20) + make.bottom.equalToSuperview().offset(-30) + } + } + + func updateSPasswordUI() { + if let sp = UserCenter.shared.currentSPassword { + spasswordLbl.stringValue = "(当前选择:\(sp.account))" + } else { + spasswordLbl.stringValue = "(错误:当前未指定专用密码!)" + } + } + + @IBAction func clickedSPasswordBtn(_ sender: NSButton) { + let vc = APSPasswordSettingVC() + vc.updateCompletion = { [weak self] ps in + self?.updateSPasswordUI() + } + presentAsSheet(vc) + } + + @IBAction func clickedSubmitBtn(_ sender: NSButton) { + uploadIpaFile() + } + +} + +// MARK: - Private Method +extension APIPAUploadVC { + + private func uploadIpaFile() { + + var appId = appIdTextField.stringValue + if let appleId = apple_id { + appId = appleId + } + guard !appId.isEmpty else { + APHUD.hide(message: "请先填写 app id ~", delayTime: 1) + return + } + + guard let sp = UserCenter.shared.currentSPassword else { + let vc = APSPasswordSettingVC() + vc.updateCompletion = { [weak self] spassword in + self?.uploadIpaFile() + } + presentAsSheet(vc) + APHUD.hide(message: "请先设置或指定专用密码~", delayTime: 1) + return + } + + guard let ipaFileURL = ipaFileURL else { + APHUD.hide(message: "请先上传 ipa 文件~", delayTime: 1) + return + } + + APHUD.show(message: "上传中", view: self.view) + + DispatchQueue.global(qos: .userInitiated).async { [self] in + + uploadModel = XMLModel() + uploadModel.apple_id = appId + uploadModel.ipa_size = ipaFileURL.fileSize() + uploadModel.ipa_md5 = ipaFileURL.fileMD5() ?? "" + uploadModel.filePaths = ["ipa.ipa": ipaFileURL.path] + + // 获取创建 itms 文件的路径 + let filePath = XMLManager.getIpaPath(appId) + + // 先删除旧的文档 + XMLManager.deleteITMS(filePath) + + uploadModel.createIpaFile(directoryPath: filePath) + + let result = XMLManager.uploadITMS(account: sp.account, pwd: sp.password, filePath: filePath) + + DispatchQueue.main.async { + APHUD.hide() + self.closeSelfAndCallBack(result) + } + } + + } + + + func closeSelfAndCallBack(_ result: (Int32, String?)) { + if result.0 == 0 { + NSAlert.show("ipa文件上传成功!稍后可在苹果后台查看~") + }else { + let sb = NSStoryboard(name: "APDebugVC", bundle: Bundle(for: self.classForCoder)) + let newWC = sb.instantiateController(withIdentifier: "APDebugWC") as? NSWindowController + let logVC = newWC?.contentViewController as? APDebugVC + newWC?.window?.title = "ipa上传错误日志" + logVC?.debugLog = result.1 ?? "" + newWC?.showWindow(self) + } + } +} + + +// MARK: - DropZoneViewDelegate +extension APIPAUploadVC: DropZoneViewDelegate { + + func receivedFile(dropZoneView: DropZoneView, fileURL: URL) { + ipaFileURL = fileURL + } + + func receivedMouseDown(dropZoneView: DropZoneView, theEvent: NSEvent) { + let openPanel = NSOpenPanel() + openPanel.canChooseFiles = true + openPanel.canChooseDirectories = false + openPanel.allowsMultipleSelection = false + openPanel.allowedFileTypes = ["ipa"] + + openPanel.beginSheetModal(for: self.view.window!) { (modalResponse) in + if modalResponse == .OK { + if let fileURL = openPanel.url { + self.ipaFileURL = fileURL + dropZoneView.setFile(fileURL) + } + } + } + } +} diff --git a/AppleParty/AppleParty/IPAUpload/IPAUpload.storyboard b/AppleParty/AppleParty/IPAUpload/IPAUpload.storyboard new file mode 100644 index 0000000..aedab52 --- /dev/null +++ b/AppleParty/AppleParty/IPAUpload/IPAUpload.storyboard @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/Info.plist b/AppleParty/AppleParty/Info.plist new file mode 100644 index 0000000..3758032 --- /dev/null +++ b/AppleParty/AppleParty/Info.plist @@ -0,0 +1,15 @@ + + + + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + SUFeedURL + https://raw.githubusercontent.com/37iOS/AppleParty/main/AppleParty/SparkleUpdate/update.xml + SUPublicEDKey + ItVUtr4L9w9VfMGlzg7+cIcvSkruiygDcarlq8PTF7I= + + diff --git a/AppleParty/AppleParty/LoginView/APLogin2FAVC.swift b/AppleParty/AppleParty/LoginView/APLogin2FAVC.swift new file mode 100644 index 0000000..76dbdd0 --- /dev/null +++ b/AppleParty/AppleParty/LoginView/APLogin2FAVC.swift @@ -0,0 +1,199 @@ +// +// APLogin2FAVC.swift +// AppleParty +// +// Created by HTC on 2022/3/17. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APLogin2FAVC: NSViewController { + + public var cancelHandle: (() -> Void)? + public var successHandle: (() -> Void)? + + @IBOutlet weak var phoneListBtn: NSPopUpButton! + @IBOutlet weak var sendCodeBtn: NSButton! + @IBOutlet weak var voiceCodeBtn: NSButton! + @IBOutlet weak var phoneCodeView: NSTextField! + @IBOutlet weak var tipsWarningView: NSTextField! + @IBOutlet weak var trusDeviceBtn: NSButton! + @IBOutlet weak var indicatorView: NSProgressIndicator! + @IBOutlet weak var verifyBtn: NSButton! + + private var numbers: [PNumber] = [] //验证手机号码列表 + private var isPhoneSecurity = false //是否通过手机验证码来验证 + // 验证码倒计时 + private var verifyCodeTimer: Timer? + private var lastTime: Int = 30 + + override func viewDidLoad() { + super.viewDidLoad() + phoneCodeView.delegate = self + fetchPhoneList() + trusDeviceBtn.state = InfoCenter.shared.trusDevice ? .on : .off + } + + @IBAction func clickedCancelBtn(_ sender: NSButton) { + closeView() + cancelHandle?() + } + + @IBAction func clickedSendCodeBtn(_ sender: NSButton) { + submitSecurityCode() + } + + + @IBAction func changeVoiceCodeBtn(_ sender: NSButton) { + sendCodeBtn.title = sender.state == .on ? "拨打语音验证码" : "发送短信验证码" + } + + + @IBAction func clickedVerifyBtn(_ sender: NSButton) { + verifySecurityCode() + } + + @IBAction func clickedTrusDeviceBtn(_ sender: NSButton) { + InfoCenter.shared.trusDevice = sender.state == .on ? true : false + } +} + + +// MARK: - 网络请求 +extension APLogin2FAVC { + + func fetchPhoneList() { + APClient.verifySecurityPhone(mode: "sms", phoneid: 0).request(showLoading: true) { [weak self] result, response, error in + if let err = error, let type = APClientErrorCode(rawValue: err.code) { + switch type { + case .privacyAcknowledgementRequired: + // 传了无效phoneid,进入选择手机号的流程 + self?.phoneListBtn.removeAllItems() + let model = PhoneNumbers(body: result) + self?.numbers = model.numbers + for number in model.numbers { + self?.phoneListBtn.addItem(withTitle: number.num) + } + self?.phoneListBtn.selectItem(at: 0) + self?.showTips("一条包含验证码的信息已发送至您的设备。可输入设备验证码后点击验证以继续。\n或者点击“发送短信验证码”获取短信验证码。") + default: + APHUD.hide(message: err.localizedDescription) + } + } + } + } + + func submitSecurityCode() { + isPhoneSecurity = true + let mode = voiceCodeBtn.state == .on ? "voice" : "sms" + let phoneId = numbers[phoneListBtn.indexOfSelectedItem].id + APClient.verifySecurityPhone(mode: mode, phoneid: phoneId).request(showLoading: true) { [weak self] result, response, error in + let code = response?.statusCode + if [200, 423].contains(code) { + let msg = self?.voiceCodeBtn.state == .on ? "请求拨打语音电话,请收听~" : "验证码已发送,请查收~" + self?.showTips(msg) + self?.verifyCodeCountdown() + } else { + self?.showTips("\(code ?? 0),\(error.debugDescription)") + } + } + } + + func verifySecurityCode() { + let code = phoneCodeView.stringValue + let phoneId = numbers[phoneListBtn.indexOfSelectedItem].id + let mode = voiceCodeBtn.state == .on ? "voice" : "sms" + let type = isPhoneSecurity ? APClient.SecurityCode.sms(code: code, phoneNumberId: phoneId, mode: mode) : APClient.SecurityCode.device(code: code) + + viewEnabled(false) + APClient.submitSecurityCode(code: type).request { [weak self] result, response, error in + self?.viewEnabled(true) + let code = response?.statusCode + switch code { + case 200, 201, 202, 203, 204: + self?.validateSession() + case 400: + let errors = dictionaryArray(result["service_errors"]) + let msg = string(from: errors.first?["message"]) + self?.showTips(msg) + default: + self?.showTips("\(code ?? 0),\(error.debugDescription)") + } + } + } + + func validateSession() { + viewEnabled(false) + APClient.signInSession.request { [weak self] result, response, error in + self?.viewEnabled(true) + let code = response?.statusCode + switch code { + case 200, 201: + UserCenter.shared.isAuthorized = true + self?.successHandle?() + self?.closeView() + default: + let errors = dictionaryArray(result["serviceErrors"]) + let msg = string(from: errors.first?["message"]) + self?.showTips(msg.isEmpty ? error.debugDescription : msg) + } + } + } +} + +// MARK: - 内部方法 +extension APLogin2FAVC { + + func closeView() { + guard let window = view.window, let parent = window.sheetParent + else { return } + parent.endSheet(window) + } + + func showTips(_ text: String) { + if text.isEmpty { + tipsWarningView.isHidden = true + tipsWarningView.stringValue = "" + } else { + tipsWarningView.stringValue = text + tipsWarningView.isHidden = false + } + } + + func viewEnabled(_ isEnabled: Bool) { + showTips("") + verifyBtn.isEnabled = isEnabled + isEnabled ? indicatorView.stopAnimation(nil) : indicatorView.startAnimation(nil) + } + + func verifyCodeCountdown() { + self.lastTime = 30 + self.sendCodeBtn.title = "\(self.lastTime)s 后重试" + self.sendCodeBtn.isEnabled = false + self.verifyCodeTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.verifyCodeTime), userInfo: nil, repeats: true) + } + + // 验证码倒计时 + @objc func verifyCodeTime() { + lastTime -= 1 + sendCodeBtn.title = "\(self.lastTime)s 后重试" + if lastTime <= 0 { + sendCodeBtn.title = "重新发送验证码" + sendCodeBtn.isEnabled = true + verifyCodeTimer?.invalidate() + } + } +} + +// MARK: - NSTextFieldDelegate +extension APLogin2FAVC: NSTextFieldDelegate { + + func controlTextDidChange(_ obj: Notification) { + if phoneCodeView.stringValue.count == 6 { + verifyBtn.isEnabled = true + } else { + verifyBtn.isEnabled = false + } + } +} diff --git a/AppleParty/AppleParty/LoginView/APLogin2FAVC.xib b/AppleParty/AppleParty/LoginView/APLogin2FAVC.xib new file mode 100644 index 0000000..46822c6 --- /dev/null +++ b/AppleParty/AppleParty/LoginView/APLogin2FAVC.xib @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/LoginView/APLoginVC.swift b/AppleParty/AppleParty/LoginView/APLoginVC.swift new file mode 100644 index 0000000..b0c6267 --- /dev/null +++ b/AppleParty/AppleParty/LoginView/APLoginVC.swift @@ -0,0 +1,234 @@ +// +// APLoginVC.swift +// AppleParty +// +// Created by HTC on 2022/3/17. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APLoginVC: NSViewController { + + public var cancelHandle: (() -> Void)? + public var successHandle: (() -> Void)? + + @IBOutlet weak var accountView: NSTextField! + @IBOutlet weak var passwordView: NSSecureTextField! + // 历史账号 + @IBOutlet weak var historyBox: NSBox! + @IBOutlet weak var tableView: NSTableView! + + @IBOutlet weak var tipsWarningView: NSTextField! + @IBOutlet weak var autoLoginBtn: NSButton! + @IBOutlet weak var indicatorView: NSProgressIndicator! + @IBOutlet weak var loginBtn: NSButton! + + override func viewDidLoad() { + super.viewDidLoad() + accountView.delegate = self + passwordView.delegate = self + tipsWarningView.maximumNumberOfLines = 5 + + // 最近登录的账号 + let user = UserCenter.shared.loginedUser + let name = user.appleid + let pwd = user.password + guard name.count > 0, pwd.count > 0 else { return } + accountView.stringValue = name + passwordView.stringValue = pwd + viewEnabled(true) + + // 如果需要自动登录 + if UserCenter.shared.isAutoLogin || UserCenter.shared.isFirstTime { + loginAccount() + UserCenter.shared.isFirstTime = false + } + } + + @IBAction func clickedCancelBtn(_ sender: NSButton) { + closeView() + cancelHandle?() + } + + + @IBAction func showAccountHistoryList(_ sender: Any) { + if historyBox.isHidden { + tableView.delegate = self + tableView.dataSource = self + tableView.reloadData() + } + historyBox.isHidden = !historyBox.isHidden + } + + @IBAction func clickedLoginBtn(_ sender: NSButton) { + loginAccount() + } +} + + +// MARK: - 网络请求 +extension APLoginVC { + + func loginAccount() { + if accountView.stringValue.isEmpty { + showTips("苹果账号不能为空!") + return + } + if passwordView.stringValue.isEmpty { + showTips("密码不能为空!") + return + } + + viewEnabled(false) + + let account = accountView.stringValue + let pwd = passwordView.stringValue + + APClient.signIn(account: account, password: pwd).request { [weak self] result, response, error in + self?.viewEnabled(true) + if let err = error, let type = APClientErrorCode(rawValue: err.code) { + switch type { + case .notAuthorized: + self?.showTips("Apple ID 或密码不正确") + case .twoStepOrFactor: + // 保存账号密码 + if self?.autoLoginBtn.state == .on { + UserCenter.shared.isAutoLogin = true + UserCenter.shared.loginedUser = User(appleid: account, password: pwd) + } + // 双重认证 + let vc = APLogin2FAVC() + vc.cancelHandle = { [weak self] in + self?.viewEnabled(true) + } + vc.successHandle = { [weak self] in + self?.trusDevice() + self?.successHandle?() + self?.closeView() + } + let pannel = NSPanel(contentViewController: vc) + pannel.setFrame(NSRect(origin: .zero, size: NSSize(width: 500, height: 360)), display: true) + self?.view.window?.beginSheet(pannel, completionHandler: nil) + default: + self?.showTips(err.localizedDescription) + } + return + } + let code = response?.statusCode + // 登陆态有效 + if code == 200 { + // 保存账号密码 + if self?.autoLoginBtn.state == .on { + UserCenter.shared.isAutoLogin = true + UserCenter.shared.loginedUser = User(appleid: account, password: pwd) + } + self?.validateSession() + } else { + self?.showTips("\(code ?? 0),\(error.debugDescription)") + } + } + } + + func validateSession() { + viewEnabled(false) + APClient.signInSession.request { [weak self] result, response, error in + self?.viewEnabled(true) + let code = response?.statusCode + switch code { + case 200, 201: + UserCenter.shared.isAuthorized = true + self?.trusDevice() + self?.successHandle?() + self?.closeView() + default: + let errors = dictionaryArray(result["serviceErrors"]) + let msg = string(from: errors.first?["message"]) + self?.showTips(msg.isEmpty ? error.debugDescription : msg) + } + } + } + + func trusDevice() { + guard InfoCenter.shared.trusDevice else { return} + + APClient.trusDevice(isTrus: true).request { result, response, error in + if response?.statusCode == 204 { + debugPrint("信任设备成功~") + } + } + } + +} + + +// MARK: - 内部方法 +extension APLoginVC { + + func showTips(_ text: String) { + if text.isEmpty { + tipsWarningView.isHidden = true + tipsWarningView.stringValue = "" + } else { + tipsWarningView.stringValue = text + tipsWarningView.isHidden = false + } + } + + func viewEnabled(_ isEnabled: Bool) { + showTips("") + loginBtn.isEnabled = isEnabled + historyBox.isHidden = true + isEnabled ? indicatorView.stopAnimation(nil) : indicatorView.startAnimation(nil) + } + + func closeView() { + guard let window = view.window, let parent = window.sheetParent + else { return } + parent.endSheet(window) + } + +} + +// MARK: - NSTextFieldDelegate +extension APLoginVC: NSTextFieldDelegate { + + func controlTextDidChange(_ obj: Notification) { + if !accountView.stringValue.isEmpty && !passwordView.stringValue.isEmpty { + loginBtn.isEnabled = true + } else { + loginBtn.isEnabled = false + showTips("") + } + } +} + +// MARK: - NSTableViewDelegate +extension APLoginVC: NSTableViewDelegate, NSTableViewDataSource { + + func numberOfRows(in tableView: NSTableView) -> Int { + return UserCenter.shared.historyUser.count + } + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + if tableColumn?.identifier == NSUserInterfaceItemIdentifier(rawValue: "nameColumn") { + let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "nameCell") + guard let cellView = tableView.makeView(withIdentifier: cellIdentifier, owner: self) as? NSTableCellView else { return nil } + cellView.textField?.stringValue = UserCenter.shared.historyUser[row].appleid + return cellView + } + return nil + } + + func tableViewSelectionDidChange(_ notification: Notification){ + let tableView = notification.object as! NSTableView + let clickedRow = tableView.selectedRow + guard clickedRow >= 0 else { + return + } + tableView.deselectRow(clickedRow) + accountView.stringValue = UserCenter.shared.historyUser[clickedRow].appleid + passwordView.stringValue = UserCenter.shared.historyUser[clickedRow].password + showAccountHistoryList(clickedRow) + } +} diff --git a/AppleParty/AppleParty/LoginView/APLoginVC.xib b/AppleParty/AppleParty/LoginView/APLoginVC.xib new file mode 100644 index 0000000..0fb725b --- /dev/null +++ b/AppleParty/AppleParty/LoginView/APLoginVC.xib @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NSAllRomanInputSourcesLocaleIdentifier + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/LoginView/APWebLoginVC.swift b/AppleParty/AppleParty/LoginView/APWebLoginVC.swift new file mode 100644 index 0000000..4467228 --- /dev/null +++ b/AppleParty/AppleParty/LoginView/APWebLoginVC.swift @@ -0,0 +1,137 @@ +// +// APWebLoginVC.swift +// AppleParty +// +// Created by HTC on 2024/10/29. +// Copyright © 2024 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APWebLoginVC: NSViewController { + + public var cancelHandle: (() -> Void)? + public var successHandle: (() -> Void)? + private var webCore: AppleWebLoginCore? = nil + + @IBOutlet weak var loginBtn: NSButton! + @IBOutlet weak var cancelBtn: NSButton! + @IBOutlet weak var indicatorView: NSProgressIndicator! + @IBOutlet weak var tipsWarningView: NSTextField! + + override func viewDidLoad() { + super.viewDidLoad() + // Do view setup here. + } + + @IBAction func clickedCancelBtn(_ sender: NSButton) { + closeView() + cancelHandle?() + } + + @IBAction func clickedLoginBtn(_ sender: NSButton) { + validateSession() + } + + // 判断是登陆态是否过期 + func validateSession() { + viewEnabled(false) + APClient.signInSession.request { [weak self] result, response, error in + self?.viewEnabled(true) + let code = response?.statusCode + switch code { + case 200, 201: + UserCenter.shared.isAuthorized = true + self?.successHandle?() + self?.closeView() + default: + let errors = dictionaryArray(result["serviceErrors"]) + let msg = string(from: errors.first?["message"]) + self?.showTips(msg.isEmpty ? error.debugDescription : msg) + // 隐藏按钮透视显示 + self?.cancelBtn.isEnabled = false + self?.loginBtn.isEnabled = false + self?.loginWithWeb() + } + } + } + + func loginWithWeb() { + let appleWebLoginCore = AppleWebLoginCore() + // 将 webView 添加到视图层次结构中 + self.view.addSubview(appleWebLoginCore.webView) + + let closeButton = NSButton(title: "取消", target: self, action: #selector(closeButtonClicked)) + closeButton.attributedTitle = NSAttributedString(string: "取消", attributes: [NSAttributedString.Key.foregroundColor: NSColor.gray]) + closeButton.keyEquivalent = "\u{1B}" // `esc` 快捷键 + appleWebLoginCore.webView.addSubview(closeButton) + + // 设置 webView 的约束以适应视图 + appleWebLoginCore.webView.translatesAutoresizingMaskIntoConstraints = false + closeButton.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + appleWebLoginCore.webView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), + appleWebLoginCore.webView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), + appleWebLoginCore.webView.topAnchor.constraint(equalTo: self.view.topAnchor), + appleWebLoginCore.webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), + + closeButton.trailingAnchor.constraint(equalTo: appleWebLoginCore.webView.trailingAnchor, constant: -10), + closeButton.topAnchor.constraint(equalTo: appleWebLoginCore.webView.topAnchor, constant: 10) + ]) + + // 关闭按钮 + + + appleWebLoginCore.installFirstLoadCompleteTrap { + // 处理首次加载完成的逻辑 + print("First load complete") + } + + appleWebLoginCore.installCredentialPopulationTrap { token, cookies in + // 处理凭据填充的逻辑 + print("Received cookies: \(cookies)") + print("Received token: \(token)") + + if let cks = APClientSession.shared.config.httpCookieStorage?.cookies { + for ck in cks { + APClientSession.shared.config.httpCookieStorage?.deleteCookie(ck) + } + } + for cookie in cookies { + APClientSession.shared.config.httpCookieStorage?.setCookie(cookie) + } +// APClientSession.shared.config.headers.update(name: "Cookie", value: "myacinfo=\(token);") + self.validateSession() + } + self.webCore = appleWebLoginCore + } + + @objc func closeButtonClicked() { + // 处理关闭按钮的点击事件 + print("关闭按钮被点击") + closeView() + } + + func viewEnabled(_ isEnabled: Bool) { + showTips("") + loginBtn.isEnabled = isEnabled + isEnabled ? indicatorView.stopAnimation(nil) : indicatorView.startAnimation(nil) + } + + func showTips(_ text: String) { + if text.isEmpty { + tipsWarningView.isHidden = true + tipsWarningView.stringValue = "" + } else { + tipsWarningView.stringValue = text + tipsWarningView.isHidden = false + } + } + + func closeView() { + guard let window = view.window, let parent = window.sheetParent + else { return } + parent.endSheet(window) + } + +} diff --git a/AppleParty/AppleParty/LoginView/APWebLoginVC.xib b/AppleParty/AppleParty/LoginView/APWebLoginVC.xib new file mode 100644 index 0000000..cade6f3 --- /dev/null +++ b/AppleParty/AppleParty/LoginView/APWebLoginVC.xib @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 提示: +登录通过 https://appstoreconnect.apple.com 网页进行授权 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/LoginView/AppleWebLogin/AppleWebLoginCore.swift b/AppleParty/AppleParty/LoginView/AppleWebLogin/AppleWebLoginCore.swift new file mode 100644 index 0000000..42cf296 --- /dev/null +++ b/AppleParty/AppleParty/LoginView/AppleWebLogin/AppleWebLoginCore.swift @@ -0,0 +1,127 @@ +// +// AppleWebLoginCore.swift +// AppleWebLogin +// +// Created by 秋星桥 on 2024/10/23. +// ref: https://github.com/Lakr233/AppleWebLogin + +import Combine +@preconcurrency import WebKit + +//private let loginURL = URL(string: "https://account.apple.com/sign-in")! +private let loginURL = URL(string: "https://appstoreconnect.apple.com/login")! + +public class AppleWebLoginCore: NSObject, WKUIDelegate, WKNavigationDelegate { + var webView: WKWebView { + associatedWebView + } + + private let associatedWebView: WKWebView + private var dataPopulationTimer: Timer? = nil + private var firstLoadComplete = false + + public private(set) var onFirstLoadComplete: (() -> Void)? + public var onCredentialPopulation: ((String, [HTTPCookie]) -> Void)? + + override public init() { + let contentController = WKUserContentController() + let configuration = WKWebViewConfiguration() + configuration.defaultWebpagePreferences.allowsContentJavaScript = true + configuration.userContentController = contentController + configuration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs") + configuration.websiteDataStore = .nonPersistent() + + associatedWebView = .init( + frame: CGRect(x: 0, y: 0, width: 1920, height: 1080), + configuration: configuration + ) + associatedWebView.isHidden = true + + super.init() + + associatedWebView.uiDelegate = self + associatedWebView.navigationDelegate = self + + associatedWebView.load(.init(url: loginURL)) + + #if DEBUG + if associatedWebView.responds(to: Selector(("setInspectable:"))) { + associatedWebView.perform(Selector(("setInspectable:")), with: true) + } + #endif + + let dataPopulationTimer = Timer(timeInterval: 1, repeats: true) { [weak self] _ in + guard let self else { return } + removeUnwantedElements() + populateData() + } + RunLoop.main.add(dataPopulationTimer, forMode: .common) + self.dataPopulationTimer = dataPopulationTimer + } + + deinit { + dataPopulationTimer?.invalidate() + onCredentialPopulation = nil + } + + public func webView(_: WKWebView, didFinish _: WKNavigation!) { + guard !firstLoadComplete else { return } + defer { firstLoadComplete = true } + associatedWebView.isHidden = false + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + self.onFirstLoadComplete?() + self.onFirstLoadComplete = nil + } + } + +// public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping @MainActor (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) { +// let request = navigationAction.request +// if let headers = request.allHTTPHeaderFields { +// print(request.url?.absoluteString) +// print("headers: \(headers)") +// if let scntValue = headers["scnt"] { +// print("scnt value: \(scntValue)") +// } +// } +// decisionHandler(.allow, preferences) +// } + + public func installFirstLoadCompleteTrap(_ block: @escaping () -> Void) { + onFirstLoadComplete = block + } + + public func installCredentialPopulationTrap(_ block: @escaping (String, [HTTPCookie]) -> Void) { + onCredentialPopulation = block + } + + private func removeUnwantedElements() { + let removeElements = """ + Element.prototype.remove = function() { + this.parentElement.removeChild(this); + } + NodeList.prototype.remove = HTMLCollection.prototype.remove = function() { + for(var i = this.length - 1; i >= 0; i--) { + if(this[i] && this[i].parentElement) { + this[i].parentElement.removeChild(this[i]); + } + } + } + document.getElementById("header").remove(); + document.getElementsByClassName('landing__animation').remove(); + """ + associatedWebView.evaluateJavaScript(removeElements) { _, _ in + } + } + + private func populateData() { + guard let onCredentialPopulation else { return } + associatedWebView.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in + //print(cookies) + for cookie in cookies where cookie.name == "myacinfo" { + let value = cookie.value + onCredentialPopulation(value, cookies) + self.onCredentialPopulation = nil + } + } + } +} diff --git a/AppleParty/AppleParty/LoginView/PhoneNumbers.swift b/AppleParty/AppleParty/LoginView/PhoneNumbers.swift new file mode 100644 index 0000000..bb07e0a --- /dev/null +++ b/AppleParty/AppleParty/LoginView/PhoneNumbers.swift @@ -0,0 +1,27 @@ +// +// PhoneNumbers.swift +// AppleParty +// +// Created by 易承 on 2021/6/2. +// + +import Foundation + +struct PNumber { + var num: String + var id: Int +} + +// MARK: - 双重绑定手机号码 +struct PhoneNumbers { + var numbers: [PNumber] + + init(body: [String: Any]) { + numbers = [PNumber]() + let trustedPhoneNumbers = dictionaryArray(body["trustedPhoneNumbers"]) + for phone in trustedPhoneNumbers { + numbers.append(PNumber(num: string(from: phone["numberWithDialCode"], defaultValue: "未知手机号"), + id: int(from: phone["id"]) ?? 0 )) + } + } +} diff --git a/AppleParty/AppleParty/QRcodeView/APQRcode.storyboard b/AppleParty/AppleParty/QRcodeView/APQRcode.storyboard new file mode 100644 index 0000000..b042bb2 --- /dev/null +++ b/AppleParty/AppleParty/QRcodeView/APQRcode.storyboard @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppleParty/AppleParty/QRcodeView/APQRcodeVC.swift b/AppleParty/AppleParty/QRcodeView/APQRcodeVC.swift new file mode 100644 index 0000000..e3e5fe0 --- /dev/null +++ b/AppleParty/AppleParty/QRcodeView/APQRcodeVC.swift @@ -0,0 +1,199 @@ +// +// APQRcodeVC.swift +// AppleParty +// +// Created by HTC on 2022/3/24. +// Copyright © 2022 37 Mobile Games. All rights reserved. +// + +import Cocoa + +class APQRcodeVC: NSViewController { + + @IBOutlet weak var inputTextField: NSTextField! + @IBOutlet weak var qrcodeSizeBtn: NSPopUpButton! + @IBOutlet weak var createQrcodeBtn: NSButton! + @IBOutlet weak var qrcodeImageView: NSImageView! + @IBOutlet weak var copyQrcodeBtn: NSButton! + @IBOutlet weak var saveQrcodeBtn: NSButton! + @IBOutlet weak var shareQrcodeBtn: NSButton! + @IBOutlet weak var shareQrcodeByAirDropBtn: NSButton! + @IBOutlet weak var scanQrcodeBtn: NSButton! + @IBOutlet weak var messageLbl: NSTextField! + @IBOutlet weak var textScrollView: NSScrollView! + @IBOutlet weak var textView: NSTextView! + + @IBAction func createQrcode(_ sender: Any) { + let str = inputTextField!.stringValue + if str.isEmpty { + enableQrcode(false) + statusMessage("") + NSAlert.show("请输出需要生成二维码的文本!") + return + } + + let img = createQRImage(str, NSMakeSize(360, 360)) + qrcodeImageView.image = img + enableQrcode(true) + statusMessage("二维码生成成功") + } + + @IBAction func copyQrcode(_ sender: Any) { + let str = inputTextField!.stringValue + if !str.isEmpty { + let img = createQRImage(str, getImageSize()) + let pb = NSPasteboard.general + pb.clearContents() + if pb.writeObjects([img as NSPasteboardWriting]) { + statusMessage("Copy QRCode to clipboard") + } else { + statusMessage("Failed to copy QRCode to clipboard") + } + } + } + + + @IBAction func saveQrcode(_ sender: Any) { + let str = inputTextField!.stringValue + if str.isEmpty { + return statusMessage("请填写有效的文本内容!") + } + + let savePanel = NSSavePanel() + savePanel.title = "Save QRCode As File" + savePanel.canCreateDirectories = true + savePanel.allowedFileTypes = ["png"] + savePanel.isExtensionHidden = false + savePanel.nameFieldStringValue = getImgaeName() + ".png" + savePanel.becomeKey() + let result = savePanel.runModal() + if (result == .OK && (savePanel.url) != nil) { + let img = createQRImage(str, getImageSize()) + let imgRep = NSBitmapImageRep(data: img.tiffRepresentation!) + let data = imgRep?.representation(using: NSBitmapImageRep.FileType.png, properties: [:]) + try! data?.write(to: savePanel.url!) + statusMessage("Save QRCode to \(savePanel.url!.absoluteString)") + } + } + + @IBAction func shareQrcode(_ sender: Any) { + let str = inputTextField!.stringValue + if str.isEmpty { + return statusMessage("请填写有效的文本内容!") + } + + let img = createQRImage(str, getImageSize()) + let picker = NSSharingServicePicker(items: [img]) + picker.delegate = self + picker.show(relativeTo: .zero, of: sender as! NSView, preferredEdge: .maxX) + } + + @IBAction func shareQrcodeByAirDrop(_ sender: Any) { + let str = inputTextField!.stringValue + if str.isEmpty { + return statusMessage("请填写有效的文本内容!") + } + + let img = createQRImage(str, getImageSize()) + let service = NSSharingService(named: .sendViaAirDrop)! + let items: [NSImage] = [img] + if service.canPerform(withItems: items) { + service.delegate = self + service.perform(withItems: items) + } else { + statusMessage("Cannot perform AirDrop!") + } + } + + @IBAction func scanQrcode(_ sender: Any) { + enableQrcode(false) + qrcodeImageView.isHidden = true + textView.string = "" + textScrollView.isHidden = false + // scan QRCode + let dict = scanQRCodeOnScreen() as! [String:Any] + let data = dict["qrcode"] as! Array + if data.isEmpty { + textView.string = "Not found valid QRCode of screen!" + return + } + // output message + appendToTextView("识别到二维码个数:\(data.count)\n", coreText: "\(data.count)") + for (index, element) in data.enumerated() { + let k = index + 1 + appendToTextView("\n第\(k)个二维码内容:\n【\n\(element)\n】\n", coreText: element) + } + } + + override func viewDidAppear() { + super.viewDidAppear() + inputTextField.becomeFirstResponder() + } + + override func viewDidLoad() { + super.viewDidLoad() + setupUI() + } + + func setupUI() { + inputTextField.delegate = self + enableQrcode(false) + qrcodeImageView.image = NSImage(named: "QRcode") + } + + func enableQrcode(_ enable: Bool) { + copyQrcodeBtn.isEnabled = enable + saveQrcodeBtn.isEnabled = enable + shareQrcodeBtn.isEnabled = enable + shareQrcodeByAirDropBtn.isEnabled = enable + textScrollView.isHidden = true + qrcodeImageView.isHidden = false + if !enable { + statusMessage("") + qrcodeImageView.image = NSImage(named: "QRcode") + } + } + + func statusMessage(_ msg: String) { + messageLbl.stringValue = msg.count == 0 ? "" : "提示:\(msg)" + } + + func getImageSize() -> NSSize { + let wh = CGFloat(qrcodeSizeBtn?.selectedTag() ?? 500) + let size = NSMakeSize(wh, wh) + return size + } + + func getImgaeName() -> String { + let dateFormatter : DateFormatter = DateFormatter() + dateFormatter.dateFormat = "HH-mm-ss" + let date = Date() + let dateString = dateFormatter.string(from: date) + return "AppleParty_qrcode-" + dateString + } + + func appendToTextView(_ text: String, coreText: String) { + let attributes = [NSAttributedString.Key.foregroundColor: NSColor.labelColor] + let secondAttributes = [NSAttributedString.Key.foregroundColor: #colorLiteral(red: 0.3211918473, green: 0.7199308276, blue: 1, alpha: 1)] + let attr = NSMutableAttributedString.init(string: text, attributes: attributes) + attr.addAttributes(secondAttributes, range: (text as NSString).range(of: coreText)) + textView.textStorage?.append(attr) + textView.scrollRangeToVisible(NSMakeRange(textView.string.count, 0)) + } +} + + +extension APQRcodeVC: NSTextFieldDelegate { + func controlTextDidChange(_ obj: Notification) { + let textField = obj.object as! NSTextField + if textField.stringValue.isEmpty { + enableQrcode(false) + } + } +} + + +extension APQRcodeVC: NSSharingServicePickerDelegate, NSSharingServiceDelegate { + + +} diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/37M-logo.png b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/37M-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0f984646fea1e132d2226528e8f6ff0765dde7cd GIT binary patch literal 134741 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˜n>P|4ybk^&PhSAk1pfd(V2XVYo<4SrR7wJ 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 I@h#|o0n*tPYybcN literal 0 HcmV?d00001 diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/Contents.json b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/Contents.json new file mode 100644 index 0000000..981e871 --- /dev/null +++ b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-logo.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "37M-logo.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-slogan.imageset/37M-slogan.png b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37M-slogan.imageset/37M-slogan.png new file mode 100644 index 0000000000000000000000000000000000000000..75bbcf40d371bc83f945a47b188f18fc8a57c6bb GIT binary patch literal 81460 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 hi>e|qtR{mkE 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 literal 0 HcmV?d00001 diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37iOSTeam-Round.imageset/Contents.json b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37iOSTeam-Round.imageset/Contents.json new file mode 100644 index 0000000..2b903f6 --- /dev/null +++ b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/37iOSTeam-Round.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "37iOSTeam-Round.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/Contents.json b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/AppleParty/AppleParty/Resources/Assets.xcassets/37MobileGames/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/AppleParty/AppleParty/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/AppleParty/AppleParty/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..786e67f --- /dev/null +++ b/AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "mac", + "size" : "16x16", + "filename" : "icon-16.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "16x16", + "filename" : "icon-32.png", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "filename" : "icon-32.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "32x32", + "filename" : "icon-64.png", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "filename" : "icon-128.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "128x128", + "filename" : "icon-256.png", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "filename" : "icon-256.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "256x256", + "filename" : "icon-512.png", + "scale" : "2x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "filename" : "icon-512.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "size" : "512x512", + "filename" : "icon-1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } + } diff --git a/AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/AppleParty/AppleParty/Resources/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..296f8d108a69c3d48785c945513ac3b25d2b0cf4 GIT binary patch literal 172635 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%0AH*a!0WHYH34qFl2kVt(EaN|*gY-`fw#i()* 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

X@n8ap#gRLos3SO@zStos|5-d}!upSiIs>aB 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