iOS 完成大部分页面

This commit is contained in:
hext 2021-12-27 22:33:27 +08:00
parent 30b5456cc2
commit 911a271b6e
43 changed files with 1447 additions and 0 deletions

114
ios/PushDeer-iOS/.gitignore vendored Normal file
View File

@ -0,0 +1,114 @@
# General
.DS_Store
.AppleDouble
.LSOverride
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# 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:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# 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/

1
ios/PushDeer-iOS/LICENSE Normal file
View File

@ -0,0 +1 @@
本项目禁止商用(包括但不限于搭建后挂广告或售卖会员、打包后上架商店销售等),对非商业用途采用 GPLV2 授权

View File

@ -0,0 +1,421 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 55;
objects = {
/* Begin PBXBuildFile section */
52163EB327773F8400594190 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB227773F8400594190 /* MainView.swift */; };
52163EB52777413B00594190 /* MessageListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB42777413B00594190 /* MessageListView.swift */; };
52163EB72777415F00594190 /* DeviceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB62777415F00594190 /* DeviceListView.swift */; };
52163EB92777417900594190 /* KeyListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB82777417900594190 /* KeyListView.swift */; };
52163EBB277741AC00594190 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EBA277741AC00594190 /* SettingsView.swift */; };
523150D9277875FB00941EDC /* DeletableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523150D8277875FB00941EDC /* DeletableView.swift */; };
523150DC2778762B00941EDC /* DeviceItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523150DB2778762B00941EDC /* DeviceItemView.swift */; };
5292F4F92776BC7900B9A7BB /* PushDeerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5292F4F82776BC7900B9A7BB /* PushDeerApp.swift */; };
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 */; };
52EB90AC2778ADF80048E0ED /* CardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90AB2778ADF80048E0ED /* CardView.swift */; };
52EB90AE2778AFD60048E0ED /* BaseNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90AD2778AFD60048E0ED /* BaseNavigationView.swift */; };
52EB90B02778D67F0048E0ED /* KeyItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90AF2778D67F0048E0ED /* KeyItemView.swift */; };
52EB90B32778DA4E0048E0ED /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90B22778DA4E0048E0ED /* Line.swift */; };
52F0243F277737470071D861 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0243E277737470071D861 /* LoginView.swift */; };
52F2C223277961D7006F08DC /* SettingsItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F2C222277961D7006F08DC /* SettingsItemView.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
52163EB227773F8400594190 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; };
52163EB42777413B00594190 /* MessageListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageListView.swift; sourceTree = "<group>"; };
52163EB62777415F00594190 /* DeviceListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceListView.swift; sourceTree = "<group>"; };
52163EB82777417900594190 /* KeyListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyListView.swift; sourceTree = "<group>"; };
52163EBA277741AC00594190 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
523150D8277875FB00941EDC /* DeletableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeletableView.swift; sourceTree = "<group>"; };
523150DB2778762B00941EDC /* DeviceItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceItemView.swift; sourceTree = "<group>"; };
5292F4F52776BC7900B9A7BB /* PushDeer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PushDeer.app; sourceTree = BUILT_PRODUCTS_DIR; };
5292F4F82776BC7900B9A7BB /* PushDeerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushDeerApp.swift; sourceTree = "<group>"; };
5292F4FA2776BC7900B9A7BB /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
5292F4FC2776BC7A00B9A7BB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
5292F4FF2776BC7A00B9A7BB /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
52EB90AB2778ADF80048E0ED /* CardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardView.swift; sourceTree = "<group>"; };
52EB90AD2778AFD60048E0ED /* BaseNavigationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseNavigationView.swift; sourceTree = "<group>"; };
52EB90AF2778D67F0048E0ED /* KeyItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyItemView.swift; sourceTree = "<group>"; };
52EB90B22778DA4E0048E0ED /* Line.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line.swift; sourceTree = "<group>"; };
52F0243C277733CE0071D861 /* PushDeer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PushDeer.entitlements; sourceTree = "<group>"; };
52F0243E277737470071D861 /* LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginView.swift; sourceTree = "<group>"; };
52F2C222277961D7006F08DC /* SettingsItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsItemView.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
5292F4F22776BC7900B9A7BB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
5292F4EC2776BC7900B9A7BB = {
isa = PBXGroup;
children = (
5292F4F72776BC7900B9A7BB /* PushDeer */,
5292F4F62776BC7900B9A7BB /* Products */,
);
indentWidth = 2;
sourceTree = "<group>";
};
5292F4F62776BC7900B9A7BB /* Products */ = {
isa = PBXGroup;
children = (
5292F4F52776BC7900B9A7BB /* PushDeer.app */,
);
name = Products;
sourceTree = "<group>";
};
5292F4F72776BC7900B9A7BB /* PushDeer */ = {
isa = PBXGroup;
children = (
52F0243D2777370F0071D861 /* View */,
52F0243C277733CE0071D861 /* PushDeer.entitlements */,
5292F4F82776BC7900B9A7BB /* PushDeerApp.swift */,
5292F4FA2776BC7900B9A7BB /* ContentView.swift */,
5292F4FC2776BC7A00B9A7BB /* Assets.xcassets */,
5292F4FE2776BC7A00B9A7BB /* Preview Content */,
);
path = PushDeer;
sourceTree = "<group>";
};
5292F4FE2776BC7A00B9A7BB /* Preview Content */ = {
isa = PBXGroup;
children = (
5292F4FF2776BC7A00B9A7BB /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
52EB90B12778D9F90048E0ED /* Common */ = {
isa = PBXGroup;
children = (
52EB90AD2778AFD60048E0ED /* BaseNavigationView.swift */,
523150D8277875FB00941EDC /* DeletableView.swift */,
52EB90AB2778ADF80048E0ED /* CardView.swift */,
52EB90B22778DA4E0048E0ED /* Line.swift */,
);
path = Common;
sourceTree = "<group>";
};
52F0243D2777370F0071D861 /* View */ = {
isa = PBXGroup;
children = (
52EB90B12778D9F90048E0ED /* Common */,
52F0243E277737470071D861 /* LoginView.swift */,
52163EB227773F8400594190 /* MainView.swift */,
52163EB62777415F00594190 /* DeviceListView.swift */,
52163EB82777417900594190 /* KeyListView.swift */,
52163EB42777413B00594190 /* MessageListView.swift */,
52163EBA277741AC00594190 /* SettingsView.swift */,
523150DB2778762B00941EDC /* DeviceItemView.swift */,
52EB90AF2778D67F0048E0ED /* KeyItemView.swift */,
52F2C222277961D7006F08DC /* SettingsItemView.swift */,
);
path = View;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
5292F4F42776BC7900B9A7BB /* PushDeer */ = {
isa = PBXNativeTarget;
buildConfigurationList = 5292F5032776BC7A00B9A7BB /* Build configuration list for PBXNativeTarget "PushDeer" */;
buildPhases = (
5292F4F12776BC7900B9A7BB /* Sources */,
5292F4F22776BC7900B9A7BB /* Frameworks */,
5292F4F32776BC7900B9A7BB /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = PushDeer;
productName = PushDeer;
productReference = 5292F4F52776BC7900B9A7BB /* PushDeer.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
5292F4ED2776BC7900B9A7BB /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1320;
LastUpgradeCheck = 1320;
TargetAttributes = {
5292F4F42776BC7900B9A7BB = {
CreatedOnToolsVersion = 13.2.1;
};
};
};
buildConfigurationList = 5292F4F02776BC7900B9A7BB /* Build configuration list for PBXProject "PushDeer" */;
compatibilityVersion = "Xcode 13.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 5292F4EC2776BC7900B9A7BB;
productRefGroup = 5292F4F62776BC7900B9A7BB /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
5292F4F42776BC7900B9A7BB /* PushDeer */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
5292F4F32776BC7900B9A7BB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5292F5002776BC7A00B9A7BB /* Preview Assets.xcassets in Resources */,
5292F4FD2776BC7A00B9A7BB /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
5292F4F12776BC7900B9A7BB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
52F0243F277737470071D861 /* LoginView.swift in Sources */,
523150DC2778762B00941EDC /* DeviceItemView.swift in Sources */,
523150D9277875FB00941EDC /* DeletableView.swift in Sources */,
52163EBB277741AC00594190 /* SettingsView.swift in Sources */,
52163EB327773F8400594190 /* MainView.swift in Sources */,
52EB90B32778DA4E0048E0ED /* Line.swift in Sources */,
52F2C223277961D7006F08DC /* SettingsItemView.swift in Sources */,
52163EB72777415F00594190 /* DeviceListView.swift in Sources */,
52163EB92777417900594190 /* KeyListView.swift in Sources */,
5292F4FB2776BC7900B9A7BB /* ContentView.swift in Sources */,
5292F4F92776BC7900B9A7BB /* PushDeerApp.swift in Sources */,
52EB90AE2778AFD60048E0ED /* BaseNavigationView.swift in Sources */,
52EB90AC2778ADF80048E0ED /* CardView.swift in Sources */,
52EB90B02778D67F0048E0ED /* KeyItemView.swift in Sources */,
52163EB52777413B00594190 /* MessageListView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
5292F5012776BC7A00B9A7BB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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;
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;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
5292F5022776BC7A00B9A7BB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
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;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
5292F5042776BC7A00B9A7BB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = PushDeer/PushDeer.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"PushDeer/Preview Content\"";
DEVELOPMENT_TEAM = Y47WTLML2S;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
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.0;
PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTS_MACCATALYST = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
5292F5052776BC7A00B9A7BB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = PushDeer/PushDeer.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"PushDeer/Preview Content\"";
DEVELOPMENT_TEAM = Y47WTLML2S;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
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.0;
PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios;
PRODUCT_NAME = "$(TARGET_NAME)";
SUPPORTS_MACCATALYST = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
5292F4F02776BC7900B9A7BB /* Build configuration list for PBXProject "PushDeer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5292F5012776BC7A00B9A7BB /* Debug */,
5292F5022776BC7A00B9A7BB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
5292F5032776BC7A00B9A7BB /* Build configuration list for PBXNativeTarget "PushDeer" */ = {
isa = XCConfigurationList;
buildConfigurations = (
5292F5042776BC7A00B9A7BB /* Debug */,
5292F5052776BC7A00B9A7BB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 5292F4ED2776BC7900B9A7BB /* Project object */;
}

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,20 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x89",
"green" : "0x47",
"red" : "0x3B"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,98 @@
{
"images" : [
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "20x20"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "29x29"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "40x40"
},
{
"idiom" : "iphone",
"scale" : "2x",
"size" : "60x60"
},
{
"idiom" : "iphone",
"scale" : "3x",
"size" : "60x60"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "20x20"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "29x29"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "40x40"
},
{
"idiom" : "ipad",
"scale" : "1x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "76x76"
},
{
"idiom" : "ipad",
"scale" : "2x",
"size" : "83.5x83.5"
},
{
"idiom" : "ios-marketing",
"scale" : "1x",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"filename" : "avatar1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "avatar1@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"filename" : "avatar2.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "avatar2@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"filename" : "deer.gray.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "deer.gray@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"filename" : "logo.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "logo@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@ -0,0 +1,22 @@
{
"images" : [
{
"filename" : "logo.with.space.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "logo.with.space@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -0,0 +1,21 @@
//
// ContentView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
struct ContentView: View {
var body: some View {
// LoginView()
MainView()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

View File

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,17 @@
//
// PushDeerApp.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
@main
struct PushDeerApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}

View File

@ -0,0 +1,40 @@
//
// BaseNavigationView.swift
// PushDeer
//
// Created by HEXT on 2021/12/26.
//
import SwiftUI
/// View, APP使
struct BaseNavigationView<Content : View> : View {
///
let title: String
/// View
@ViewBuilder let contentView: Content
var body: some View {
NavigationView {
ZStack {
Spacer()
.frame(width: .infinity, height: .infinity)
contentView
}
.background(
Image("deer.gray").offset(x: -150, y: -10),
alignment: .bottom
)
.navigationBarTitle(title)
}
.navigationViewStyle(.stack)
}
}
struct BaseNavigationView_Previews: PreviewProvider {
static var previews: some View {
BaseNavigationView(title: "标题") {
Text("内容")
}
}
}

View File

@ -0,0 +1,37 @@
//
// CardView.swift
// PushDeer
//
// Created by HEXT on 2021/12/26.
//
import SwiftUI
/// View
struct CardView<Content : View> : View {
/// View
@ViewBuilder let contentView: Content
var body: some View {
contentView
.overlay(RoundedRectangle(cornerRadius: 8).stroke())
.foregroundColor(Color.accentColor)
.background(
Color(UIColor.systemBackground)
.cornerRadius(8)
.shadow(
color: Color.black.opacity(0.16),
radius: 6, x: 0, y: 3
)
)
}
}
struct CardView_Previews: PreviewProvider {
static var previews: some View {
CardView {
Text("Hello, World!")
.padding()
}
}
}

View File

@ -0,0 +1,79 @@
//
// DeletableView.swift
// PushDeer
//
// Created by HEXT on 2021/12/26.
//
import SwiftUI
/// View
struct DeletableView<Content : View> : View {
/// View
@ViewBuilder let contentView: Content
///
let deleteAction : () -> ()
/// x,
private let offsetMaxX = 80.0
@State private var offsetX = 0.0
@State private var isShowDelete = false
var body: some View {
ZStack {
HStack {
Spacer()
Button(action: {
print("点击删除")
withAnimation(.easeOut) {
deleteAction()
}
}, label: {
Image(systemName: "trash")
.imageScale(.large)
.foregroundColor(Color.red)
.padding()
})
}
contentView
.offset(x: offsetX, y: 0)
.gesture(
DragGesture()
.onChanged({ value in
let width = value.translation.width
print("onChanged", width)
let endX = isShowDelete ? offsetMaxX : 0.0
if width < endX {
offsetX = width - endX
} else {
offsetX = 0
}
})
.onEnded({ value in
withAnimation(.easeOut) {
let width = value.translation.width
print("onEnded", width)
if width > -(offsetMaxX/2) {
offsetX = 0
isShowDelete = false
} else {
offsetX = -offsetMaxX
isShowDelete = true
}
}
})
)
}
}
}
struct DeletableView_Previews: PreviewProvider {
static var previews: some View {
DeletableView(contentView: {
DeviceItemView(name: "未知设备")
}, deleteAction: {
})
}
}

View File

@ -0,0 +1,37 @@
//
// Line.swift
// PushDeer
//
// Created by HEXT on 2021/12/27.
//
import SwiftUI
/// 线
struct HLine: Shape {
func path(in rect: CGRect) -> Path {
Path { path in
path.move(to: CGPoint(x: rect.minX, y: rect.midY))
path.addLine(to: CGPoint(x: rect.maxX, y: rect.midY))
}
}
}
/// 线
struct VLine: Shape {
func path(in rect: CGRect) -> Path {
Path { path in
path.move(to: CGPoint(x: rect.midX, y: rect.minY))
path.addLine(to: CGPoint(x: rect.midX, y: rect.maxY))
}
}
}
struct Line_Previews: PreviewProvider {
static var previews: some View {
// 线
HLine().stroke(style: StrokeStyle(lineWidth: 1,dash: [5]))
// 线
VLine().stroke()
}
}

View File

@ -0,0 +1,34 @@
//
// DeviceItemView.swift
// PushDeer
//
// Created by HEXT on 2021/12/26.
//
import SwiftUI
/// View
struct DeviceItemView: View {
var name: String
var body: some View {
CardView {
HStack{
Image(systemName: "ipad.and.iphone")
.resizable()
.scaledToFit()
.frame(width: 40, height: 40, alignment: .center)
.padding(EdgeInsets(top: 0, leading: 18, bottom: 0, trailing: 8))
Text(name)
.font(.system(size: 20))
Spacer()
}
.frame(height: 80)
}
}
}
struct DeviceItemView_Previews: PreviewProvider {
static var previews: some View {
DeviceItemView(name: "未知设备")
}
}

View File

@ -0,0 +1,45 @@
//
// DeviceListView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
///
struct DeviceListView: View {
@State var devices = Array(0..<10)
var body: some View {
BaseNavigationView(title: "设备") {
ScrollView {
LazyVStack(alignment: .center) {
ForEach(devices, id: \.self) { name in
DeletableView(contentView: {
DeviceItemView(name: "设备 \(name)")
}, deleteAction: {
devices.removeAll { _name in
_name == name
}
})
.padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24))
}
}
}
.navigationBarItems(trailing: Button(action: {
withAnimation(.easeOut) {
devices.insert(Int(arc4random_uniform(1000)), at: 0)
}
}, label: {
Image(systemName: "plus")
.foregroundColor(Color(UIColor.lightGray))
}))
}
}
}
struct DeviceView_Previews: PreviewProvider {
static var previews: some View {
DeviceListView()
}
}

View File

@ -0,0 +1,72 @@
//
// KeyItemView.swift
// PushDeer
//
// Created by HEXT on 2021/12/27.
//
import SwiftUI
/// Key View
struct KeyItemView: View {
let keyItem: KeyItem
var body: some View {
VStack(spacing: 20) {
HStack(alignment: .bottom) {
Image("avatar2")
.resizable()
.scaledToFit()
.frame(width: 38, height: 38)
Text("Key \(keyItem.id)")
.font(.system(size: 20))
.foregroundColor(Color.accentColor)
Spacer()
Image(systemName: "calendar")
.font(.system(size: 14))
.foregroundColor(Color.gray)
Text("2021/12/01")
.font(.system(size: 14))
.foregroundColor(Color.gray)
}
TextField("Key", text: .constant(keyItem.key) )
.font(.system(size: 14))
.disabled(true)
.padding(12)
.overlay(RoundedRectangle(cornerRadius: 4).stroke(Color(UIColor.lightGray)))
.foregroundColor(Color.gray)
HLine().stroke(Color.gray, style: StrokeStyle(lineWidth: 1, dash: [5]))
HStack {
Button("重置") {
print("点击重置")
}
.font(.system(size: 20))
.frame(width: 90, height: 42)
.overlay(RoundedRectangle(cornerRadius: 4).stroke())
.foregroundColor(Color.accentColor)
Spacer()
Button("复制") {
print("点击复制")
UIPasteboard.general.string = keyItem.key
}
.font(.system(size: 20))
.frame(width: 90, height: 42)
.foregroundColor(Color.white)
.background(Color.accentColor)
.cornerRadius(8)
}
}
.padding()
}
}
struct KeyItemView_Previews: PreviewProvider {
static var previews: some View {
KeyItemView(keyItem: KeyItem(id: 1, key: "Key"))
}
}

View File

@ -0,0 +1,59 @@
//
// KeyListView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
struct KeyItem: Codable, Identifiable{
let id: Int
let key: String
}
/// Key
struct KeyListView: View {
@State private var keyItems = [
KeyItem(id: 1, key: UUID().uuidString),
KeyItem(id: 2, key: UUID().uuidString),
KeyItem(id: 3, key: UUID().uuidString),
KeyItem(id: 4, key: UUID().uuidString),
]
var body: some View {
BaseNavigationView(title: "Key") {
ScrollView {
LazyVStack(alignment: .center) {
ForEach(keyItems) { keyItem in
DeletableView(contentView: {
CardView {
KeyItemView(keyItem: keyItem)
}
}, deleteAction: {
keyItems.removeAll { _keyItem in
keyItem.id == _keyItem.id
}
})
.padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24))
}
}
}
.navigationBarItems(trailing: Button(action: {
let keyItem = KeyItem(id: Int(arc4random_uniform(1000)), key: UUID().uuidString)
withAnimation(.easeOut) {
keyItems.insert(keyItem, at: 0)
}
}, label: {
Image(systemName: "plus")
.foregroundColor(Color(UIColor.lightGray))
}))
}
}
}
struct KeyView_Previews: PreviewProvider {
static var previews: some View {
KeyListView()
}
}

View File

@ -0,0 +1,40 @@
//
// LoginView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
import AuthenticationServices
///
struct LoginView: View {
var body: some View {
VStack{
Spacer()
Image("logo.with.space")
.resizable()
.scaledToFit()
Spacer()
SignInWithAppleButton(
onRequest: { request in
},
onCompletion: { result in
}
)
.frame(height: 64)
.padding()
Spacer()
}
.padding()
}
}
struct LoginView_Previews: PreviewProvider {
static var previews: some View {
LoginView()
}
}

View File

@ -0,0 +1,40 @@
//
// MainView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
/// APP
struct MainView: View {
var body: some View {
TabView {
DeviceListView()
.tabItem {
Label("设备",systemImage: "ipad.and.iphone")
}
KeyListView()
.tabItem{
Label("Key",systemImage: "key")
}
MessageListView()
.tabItem({Label("消息",systemImage: "message")}).onTapGesture {
}
SettingsView()
.tabItem{
Label("设置",systemImage: "gearshape")
}
}
}
}
struct MainView_Previews: PreviewProvider {
static var previews: some View {
MainView()
}
}

View File

@ -0,0 +1,21 @@
//
// MessageListView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
///
struct MessageListView: View {
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct MessageView_Previews: PreviewProvider {
static var previews: some View {
MessageListView()
}
}

View File

@ -0,0 +1,45 @@
//
// SettingsItemView.swift
// PushDeer
//
// Created by HeXiaoTian on 2021/12/27.
//
import SwiftUI
/// View
struct SettingsItemView: View {
let title: String
let button: String
let action: () -> ()
var body: some View {
CardView {
HStack{
Text(title)
.font(.system(size: 18))
.foregroundColor(Color(UIColor.darkGray))
.padding()
Spacer()
Button(button) {
print("点击\(button)")
action()
}
.font(.system(size: 20))
.frame(width: 80, height: 42)
.foregroundColor(Color.white)
.background(Color.accentColor)
.cornerRadius(8)
.padding()
}
.frame(height: 74)
}
}
}
struct SettingsItemView_Previews: PreviewProvider {
static var previews: some View {
SettingsItemView(title: "登录为 Hext", button: "退出") {
// logout
}
}
}

View File

@ -0,0 +1,37 @@
//
// SettingsView.swift
// PushDeer
//
// Created by HEXT on 2021/12/25.
//
import SwiftUI
///
struct SettingsView: View {
var body: some View {
BaseNavigationView(title: "设置") {
VStack {
SettingsItemView(title: "登录为 Hext", button: "退出") {
}
.padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20))
SettingsItemView(title: "自定义服务器", button: "扫码") {
}
.padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20))
SettingsItemView(title: "喜欢PushDeer?", button: "评分") {
}
.padding(EdgeInsets(top: 18, leading: 20, bottom: 0, trailing: 20))
Spacer()
}
}
}
}
struct SettingsView_Previews: PreviewProvider {
static var previews: some View {
SettingsView()
}
}

View File

@ -0,0 +1,10 @@
# PushDeer-iOS (开发中)
PushDeer 是一个开放源码的无 App 推送服务.
这里是 PushDeer 的 iOS 端的源码, 支持 iOS / iPadOS / macOS.
PushDeer-iOS 最低支持 iOS14, 因为苹果轻应用(App Clips)最低支持 iOS14.
由于苹果规定轻应用必须随 APP 一起发布, 所以除了扫码打开轻应用即时享用推送服务, 实际上你也可以下载 APP 使用.