iOS 完成大部分页面
114
ios/PushDeer-iOS/.gitignore
vendored
Normal 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
@ -0,0 +1 @@
|
|||||||
|
本项目禁止商用(包括但不限于搭建后挂广告或售卖会员、打包后上架商店销售等),对非商业用途采用 GPLV2 授权
|
421
ios/PushDeer-iOS/PushDeer.xcodeproj/project.pbxproj
Normal 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 */;
|
||||||
|
}
|
7
ios/PushDeer-iOS/PushDeer.xcodeproj/project.xcworkspace/contents.xcworkspacedata
generated
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Workspace
|
||||||
|
version = "1.0">
|
||||||
|
<FileRef
|
||||||
|
location = "self:">
|
||||||
|
</FileRef>
|
||||||
|
</Workspace>
|
@ -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>
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
6
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Contents.json
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
22
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/avatar1.png
vendored
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/avatar1@2x.png
vendored
Normal file
After Width: | Height: | Size: 25 KiB |
22
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/avatar2.png
vendored
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/avatar2@2x.png
vendored
Normal file
After Width: | Height: | Size: 44 KiB |
22
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/deer.gray.png
vendored
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/deer.gray@2x.png
vendored
Normal file
After Width: | Height: | Size: 107 KiB |
22
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/logo.png
vendored
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/logo@2x.png
vendored
Normal file
After Width: | Height: | Size: 41 KiB |
22
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/Contents.json
vendored
Normal 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
|
||||||
|
}
|
||||||
|
}
|
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/logo.with.space.png
vendored
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/logo.with.space@2x.png
vendored
Normal file
After Width: | Height: | Size: 51 KiB |
21
ios/PushDeer-iOS/PushDeer/ContentView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
10
ios/PushDeer-iOS/PushDeer/PushDeer.entitlements
Normal 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>
|
17
ios/PushDeer-iOS/PushDeer/PushDeerApp.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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("内容")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
ios/PushDeer-iOS/PushDeer/View/Common/CardView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
79
ios/PushDeer-iOS/PushDeer/View/Common/DeletableView.swift
Normal 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: {
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
37
ios/PushDeer-iOS/PushDeer/View/Common/Line.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
34
ios/PushDeer-iOS/PushDeer/View/DeviceItemView.swift
Normal 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: "未知设备")
|
||||||
|
}
|
||||||
|
}
|
45
ios/PushDeer-iOS/PushDeer/View/DeviceListView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
72
ios/PushDeer-iOS/PushDeer/View/KeyItemView.swift
Normal 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"))
|
||||||
|
}
|
||||||
|
}
|
59
ios/PushDeer-iOS/PushDeer/View/KeyListView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
40
ios/PushDeer-iOS/PushDeer/View/LoginView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
40
ios/PushDeer-iOS/PushDeer/View/MainView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
21
ios/PushDeer-iOS/PushDeer/View/MessageListView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
45
ios/PushDeer-iOS/PushDeer/View/SettingsItemView.swift
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
37
ios/PushDeer-iOS/PushDeer/View/SettingsView.swift
Normal 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()
|
||||||
|
}
|
||||||
|
}
|
10
ios/PushDeer-iOS/README.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# PushDeer-iOS (开发中)
|
||||||
|
|
||||||
|
PushDeer 是一个开放源码的无 App 推送服务.
|
||||||
|
|
||||||
|
这里是 PushDeer 的 iOS 端的源码, 支持 iOS / iPadOS / macOS.
|
||||||
|
|
||||||
|
|
||||||
|
PushDeer-iOS 最低支持 iOS14, 因为苹果轻应用(App Clips)最低支持 iOS14.
|
||||||
|
|
||||||
|
由于苹果规定轻应用必须随 APP 一起发布, 所以除了扫码打开轻应用即时享用推送服务, 实际上你也可以下载 APP 使用.
|