This commit is contained in:
古俊杰 2022-01-05 22:37:21 +08:00
commit a733beca4d
122 changed files with 6839 additions and 296 deletions

View File

@ -1,4 +1,4 @@
# PushDeerOS
# PushDeer
PushDeer开源版可以自行架设的无APP推送服务WIP当前项目只实现了后端API其他部分正在施工🚧
@ -14,12 +14,15 @@ PushDeer开源版可以自行架设的无APP推送服务WIP当前项目
|功能|领取人|预期完成时间|最低版本兼容|本周进度|
|-|-|-|-|-|
|iOS/MacApp+Clip开发|[Hext123](https://github.com/Hext123)|2022年1月20日|iOS14|界面绘制|
|Android客户端|[WolfHugo](https://github.com/alone-wolf)|2022年2月24日|5.1|推送DSK测试·MiPUSH|
|快应用|[7YHong](https://github.com/7YHong)|2022年2月27日|-|-|
|API完善和更新|[古俊杰](https://github.com/ilovintit)|配合客户端同步更新|-|-|
|iOS/MacApp+Clip开发|[Hext123](https://github.com/Hext123)|2022年1月20日|iOS14|界面完成,开始对接接口|
|Android客户端|[WolfHugo](https://github.com/alone-wolf)|2022年2月24日|5.1|API调试通过准备写业务逻辑|
|快应用|[7YHong](https://github.com/7YHong)|2022年2月27日|-|完成大部分页面展示准备完成markdown、image类消息界面|
|API完善和更新|[古俊杰](https://github.com/ilovintit)|配合客户端同步更新|-|添加自动生成swgger文档功能中|
## 相关项目
- [API的Go实现](https://github.com/iepngs/pushdeer-backend-go) by [iepngs](https://github.com/iepngs)
- [Go SDK](https://github.com/Luoxin/go-pushdeer-sdk) by [Luoxin](https://github.com/Luoxin)
## 产品定义
@ -132,6 +135,8 @@ PushDeer主要面向以下三类用户
### API 说明
[在线文档Swagger](https://ilovintit.github.io/pushdeer-api-doc/#/)
API_BASE=http://127.0.0.1:8800
认证方式:通过登入接口获得`token`,通过`post`和`get`方式附带`token`参数即可自动登入。
@ -277,6 +282,4 @@ API_BASE=http://127.0.0.1:8800
本项目禁止商用(包括但不限于搭建后挂广告或售卖会员、打包后上架商店销售等),对非商业用途采用 GPLV2 授权
## 相关项目
- [Go SDK](https://github.com/Luoxin/go-pushdeer-sdk) by [Luoxin](https://github.com/Luoxin)

View File

@ -10,7 +10,7 @@ class PushDeerUserController extends Controller
public function info(Request $request)
{
//return $_SESSION;
return http_result(PushDeerUser::where('id', $_SESSION['uid'])->get());
return http_result(PushDeerUser::where('id', $_SESSION['uid'])->get()->first());
}
public function fakeLogin(Request $request)

View File

@ -1,9 +1,8 @@
<?php
use AppleSignIn\ASDecoder;
function getUserDataFromIdentityToken($idToken)
{
$appleSignInPayload = ASDecoder::getAppleSignInPayload($idToken);
$appleSignInPayload = \AppleSignIn\ASDecoder::getAppleSignInPayload($idToken);
return [ 'email' => $appleSignInPayload->getEmail() , 'uid' => $appleSignInPayload->getUser() ];
}

400
api/composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
#!/bin/bash
# 初始化 laravel
cd /app/api && composer install && cp .env.example .env && php artisan key:generate && php artisan migrate --seed
cd /app/api && composer install && cp -n .env.example .env && php artisan key:generate && php artisan migrate --seed
chmod -R 0777 /app/api/storage
chmod -R 0777 /app/api/bootstrap/cache/
@ -10,4 +10,4 @@ chmod -R 0777 /app/api/bootstrap/cache/
# 启动 proxy
# 已经设置为 deamon
# cd /app/proxy && ./server-linux &
# cd /app/proxy && ./server-linux &

View File

@ -78,7 +78,7 @@ playground.xcworkspace
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace

22
ios/PushDeer-iOS/Podfile Normal file
View File

@ -0,0 +1,22 @@
# Uncomment the next line to define a global platform for your project
platform :ios, '14.0'
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
def commonPods
# Pods for common
pod 'Moya', '~> 15.0'
end
target 'PushDeer' do
commonPods
# Pods for PushDeer
end
target 'PushDeerClip' do
commonPods
# Pods for PushDeerClip
end

View File

@ -0,0 +1,22 @@
PODS:
- Alamofire (5.5.0)
- Moya (15.0.0):
- Moya/Core (= 15.0.0)
- Moya/Core (15.0.0):
- Alamofire (~> 5.0)
DEPENDENCIES:
- Moya (~> 15.0)
SPEC REPOS:
trunk:
- Alamofire
- Moya
SPEC CHECKSUMS:
Alamofire: 1c4fb5369c3fe93d2857c780d8bbe09f06f97e7c
Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee
PODFILE CHECKSUM: 71abdebce610eefe1a0299d0a0bd00a463b0a79c
COCOAPODS: 1.11.2

View File

@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
4812F19BB0BFEFE089BC253E /* Pods_PushDeerClip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E03C2088F4CD9F4C0848E1A5 /* Pods_PushDeerClip.framework */; };
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 */; };
@ -14,18 +15,76 @@
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 */; };
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 */; };
52450F3C278491F8003652D8 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F3A278491F8003652D8 /* AppState.swift */; };
52450F3F2784923D003652D8 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F3E2784923D003652D8 /* Result.swift */; };
52450F402784923D003652D8 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F3E2784923D003652D8 /* Result.swift */; };
52450F422784943F003652D8 /* HttpRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52450F412784943F003652D8 /* HttpRequest.swift */; };
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 */; };
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 */; };
52B8CF5F277DE660004CB680 /* AppleSignInButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */; };
52B8CF67277E0B44004CB680 /* PushDeerClipApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B8CF66277E0B44004CB680 /* PushDeerClipApp.swift */; };
52B8CF69277E0B44004CB680 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B8CF68277E0B44004CB680 /* ContentView.swift */; };
52B8CF6B277E0B46004CB680 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52B8CF6A277E0B46004CB680 /* Assets.xcassets */; };
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, ); }; };
52B8CF78277E0BF1004CB680 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB227773F8400594190 /* MainView.swift */; };
52B8CF79277E0BFB004CB680 /* DeviceListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB62777415F00594190 /* DeviceListView.swift */; };
52B8CF7A277E0BFB004CB680 /* MessageListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB42777413B00594190 /* MessageListView.swift */; };
52B8CF7B277E0BFB004CB680 /* DeviceItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523150DB2778762B00941EDC /* DeviceItemView.swift */; };
52B8CF7C277E0BFB004CB680 /* KeyListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EB82777417900594190 /* KeyListView.swift */; };
52B8CF7D277E0BFB004CB680 /* KeyItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90AF2778D67F0048E0ED /* KeyItemView.swift */; };
52B8CF7E277E0BFB004CB680 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52163EBA277741AC00594190 /* SettingsView.swift */; };
52B8CF7F277E0BFB004CB680 /* SettingsItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F2C222277961D7006F08DC /* SettingsItemView.swift */; };
52B8CF80277E0BFB004CB680 /* MessageItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F40D2E277CA05600766C24 /* MessageItemView.swift */; };
52B8CF81277E0BFB004CB680 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0243E277737470071D861 /* LoginView.swift */; };
52B8CF82277E0C06004CB680 /* AppleSignInButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */; };
52B8CF83277E0C12004CB680 /* DeletableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523150D8277875FB00941EDC /* DeletableView.swift */; };
52B8CF84277E0C12004CB680 /* CardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90AB2778ADF80048E0ED /* CardView.swift */; };
52B8CF85277E0C12004CB680 /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90B22778DA4E0048E0ED /* Line.swift */; };
52B8CF86277E0C12004CB680 /* BaseNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52EB90AD2778AFD60048E0ED /* BaseNavigationView.swift */; };
52B8CF87277E0C5C004CB680 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5292F4FC2776BC7A00B9A7BB /* 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 */; };
52F40D2F277CA05600766C24 /* MessageItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F40D2E277CA05600766C24 /* MessageItemView.swift */; };
64B0C15E70CCC382B480F76E /* Pods_PushDeer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E380A18349DE4D26071E913E /* Pods_PushDeer.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
52B8CF71277E0B46004CB680 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 5292F4ED2776BC7900B9A7BB /* Project object */;
proxyType = 1;
remoteGlobalIDString = 52B8CF63277E0B44004CB680;
remoteInfo = PushDeerClip;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
52B8CF77277E0B46004CB680 /* Embed App Clips */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "$(CONTENTS_FOLDER_PATH)/AppClips";
dstSubfolderSpec = 16;
files = (
52B8CF73277E0B46004CB680 /* PushDeerClip.app in Embed App Clips */,
);
name = "Embed App Clips";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase 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>"; };
@ -34,11 +93,25 @@
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>"; };
52450F3727848243003652D8 /* PushDeerApi.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushDeerApi.swift; sourceTree = "<group>"; };
52450F3A278491F8003652D8 /* AppState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = "<group>"; };
52450F3E2784923D003652D8 /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = "<group>"; };
52450F412784943F003652D8 /* HttpRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HttpRequest.swift; sourceTree = "<group>"; };
52450F442784A95D003652D8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
52483FC1277ED6D5003A100E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.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>"; };
52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppleSignInButton.swift; sourceTree = "<group>"; };
52B8CF64277E0B44004CB680 /* PushDeerClip.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PushDeerClip.app; sourceTree = BUILT_PRODUCTS_DIR; };
52B8CF66277E0B44004CB680 /* PushDeerClipApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PushDeerClipApp.swift; sourceTree = "<group>"; };
52B8CF68277E0B44004CB680 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
52B8CF6A277E0B46004CB680 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
52B8CF6D277E0B46004CB680 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
52B8CF6F277E0B46004CB680 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
52B8CF70277E0B46004CB680 /* PushDeerClip.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = PushDeerClip.entitlements; 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>"; };
@ -46,6 +119,13 @@
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>"; };
52F40D2E277CA05600766C24 /* MessageItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageItemView.swift; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -53,17 +133,58 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
64B0C15E70CCC382B480F76E /* Pods_PushDeer.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
52B8CF61277E0B44004CB680 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4812F19BB0BFEFE089BC253E /* Pods_PushDeerClip.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
17D35B157765D96FC4DA6C39 /* Pods */ = {
isa = PBXGroup;
children = (
CE3005BD875FC9819A92466C /* Pods-PushDeer.debug.xcconfig */,
CCCE1F6E56B157872E2C755F /* Pods-PushDeer.release.xcconfig */,
69F56B2711ED98819D474BE3 /* Pods-PushDeerClip.debug.xcconfig */,
9CC775BE0326BF31C6FACF06 /* Pods-PushDeerClip.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
52450F362784822C003652D8 /* Service */ = {
isa = PBXGroup;
children = (
52450F3727848243003652D8 /* PushDeerApi.swift */,
52450F3A278491F8003652D8 /* AppState.swift */,
52450F412784943F003652D8 /* HttpRequest.swift */,
);
path = Service;
sourceTree = "<group>";
};
52450F3D27849228003652D8 /* Model */ = {
isa = PBXGroup;
children = (
52450F3E2784923D003652D8 /* Result.swift */,
);
path = Model;
sourceTree = "<group>";
};
5292F4EC2776BC7900B9A7BB = {
isa = PBXGroup;
children = (
5292F4F72776BC7900B9A7BB /* PushDeer */,
52B8CF65277E0B44004CB680 /* PushDeerClip */,
5292F4F62776BC7900B9A7BB /* Products */,
17D35B157765D96FC4DA6C39 /* Pods */,
78FEAD2568FB92808C44E85A /* Frameworks */,
);
indentWidth = 2;
sourceTree = "<group>";
@ -72,6 +193,7 @@
isa = PBXGroup;
children = (
5292F4F52776BC7900B9A7BB /* PushDeer.app */,
52B8CF64277E0B44004CB680 /* PushDeerClip.app */,
);
name = Products;
sourceTree = "<group>";
@ -79,8 +201,13 @@
5292F4F72776BC7900B9A7BB /* PushDeer */ = {
isa = PBXGroup;
children = (
52450F442784A95D003652D8 /* Info.plist */,
52450F362784822C003652D8 /* Service */,
52B8CF5D277DE5FF004CB680 /* Common */,
52450F3D27849228003652D8 /* Model */,
52F0243D2777370F0071D861 /* View */,
52F0243C277733CE0071D861 /* PushDeer.entitlements */,
52483FC1277ED6D5003A100E /* AppDelegate.swift */,
5292F4F82776BC7900B9A7BB /* PushDeerApp.swift */,
5292F4FA2776BC7900B9A7BB /* ContentView.swift */,
5292F4FC2776BC7A00B9A7BB /* Assets.xcassets */,
@ -97,6 +224,35 @@
path = "Preview Content";
sourceTree = "<group>";
};
52B8CF5D277DE5FF004CB680 /* Common */ = {
isa = PBXGroup;
children = (
52B8CF5E277DE660004CB680 /* AppleSignInButton.swift */,
);
path = Common;
sourceTree = "<group>";
};
52B8CF65277E0B44004CB680 /* PushDeerClip */ = {
isa = PBXGroup;
children = (
52B8CF66277E0B44004CB680 /* PushDeerClipApp.swift */,
52B8CF68277E0B44004CB680 /* ContentView.swift */,
52B8CF6A277E0B46004CB680 /* Assets.xcassets */,
52B8CF6F277E0B46004CB680 /* Info.plist */,
52B8CF70277E0B46004CB680 /* PushDeerClip.entitlements */,
52B8CF6C277E0B46004CB680 /* Preview Content */,
);
path = PushDeerClip;
sourceTree = "<group>";
};
52B8CF6C277E0B46004CB680 /* Preview Content */ = {
isa = PBXGroup;
children = (
52B8CF6D277E0B46004CB680 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
52EB90B12778D9F90048E0ED /* Common */ = {
isa = PBXGroup;
children = (
@ -120,11 +276,21 @@
52163EBA277741AC00594190 /* SettingsView.swift */,
523150DB2778762B00941EDC /* DeviceItemView.swift */,
52EB90AF2778D67F0048E0ED /* KeyItemView.swift */,
52F40D2E277CA05600766C24 /* MessageItemView.swift */,
52F2C222277961D7006F08DC /* SettingsItemView.swift */,
);
path = View;
sourceTree = "<group>";
};
78FEAD2568FB92808C44E85A /* Frameworks */ = {
isa = PBXGroup;
children = (
E380A18349DE4D26071E913E /* Pods_PushDeer.framework */,
E03C2088F4CD9F4C0848E1A5 /* Pods_PushDeerClip.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -132,19 +298,42 @@
isa = PBXNativeTarget;
buildConfigurationList = 5292F5032776BC7A00B9A7BB /* Build configuration list for PBXNativeTarget "PushDeer" */;
buildPhases = (
D7C2D4C0049487EE64D69530 /* [CP] Check Pods Manifest.lock */,
5292F4F12776BC7900B9A7BB /* Sources */,
5292F4F22776BC7900B9A7BB /* Frameworks */,
5292F4F32776BC7900B9A7BB /* Resources */,
52B8CF77277E0B46004CB680 /* Embed App Clips */,
D5C7FAC44EC37CBCD945E0F2 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
52B8CF72277E0B46004CB680 /* PBXTargetDependency */,
);
name = PushDeer;
productName = PushDeer;
productReference = 5292F4F52776BC7900B9A7BB /* PushDeer.app */;
productType = "com.apple.product-type.application";
};
52B8CF63277E0B44004CB680 /* PushDeerClip */ = {
isa = PBXNativeTarget;
buildConfigurationList = 52B8CF74277E0B46004CB680 /* Build configuration list for PBXNativeTarget "PushDeerClip" */;
buildPhases = (
2478CBF24D0E46561F75C65B /* [CP] Check Pods Manifest.lock */,
52B8CF60277E0B44004CB680 /* Sources */,
52B8CF61277E0B44004CB680 /* Frameworks */,
52B8CF62277E0B44004CB680 /* Resources */,
2E496999EBC4004366E8DE5E /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = PushDeerClip;
productName = PushDeerClip;
productReference = 52B8CF64277E0B44004CB680 /* PushDeerClip.app */;
productType = "com.apple.product-type.application.on-demand-install-capable";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@ -158,6 +347,9 @@
5292F4F42776BC7900B9A7BB = {
CreatedOnToolsVersion = 13.2.1;
};
52B8CF63277E0B44004CB680 = {
CreatedOnToolsVersion = 13.2.1;
};
};
};
buildConfigurationList = 5292F4F02776BC7900B9A7BB /* Build configuration list for PBXProject "PushDeer" */;
@ -174,6 +366,7 @@
projectRoot = "";
targets = (
5292F4F42776BC7900B9A7BB /* PushDeer */,
52B8CF63277E0B44004CB680 /* PushDeerClip */,
);
};
/* End PBXProject section */
@ -188,8 +381,99 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
52B8CF62277E0B44004CB680 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
52B8CF6E277E0B46004CB680 /* Preview Assets.xcassets in Resources */,
52B8CF87277E0C5C004CB680 /* Assets.xcassets in Resources */,
52B8CF6B277E0B46004CB680 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
2478CBF24D0E46561F75C65B /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-PushDeerClip-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
2E496999EBC4004366E8DE5E /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
D5C7FAC44EC37CBCD945E0F2 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
D7C2D4C0049487EE64D69530 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-PushDeer-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
5292F4F12776BC7900B9A7BB /* Sources */ = {
isa = PBXSourcesBuildPhase;
@ -203,18 +487,63 @@
52EB90B32778DA4E0048E0ED /* Line.swift in Sources */,
52F2C223277961D7006F08DC /* SettingsItemView.swift in Sources */,
52163EB72777415F00594190 /* DeviceListView.swift in Sources */,
52B8CF5F277DE660004CB680 /* AppleSignInButton.swift in Sources */,
52163EB92777417900594190 /* KeyListView.swift in Sources */,
5292F4FB2776BC7900B9A7BB /* ContentView.swift in Sources */,
52450F3B278491F8003652D8 /* AppState.swift in Sources */,
5292F4F92776BC7900B9A7BB /* PushDeerApp.swift in Sources */,
52483FC2277ED6D5003A100E /* AppDelegate.swift in Sources */,
52450F3827848243003652D8 /* PushDeerApi.swift in Sources */,
52EB90AE2778AFD60048E0ED /* BaseNavigationView.swift in Sources */,
52EB90AC2778ADF80048E0ED /* CardView.swift in Sources */,
52EB90B02778D67F0048E0ED /* KeyItemView.swift in Sources */,
52450F3F2784923D003652D8 /* Result.swift in Sources */,
52450F422784943F003652D8 /* HttpRequest.swift in Sources */,
52163EB52777413B00594190 /* MessageListView.swift in Sources */,
52F40D2F277CA05600766C24 /* MessageItemView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
52B8CF60277E0B44004CB680 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
52B8CF82277E0C06004CB680 /* AppleSignInButton.swift in Sources */,
52B8CF69277E0B44004CB680 /* ContentView.swift in Sources */,
52B8CF78277E0BF1004CB680 /* MainView.swift in Sources */,
52B8CF79277E0BFB004CB680 /* DeviceListView.swift in Sources */,
52B8CF84277E0C12004CB680 /* CardView.swift in Sources */,
52B8CF7E277E0BFB004CB680 /* SettingsView.swift in Sources */,
52B8CF7C277E0BFB004CB680 /* KeyListView.swift in Sources */,
52B8CF7A277E0BFB004CB680 /* MessageListView.swift in Sources */,
52B8CF83277E0C12004CB680 /* DeletableView.swift in Sources */,
52B8CF81277E0BFB004CB680 /* LoginView.swift in Sources */,
52B8CF7F277E0BFB004CB680 /* SettingsItemView.swift in Sources */,
52450F3C278491F8003652D8 /* AppState.swift in Sources */,
52B8CF80277E0BFB004CB680 /* MessageItemView.swift in Sources */,
52483FC3277ED6D5003A100E /* AppDelegate.swift in Sources */,
52450F3927848243003652D8 /* PushDeerApi.swift in Sources */,
52B8CF86277E0C12004CB680 /* BaseNavigationView.swift in Sources */,
52B8CF67277E0B44004CB680 /* PushDeerClipApp.swift in Sources */,
52B8CF85277E0C12004CB680 /* Line.swift in Sources */,
52450F402784923D003652D8 /* Result.swift in Sources */,
52450F432784943F003652D8 /* HttpRequest.swift in Sources */,
52B8CF7B277E0BFB004CB680 /* DeviceItemView.swift in Sources */,
52B8CF7D277E0BFB004CB680 /* KeyItemView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
52B8CF72277E0B46004CB680 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
platformFilter = ios;
target = 52B8CF63277E0B44004CB680 /* PushDeerClip */;
targetProxy = 52B8CF71277E0B46004CB680 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
5292F5012776BC7A00B9A7BB /* Debug */ = {
isa = XCBuildConfiguration;
@ -334,6 +663,7 @@
};
5292F5042776BC7A00B9A7BB /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = CE3005BD875FC9819A92466C /* Pods-PushDeer.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
@ -344,6 +674,7 @@
DEVELOPMENT_TEAM = Y47WTLML2S;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PushDeer/Info.plist;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
@ -365,6 +696,7 @@
};
5292F5052776BC7A00B9A7BB /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = CCCE1F6E56B157872E2C755F /* Pods-PushDeer.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
@ -375,6 +707,7 @@
DEVELOPMENT_TEAM = Y47WTLML2S;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PushDeer/Info.plist;
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
@ -394,6 +727,74 @@
};
name = Release;
};
52B8CF75277E0B46004CB680 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 69F56B2711ED98819D474BE3 /* Pods-PushDeerClip.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = PushDeerClip/PushDeerClip.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"PushDeerClip/Preview Content\"";
DEVELOPMENT_TEAM = Y47WTLML2S;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PushDeerClip/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = PushDeer;
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.0;
PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios.Clip;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
52B8CF76277E0B46004CB680 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9CC775BE0326BF31C6FACF06 /* Pods-PushDeerClip.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = PushDeerClip/PushDeerClip.entitlements;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_ASSET_PATHS = "\"PushDeerClip/Preview Content\"";
DEVELOPMENT_TEAM = Y47WTLML2S;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = PushDeerClip/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = PushDeer;
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.0;
PRODUCT_BUNDLE_IDENTIFIER = com.wskfz.pushdeer.ios.Clip;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
@ -415,6 +816,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
52B8CF74277E0B46004CB680 /* Build configuration list for PBXNativeTarget "PushDeerClip" */ = {
isa = XCConfigurationList;
buildConfigurations = (
52B8CF75277E0B46004CB680 /* Debug */,
52B8CF76277E0B46004CB680 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 5292F4ED2776BC7900B9A7BB /* Project object */;

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:PushDeer.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</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,49 @@
//
// AppDelegate.swift
// PushDeer
//
// Created by HeXiaoTian on 2021/12/31.
//
import UIKit
import UserNotifications
class AppDelegate: NSObject, UIApplicationDelegate, UNUserNotificationCenterDelegate {
static var deviceToken: String = ""
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
print("注册通知结果: \(granted) - \(String(describing: error))")
}
application.registerForRemoteNotifications()
Task {
// APP, , . ()
let result = try await HttpRequest.fake()
AppState.shared.token = result.token
HttpRequest.getDevices()
}
return true
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
print("deviceToken: ", deviceTokenString)
AppDelegate.deviceToken = deviceTokenString;
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
print("willPresent:", notification.request.content.userInfo)
return [.sound, .list, .banner]
}
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse) async {
print("didReceive:", response.notification.request.content.userInfo)
}
}

View File

@ -1,98 +1,122 @@
{
"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"
"images": [
{
"size": "20x20",
"idiom": "iphone",
"filename": "icon-20@2x.png",
"scale": "2x"
},
{
"size": "20x20",
"idiom": "iphone",
"filename": "icon-20@3x.png",
"scale": "3x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29@2x.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29@3x.png",
"scale": "3x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "icon-40@2x.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "icon-40@3x.png",
"scale": "3x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "icon-60@2x.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "icon-60@3x.png",
"scale": "3x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "icon-20-ipad.png",
"scale": "1x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "icon-20@2x-ipad.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "icon-29-ipad.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "icon-29@2x-ipad.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "icon-40.png",
"scale": "1x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "icon-40@2x.png",
"scale": "2x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "icon-76.png",
"scale": "1x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "icon-76@2x.png",
"scale": "2x"
},
{
"size": "83.5x83.5",
"idiom": "ipad",
"filename": "icon-83.5@2x.png",
"scale": "2x"
},
{
"size": "1024x1024",
"idiom": "ios-marketing",
"filename": "icon-1024.png",
"scale": "1x"
}
],
"info": {
"version": 1,
"author": "icon.wuruihong.com"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -0,0 +1,71 @@
//
// AppleSignInButton.swift
// PushDeer
//
// Created by HEXT on 2021/12/30.
//
import Foundation
import UIKit
import SwiftUI
import AuthenticationServices
/// Apple , 仿 SwiftUI SignInWithAppleButton
///
/// 使? , SignInWithAppleButton macOS , iOS .
struct AppleSignInButton: UIViewRepresentable {
var type = ASAuthorizationAppleIDButton.ButtonType.signIn
var style = ASAuthorizationAppleIDButton.Style.black
let onRequest: (ASAuthorizationAppleIDRequest) -> Void
let onCompletion: (Result<ASAuthorization, Error>) -> Void
func makeUIView(context: Context) -> ASAuthorizationAppleIDButton {
let signInButton = ASAuthorizationAppleIDButton(type: type, style: style)
let coordinator = AppleSignInCoordinator(onRequest: onRequest, onCompletion: onCompletion)
signInButton.addAction(
UIAction { action in
coordinator.performRequests()
},
for: UIControl.Event.touchUpInside
)
return signInButton
}
func updateUIView(_ uiView: ASAuthorizationAppleIDButton, context: Context) {
}
}
class AppleSignInCoordinator: NSObject, ASAuthorizationControllerDelegate {
let onRequest: (ASAuthorizationAppleIDRequest) -> Void
let onCompletion: (Result<ASAuthorization, Error>) -> Void
init(
onRequest: @escaping (ASAuthorizationAppleIDRequest) -> Void,
onCompletion: @escaping (Result<ASAuthorization, Error>) -> Void
) {
self.onRequest = onRequest
self.onCompletion = onCompletion
}
@objc func performRequests() {
let appleIDProvider = ASAuthorizationAppleIDProvider()
let request = appleIDProvider.createRequest()
onRequest(request)
let authorizationController = ASAuthorizationController(authorizationRequests: [request])
authorizationController.delegate = self
authorizationController.performRequests()
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithAuthorization authorization: ASAuthorization) {
print(authorization.debugDescription)
onCompletion(.success(authorization))
}
func authorizationController(controller: ASAuthorizationController, didCompleteWithError error: Error) {
print(error.localizedDescription)
onCompletion(.failure(error))
}
}

View File

@ -0,0 +1,15 @@
<?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>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,59 @@
//
// Result.swift
// PushDeer
//
// Created by HEXT on 2022/1/4.
//
import Foundation
/// API
struct ApiResult<T : Codable> : Codable{
let code: Int
/// , code != 0
let error: String?
/// , code == 0
let content: T?
}
struct TokenContent: Codable{
let token: String
}
struct DeviceItem: Codable, Identifiable{
let id: Int
let uid: String
let name: String
let type: String
let device_id: String
let is_clip: Int
}
struct DeviceContent: Codable{
let devices: [DeviceItem]
}
struct KeyContent: Codable{
let keys: [KeyItem]
}
struct KeyItem: Codable, Identifiable{
let id: Int
let key: String
}
struct MessageContent: Codable{
let messages: [MessageItem]
}
struct MessageItem: Codable, Identifiable{
let id: Int
let uid: String
let text: String
let desp: String
let type: String
}
struct ActionContent: Codable{
let message: String
}

View File

@ -2,6 +2,12 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>aps-environment</key>
<string>development</string>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>

View File

@ -9,9 +9,11 @@ import SwiftUI
@main
struct PushDeerApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
ContentView().environmentObject(AppState.shared)
}
}
}

View File

@ -0,0 +1,19 @@
//
// AppState.swift
// PushDeer
//
// Created by HEXT on 2022/1/4.
//
import Foundation
class AppState: ObservableObject {
@Published var token : String? = nil
@Published var devices: [DeviceItem] = []
@Published var keys: [KeyItem] = []
@Published var messages: [MessageItem] = []
@Published var tab_selected: Int = 1
@Published var device_token: String = ""
static let shared = AppState()
private init() {}
}

View File

@ -0,0 +1,55 @@
//
// HttpRequest.swift
// PushDeer
//
// Created by HEXT on 2022/1/4.
//
import Foundation
import Moya
struct HttpRequest {
static let provider = MoyaProvider<PushDeerApi>(callbackQueue: DispatchQueue.main)
/// , Swift Concurrency (async / await)
static func request<T: Codable>(_ targetType: PushDeerApi, resultType: T.Type) async throws -> T {
return try await withCheckedThrowingContinuation { continuation in
provider.request(targetType) { result in
switch result {
case let .success(response):
do {
let result = try JSONDecoder().decode(ApiResult<T>.self, from: response.data)
print(result)
if let content = result.content, result.code == 0 {
continuation.resume(returning: content)
} else {
continuation.resume(throwing: NSError(domain: result.error ?? "接口报错", code: result.code, userInfo: nil))
}
} catch {
print(error)
continuation.resume(throwing: error)
}
case let .failure(error):
print(error)
continuation.resume(throwing: error)
}
}
}
}
static func fake() async throws -> TokenContent {
return try await request(.fake, resultType: TokenContent.self)
}
static func login(idToken: String) async throws -> TokenContent {
return try await request(.login(idToken: idToken), resultType: TokenContent.self)
}
@MainActor static func getDevices() {
_Concurrency.Task {
let result = try await request(.getDevices(token: AppState.shared.token ?? ""), resultType: DeviceContent.self)
AppState.shared.devices = result.devices
}
}
}

View File

@ -0,0 +1,114 @@
//
// PushDeerApi.swift
// PushDeer
//
// Created by HEXT on 2022/1/4.
//
import Foundation
import Moya
enum PushDeerApi {
case fake
case login(idToken: String)
case regDevice(token: String, name: String, device_id: String, is_clip: Int)
case getDevices(token: String)
case rmDevice(token: String, id: Int)
case genKey(token: String)
case regenKey(token: String, id: Int)
case renameKey(token: String, id: Int, name: String)
case getKeys(token: String)
case rmKey(token: String, id: Int)
/// type: =textmarkdown=imagemarkdown
case push(pushkey: String, text: String, desp: String, type: String)
case getMessages(token: String, limit: Int)
case rmMessage(token: String, id: Int)
}
extension PushDeerApi: TargetType {
var baseURL: URL { URL( string: "http://pushdeer.wskfz.com:8800" )! }
var path: String {
switch self {
case .fake:
return "/login/fake"
case .login:
return "/login/idtoken"
case .regDevice:
return "/device/reg"
case .getDevices:
return "/device/list"
case .rmDevice:
return "/device/remove"
case .genKey:
return "/key/gen"
case .regenKey:
return "/key/regen"
case .renameKey:
return "/key/rename"
case .getKeys:
return "/key/list"
case .rmKey:
return "/key/remove"
case .push:
return "/message/push"
case .getMessages:
return "/message/list"
case .rmMessage:
return "/message/remove"
}
}
var method: Moya.Method {
switch self {
default:
return .post
}
}
var task: Task {
switch self {
case .fake:
return .requestParameters(parameters: [:], encoding: URLEncoding.queryString)
case let .login(idToken):
return .requestParameters(parameters: ["idToken": idToken], encoding: URLEncoding.queryString)
case let .regDevice(token, name, device_id, is_clip):
return .requestParameters(parameters: ["token": token,"name": name, "device_id": device_id,"is_clip": is_clip], encoding: URLEncoding.queryString)
case let .getDevices(token):
return .requestParameters(parameters: ["token": token], encoding: URLEncoding.queryString)
case let .rmDevice(token, id):
return .requestParameters(parameters: ["token": token,"id": id], encoding: URLEncoding.queryString)
case let .genKey(token):
return .requestParameters(parameters: ["token": token], encoding: URLEncoding.queryString)
case let .regenKey(token, id):
return .requestParameters(parameters: ["token": token,"id": id], encoding: URLEncoding.queryString)
case let .renameKey(token, id, name):
return .requestParameters(parameters: ["token": token,"id": id,"name": name], encoding: URLEncoding.queryString)
case let .getKeys(token):
return .requestParameters(parameters: ["token": token],encoding: URLEncoding.queryString)
case let .rmKey(token, id):
return .requestParameters(parameters: ["token": token, "id": id],encoding: URLEncoding.queryString)
case let .push(pushkey, text, desp, type):
return .requestParameters(parameters: ["pushkey": pushkey, "text": text, "desp": desp, "type": type],encoding: URLEncoding.queryString)
case let .getMessages(token, limit):
return .requestParameters(parameters: ["token": token, "limit": limit],encoding: URLEncoding.queryString)
case let .rmMessage(token, id):
return .requestParameters(parameters: ["token": token, "id": id],encoding: URLEncoding.queryString)
}
}
var headers: [String: String]? {
return ["Content-type": "application/json"]
}
}

View File

@ -9,32 +9,36 @@ import SwiftUI
///
struct DeviceListView: View {
@State var devices = Array(0..<10)
@EnvironmentObject private var store: AppState
var body: some View {
BaseNavigationView(title: "设备") {
ScrollView {
LazyVStack(alignment: .center) {
ForEach(devices, id: \.self) { name in
ForEach(store.devices, id: \.id) { deviceItem in
DeletableView(contentView: {
DeviceItemView(name: "设备 \(name)")
DeviceItemView(name: deviceItem.name)
}, deleteAction: {
devices.removeAll { _name in
_name == name
store.devices.removeAll { _deviceItem in
_deviceItem.id == deviceItem.id
}
})
.padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24))
}
Spacer(minLength: 30)
}
}
.navigationBarItems(trailing: Button(action: {
withAnimation(.easeOut) {
devices.insert(Int(arc4random_uniform(1000)), at: 0)
// store.devices.insert(DeviceItem(), at: 0)
}
}, label: {
Image(systemName: "plus")
.foregroundColor(Color(UIColor.lightGray))
}))
}
.onAppear {
HttpRequest.getDevices()
}
}
}

View File

@ -7,11 +7,6 @@
import SwiftUI
struct KeyItem: Codable, Identifiable{
let id: Int
let key: String
}
/// Key
struct KeyListView: View {
@State private var keyItems = [
@ -37,6 +32,7 @@ struct KeyListView: View {
})
.padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24))
}
Spacer(minLength: 30)
}
}
.navigationBarItems(trailing: Button(action: {

View File

@ -17,15 +17,39 @@ struct LoginView: View {
.resizable()
.scaledToFit()
Spacer()
SignInWithAppleButton(
AppleSignInButton(
onRequest: { request in
request.requestedScopes = [.fullName, .email]
},
onCompletion: { result in
switch result {
case let .success(authorization):
if let appleIDCredential = authorization.credential as? ASAuthorizationAppleIDCredential {
// IDAPP
print(appleIDCredential.user) // 000791.7a323f1326dd4674bc16d32fd6339875.1424
// emailfullName->Apple ID->->使AppleIDApp APP
print(appleIDCredential.email as Any) // easychen@qq.com
print(appleIDCredential.fullName as Any) // givenName: lijie familyName: chen
// JWTtoken.3, base64
let idToken = String(data:appleIDCredential.identityToken!, encoding: .utf8)
print(idToken as Any)
Task {
do {
let result = try await HttpRequest.login(idToken: idToken!)
print(result)
} catch {
print(error)
}
}
}
case let .failure(error):
print(error)
}
}
)
.frame(height: 64)
.frame(maxWidth: 375, minHeight: 64, maxHeight: 64)
.padding()
Spacer()
}

View File

@ -0,0 +1,64 @@
//
// MessageItemView.swift
// PushDeer
//
// Created by HEXT on 2021/12/29.
//
import SwiftUI
struct MessageItemView: View {
///
let deleteAction : () -> ()
var body: some View {
VStack {
HStack {
HLine().stroke(Color(UIColor.lightGray))
.frame(width: 20, height: 1)
Image("avatar2")
.resizable()
.scaledToFit()
.frame(width: 38, height: 38)
Text("key名字")
.font(.system(size: 14))
.foregroundColor(Color(UIColor.darkGray))
Text("· 5分钟前")
.font(.system(size: 12))
.foregroundColor(Color(UIColor.darkGray))
HLine().stroke(Color(UIColor.lightGray))
.frame(height: 1)
}
DeletableView(contentView: {
CardView {
HStack{
Text("纯文本的效果")
.font(.system(size: 14))
.foregroundColor(Color(UIColor.darkGray))
.padding()
Spacer(minLength: 0)
}
.contextMenu {
Button("复制") {
UIPasteboard.general.string = "someText"
}
}
}
}, deleteAction: deleteAction)
.padding(EdgeInsets(top: 10, leading: 26, bottom: 0, trailing: 24))
}
.padding(.top, 25)
}
}
struct MessageItemView_Previews: PreviewProvider {
static var previews: some View {
VStack {
MessageItemView(){}
MessageItemView(){}
Spacer()
}
}
}

View File

@ -9,8 +9,56 @@ import SwiftUI
///
struct MessageListView: View {
@State private var messages = Array(0..<10)
@State private var isShowTest = true
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
BaseNavigationView(title: "消息") {
ScrollView {
LazyVStack(alignment: .leading) {
if isShowTest {
TestPushView()
}
ForEach(messages, id: \.self) { msg in
MessageItemView {
messages.removeAll { _msg in
_msg == msg
}
}
}
Spacer(minLength: 30)
}
}
.navigationBarItems(trailing: Button(action: {
withAnimation(.easeOut) {
isShowTest = !isShowTest
}
}, label: {
Image(systemName: isShowTest ? "chevron.up" : "chevron.down")
.foregroundColor(Color(UIColor.lightGray))
}))
}
}
}
struct TestPushView: View {
@State private var testText = ""
var body: some View {
TextEditor(text: $testText)
.overlay(RoundedRectangle(cornerRadius: 4).stroke(Color.accentColor))
.frame(height: 128)
.padding(EdgeInsets(top: 18, leading: 26, bottom: 0, trailing: 24))
Button("推送测试") {
print("点击推送测试")
}
.font(.system(size: 20))
.frame(width: 104, height: 42)
.foregroundColor(Color.white)
.background(Color.accentColor)
.cornerRadius(8)
.padding(EdgeInsets(top: 12, leading: 26, bottom: 0, trailing: 24))
}
}

View File

@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

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

View File

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

View File

@ -0,0 +1,18 @@
<?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>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
<key>NSAppClip</key>
<dict>
<key>NSAppClipRequestEphemeralUserNotification</key>
<false/>
<key>NSAppClipRequestLocationConfirmation</key>
<false/>
</dict>
</dict>
</plist>

View File

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

View File

@ -0,0 +1,16 @@
<?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>aps-environment</key>
<string>development</string>
<key>com.apple.developer.applesignin</key>
<array>
<string>Default</string>
</array>
<key>com.apple.developer.parent-application-identifiers</key>
<array>
<string>$(AppIdentifierPrefix)com.wskfz.pushdeer.ios</string>
</array>
</dict>
</plist>

View File

@ -0,0 +1,19 @@
//
// PushDeerClipApp.swift
// PushDeerClip
//
// Created by HEXT on 2021/12/30.
//
import SwiftUI
@main
struct PushDeerClipApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView().environmentObject(AppState.shared)
}
}
}

21
push/LICENSE Normal file
View File

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 Bo-Yi Wu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

27
quickapp/.gitignore vendored Normal file
View File

@ -0,0 +1,27 @@
.DS_Store
node_modules
/dist
/build
/sign
# sign
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw*
.ide
.quickapp.preview.json

1
quickapp/.npmrc Normal file
View File

@ -0,0 +1 @@
registry="https://registry.npm.taobao.org"

6
quickapp/.prettierignore Normal file
View File

@ -0,0 +1,6 @@
package.json
manifest.json
README.md
# assets/js
src/assets/js/*.js

5
quickapp/README.md Normal file
View File

@ -0,0 +1,5 @@
# PushDeer-快应用 (开发中)
PushDeer 是一个开放源码的无 App 推送服务
这里是 PushDeer 的 `快应用` 端的源码

2263
quickapp/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

58
quickapp/package.json Normal file
View File

@ -0,0 +1,58 @@
{
"name": "pushdeer",
"version": "2.0.0",
"description": "PushDeer开源版可以自行架设的无APP推送服务",
"scripts": {
"start": "hap server --watch",
"server": "hap server",
"build": "hap build",
"release": "hap release",
"watch": "hap watch",
"debug": "hap debug",
"gen": "node ./scripts/gen/index.js",
"precommit-msg": "echo '🚧 start pre-commit checks ...' && exit 0",
"prettier": "node ./scripts/selfCloseInputTag.js && prettier --write \"src/**/*.{ux,js,json,less,scss,css,pcss,md,vue}\"",
"prettier-watcher": "onchange '**/*.md' \"src/**/**/*.{ux,js,json,less,scss,css,pcss,md,vue}\" -- prettier --write {{changed}}"
},
"dependencies": {
"apex-ui": "^1.9.2"
},
"devDependencies": {
"@babel/runtime": "^7.12.5",
"@types/quickapp": "npm:quickapp-interface@^1.0.0",
"colors": "^1.4.0",
"husky": "^7.0.1",
"less": "^4.1.1",
"less-loader": "^10.0.1",
"lint-staged": "^11.0.1",
"onchange": "^5.2.0",
"prettier": "^2.3.2",
"prettier-plugin-ux": "^0.3.0"
},
"prettier": {
"singleQuote": true,
"semi": false,
"printWidth": 80,
"proseWrap": "never",
"tabWidth": 2
},
"husky": {
"hooks": {
"pre-commit": "yarn run precommit-msg && lint-staged"
}
},
"lint-staged": {
"**/**.{ux,js,json,less,scss,css,pcss,md,vue}": [
"prettier --write",
"git add"
]
},
"keywords": [
"快应用",
"快应用示例",
"快应用模版"
],
"browserslist": [
"chrome 65"
]
}

