diff --git a/ios/PushDeer-iOS/Podfile b/ios/PushDeer-iOS/Podfile index d4279af..12e7c04 100644 --- a/ios/PushDeer-iOS/Podfile +++ b/ios/PushDeer-iOS/Podfile @@ -9,6 +9,7 @@ def commonPods pod 'Moya', '~> 15.0' pod 'SDWebImageSwiftUI', '~> 2.0.2' pod 'KRProgressHUD', '~> 3.4.7' + pod 'IQKeyboardManagerSwift', '~> 6.5.9' # pod 'WoodPeckeriOS', :configurations => ['Debug'] end diff --git a/ios/PushDeer-iOS/Podfile.lock b/ios/PushDeer-iOS/Podfile.lock index b9203ec..1a566d8 100644 --- a/ios/PushDeer-iOS/Podfile.lock +++ b/ios/PushDeer-iOS/Podfile.lock @@ -1,5 +1,6 @@ PODS: - Alamofire (5.5.0) + - IQKeyboardManagerSwift (6.5.9) - KRActivityIndicatorView (3.0.7) - KRProgressHUD (3.4.7): - KRActivityIndicatorView (= 3.0.7) @@ -14,6 +15,7 @@ PODS: - SDWebImage (~> 5.10) DEPENDENCIES: + - IQKeyboardManagerSwift (~> 6.5.9) - KRProgressHUD (~> 3.4.7) - Moya (~> 15.0) - SDWebImageSwiftUI (~> 2.0.2) @@ -21,6 +23,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - Alamofire + - IQKeyboardManagerSwift - KRActivityIndicatorView - KRProgressHUD - Moya @@ -29,12 +32,13 @@ SPEC REPOS: SPEC CHECKSUMS: Alamofire: 1c4fb5369c3fe93d2857c780d8bbe09f06f97e7c + IQKeyboardManagerSwift: 6e839c575c4aa1078d58a596e41244e77abe918f KRActivityIndicatorView: ad69e89c4ce40c986cf580595be4829dcad0e35a KRProgressHUD: a248f0bc6c9c2aed40a37b76e03ffecc7f85c887 Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee SDWebImage: 4dc3e42d9ec0c1028b960a33ac6b637bb432207b SDWebImageSwiftUI: 8a3923c95108312b03a599ec1498754af55a6819 -PODFILE CHECKSUM: 06aae1de50f9c1a188e69787835ec8718dd7d543 +PODFILE CHECKSUM: 3c8d668f811e3c29bb70fc8a24d2ecd9c266ba45 COCOAPODS: 1.11.2 diff --git a/ios/PushDeer-iOS/PushDeer.xcodeproj/project.pbxproj b/ios/PushDeer-iOS/PushDeer.xcodeproj/project.pbxproj index e392858..6482089 100644 --- a/ios/PushDeer-iOS/PushDeer.xcodeproj/project.pbxproj +++ b/ios/PushDeer-iOS/PushDeer.xcodeproj/project.pbxproj @@ -17,6 +17,8 @@ 523150DC2778762B00941EDC /* DeviceItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523150DB2778762B00941EDC /* DeviceItemView.swift */; }; 5242C872278C8CBB00FDB27E /* EditableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5242C871278C8CBB00FDB27E /* EditableText.swift */; }; 5242C873278C8CBB00FDB27E /* EditableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5242C871278C8CBB00FDB27E /* EditableText.swift */; }; + 5243372727A6D86200190D00 /* Env.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243372627A6D86200190D00 /* Env.swift */; }; + 5243372827A6D86200190D00 /* Env.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243372627A6D86200190D00 /* Env.swift */; }; 52450F3827848243003652D8 /* PushDeerApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F3727848243003652D8 /* PushDeerApi.swift */; }; 52450F3927848243003652D8 /* PushDeerApi.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F3727848243003652D8 /* PushDeerApi.swift */; }; 52450F3B278491F8003652D8 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F3A278491F8003652D8 /* AppState.swift */; }; @@ -27,6 +29,8 @@ 52450F432784943F003652D8 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F412784943F003652D8 /* HttpRequest.swift */; }; 52483FC2277ED6D5003A100E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52483FC1277ED6D5003A100E /* AppDelegate.swift */; }; 52483FC3277ED6D5003A100E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52483FC1277ED6D5003A100E /* AppDelegate.swift */; }; + 524E99E627B3CD0F00292396 /* EndpointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524E99E527B3CD0F00292396 /* EndpointView.swift */; }; + 524E99E727B3CD0F00292396 /* EndpointView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524E99E527B3CD0F00292396 /* EndpointView.swift */; }; 526A1E702791E00400BA2177 /* PushDeerData.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 526A1E6E2791E00400BA2177 /* PushDeerData.xcdatamodeld */; }; 526A1E712791E00400BA2177 /* PushDeerData.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 526A1E6E2791E00400BA2177 /* PushDeerData.xcdatamodeld */; }; 526A1E732791E03900BA2177 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526A1E722791E03900BA2177 /* Persistence.swift */; }; @@ -42,6 +46,10 @@ 5292F4FB2776BC7900B9A7BB /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5292F4FA2776BC7900B9A7BB /* ContentView.swift */; }; 5292F4FD2776BC7A00B9A7BB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5292F4FC2776BC7A00B9A7BB /* Assets.xcassets */; }; 5292F5002776BC7A00B9A7BB /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5292F4FF2776BC7A00B9A7BB /* Preview Assets.xcassets */; }; + 52AC5C2827B7FE1D00EEB185 /* ViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC5C2727B7FE1D00EEB185 /* ViewExtension.swift */; }; + 52AC5C2927B7FE1D00EEB185 /* ViewExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC5C2727B7FE1D00EEB185 /* ViewExtension.swift */; }; + 52AC5C2B27B8206D00EEB185 /* ListTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC5C2A27B8206D00EEB185 /* ListTest.swift */; }; + 52AC5C2C27B8206D00EEB185 /* ListTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AC5C2A27B8206D00EEB185 /* ListTest.swift */; }; 52B8CF5F277DE660004CB680 /* AppleSignInButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */; }; 52B8CF6E277E0B46004CB680 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52B8CF6D277E0B46004CB680 /* Preview Assets.xcassets */; }; 52B8CF73277E0B46004CB680 /* PushDeerClip.app in Embed App Clips */ = {isa = PBXBuildFile; fileRef = 52B8CF64277E0B44004CB680 /* PushDeerClip.app */; platformFilter = ios; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -106,15 +114,19 @@ 52163EB62777415F00594190 /* DeviceListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceListView.swift; sourceTree = ""; }; 52163EB82777417900594190 /* KeyListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyListView.swift; sourceTree = ""; }; 52163EBA277741AC00594190 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; + 5222E12F27B3F73C000B4223 /* PushDeerClip-SelfHosted.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "PushDeerClip-SelfHosted.entitlements"; sourceTree = ""; }; 523150D8277875FB00941EDC /* DeletableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletableView.swift; sourceTree = ""; }; 523150DB2778762B00941EDC /* DeviceItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceItemView.swift; sourceTree = ""; }; + 5234214C27B3F1AA007D6C1C /* PushDeer-SelfHosted.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "PushDeer-SelfHosted.entitlements"; sourceTree = ""; }; 5242C871278C8CBB00FDB27E /* EditableText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditableText.swift; sourceTree = ""; }; + 5243372627A6D86200190D00 /* Env.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Env.swift; sourceTree = ""; }; 52450F3727848243003652D8 /* PushDeerApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushDeerApi.swift; sourceTree = ""; }; 52450F3A278491F8003652D8 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; 52450F3E2784923D003652D8 /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; 52450F412784943F003652D8 /* HttpRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HttpRequest.swift; sourceTree = ""; }; 52450F442784A95D003652D8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 52483FC1277ED6D5003A100E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 524E99E527B3CD0F00292396 /* EndpointView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EndpointView.swift; sourceTree = ""; }; 526A1E6F2791E00400BA2177 /* PushDeerData.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = PushDeerData.xcdatamodel; sourceTree = ""; }; 526A1E722791E03900BA2177 /* Persistence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; 526A1E7C2792B2A600BA2177 /* MessageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageModel.swift; sourceTree = ""; }; @@ -124,6 +136,8 @@ 5292F4FA2776BC7900B9A7BB /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 5292F4FC2776BC7A00B9A7BB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 5292F4FF2776BC7A00B9A7BB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 52AC5C2727B7FE1D00EEB185 /* ViewExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewExtension.swift; sourceTree = ""; }; + 52AC5C2A27B8206D00EEB185 /* ListTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListTest.swift; sourceTree = ""; }; 52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleSignInButton.swift; sourceTree = ""; }; 52B8CF64277E0B44004CB680 /* PushDeerClip.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PushDeerClip.app; sourceTree = BUILT_PRODUCTS_DIR; }; 52B8CF6D277E0B46004CB680 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; @@ -144,11 +158,15 @@ 52F2C222277961D7006F08DC /* SettingsItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsItemView.swift; sourceTree = ""; }; 52F40D2E277CA05600766C24 /* MessageItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageItemView.swift; sourceTree = ""; }; 69F56B2711ED98819D474BE3 /* Pods-PushDeerClip.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeerClip.debug.xcconfig"; path = "Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip.debug.xcconfig"; sourceTree = ""; }; + 8B9D658D778AE868A0E052A8 /* Pods-PushDeer.debug-selfhosted.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeer.debug-selfhosted.xcconfig"; path = "Target Support Files/Pods-PushDeer/Pods-PushDeer.debug-selfhosted.xcconfig"; sourceTree = ""; }; 9CC775BE0326BF31C6FACF06 /* Pods-PushDeerClip.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeerClip.release.xcconfig"; path = "Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip.release.xcconfig"; sourceTree = ""; }; + B796E2A583611F7B6DC34726 /* Pods-PushDeerClip.release-selfhosted.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeerClip.release-selfhosted.xcconfig"; path = "Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip.release-selfhosted.xcconfig"; sourceTree = ""; }; + CB57B55699850AD493C774D0 /* Pods-PushDeerClip.debug-selfhosted.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeerClip.debug-selfhosted.xcconfig"; path = "Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip.debug-selfhosted.xcconfig"; sourceTree = ""; }; CCCE1F6E56B157872E2C755F /* Pods-PushDeer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeer.release.xcconfig"; path = "Target Support Files/Pods-PushDeer/Pods-PushDeer.release.xcconfig"; sourceTree = ""; }; CE3005BD875FC9819A92466C /* Pods-PushDeer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeer.debug.xcconfig"; path = "Target Support Files/Pods-PushDeer/Pods-PushDeer.debug.xcconfig"; sourceTree = ""; }; E03C2088F4CD9F4C0848E1A5 /* Pods_PushDeerClip.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PushDeerClip.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E380A18349DE4D26071E913E /* Pods_PushDeer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PushDeer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E60A7D4CA1149E1DBC55C672 /* Pods-PushDeer.release-selfhosted.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PushDeer.release-selfhosted.xcconfig"; path = "Target Support Files/Pods-PushDeer/Pods-PushDeer.release-selfhosted.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -180,6 +198,10 @@ CCCE1F6E56B157872E2C755F /* Pods-PushDeer.release.xcconfig */, 69F56B2711ED98819D474BE3 /* Pods-PushDeerClip.debug.xcconfig */, 9CC775BE0326BF31C6FACF06 /* Pods-PushDeerClip.release.xcconfig */, + 8B9D658D778AE868A0E052A8 /* Pods-PushDeer.debug-selfhosted.xcconfig */, + E60A7D4CA1149E1DBC55C672 /* Pods-PushDeer.release-selfhosted.xcconfig */, + CB57B55699850AD493C774D0 /* Pods-PushDeerClip.debug-selfhosted.xcconfig */, + B796E2A583611F7B6DC34726 /* Pods-PushDeerClip.release-selfhosted.xcconfig */, ); path = Pods; sourceTree = ""; @@ -237,6 +259,8 @@ 52450F3D27849228003652D8 /* Model */, 52F0243D2777370F0071D861 /* View */, 52F0243C277733CE0071D861 /* PushDeer.entitlements */, + 5234214C27B3F1AA007D6C1C /* PushDeer-SelfHosted.entitlements */, + 5243372627A6D86200190D00 /* Env.swift */, 52483FC1277ED6D5003A100E /* AppDelegate.swift */, 5292F4F82776BC7900B9A7BB /* PushDeerApp.swift */, 5292F4FA2776BC7900B9A7BB /* ContentView.swift */, @@ -259,6 +283,8 @@ children = ( 5287FF58278B3AAE00249A0E /* HToast.swift */, 52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */, + 52AC5C2727B7FE1D00EEB185 /* ViewExtension.swift */, + 52AC5C2A27B8206D00EEB185 /* ListTest.swift */, ); path = Common; sourceTree = ""; @@ -269,6 +295,7 @@ 52B8CF6F277E0B46004CB680 /* Info.plist */, 52E317DD279305BB000B8BB1 /* InfoPlist.strings */, 52B8CF70277E0B46004CB680 /* PushDeerClip.entitlements */, + 5222E12F27B3F73C000B4223 /* PushDeerClip-SelfHosted.entitlements */, 52B8CF6C277E0B46004CB680 /* Preview Content */, ); path = PushDeerClip; @@ -298,6 +325,7 @@ isa = PBXGroup; children = ( 52EB90B12778D9F90048E0ED /* Common */, + 524E99E527B3CD0F00292396 /* EndpointView.swift */, 52F0243E277737470071D861 /* LoginView.swift */, 52163EB227773F8400594190 /* MainView.swift */, 52163EB62777415F00594190 /* DeviceListView.swift */, @@ -532,9 +560,11 @@ 526A1E732791E03900BA2177 /* Persistence.swift in Sources */, 52F2C223277961D7006F08DC /* SettingsItemView.swift in Sources */, 52163EB72777415F00594190 /* DeviceListView.swift in Sources */, + 52AC5C2B27B8206D00EEB185 /* ListTest.swift in Sources */, 52B8CF5F277DE660004CB680 /* AppleSignInButton.swift in Sources */, 52163EB92777417900594190 /* KeyListView.swift in Sources */, 5292F4FB2776BC7900B9A7BB /* ContentView.swift in Sources */, + 5243372727A6D86200190D00 /* Env.swift in Sources */, 5287FF59278B3AAE00249A0E /* HToast.swift in Sources */, 52450F3B278491F8003652D8 /* AppState.swift in Sources */, 5292F4F92776BC7900B9A7BB /* PushDeerApp.swift in Sources */, @@ -542,8 +572,10 @@ 52483FC2277ED6D5003A100E /* AppDelegate.swift in Sources */, 52450F3827848243003652D8 /* PushDeerApi.swift in Sources */, 52EB90AE2778AFD60048E0ED /* BaseNavigationView.swift in Sources */, + 524E99E627B3CD0F00292396 /* EndpointView.swift in Sources */, 52EB90AC2778ADF80048E0ED /* CardView.swift in Sources */, 52EB90B02778D67F0048E0ED /* KeyItemView.swift in Sources */, + 52AC5C2827B7FE1D00EEB185 /* ViewExtension.swift in Sources */, 52450F3F2784923D003652D8 /* Result.swift in Sources */, 526A1E702791E00400BA2177 /* PushDeerData.xcdatamodeld in Sources */, 52450F422784943F003652D8 /* HttpRequest.swift in Sources */, @@ -566,9 +598,11 @@ 526A1E742791E03900BA2177 /* Persistence.swift in Sources */, 52B8CF7A277E0BFB004CB680 /* MessageListView.swift in Sources */, 52B8CF83277E0C12004CB680 /* DeletableView.swift in Sources */, + 52AC5C2C27B8206D00EEB185 /* ListTest.swift in Sources */, 52B8CF81277E0BFB004CB680 /* LoginView.swift in Sources */, 52B8CF7F277E0BFB004CB680 /* SettingsItemView.swift in Sources */, 52450F3C278491F8003652D8 /* AppState.swift in Sources */, + 5243372827A6D86200190D00 /* Env.swift in Sources */, 5287FF5A278B3AAE00249A0E /* HToast.swift in Sources */, 52B8CF80277E0BFB004CB680 /* MessageItemView.swift in Sources */, 526A1E752791E52600BA2177 /* PushDeerApp.swift in Sources */, @@ -576,8 +610,10 @@ 52483FC3277ED6D5003A100E /* AppDelegate.swift in Sources */, 52450F3927848243003652D8 /* PushDeerApi.swift in Sources */, 52B8CF86277E0C12004CB680 /* BaseNavigationView.swift in Sources */, + 524E99E727B3CD0F00292396 /* EndpointView.swift in Sources */, 52FBA09427874879003308C2 /* ContentView.swift in Sources */, 52B8CF85277E0C12004CB680 /* Line.swift in Sources */, + 52AC5C2927B7FE1D00EEB185 /* ViewExtension.swift in Sources */, 52450F402784923D003652D8 /* Result.swift in Sources */, 526A1E712791E00400BA2177 /* PushDeerData.xcdatamodeld in Sources */, 52450F432784943F003652D8 /* HttpRequest.swift in Sources */, @@ -628,6 +664,285 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 524E99E827B3DDF000292396 /* Debug-SelfHosted */ = { + 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", + "SELFHOSTED=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; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG SELFHOSTED"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = "Debug-SelfHosted"; + }; + 524E99E927B3DDF000292396 /* Debug-SelfHosted */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8B9D658D778AE868A0E052A8 /* Pods-PushDeer.debug-selfhosted.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-SH"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "PushDeer/PushDeer-SelfHosted.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 4; + DEVELOPMENT_ASSET_PATHS = "\"PushDeer/Preview Content\""; + DEVELOPMENT_TEAM = HUJ6HAE4VU; + "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = PushDeer/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "PushDeer·自架版"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.2; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.self.ios; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTS_MACCATALYST = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Debug-SelfHosted"; + }; + 524E99EA27B3DDF000292396 /* Debug-SelfHosted */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = CB57B55699850AD493C774D0 /* Pods-PushDeerClip.debug-selfhosted.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-SH"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "PushDeerClip/PushDeerClip-SelfHosted.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 4; + DEVELOPMENT_ASSET_PATHS = "\"PushDeerClip/Preview Content\""; + DEVELOPMENT_TEAM = HUJ6HAE4VU; + ENABLE_PREVIEWS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "APPCLIP=1", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = PushDeerClip/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "PushDeer·自架版"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.2; + OTHER_SWIFT_FLAGS = "$(inherited) -D APPCLIP"; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.self.ios.Clip; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Debug-SelfHosted"; + }; + 524E99EB27B3DDFE00292396 /* Release-SelfHosted */ = { + 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_PREPROCESSOR_DEFINITIONS = "SELFHOSTED=1"; + 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; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = SELFHOSTED; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = "Release-SelfHosted"; + }; + 524E99EC27B3DDFE00292396 /* Release-SelfHosted */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E60A7D4CA1149E1DBC55C672 /* Pods-PushDeer.release-selfhosted.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-SH"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "PushDeer/PushDeer-SelfHosted.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 4; + DEVELOPMENT_ASSET_PATHS = "\"PushDeer/Preview Content\""; + DEVELOPMENT_TEAM = HUJ6HAE4VU; + "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = PushDeer/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "PushDeer·自架版"; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.2; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.self.ios; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTS_MACCATALYST = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Release-SelfHosted"; + }; + 524E99ED27B3DDFE00292396 /* Release-SelfHosted */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B796E2A583611F7B6DC34726 /* Pods-PushDeerClip.release-selfhosted.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = "AppIcon-SH"; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = "PushDeerClip/PushDeerClip-SelfHosted.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 4; + DEVELOPMENT_ASSET_PATHS = "\"PushDeerClip/Preview Content\""; + DEVELOPMENT_TEAM = HUJ6HAE4VU; + ENABLE_PREVIEWS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "APPCLIP=1", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = PushDeerClip/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = "PushDeer·自架版"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.2; + OTHER_SWIFT_FLAGS = "$(inherited) -D APPCLIP"; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.self.ios.Clip; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = "Release-SelfHosted"; + }; 5292F5012776BC7A00B9A7BB /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -754,13 +1069,17 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = PushDeer/PushDeer.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 4; DEVELOPMENT_ASSET_PATHS = "\"PushDeer/Preview Content\""; - DEVELOPMENT_TEAM = Y47WTLML2S; + DEVELOPMENT_TEAM = HUJ6HAE4VU; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = PushDeer/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = PushDeer; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -770,8 +1089,8 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios; + MARKETING_VERSION = 1.2; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.app.ios; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -788,13 +1107,17 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = PushDeer/PushDeer.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 4; DEVELOPMENT_ASSET_PATHS = "\"PushDeer/Preview Content\""; - DEVELOPMENT_TEAM = Y47WTLML2S; + DEVELOPMENT_TEAM = HUJ6HAE4VU; "ENABLE_HARDENED_RUNTIME[sdk=macosx*]" = YES; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = PushDeer/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = PushDeer; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -804,8 +1127,8 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios; + MARKETING_VERSION = 1.2; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.app.ios; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = YES; SWIFT_EMIT_LOC_STRINGS = YES; @@ -822,9 +1145,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = PushDeerClip/PushDeerClip.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 4; DEVELOPMENT_ASSET_PATHS = "\"PushDeerClip/Preview Content\""; - DEVELOPMENT_TEAM = Y47WTLML2S; + DEVELOPMENT_TEAM = HUJ6HAE4VU; ENABLE_PREVIEWS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -833,6 +1156,8 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = PushDeerClip/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = PushDeer; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -843,9 +1168,9 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2; OTHER_SWIFT_FLAGS = "$(inherited) -D APPCLIP"; - PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios.Clip; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.app.ios.Clip; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -861,9 +1186,9 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = PushDeerClip/PushDeerClip.entitlements; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 4; DEVELOPMENT_ASSET_PATHS = "\"PushDeerClip/Preview Content\""; - DEVELOPMENT_TEAM = Y47WTLML2S; + DEVELOPMENT_TEAM = HUJ6HAE4VU; ENABLE_PREVIEWS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", @@ -872,6 +1197,8 @@ GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = PushDeerClip/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = PushDeer; + INFOPLIST_KEY_NSLocalNetworkUsageDescription = "APP需要访问本地网络以供调试(仅在开发时)"; + INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "APP为您提供保存图片到相册的功能"; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -882,9 +1209,9 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.2; OTHER_SWIFT_FLAGS = "$(inherited) -D APPCLIP"; - PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios.Clip; + PRODUCT_BUNDLE_IDENTIFIER = com.pushdeer.app.ios.Clip; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; @@ -899,7 +1226,9 @@ isa = XCConfigurationList; buildConfigurations = ( 5292F5012776BC7A00B9A7BB /* Debug */, + 524E99E827B3DDF000292396 /* Debug-SelfHosted */, 5292F5022776BC7A00B9A7BB /* Release */, + 524E99EB27B3DDFE00292396 /* Release-SelfHosted */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -908,7 +1237,9 @@ isa = XCConfigurationList; buildConfigurations = ( 5292F5042776BC7A00B9A7BB /* Debug */, + 524E99E927B3DDF000292396 /* Debug-SelfHosted */, 5292F5052776BC7A00B9A7BB /* Release */, + 524E99EC27B3DDFE00292396 /* Release-SelfHosted */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -917,7 +1248,9 @@ isa = XCConfigurationList; buildConfigurations = ( 52B8CF75277E0B46004CB680 /* Debug */, + 524E99EA27B3DDF000292396 /* Debug-SelfHosted */, 52B8CF76277E0B46004CB680 /* Release */, + 524E99ED27B3DDFE00292396 /* Release-SelfHosted */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeer-SelfHosted.xcscheme b/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeer-SelfHosted.xcscheme new file mode 100644 index 0000000..e205900 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeer-SelfHosted.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeer.xcscheme b/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeer.xcscheme new file mode 100644 index 0000000..18515b9 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeer.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeerClip-SelfHosted.xcscheme b/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeerClip-SelfHosted.xcscheme new file mode 100644 index 0000000..390afaa --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer.xcodeproj/xcshareddata/xcschemes/PushDeerClip-SelfHosted.xcscheme @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/PushDeer-iOS/PushDeer.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/PushDeer-iOS/PushDeer.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/PushDeer-iOS/PushDeer/AppDelegate.swift b/ios/PushDeer-iOS/PushDeer/AppDelegate.swift index 1ee62d6..6cfd7ed 100644 --- a/ios/PushDeer-iOS/PushDeer/AppDelegate.swift +++ b/ios/PushDeer-iOS/PushDeer/AppDelegate.swift @@ -7,11 +7,13 @@ import UIKit import UserNotifications +import IQKeyboardManagerSwift class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + // 注册通知 let center = UNUserNotificationCenter.current() center.delegate = self center.requestAuthorization(options: [.badge, .sound, .alert]) { granted, error in @@ -19,6 +21,7 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele } application.registerForRemoteNotifications() + // 首次网络请求提示 Task { let notFirstStart = UserDefaults.standard.bool(forKey: "PushDeer_notFirstStart") if !notFirstStart { @@ -28,6 +31,10 @@ class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDele } } + // IQ键盘管理 + IQKeyboardManager.shared.enable = false // 键盘与输入框的距离管理 禁用 + IQKeyboardManager.shared.enableAutoToolbar = true // 键盘上方添加的工具栏 启用 + return true } diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/100.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/100.png new file mode 100644 index 0000000..05ec7e7 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/100.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/1024.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/1024.png new file mode 100644 index 0000000..d35e3c7 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/1024.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/114.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/114.png new file mode 100644 index 0000000..ba7d6a8 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/114.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/120.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/120.png new file mode 100644 index 0000000..bc42a2e Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/120.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/128.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/128.png new file mode 100644 index 0000000..33e313c Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/128.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/144.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/144.png new file mode 100644 index 0000000..c1b18ac Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/144.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/152.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/152.png new file mode 100644 index 0000000..9a95ad2 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/152.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/16.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/16.png new file mode 100644 index 0000000..3a165e0 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/16.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/167.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/167.png new file mode 100644 index 0000000..9e65a36 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/167.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/172.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/172.png new file mode 100644 index 0000000..5f2b527 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/172.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/180.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/180.png new file mode 100644 index 0000000..153bfad Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/180.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/196.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/196.png new file mode 100644 index 0000000..2c91c45 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/196.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/20.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/20.png new file mode 100644 index 0000000..f32be2f Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/20.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/216.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/216.png new file mode 100644 index 0000000..0e15495 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/216.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/256.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/256.png new file mode 100644 index 0000000..7769706 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/256.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/29.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/29.png new file mode 100644 index 0000000..37341c7 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/29.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/32.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/32.png new file mode 100644 index 0000000..f88bb99 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/32.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/40.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/40.png new file mode 100644 index 0000000..bbab991 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/40.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/48.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/48.png new file mode 100644 index 0000000..80fd87a Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/48.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/50.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/50.png new file mode 100644 index 0000000..dc127f5 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/50.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/512.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/512.png new file mode 100644 index 0000000..3431240 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/512.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/55.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/55.png new file mode 100644 index 0000000..c4c3c93 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/55.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/57.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/57.png new file mode 100644 index 0000000..569eefe Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/57.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/58.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/58.png new file mode 100644 index 0000000..57f6912 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/58.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/60.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/60.png new file mode 100644 index 0000000..a6c40f8 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/60.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/64.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/64.png new file mode 100644 index 0000000..2bbbb5b Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/64.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/72.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/72.png new file mode 100644 index 0000000..13b81aa Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/72.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/76.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/76.png new file mode 100644 index 0000000..8a18a9c Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/76.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/80.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/80.png new file mode 100644 index 0000000..41013c6 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/80.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/87.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/87.png new file mode 100644 index 0000000..4a339eb Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/87.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/88.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/88.png new file mode 100644 index 0000000..a630e2f Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/88.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/Contents.json b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/Contents.json new file mode 100644 index 0000000..04de9d4 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/Contents.json @@ -0,0 +1,330 @@ +{ + "images" : [ + { + "filename" : "40.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "60.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "filename" : "80.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "filename" : "57.png", + "idiom" : "iphone", + "scale" : "1x", + "size" : "57x57" + }, + { + "filename" : "114.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "57x57" + }, + { + "filename" : "120.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "filename" : "180.png", + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "filename" : "20.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "filename" : "29.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "filename" : "58.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "40.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "filename" : "80.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "50.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "50x50" + }, + { + "filename" : "100.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "50x50" + }, + { + "filename" : "72.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "72x72" + }, + { + "filename" : "144.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "72x72" + }, + { + "filename" : "76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "filename" : "152.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "filename" : "167.png", + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "filename" : "1024.png", + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + }, + { + "filename" : "48.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "24x24", + "subtype" : "38mm" + }, + { + "filename" : "55.png", + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "27.5x27.5", + "subtype" : "42mm" + }, + { + "filename" : "58.png", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "2x", + "size" : "29x29" + }, + { + "filename" : "87.png", + "idiom" : "watch", + "role" : "companionSettings", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "watch", + "role" : "notificationCenter", + "scale" : "2x", + "size" : "33x33", + "subtype" : "45mm" + }, + { + "filename" : "80.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "40x40", + "subtype" : "38mm" + }, + { + "filename" : "88.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "44x44", + "subtype" : "40mm" + }, + { + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "46x46", + "subtype" : "41mm" + }, + { + "filename" : "100.png", + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "50x50", + "subtype" : "44mm" + }, + { + "idiom" : "watch", + "role" : "appLauncher", + "scale" : "2x", + "size" : "51x51", + "subtype" : "45mm" + }, + { + "filename" : "172.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "86x86", + "subtype" : "38mm" + }, + { + "filename" : "196.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "98x98", + "subtype" : "42mm" + }, + { + "filename" : "216.png", + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "108x108", + "subtype" : "44mm" + }, + { + "idiom" : "watch", + "role" : "quickLook", + "scale" : "2x", + "size" : "117x117", + "subtype" : "45mm" + }, + { + "filename" : "1024.png", + "idiom" : "watch-marketing", + "scale" : "1x", + "size" : "1024x1024" + }, + { + "filename" : "16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : "32.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : "32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : "64.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : "128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : "256.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : "256.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : "512.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : "512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : "1024.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/Contents.json b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/Contents.json new file mode 100644 index 0000000..b1eb435 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "logo2.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/logo2.png b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/logo2.png new file mode 100644 index 0000000..6c39fd6 Binary files /dev/null and b/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/logo2.png differ diff --git a/ios/PushDeer-iOS/PushDeer/Common/ListTest.swift b/ios/PushDeer-iOS/PushDeer/Common/ListTest.swift new file mode 100644 index 0000000..2ba635e --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/Common/ListTest.swift @@ -0,0 +1,59 @@ +// +// ListTest.swift +// PushDeer +// +// Created by HEXT on 2022/2/13. +// + +import SwiftUI + +/// 这是一个测试代码, 测试APP中几个列表改成List的可行性, 最后证明在iOS 15以上勉强可以, iOS 14 不太行, 样式达不到UI标准 +struct ListTestView: View { + var body: some View { + List { + Text("Hello, world!1") + Text("Hello, world!2") + .listRowBackground(Color.red) + Text("Hello, world!3") + + ForEach.init([ + DeviceItem(id: 0, uid: "", name: "Hext's iPhone 11", type: "", device_id: "", is_clip: 1) + ]) { + DeviceItemView(deviceItem: $0) + } + .onDelete(perform: { indexSet in + HToast.showSuccess("删除成功") + }) +// .listRowSeparator(.hidden) +// .listRowBackground(Color.red) + + } + .onAppear(perform: { + UITableView.appearance().backgroundColor = UIColor.clear + UITableView.appearance().separatorStyle = .none + UITableView.appearance().separatorColor = UIColor.clear + }) + .background(Color.white) + + // .listStyle(DefaultListStyle()) + // .listStyle(BorderedListStyle()) // + // .listStyle(CarouselListStyle()) // + // .listStyle(EllipticalListStyle()) // + // .listStyle(GroupedListStyle()) + // .listStyle(InsetListStyle()) + // .listStyle(InsetGroupedListStyle()) + .listStyle(PlainListStyle()) + // .listStyle(SidebarListStyle()) + + .refresh { + HToast.showSuccess("刷新成功") + } + } +} + +struct ListTestView_Previews: PreviewProvider { + static var previews: some View { + ListTestView() + .environmentObject(AppState.shared) + } +} diff --git a/ios/PushDeer-iOS/PushDeer/Common/ViewExtension.swift b/ios/PushDeer-iOS/PushDeer/Common/ViewExtension.swift new file mode 100644 index 0000000..9beaca7 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/Common/ViewExtension.swift @@ -0,0 +1,78 @@ +// +// ViewExtension.swift +// PushDeer +// +// Created by HEXT on 2022/2/12. +// + +import SwiftUI + +/// 给 View 加扩展, 包括给系统扩展包一层以兼容老系统 +extension View { + + /* + ps: #available(iOS 15.0, *) 判断在 Xcode 13.2 上面有 bug + https://stackoverflow.com/questions/70506330/swiftui-app-crashes-with-different-searchbar-viewmodifier-on-ios-14-15/70603710#70603710 + 例如: if #available(iOS 15.0, *) { textField().submitLabel(.done) } + 比如就算在 iOS 14 上, 也会寻找 submitLabel 方法, + submitLabel 方法在 iOS 14 上 不存在, 就会造成奔溃. + 一般解决方法为多包一层, 比如用自己的 ViewModifier 包装系统的, 再去判断 + 比如自己写个 aaa ViewModifier 去包装系统的 submitLabel, 然后使用的地方改成自己的方法: + if #available(iOS 15.0, *) { textField().aaa(.done) } + 自己写的 aaa ViewModifier 方法在每个系统上都可以找到, 就不会奔溃了 + */ + + /// 给 List 添加 下拉刷新 + func refresh(action: @escaping @Sendable () async -> Void) -> some View { + Group { + if #available(iOS 15.0, *) { + self.modifier(RefreshModifier(action: action)) + } else { + self + } + } + } + + /// 键盘回车按钮的文字显示为: 完成/Done + func submitLabelDone() -> some View { + Group { + if #available(iOS 15.0, *) { + self.modifier(SubmitLabelDoneModifier()) + } else { + self + } + } + } +} + +@available(iOS 15.0, *) +struct RefreshModifier: ViewModifier { + let action: @Sendable () async -> Void + func body(content: Content) -> some View { + content + .refreshable(action: action) + } +} + +@available(iOS 15.0, *) +struct SubmitLabelDoneModifier: ViewModifier { + func body(content: Content) -> some View { + content + .submitLabel(.done) + } +} + +struct ViewExtension_Previews: PreviewProvider { + static var previews: some View { + List { + Text("A List Item") + Text("A Second List Item") + Text("A Third List Item") + TextField("请输入", text: .constant("")) + .submitLabelDone() + } + .refresh { + + } + } +} diff --git a/ios/PushDeer-iOS/PushDeer/ContentView.swift b/ios/PushDeer-iOS/PushDeer/ContentView.swift index 078c67f..6cf1ffb 100644 --- a/ios/PushDeer-iOS/PushDeer/ContentView.swift +++ b/ios/PushDeer-iOS/PushDeer/ContentView.swift @@ -12,7 +12,9 @@ struct ContentView: View { @EnvironmentObject private var store: AppState var body: some View { - if store.token.isEmpty { + if Env.isSelfHosted && store.api_endpoint.isEmpty { + EndpointView() + } else if store.token.isEmpty { LoginView() } else { MainView() diff --git a/ios/PushDeer-iOS/PushDeer/Env.swift b/ios/PushDeer-iOS/PushDeer/Env.swift new file mode 100644 index 0000000..7008e82 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/Env.swift @@ -0,0 +1,24 @@ +// +// Env.swift +// PushDeer +// +// Created by HEXT on 2022/1/30. +// + +import Foundation + +/// APP运行环境 +struct Env { + /// 是否是自建服务, 自建服务为 true, 在线服务为 false + static let isSelfHosted: Bool = { + #if SELFHOSTED + return true + #else + return false + #endif + }() + /// 在线版本的 Api Endpoint + static let onlineApiEndpoint = "https://api2.pushdeer.com" + /// AppStore 的 appId, 自建版: 1608017631; 在线版: 1596771139 + static let appStoreId = isSelfHosted ? 1608017631 : 1596771139 +} diff --git a/ios/PushDeer-iOS/PushDeer/Info.plist b/ios/PushDeer-iOS/PushDeer/Info.plist index 6ddad4c..46e9daf 100644 --- a/ios/PushDeer-iOS/PushDeer/Info.plist +++ b/ios/PushDeer-iOS/PushDeer/Info.plist @@ -2,8 +2,6 @@ - NSPhotoLibraryAddUsageDescription - APP为您提供保存图片到相册的功能 CFBundleAllowMixedLocalizations NSAppTransportSecurity @@ -19,7 +17,5 @@ remote-notification - NSLocalNetworkUsageDescription - APP需要访问本地网络以供调试(仅在开发时) diff --git a/ios/PushDeer-iOS/PushDeer/PushDeer-SelfHosted.entitlements b/ios/PushDeer-iOS/PushDeer/PushDeer-SelfHosted.entitlements new file mode 100644 index 0000000..64fe498 --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/PushDeer-SelfHosted.entitlements @@ -0,0 +1,22 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + com.apple.developer.associated-domains + + appclips:self.pushdeer.com + + com.apple.security.app-sandbox + + com.apple.security.network.client + + com.apple.security.personal-information.photos-library + + + diff --git a/ios/PushDeer-iOS/PushDeer/PushDeer.entitlements b/ios/PushDeer-iOS/PushDeer/PushDeer.entitlements index acd55e5..09987df 100644 --- a/ios/PushDeer-iOS/PushDeer/PushDeer.entitlements +++ b/ios/PushDeer-iOS/PushDeer/PushDeer.entitlements @@ -8,6 +8,10 @@ Default + com.apple.developer.associated-domains + + appclips:vip.pushdeer.com + com.apple.security.app-sandbox com.apple.security.network.client diff --git a/ios/PushDeer-iOS/PushDeer/PushDeerApp.swift b/ios/PushDeer-iOS/PushDeer/PushDeerApp.swift index 5b22b54..bbe7875 100644 --- a/ios/PushDeer-iOS/PushDeer/PushDeerApp.swift +++ b/ios/PushDeer-iOS/PushDeer/PushDeerApp.swift @@ -16,6 +16,17 @@ struct PushDeerApp: App { var body: some Scene { WindowGroup { ContentView() + .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in + // 后台进入前台后, 清空未读消息角标 + UIApplication.shared.applicationIconBadgeNumber = 0 + // 后台进入前台后, 刷新本地消息列表 + if !AppState.shared.token.isEmpty { + Task { + let messageItems = try await HttpRequest.getMessages().messages + try MessageModel.saveAndUpdate(messageItems: messageItems) + } + } + } .environmentObject(store) .environment(\.managedObjectContext, persistenceController.container.viewContext) } diff --git a/ios/PushDeer-iOS/PushDeer/Service/AppState.swift b/ios/PushDeer-iOS/PushDeer/Service/AppState.swift index 47e2089..27a3a36 100644 --- a/ios/PushDeer-iOS/PushDeer/Service/AppState.swift +++ b/ios/PushDeer-iOS/PushDeer/Service/AppState.swift @@ -38,6 +38,13 @@ class AppState: ObservableObject { } } + /// API endpoint + @Published var api_endpoint : String { + didSet { + UserDefaults.standard.set(api_endpoint, forKey: "PushDeer_api_endpoint") + } + } + var isAppClip: Bool { #if APPCLIP return true @@ -52,9 +59,11 @@ class AppState: ObservableObject { let _token = UserDefaults.standard.string(forKey: "PushDeer_token") let _tabSelectedIndex = UserDefaults.standard.integer(forKey: "PushDeer_tabSelectedIndex") let _isShowTestPush = UserDefaults.standard.object(forKey: "PushDeer_isShowTestPush") + let _api_endpoint = UserDefaults.standard.string(forKey: "PushDeer_api_endpoint") token = _token ?? "" tabSelectedIndex = _tabSelectedIndex isShowTestPush = _isShowTestPush as? Bool ?? true + api_endpoint = _api_endpoint ?? "" } func appleIdLogin(_ result: Result) async throws -> TokenContent { diff --git a/ios/PushDeer-iOS/PushDeer/Service/PushDeerApi.swift b/ios/PushDeer-iOS/PushDeer/Service/PushDeerApi.swift index db35e24..a698182 100644 --- a/ios/PushDeer-iOS/PushDeer/Service/PushDeerApi.swift +++ b/ios/PushDeer-iOS/PushDeer/Service/PushDeerApi.swift @@ -34,7 +34,13 @@ enum PushDeerApi { } extension PushDeerApi: TargetType { - var baseURL: URL { URL( string: "http://pushdeer.wskfz.com:8800" )! } + var baseURL: URL { + var urlStr = Env.onlineApiEndpoint + if Env.isSelfHosted && !AppState.shared.api_endpoint.isEmpty { + urlStr = AppState.shared.api_endpoint + } + return URL(string: urlStr)! + } var path: String { switch self { case .fake: diff --git a/ios/PushDeer-iOS/PushDeer/View/Common/EditableText.swift b/ios/PushDeer-iOS/PushDeer/View/Common/EditableText.swift index 20720c7..9611adf 100644 --- a/ios/PushDeer-iOS/PushDeer/View/Common/EditableText.swift +++ b/ios/PushDeer-iOS/PushDeer/View/Common/EditableText.swift @@ -14,28 +14,14 @@ struct EditableText: View { } - func textField() -> some View { + var body: some View { TextField(placeholder, text: $value, onCommit: { print("修改文本:", value) self.onCommit(value) }) .font(.system(size: 20)) .foregroundColor(Color.accentColor) - } - - var body: some View { - if #available(iOS 15.0, *) { - Group { - // https://stackoverflow.com/questions/70506330/swiftui-app-crashes-with-different-searchbar-viewmodifier-on-ios-14-15/70603710#70603710 - // !!!: 用 Group 包起来, 并且再次检查, 是因为在 Xcode 13.2 上面有 bug, 造成老版本也会寻找 if 里面的新方法, 造成老版本奔溃. - if #available(iOS 15.0, *) { - textField() - .submitLabel(.done) - } - } - } else { - textField() - } + .submitLabelDone() } } diff --git a/ios/PushDeer-iOS/PushDeer/View/DeviceListView.swift b/ios/PushDeer-iOS/PushDeer/View/DeviceListView.swift index ee23764..a385d29 100644 --- a/ios/PushDeer-iOS/PushDeer/View/DeviceListView.swift +++ b/ios/PushDeer-iOS/PushDeer/View/DeviceListView.swift @@ -10,6 +10,7 @@ import SwiftUI /// 设备界面 struct DeviceListView: View { @EnvironmentObject private var store: AppState + @State private var isShowAlert = false var body: some View { BaseNavigationView(title: "设备") { ScrollView { @@ -21,6 +22,8 @@ struct DeviceListView: View { store.devices.removeAll { _deviceItem in _deviceItem.id == deviceItem.id } + // 尝试触发 @Published, 看能不能解决 UI 偶尔不更新的问题 + store.devices = store.devices HToast.showSuccess(NSLocalizedString("已删除", comment: "删除设备/Key/消息时提示")) Task { do { @@ -32,29 +35,65 @@ struct DeviceListView: View { }) .padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24)) } + + if store.devices.isEmpty { + Text("你还未注册当前设备, 注册后才能收到推送, 你可以点击右上角 \(Image(systemName: "plus")) 添加当前设备") + .foregroundColor(Color(UIColor.lightGray)) + .padding() + } + Spacer(minLength: 30) } } - .navigationBarItems(trailing: Button(action: { - Task { - let hasContains = store.devices.contains { store.deviceToken == $0.device_id } - if hasContains { - HToast.showInfo(NSLocalizedString("已添加过当前设备", comment: "")) - return; - } - let devices = try await HttpRequest.regDevice().devices - withAnimation(.easeOut) { - store.devices = devices - } - HToast.showSuccess(NSLocalizedString("已添加当前设备", comment: "")) - } - }, label: { + .navigationBarItems(trailing: Button(action: regDevice, label: { Image(systemName: "plus") .foregroundColor(Color(UIColor.lightGray)) })) } .onAppear { - HttpRequest.loadDevices() + Task { + // 加载已注册设备列表 + let result = try await HttpRequest.getDevices() + AppState.shared.devices = result.devices + + // 首次提示添加设备 + let hasAlertRegDevice = UserDefaults.standard.bool(forKey: "PushDeer_hasAlertRegDevice") + if !AppState.shared.deviceToken.isEmpty && !hasAlertRegDevice { + let hasContains = result.devices.contains { deviceItem in + deviceItem.device_id == AppState.shared.deviceToken + } + if !hasContains { + isShowAlert = true + UserDefaults.standard.set(true, forKey: "PushDeer_hasAlertRegDevice") + } + } + } + } + .alert(isPresented: $isShowAlert) { + Alert( + title: Text("温馨提示"), + message: Text("你还未注册当前设备, 注册后才能收到推送, 是否现在注册? (你还可以稍后点击右上角 + 符号添加当前设备)"), + primaryButton: .default( + Text("注册"), + action: regDevice + ), + secondaryButton: .cancel(Text("稍后")) + ) + } + } + + func regDevice() -> Void { + Task { + let hasContains = store.devices.contains { store.deviceToken == $0.device_id } + if hasContains { + HToast.showInfo(NSLocalizedString("已添加过当前设备", comment: "")) + return; + } + let devices = try await HttpRequest.regDevice().devices + withAnimation(.easeOut) { + store.devices = devices + } + HToast.showSuccess(NSLocalizedString("已添加当前设备", comment: "")) } } } diff --git a/ios/PushDeer-iOS/PushDeer/View/EndpointView.swift b/ios/PushDeer-iOS/PushDeer/View/EndpointView.swift new file mode 100644 index 0000000..732077d --- /dev/null +++ b/ios/PushDeer-iOS/PushDeer/View/EndpointView.swift @@ -0,0 +1,84 @@ +// +// EndpointView.swift +// PushDeer +// +// Created by Easy on 2022/2/1. +// + +import SwiftUI + +struct EndpointView: View { + @EnvironmentObject private var store: AppState + @State private var endpoint = "" + + var body: some View { + VStack{ + Spacer() + + Image("logo-SH") + .resizable() + .scaledToFit() + .frame(height: 200) + + Spacer() + + TextField( + "请输入API服务的 endpoint url", + text: $endpoint + ) + .frame(maxWidth: 400, maxHeight: 48) + .padding(.horizontal, 6) + .cornerRadius(5) + .overlay( + RoundedRectangle(cornerRadius: 5) + .stroke(lineWidth: 1.0) + ) + + Text("您在此应用中的数据都将发送到 endpoint 指向的服务器") + + Button("保存") { + + if endpoint.isEmpty { + HToast.showError(NSLocalizedString("Endpoint 不能为空", comment: "")) + return + } + + if URL(string: endpoint) == nil { + HToast.showError(NSLocalizedString("Endpoint 格式不正确", comment: "")) + return + } + + if !endpoint.lowercased().hasPrefix("http") { + HToast.showError(NSLocalizedString("请输入协议前缀: http:// 或 https://", comment: "")) + return + } + + if endpoint.last == "/" { + endpoint = String(endpoint.dropLast()) + } + + if endpoint == Env.onlineApiEndpoint { + HToast.showError(NSLocalizedString("请输入自架服务器的 Endpoint 或者使用非自架版PushDeer", comment: "")) + return + } + + store.api_endpoint = endpoint + } + .font(.system(size: 20)) + .frame(width: 104, height: 42) + .foregroundColor(Color.white) + .background(Color("BtnBgColor")) + .cornerRadius(8) + .padding(EdgeInsets(top: 12, leading: 26, bottom: 0, trailing: 24)) + + Spacer() + } + .padding(.horizontal, 16) + } +} + +struct EndpointView_Previews: PreviewProvider { + static var previews: some View { + EndpointView().environmentObject(AppState.shared) + } +} diff --git a/ios/PushDeer-iOS/PushDeer/View/KeyListView.swift b/ios/PushDeer-iOS/PushDeer/View/KeyListView.swift index e21c1e8..a9b7503 100644 --- a/ios/PushDeer-iOS/PushDeer/View/KeyListView.swift +++ b/ios/PushDeer-iOS/PushDeer/View/KeyListView.swift @@ -24,6 +24,8 @@ struct KeyListView: View { store.keys.removeAll { _keyItem in keyItem.id == _keyItem.id } + // 尝试触发 @Published, 看能不能解决 UI 偶尔不更新的问题 + store.keys = store.keys HToast.showSuccess(NSLocalizedString("已删除", comment: "删除设备/Key/消息时提示")) Task { do { @@ -35,24 +37,43 @@ struct KeyListView: View { }) .padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24)) } + + if store.keys.isEmpty { + Text("你还未添加过 Key, 发送推送需要使用 Key, 你可以点击右上角 \(Image(systemName: "plus")) 生成一个 Key") + .foregroundColor(Color(UIColor.lightGray)) + .padding() + } + Spacer(minLength: 30) } } - .navigationBarItems(trailing: Button(action: { - Task { - let keys = try await HttpRequest.genKey().keys - withAnimation(.easeOut) { - store.keys = keys - } - HToast.showSuccess(NSLocalizedString("已添加新Key", comment: "")) - } - }, label: { + .navigationBarItems(trailing: Button(action: genKey, label: { Image(systemName: "plus") .foregroundColor(Color(UIColor.lightGray)) })) } .onAppear { - HttpRequest.loadKeys() + Task { + let result = try await HttpRequest.getKeys() + AppState.shared.keys = result.keys + + // 首次自动生成一个 key + let hasAlertGenKey = UserDefaults.standard.bool(forKey: "PushDeer_hasAlertGenKey") + if result.keys.isEmpty && !hasAlertGenKey { + genKey() + UserDefaults.standard.set(true, forKey: "PushDeer_hasAlertGenKey") + } + } + } + } + + func genKey() -> Void { + Task { + let keys = try await HttpRequest.genKey().keys + withAnimation(.easeOut) { + store.keys = keys + } + HToast.showSuccess(NSLocalizedString("已添加新Key", comment: "")) } } } diff --git a/ios/PushDeer-iOS/PushDeer/View/LoginView.swift b/ios/PushDeer-iOS/PushDeer/View/LoginView.swift index 63c3b06..6192f11 100644 --- a/ios/PushDeer-iOS/PushDeer/View/LoginView.swift +++ b/ios/PushDeer-iOS/PushDeer/View/LoginView.swift @@ -20,6 +20,11 @@ struct LoginView: View { Image("logo.with.space") .resizable() .scaledToFit() + if Env.isSelfHosted { + Button("重置API endpoint") { + store.api_endpoint = "" + } + } Spacer() if showLoading { ProgressView() diff --git a/ios/PushDeer-iOS/PushDeer/View/MainView.swift b/ios/PushDeer-iOS/PushDeer/View/MainView.swift index 39f5f5b..2a08130 100644 --- a/ios/PushDeer-iOS/PushDeer/View/MainView.swift +++ b/ios/PushDeer-iOS/PushDeer/View/MainView.swift @@ -13,6 +13,12 @@ struct MainView: View { var body: some View { TabView.init(selection: $store.tabSelectedIndex) { + + MessageListView() + .tabItem({Label("消息",systemImage: "message")}).onTapGesture { + } + .tag(2) + DeviceListView() .tabItem { if #available(iOS 15.0, *) { @@ -29,11 +35,6 @@ struct MainView: View { } .tag(1) - MessageListView() - .tabItem({Label("消息",systemImage: "message")}).onTapGesture { - } - .tag(2) - SettingsView() .tabItem{ Label("设置",systemImage: "gearshape") diff --git a/ios/PushDeer-iOS/PushDeer/View/MessageListView.swift b/ios/PushDeer-iOS/PushDeer/View/MessageListView.swift index 282a110..ef0c80a 100644 --- a/ios/PushDeer-iOS/PushDeer/View/MessageListView.swift +++ b/ios/PushDeer-iOS/PushDeer/View/MessageListView.swift @@ -73,10 +73,22 @@ struct TestPushView: View { HToast.showError(NSLocalizedString("推送失败, 请先输入推送内容", comment: "")) return } + // 收键盘 + UIApplication.shared.sendAction( + #selector(UIResponder.resignFirstResponder), + to: nil, + from: nil, + for: nil + ) Task { if store.keys.isEmpty { + // 查keys列表 store.keys = try await HttpRequest.getKeys().keys } + if store.keys.isEmpty { + // 没查到就自动生成一个key + store.keys = try await HttpRequest.genKey().keys + } if let keyItem = store.keys.first { do { _ = try await HttpRequest.push(pushkey: keyItem.key, text: testText, desp: "", type: "") diff --git a/ios/PushDeer-iOS/PushDeer/View/SettingsView.swift b/ios/PushDeer-iOS/PushDeer/View/SettingsView.swift index 54787c1..c8f1c81 100644 --- a/ios/PushDeer-iOS/PushDeer/View/SettingsView.swift +++ b/ios/PushDeer-iOS/PushDeer/View/SettingsView.swift @@ -14,26 +14,31 @@ struct SettingsView: View { var body: some View { BaseNavigationView(title: "设置") { - VStack { - SettingsItemView(title: NSLocalizedString("登录为", comment: "") + " " + userName(), button: NSLocalizedString("退出", comment: "退出登录按钮上的文字")) { - store.token = "" + ScrollView { + VStack { + SettingsItemView(title: NSLocalizedString("登录为", comment: "") + " " + userName(), button: NSLocalizedString("退出", comment: "退出登录按钮上的文字")) { + store.token = "" + } + .padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20)) + + if Env.isSelfHosted { + SettingsItemView(title: NSLocalizedString("API endpoint", comment: ""), button: NSLocalizedString("重置", comment: "")) { + store.api_endpoint = "" + store.token = "" + } + .padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20)) + } + + SettingsItemView(title: NSLocalizedString("喜欢PushDeer?", comment: ""), button: NSLocalizedString("评分", comment: "")) { + let urlStr = "itms-apps://itunes.apple.com/app/id\(Env.appStoreId)?action=write-review" + UIApplication.shared.open(URL(string: urlStr)!, options: [:], completionHandler: nil) + // 直接弹出系统评分控件, 不过一年最多3次, 用户还可以在系统设置里面关 + // SKStoreReviewController.requestReview() + } + .padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20)) + + Spacer() } - .padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20)) - - SettingsItemView(title: NSLocalizedString("自定义服务器", comment: ""), button: NSLocalizedString("扫码", comment: "")) { - } - .disabled(true) - .padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20)) - - SettingsItemView(title: NSLocalizedString("喜欢PushDeer?", comment: ""), button: NSLocalizedString("评分", comment: "")) { - let urlStr = "itms-apps://itunes.apple.com/app/id\(1596771139)?action=write-review" - UIApplication.shared.open(URL(string: urlStr)!, options: [:], completionHandler: nil) - // 直接弹出系统评分控件, 不过一年最多3次, 用户还可以在系统设置里面关 -// SKStoreReviewController.requestReview() - } - .padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20)) - - Spacer() } } .onAppear { diff --git a/ios/PushDeer-iOS/PushDeer/en.lproj/Localizable.strings b/ios/PushDeer-iOS/PushDeer/en.lproj/Localizable.strings index 66985d1..4747a38 100644 --- a/ios/PushDeer-iOS/PushDeer/en.lproj/Localizable.strings +++ b/ios/PushDeer-iOS/PushDeer/en.lproj/Localizable.strings @@ -1,6 +1,9 @@ /* 在设备列表中标识当前设备 */ "(当前设备)" = "(current device)"; +/* No comment provided by engineer. */ +"保存" = "Save"; + /* No comment provided by engineer. */ "保存成功" = "Saved successfully"; @@ -34,12 +37,42 @@ /* No comment provided by engineer. */ "内容" = "Content"; +/* No comment provided by engineer. */ +"你还未添加过 Key, 发送推送需要使用 Key, 你可以点击右上角 %@ 生成一个 Key" = "You have not added a key yet, you need to use a key to send a push, you can click %@ in the upper right corner to generate a key"; + +/* No comment provided by engineer. */ +"你还未注册当前设备, 注册后才能收到推送, 你可以点击右上角 %@ 添加当前设备" = "You have not registered the current device, you can receive push notifications after registration. You can click %@ in the upper right corner to add the current device"; + +/* No comment provided by engineer. */ +"你还未注册当前设备, 注册后才能收到推送, 是否现在注册? (你还可以稍后点击右上角 + 符号添加当前设备)" = "You have not registered the current device, you can receive push notifications after registration, do you want to register now? (You can also click the + symbol in the upper right corner to add the current device later)"; + +/* No comment provided by engineer. */ +"您在此应用中的数据都将发送到 endpoint 指向的服务器" = "Your data in this app will be sent to the server pointed to by endpoint"; + /* No comment provided by engineer. */ "评分" = "Score"; +/* No comment provided by engineer. */ +"苹果用户" = "Apple User"; + +/* No comment provided by engineer. */ +"请输入" = "Please enter"; + +/* No comment provided by engineer. */ +"请输入协议前缀: http:// 或 https://" = "Please enter a protocol prefix: http:// or https://"; + +/* No comment provided by engineer. */ +"请输入自架服务器的 Endpoint 或者使用非自架版PushDeer" = "Please enter the Endpoint of the self-hosted server or use the non-self-hosted version of PushDeer"; + +/* No comment provided by engineer. */ +"请输入API服务的 endpoint url" = "Please enter the endpoint url of the API service"; + /* No comment provided by engineer. */ "扫码" = "Scan"; +/* No comment provided by engineer. */ +"稍后" = "Later"; + /* No comment provided by engineer. */ "设备" = "Devices"; @@ -52,6 +85,9 @@ /* No comment provided by engineer. */ "输入key名称" = "Enter key name"; +/* No comment provided by engineer. */ +"温馨提示" = "Tips"; + /* No comment provided by engineer. */ "图片未加载成功" = "Image did not load successfully"; @@ -106,7 +142,18 @@ /* 重置key的按钮标题 */ "重置" = "Reset"; +/* No comment provided by engineer. */ +"重置API endpoint" = "Reset API endpoint"; + +/* No comment provided by engineer. */ +"注册" = "Register"; + /* No comment provided by engineer. */ "自定义服务器" = "Custom server"; -"苹果用户" = "Apple User"; +/* No comment provided by engineer. */ +"Endpoint 不能为空" = "Endpoint cannot be empty"; + +/* No comment provided by engineer. */ +"Endpoint 格式不正确" = "Endpoint is malformed"; + diff --git a/ios/PushDeer-iOS/PushDeerClip/Info.plist b/ios/PushDeer-iOS/PushDeerClip/Info.plist index 8dd2867..17413d9 100644 --- a/ios/PushDeer-iOS/PushDeerClip/Info.plist +++ b/ios/PushDeer-iOS/PushDeerClip/Info.plist @@ -2,6 +2,8 @@ + CFBundleAllowMixedLocalizations + NSAppClip NSAppClipRequestEphemeralUserNotification @@ -18,11 +20,5 @@ _adhp._tcp - NSLocalNetworkUsageDescription - APP需要访问本地网络以供调试(仅在开发时) - CFBundleAllowMixedLocalizations - - NSPhotoLibraryAddUsageDescription - APP为您提供保存图片到相册的功能 diff --git a/ios/PushDeer-iOS/PushDeerClip/PushDeerClip-SelfHosted.entitlements b/ios/PushDeer-iOS/PushDeerClip/PushDeerClip-SelfHosted.entitlements new file mode 100644 index 0000000..bc419bf --- /dev/null +++ b/ios/PushDeer-iOS/PushDeerClip/PushDeerClip-SelfHosted.entitlements @@ -0,0 +1,20 @@ + + + + + aps-environment + development + com.apple.developer.applesignin + + Default + + com.apple.developer.associated-domains + + appclips:self.pushdeer.com + + com.apple.developer.parent-application-identifiers + + $(AppIdentifierPrefix)com.pushdeer.self.ios + + + diff --git a/ios/PushDeer-iOS/PushDeerClip/PushDeerClip.entitlements b/ios/PushDeer-iOS/PushDeerClip/PushDeerClip.entitlements index e6942c0..a92507e 100644 --- a/ios/PushDeer-iOS/PushDeerClip/PushDeerClip.entitlements +++ b/ios/PushDeer-iOS/PushDeerClip/PushDeerClip.entitlements @@ -8,9 +8,13 @@ Default + com.apple.developer.associated-domains + + appclips:vip.pushdeer.com + com.apple.developer.parent-application-identifiers - $(AppIdentifierPrefix)com.wskfz.pushdeer.ios + $(AppIdentifierPrefix)com.pushdeer.app.ios