BIN
quickapp/pushdeer素材.xd Normal file

Binary file not shown.

View File

@ -0,0 +1,87 @@
/**
* @desc: gen script commandmake a new page generated by one click.
* @author: nicejade
*/
const fs = require('fs')
const path = require('path')
const colors = require('colors')
const newFolderName = process.argv[2]
String.prototype.firstUpperCase = function() {
return this.replace(/\b(\w)/g, $1 => {
return $1.toLowerCase()
})
}
const resolve = dir => {
return path.join(__dirname, '../..', dir)
}
const successExecPrint = msg => {
console.log(
colors.green(``) +
colors.cyan(`${msg} `) +
colors.green('task has been successfully executed.')
)
}
function createNewPage(newFolderPath) {
const mReg = new RegExp('@PAGE_CLASS_NAME', 'g')
const pageContent = fs.readFileSync(`${__dirname}/template.ux`, 'UTF-8')
const rootClassName = newFolderName
.firstUpperCase()
.replace(/([A-Z])/g, '-$1')
.toLowerCase()
const newContent = pageContent.replace(mReg, rootClassName)
fs.mkdirSync(newFolderPath, 0777)
fs.writeFile(`${newFolderPath}/index.ux`, newContent, error => {
if (error) throw `Something went wrong: ${error}`
})
successExecPrint('Create New Page')
}
function saveRouter2Manifest() {
const manifestPath = resolve('/src/manifest.json')
let manifestConf = fs.readFileSync(manifestPath, 'UTF-8')
manifestConf = JSON.parse(manifestConf)
const routerPages = manifestConf.router.pages
routerPages[`pages/${newFolderName}`] = {
component: 'index'
}
manifestConf = JSON.stringify(manifestConf, null, 2)
fs.writeFile(manifestPath, manifestConf, error => {
if (error) throw `Something went wrong[@saveRouter2Manifest]: ${error}`
})
successExecPrint('Save Router Into Manifest')
}
function main() {
if (!newFolderName) {
return console.warn(
`⚠️ Please enter the name of the page you want to create.`.underline.red
)
}
const folderNameReg = /^[A-Z][[A-Za-z0-9]+$/
if (!folderNameReg.test(newFolderName)) {
return console.warn(
`⚠️ Please enter the standard Folder name. Eg: XyzAbcde.`.underline.red
)
}
const newFolderPath = path.join(__dirname, `../../src/pages/${newFolderName}`)
const isExist = fs.existsSync(newFolderPath)
if (isExist) {
return console.warn(
`⚠️ ${newFolderName} already exists in the /src/pages/ directory.`
.underline.red
)
}
createNewPage(newFolderPath)
saveRouter2Manifest()
}
main()

View File

@ -0,0 +1,28 @@
<template>
<div class="wrapper">
<text class="title">{{ title }}</text>
</div>
</template>
<script>
export default {
private: {
title: '欢迎体验快应用开发'
},
onInit() {}
}
</script>
<style lang="less">
@import './../../assets/styles/style.less';
.wrapper {
.flex-box-mixins(column, center, center);
.title {
font-size: 8 * @size-factor;
text-align: center;
color: @black;
}
}
</style>

View File

@ -0,0 +1,36 @@
/**
* @file: selfCloseInputTag.js
* @desc: 遍历指定目录下 .ux 文件将其中 input 标签由 <input **></input> 转换为 <input ** />
* @date: 2019-01-23
*/
const fs = require('fs')
const path = require('path')
const quickappCodePath = './src/'
const main = codePath => {
const traversing = cpath => {
const files = fs.readdirSync(cpath)
files.forEach(fileName => {
const fPath = path.join(cpath, fileName)
const stats = fs.statSync(fPath)
stats.isDirectory() && traversing(fPath)
stats.isFile() && fPath.endsWith('.ux') && matchAndReplace(fPath)
})
}
traversing(codePath)
}
const matchAndReplace = path => {
const pageContent = fs.readFileSync(path, 'UTF-8')
const newContent = pageContent.replace(
/(<)([\s]*?)(input\b[^\/]*?)>[\s\S]*?<\/input>/gm,
'$1$3 />'
)
fs.writeFile(path, newContent, error => {
if (error) throw `Something went wrong: ${error}`
})
}
main(quickappCodePath)

17
quickapp/src/app.ux Normal file
View File

@ -0,0 +1,17 @@
<script>
/**
* 应用级别的配置,供所有页面公用
*/
const $utils = require('./helper/utils').default
const $apis = require('./helper/apis').default
/* @desc: 注入方法至全局 global,以便页面调用 */
const hook2global = global.__proto__ || global
hook2global.$utils = $utils
hook2global.$apis = $apis
export default {
onCreate() {}
}
</script>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="92" height="95" viewBox="0 0 92 95">
<image id="calander" width="92" height="95" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="105" height="95" viewBox="0 0 105 95">
<image id="device-ipad" width="105" height="95" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="75" height="95" viewBox="0 0 75 95">
<image id="device-iphone" width="75" height="95" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 155 B

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="530" height="2" viewBox="0 0 530 2">
<line id="直线_1" data-name="直线 1" x2="530" transform="translate(0 1)" fill="none" stroke="#d8d8d8" stroke-width="2" stroke-dasharray="10"/>
</svg>

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="79" height="95" viewBox="0 0 79 95">
<image id="plus" width="79" height="95" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE8AAABfCAYAAACp4podAAAABHNCSVQICAgIfAhkiAAAA0NJREFUeF7tmj2IE2EURXc2tbqCIGghCvlDELRREGy0sLARFxZEBEEQRFArWxULbbSwEWwEXdhGOwt7XbQSRMwPCRHBUgSxCeTHO5IiLMnu5DsTmZEbWLJs5rz53smdnYHvRQt+BRuIgkmDC5YHQmB5lgcMANTJszxgAKBOnuUBAwB18iwPGACok2d5wABAnTzLAwYA6uRZHjAAUCfvf5TXbrd39Hq94+pt+2AweF+tVr+CPueCZjJ5jUbjpIStRlG0e9R1X++3K5XKvblYCCyaOXkSt3c4HH5WP0sbe9Lfl5XAl4G9po5lUd5NSXo4pdM3St/p1C0EFsycvHq9/kS9XJnST0fyDgT2mjqWRXlP1eXlSZ0qkd902e5L3UJgQcsLFBdjlmd5wABAnTzLAwYA6uRZHjAAUCfP8oABgDp5lgcMANTJszxgAKBOnuUBAwB18iwPGACok2d5wABAnTzLAwYAOlPyOp3OUrfbPaHz7Z/X/od2yFY0KXBsUk/67Kc+uwv63RRV7R+Li4vrxWKxneQcieU1m81T/X7/xdgIRJL6uTtGX1BPPd5JMtqRSJ42ovfEIxAqujN3NgIXrASeK5VKrzbDE8mr1WrXJO5x4DpyiSksr7XBfgbLU/Luq8itXFoIXLTkfZS8I1ieJpdWVGwtcB25xHSlPSuXy5ewPIkrKH3vVPBoLk3MuGj1+1u9HtJNo4PlxQVGjynx6NeyfrbNuJ5cHD66037QYq9K3KetFp3ohjFeRCeIWq3Wrq0Kh36ux6H4C7owhf9eKBQOh9ZOwP3SM143wXF/D5lZXtLCocfp34NHzCwv1ADgnDzLAwYA6uRZHjAAUCfP8oABgDp5lgcMANTJszxgAKBOnuUBAwB18iwPGACok2d5wABAnTzLAwYA6uRZHjAAUCXvkfAbk0po2/OLRiAOgvKpopnbetRQ0Xnt1q9O6fK5NqMvpmoAFMucvNFox9uNA45JRyCAi5nRzMmLO9ClG49zPJCws3qPf1/XpMB1zcvVZu5wjkAm5Y33G4936DWco4Pg0pmXF9zZPwAtD0i2PMsDBgDq5FkeMABQJ8/ygAGAOnmWBwwA1MmzPGAAoE6e5QEDAP0DDiwVfl1guh8AAAAASUVORK5CYII="/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="58.537" height="80" viewBox="0 0 58.537 80">
<image id="tabbar-device-active" width="58.537" height="80" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="58.537" height="80" viewBox="0 0 58.537 80">
<image id="tabbar-device" width="58.537" height="80" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABSCAYAAAAIArdYAAAABHNCSVQICAgIfAhkiAAACaVJREFUeF7tmwlsFVUUhmnphrS0EBQrFo1gkCWRTUHQCCqCqCEoVhYVQQTtQlu6UDRIRSJtSmlLWcJqxQWkRIggGKLRuEAsYXHBKLhEbUHWLpHSvX7nZaYZHvPeu6+1Qwszyc3M3HvuOec/59x17vi0u8Yun2sMbzsb8NXucdvDtoevMgsohXRUVFRwYGDgHQ0NDbeDv9sVtkE5evyKDr/k5uae8lYXt4DT0tL8SktLY2CaRgr1lnkL09fDf31NTc0rK1euPKcqyy3g+Pj4FTCKVmV2heiOhoWFDcA5tSryXQKeM2fOYF9f30KY+BoZEU5FPj4+dSrMW4IG+Tch399JpyTCO0tFnkvAeHcRDBboTBCUTVq9fPny4yqMW4omISGhC3o8QcoF+HWanP05OTnDVWS6BBwXF7cFhk9rTM4SNuGqYaMiuLk0Rv0Afw4Pd1Xh6Q7wfgAPEyYwfAuGM1QYWkVDBE5EVoEuz8/PL3jp0qUXPMl3F9IHqDxEA5wJ4BRPzKwsB3BYfX39QJHZnis0NPQLlQhss4CbatxWDTg2NvZ6nPc44G4jXdIzmwAuxeOH6VQ/cWeMVguYkB1B37GTfqSzl97cW1xcPK6goMB06Gy1gOmFfwBsfy/B6uQvMkytN6vbKgHL3N3f378cwKLf/rq6umdra2vPBwQELCArwQCknvx+lJ9irn8/+du1TnYDnezMNgOYWV4PZnl/isK0y/m0y3R5njdvXmhlZaUMRx01YEcp+0wHRlScxCA38r4DD09ok4BROhnll6qENoD/BvDNNmCDtVplGzaGtO1hN7Fth7SJceyQ1o3CTOeKLR7sNmwPS+Y9l91p2Z1WO9dfD+1Oy8ItHruXtqKXpscrZOVxl7YMy2Z9OVdlxcK+cRw7FeNUaE1oZH857Up5eDcKPaIpdQRFHDuEni4MtQdDjfVEZ1aOoT7CsONdAWZXMqCsrKy9sW5RUVG1vp3T3GEpB8ZxOnMW4kNYbB9UAOLDjoVjge7tVVFRUZufn19pBpjI6YVBjsIzwMiXvK8x0n2S1yzAVH4GT72jM4dxA+/7uH3OXenDlbeAoS+WvajExMSubNuc0eq/Q95zGqChyO5g5MsWz7EVK1acSEpKuoHnYsr8SJupM8VMvsvFA+HjW1JSIu14cBMUb1IVjPkb3uollRkWBbD++US+B593x5S6fdE1WKN5DcBveAVYE9qH+7ukQU1C0IRKeDYiLy+viAiLAUCetywAfobPLn2zsrLOeg1YKoin+Sg+FUbDUECs302i21tFVOnZvNuYnZ2dq4XwY9wlnD1uxKNbCXp9xz0d7550Ja/FFFcFaDWdDdhqi1stz/aw1Ra3Wp7tYastbrU828NWW9xqebaHrba41fJsD5tZXHYaSNVWemPZsmWyvBvOxkMKa12VjQcl9Tx6OD09PZSzFR+zEjkwl4vVSIMzZ5SbRrkcLzK9qLONqluUNIKI1dJM+K3jsbC8vHyEyoEzVd4eAa9Zs+a6CxcuyJp4AkrkR0REzIyMjLzkSBBrzyxAzaW8krucY3ZcvPvyHsTjYgA3HlR1pxzHB0dTZzdJdi7kMHiFJzCsoe9NSUn5zROdlHsELESyJu7UqZMcLElGgR2csJnEvlOVLsAAuDfbM8cM+QNR/JAqYCLlbvjvhT6Q9D6p0XjOYOAbTt6j0J/mBE/fmJgYpUPiSoB1YSi0hOdUUjQeW2XId+xwVldXh6WmppZ5C1g2FOCdIIt36vrzXsLzNGTsNPMaUTCG8k2U+dLGRyUnJ/+o4l1lDxuZoVgkO4gFelvOyMgIweOy/1SKgnJkqPHC8x49jPJd2eXIF2+Rfie9DOBU+I/ingfvZD2a5JeEkJCQxZTJQVcxyoPockQVbJMAOzPHAInkybGiNwH8qrGczmcASh8mLSPUhe6yi/pryJxF2k6ETJcI2bp1a3v2mzPIS5RtG9Ikni9imM3c7yF9C9gpgBUDeXW5DWkUHgTjSw51dujQ4dDs2bNrNGtLZzUHhf6gHd3l3I6gCcIjp6Gpg2Yb90ruB8EuHnVc/KARzGGzSPI2OmtOhDxFHcmX3xBkWJQfTTLouRc0ted2CxiBZxB4yUlz9n7D6RH/oSyesmwUKKIdjWGs/MmFB18CZBy0d0g5zx8ATjzm8pI2jbHv5T6VenIqP0yrW837Lp4LMPCu6Ojof71yL8SeAM+GxrHxjSA58jdCB6yF3byqqqrV8+fPL/EkWHp6oVm4cKFs6F82li9ZsqRzUFDQYIz3EOWTIe1BqgD0Vu7r5DwlR4mnU/Y87921IXAP988I9SPMFb5TMYByL01bW4mgKB2wKI8X+iBQDnUqXYTiWoA3DjVEyctUlPpDANJTYwLLhkMSyrTp94y9vpSLoTkePBbDTOf1Aej048VS7zjvO+lLklwp1FzAsxAinY7SBeBA4xQVwJkoGA0POTEk4/VBvLWPu9uvDLow2r4Pnu0NjwHk3QmfoRINNJnVLQIYr3fH0v1R8j2EFZGSTQTJbGsTqYxeVZRrDGfp1MLDw+ukEwR8hjbcKBnPiWgVXlX6oaxZHtaFoqycY14kXxidJ/oY5QXo5LD2TJTa4AqNAXAShnOeNck/VHK95lS/I3Ll7zlrAdOWw1BSzjcX4sWHdS9KR0TI/Ux+VXBwcE/xpCfARMstfEj7y0iHMRyTC0JVQrfxwphdeBHjWAtYNEC4/JSZp08ytEWHzItHkCZ7Wi3pHsZYA+mRi4zAMMIX8k4EjTTmMwvrDK3M3VsWMF/nZL6cj7AZzGMbf45C6eUoHEuZrIwEqJwEuGwGZublVtuGUbY/XlwLsOGkUYSww/pyaWOzTPj1oxIfUj7RbNx1Bq0Dhvcs6E87lctpBLnijfnQhkArH+1bzsMwl6/sNyLsVdqUzHcdFyHsz7o5ivyF+tjI80+EYxygPzXzqjFPB9wq2rC2HpapY29AyIfmSYB1/FwhQDmbMZ78xVr5CQAnktrT5nK4y9R0O0DS6Iy+dwXcENIjNaM2ksLbsUyEl/Ouikw5ZQz/fz2sLRR+R+ApFH9SelGWdYN5n4awyRqoGhTLZXr4uj7Fk6UfZdmkqaIv5V9SP4+TODucJ/+tsQ3fR2dVqK9NUXAvQEYDRP4n3sjz24Su6Zf3zMzM/syDUwAsc2T586QfvfZFs5AmLxY6/UCL25aA8UKglb2v/9fDZlIBHIHit6L4V57ap17OUYQeKNjFbNEu2zsyRWTcfl9lESA8OUYVyEghUXYUnt+o6KE801Jh1hZobMBtwUvN0dH2cHOs1xbq/gfeuu+eGZzBNwAAAABJRU5ErkJggg=="/>
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="80" viewBox="0 0 56 80">
<image id="tabbar-key-active" width="56" height="80" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="56" height="80" viewBox="0 0 56 80">
<image id="tabbar-key" width="56" height="80" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="52.093" height="80" viewBox="0 0 52.093 80">
<image id="tabbar-message-active" width="52.093" height="80" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="50.233" height="80" viewBox="0 0 50.233 80">
<image id="tabbar-message" width="50.233" height="80" xlink:href="data:image/png;base64,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"/>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="43.636" height="80" viewBox="0 0 43.636 80">
<image id="tabbar-settings" width="43.636" height="80" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAABYCAYAAACzpXSwAAAABHNCSVQICAgIfAhkiAAADV9JREFUeF7tmwl0VdUVhknCPIVYJ5JitaUCFRRUHJAh1hbqVGBVKaBWtJjYMCeQMCwLuihhnkHA2sZabUGKUKW0WAQZVikollaxWhAUVJwggMwQ+v2v5951cnPvuy/vvSzrWrlr3fXuPWfvffa/9z7D3ee8lBpf8SvlK65/jWoAX7YHq8QDQ4cObXLu3LkrU1NTI/LLysrO1a1bd/ukSZMOJRtwUgGMGzeudmlp6WKUvz0lJaWWR9lTlK/IyMjoC92ZZAFJKgAsPxbFxkVTDhAjZ82aNen/DsDdd9+dlpmZeQDLNzbKKVy+0DNKN7LKP5s5c+YFXwoAKZmVldUXhS4krjfNmTNns6MI1m/L8+tG4c9Pnz596fz58yMAioqK0k+ePLmXx0Z6P3PmTKu5c+f+2/CmwNsBmbr3zp49e7Ewxwow5hAaNmxYcxr4I4JbWcJfOXv2bB5AdqDEAMrnmroVWLmHrcSQIUNW4YUfGID9CaMn8/Pzr4J/AeU3WLTbMc4PAfJ+LCBiAmCUX4fALK9QQJ2W4ijRid9rjYLDUXCaTQvAUbxPMPWbod8Kbx6/aT4yd1OXHQuIUABe5RF8jkYVOu25a/pZifrrZ8yYscWuGzx4cEeG1Q1+9MYI28Tn1FO2Oy0trcv06dMVeoFXKAAstxbubCOhjEYeRLmnANYGV8v9HTzSS5s0aXKBd6jUEHvw4MHPoW9o06PoeuT8zIThIOpmWyBexJN3xg0A5W+CeaMl4F5i+xnrPYXYfpB3DYv/4Z5+/PjxlYsWLTrm1+igQYMa16xZsycK51PfFDCFyCuxaZGnsJpnlbWD5h9BIKJ6AABXw/iamLHUSUIgA+sf9wrLycmpH6R0QMMpeXl5DZxRyqbRLM77QcsLLfHC23EBMMPmJzCfZ0BMQNiYaC5NtA4ACiGFkq4PsP7X4w4hMeLSXFy6wAg5xW9bhL6VqKJ+/PI4nt5ijUzekK3AFtqJ4VCcb7Q66zoA3BwGQKMXsX6Z6Ph9l066KxoPnTyVTq7hVaObQvYlvN01rJ1YAMgLnRH8iiOM52z6gvvuieE+ND4amtaexrfzPh7wS/2Uoo074HnBqWOCuxrQkZk9rhDCgllYTpaW8rfw+00j6COEX4bwk17BKDEM2ulBDWoO0eTFBOWEpEs6fPjwBiwx9lBwvil8B9qXed6AzLUA/8hPbgUPoHg9GMdBrKHOb6KajLAirzDidzhlU5xyM+H9k/dU7jZ2eRAITwd2mzAT3SQMOt5ruAoAEPIInI95FZQQLPEq90OEz5t2PTzZvGvCc67ljPe5U6dO1QhWg/qm8D8F7/f1bjzRHk9EhmjnYp5ox1A9n/drfL4nRFaA8cp5uAIAwmA7zFeahnbwvATk65nWN/vNAaKDZxl0PY0iq48dO3YH84LWSO5lPLuGghtN4VMo089rKL0rnAjTGwHamdcfc19u6DbB09Hm8QNwxJnuEXAdI8FWv0bsMgDsh+cilfHbA6Ar/HjwhBT+tanbiTLfjkG2PYB8BE9mzAAgjDqNS5D5jHQ7NAC+BoADfoqZhaGWHJGZHePUDQNAWN2A9/9m6JIPQILxgOs1ud7+0LEVZEV6GzG+MkgZPzCVBoCbP0bQhUZY8alTp2azZtkfzVLw/J366xwe3Dzajx6gWr3mGg+swQPfiyZ34MCBmVh/ODzDDM8ueJpHDSGUKYHgfo/gnbhc4/HG2rVrPzd58uQjdj2KPUTdIlNWxm8/QDztoRkIzRynDHn3oMyzNo1ZyN1FmTqqPpCcucchm4fcgVEB4OZrcLNmxKYB1hmMEFcR0fTr168u3wCreMx2QKCgRpyXuDUPdEN5e/nhO1IBoBDaoIzFXmTcTv/6V1QAqtRH+IkTJzQxfZdbY3Idi2kLANwvJ6fczKQvWiAC8NdYTe6oe0lJyQkvgT2Eqw4jiEZzzxpCearf8jt0LUQnqqMxHq/8znJ/F9y/3quAAaGswu1+2qPQ84cOHeoboLy89GerjTtJgq1mlNMKOPAKBSBOLFOM8JFGygFGmpaMNJ8GSTUplu4oHIlheN/lXuZ1v82vDsvsrVRLJPUC7xiMFEkCJASAPtGaxvXB7aQKHyKEfhkmOJ565okhKD7TCR9WAK3DluGhHsD6Gn2c6VtTuUaHmBNPlQFisntbaa+d4VtFe7fF7QGUvwhhzhyAQcquYgH2RmWUqiwtbV5Pm07Gr4xwzcALh4PkRPUAwsp1LABcDoDIUsC5DMgJuP4NOvqCoAWfQ286+gDomxPzo6dNm/aZLc9OJKicNjvRpp0ZKYclKgCNQMyE+hSMZORodB8CsxWX+gQ8cOBADkoXU6VMguq/wHp/CFplAlYpmR7Q1DdaaM1UBP2TYqcPXIH8tdQ7yd+dzC+toqXjQ/sAnbg3Ap/ldmj3ougvaPABiirMB8Zq3/CmBcmDXo5yQemRTchUG0rPR5YxvJ/FOD3xqPuZ6RdGoQDEpKUCPwstEF5Ze4wXHE/cxxD4W09o9Of9CcvyR3lu5qeUlKf8J96lRtwAooDQrstEJqfi9PT0QgA+aqz3BI3n2A1ihKepv9eUFfHRM7devXo/5z3fGqIjlo9VecmKyQOOImaEeIxGMml0A7/o+b+sGaF2Cy7/qwHwNuUtPQDeg+cSU9aRuN+kZxP3g6jrjLxdCiPqtvlZOyEPhAkkVdiwVq1apSgQSZejzO/5iWQSKFOoaJUZ+ZChL6T7ZTXC2qhSABLOELicn+7RFBEwvNMnHmWrHABhdAnWfpO7XArdalj7Zq2CcjzxgKpUH4ilAfNRopz+NR76rcyqL0SbVWOR76VJOoB4lEiEpxpAItZLBm+1B5JhxURkVHsgEeslg7faA8mwYiIyqj2QiPWSwVvtgWRYMREZ1R5IxHrJ4C3nAe13hWWDk9FoMmW4ACZOnJjO7stKPvm2ksNRpqBC/pPTU/dTH3gACZ6lsOpb2PeCX1tP9vm4eLBspg03a+0CWLhwYf2jR48ql9MTJUuaNWvWv1evXkpxuBdpwGkoma+NB361lRS5eE/lXTuO4xGujfIgAPpmvoP7cYtAiVwdrNL2q3JFuhpwP4BcHf541Wonh/dVtOEeKPSGUGrjxo0nwjAC5uVkGXrznetuoVoAWhQUFLzjCKa8HYKVCgkFgNxu8NazeLWJN4VjmlnsDH2oco4oZ9L2BzyOsa2NB/VNvTYQgCMUQuU7taExAGJt/Ucuyv/Ez61s9zQZOXKkew66kgC0e1PgyER5bWNpM0RJLkdmOuU67qCQXu3QChvlfwkFYJTtRdLpOacvYJVGWEW7MqUIuNgSWiNWANDpMEgXm9d+pi0d0amJ0oFn5Kh/BQ+OcA0QJMxbjvVltancEwBQ7tgZCdi2NPo693SEu9aNVbblYR2xPIL878TKG+kDKHC1nZ9UGXnLbbm5uacZVms2atRInXcwCu6uU6dOe/azPrcbgKYuNJ9Acxaapfye4Pc1sJQYb3bivdzWbICCbQxvuT0IP1rSmPlEyMsRALj2Uxidg0YReg4fNS0sLNxP3VDqZlCkvYFubFDs8BOIhx5GySHQRnKiPC8GQG8jX6dN+oZYVflWZcGVao/kWKNdAFgMgLccANr+j4wMCFEO8yYHwJIlS9L27dtXxOHtx0eNGuUehwwSro0P1Y0dO1YnfCvMJfIWmexyfcgA1l7YPJQfbW/p2u2QBd8Pf7n95QprISypQ6d5DgAJIMRaITiw83nBHD58eBENufOEXY98yVkXZmG/eiKgKxGg3X/3ihVADgAWxtooAOoELUkcALI0HopJJrQ6+jkhbgA0qgOArXHtMwjbx+0OYxYozca/4T5EbLbwCx/RWh7Q6UX7mFo0++icxV1xA3Ak06Ef0QSDoGtxZbnzbij2U+i0Ad6fYVCbdr6XBUBjvTubh3hXg0DbhAHQF/TvpPcQtgUrd3WsXFxcnMFCUMcETjZs2PBbGn7DAGjEYpRyT6pHA4DhBtPWrIQBmBDQeZ05zqRlFoGa7rUg6xNtNeoJIe3elNsjjgJCQ3zTSgNgI1prkxLy+g+OGDHCWSlq3piNRXRAWytPKa6/llSYof0UskJoAQppdRp60fe0+ny4UgBgaI2VF6FoB+6bCZl1TktmbtD+7a2mbBn1dwV1XFtDC8A0FNLRnNALADp6WVBZAFrOXgyIMcSqe4qKkKnFd0Me5WNROEOt87yDRoYAInQGtQBolz7wDIQHlf7adV4oAM2ifA9oqdACpRSfvVFeR8dqSHH2drXsHW/qPwRAAXcagmeapcjzABnHNpOOHPte1jyQ/E5sFm46nPQxivwIRd7n+LCOnOkQYB+j5GlAzOK/kY8OGDAg8j8xaM7Xeon7Hl5TqF8P/xym/uU650Cf0RrHOX3bDDqFxMvQxbQfDL3+SaLvhqXw7FGblO1iwFjgNxN3ovNucb7EaHw1xDrzrBXir3jWH4B8T5JPmTKlNYdDCmlE26g6pHcFjRxHxpM8q7Mn7aKNrUTHfaF5IRqXxS5FEd+/UPlpxDbqJTRwHkCjfZgkBUwogKS0UoVCqgFUoXFjEl3tgZjMVIVE/wVANv+zdg2RfgAAAABJRU5ErkJggg=="/>
</svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@ -0,0 +1,5 @@
.flex-box-mixins (@column, @justify, @align) {
flex-direction: @column;
justify-content: @justify;
align-items: @align;
}

Some files were not shown because too many files have changed in this diff Show More