├── .gitee └── ISSUE_TEMPLATE.zh-CN.md ├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ └── bug_report.md ├── .gitignore ├── LICENSE ├── README.md ├── RoboFile.php ├── android ├── .gitignore ├── Readme.md ├── app │ ├── .gitignore │ ├── build.gradle │ ├── debug │ │ ├── PushDeer-v1.0-dev-8.apk │ │ └── output-metadata.json │ ├── libs │ │ └── MiPush_SDK_Client_5_0_5-C_3rd.aar │ ├── proguard-rules.pro │ ├── release │ │ └── output-metadata.json │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── pushdeer │ │ │ └── os │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── ic_launcher-playstore.png │ │ ├── java │ │ │ └── com │ │ │ │ └── pushdeer │ │ │ │ └── os │ │ │ │ ├── App.kt │ │ │ │ ├── AppKeys.kt │ │ │ │ ├── MainActivity.kt │ │ │ │ ├── WebViewActivity.kt │ │ │ │ ├── data │ │ │ │ ├── api │ │ │ │ │ ├── PushDeerApi.kt │ │ │ │ │ └── data │ │ │ │ │ │ ├── request │ │ │ │ │ │ └── DeviceInfo.kt │ │ │ │ │ │ └── response │ │ │ │ │ │ ├── DeviceInfo.kt │ │ │ │ │ │ ├── Message.kt │ │ │ │ │ │ ├── PushKey.kt │ │ │ │ │ │ ├── ReturnData.kt │ │ │ │ │ │ └── UserInfo.kt │ │ │ │ ├── database │ │ │ │ │ ├── AppDatabase.kt │ │ │ │ │ ├── dao │ │ │ │ │ │ ├── LogDogDao.kt │ │ │ │ │ │ └── MessageDao.kt │ │ │ │ │ └── entity │ │ │ │ │ │ ├── LogDog.kt │ │ │ │ │ │ └── MessageEntity.java │ │ │ │ └── repository │ │ │ │ │ ├── LogDogRepository.kt │ │ │ │ │ ├── MessageRepository.kt │ │ │ │ │ └── MiPushRepository.kt │ │ │ │ ├── factory │ │ │ │ └── ViewModelFactory.kt │ │ │ │ ├── holder │ │ │ │ └── RequestHolder.kt │ │ │ │ ├── keeper │ │ │ │ ├── RepositoryKeeper.kt │ │ │ │ └── StoreKeeper.kt │ │ │ │ ├── okhttp │ │ │ │ └── LogInterceptor.kt │ │ │ │ ├── receiver │ │ │ │ └── MessageReceiver.kt │ │ │ │ ├── store │ │ │ │ └── SettingStore.kt │ │ │ │ ├── ui │ │ │ │ ├── compose │ │ │ │ │ ├── componment │ │ │ │ │ │ ├── Item.kt │ │ │ │ │ │ ├── KeyItem.kt │ │ │ │ │ │ ├── MessageItem.kt │ │ │ │ │ │ ├── MyAlertDialog.kt │ │ │ │ │ │ ├── SettingItem.kt │ │ │ │ │ │ ├── SwipeToDismissItem.kt │ │ │ │ │ │ └── WeChatLoginButtom.kt │ │ │ │ │ └── page │ │ │ │ │ │ ├── LogDogPage.kt │ │ │ │ │ │ ├── LoginPage.kt │ │ │ │ │ │ └── main │ │ │ │ │ │ ├── DeviceListPage.kt │ │ │ │ │ │ ├── KeyListPage.kt │ │ │ │ │ │ ├── MainPage.kt │ │ │ │ │ │ ├── MainPageFrame.kt │ │ │ │ │ │ ├── MessageListPage.kt │ │ │ │ │ │ └── SettingPage.kt │ │ │ │ ├── navigation │ │ │ │ │ └── Page.kt │ │ │ │ └── theme │ │ │ │ │ ├── Color.kt │ │ │ │ │ ├── Shape.kt │ │ │ │ │ ├── Theme.kt │ │ │ │ │ └── Type.kt │ │ │ │ ├── util │ │ │ │ ├── ActivityOpener.kt │ │ │ │ ├── AppComponentUtils.kt │ │ │ │ ├── CurrentTimeUtil.kt │ │ │ │ ├── MiPushUtils.kt │ │ │ │ ├── NotificationUtil.kt │ │ │ │ ├── StatusBarUtils.java │ │ │ │ └── SystemUtil.java │ │ │ │ ├── values │ │ │ │ └── ConstValues.kt │ │ │ │ ├── viewmodel │ │ │ │ ├── LogDogViewModel.kt │ │ │ │ ├── MessageViewModel.kt │ │ │ │ ├── PushDeerViewModel.kt │ │ │ │ └── UiViewModel.kt │ │ │ │ └── wxapi │ │ │ │ └── WXEntryActivity.kt │ │ └── res │ │ │ ├── drawable │ │ │ ├── gearshape2x.png │ │ │ ├── ic_apple_colored.xml │ │ │ ├── ic_baseline_arrow_back_24.xml │ │ │ ├── ic_baseline_close_24.xml │ │ │ ├── ic_deer_head_with_mail.xml │ │ │ ├── ic_launcher_foreground.xml │ │ │ ├── ic_logo_svg_1.xml │ │ │ ├── ic_okok2.xml │ │ │ ├── ic_wechat_colored.xml │ │ │ ├── ipad_and_iphon2x.png │ │ │ ├── ipad_landscape2x.png │ │ │ ├── iphone2x.png │ │ │ ├── key2x.png │ │ │ ├── logo_com_x2.png │ │ │ ├── logo_half.png │ │ │ └── message2x.png │ │ │ ├── layout │ │ │ ├── activity_qr_scan.xml │ │ │ └── activity_webview.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── values-night │ │ │ └── themes.xml │ │ │ ├── values-zh-rCN │ │ │ └── strings.xml │ │ │ ├── values-zh │ │ │ └── strings.xml │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── ic_launcher_background.xml │ │ │ ├── strings.xml │ │ │ └── themes.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── pushdeer │ │ └── os │ │ └── ExampleUnitTest.kt ├── build.gradle ├── common │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── wh │ │ │ └── common │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── wh │ │ │ │ └── common │ │ │ │ ├── activity │ │ │ │ ├── ABaseActivity.kt │ │ │ │ └── QrScanActivity.kt │ │ │ │ ├── data │ │ │ │ └── app │ │ │ │ │ └── AppInfo.kt │ │ │ │ ├── store │ │ │ │ ├── AStoreFactory.kt │ │ │ │ ├── IStore.kt │ │ │ │ ├── Providers.kt │ │ │ │ ├── Store.kt │ │ │ │ └── StoreProvider.kt │ │ │ │ ├── toy │ │ │ │ ├── portainer │ │ │ │ │ ├── data │ │ │ │ │ │ ├── AdminPassword.kt │ │ │ │ │ │ ├── Auth.java │ │ │ │ │ │ ├── Bridge.java │ │ │ │ │ │ ├── Endpoint.java │ │ │ │ │ │ ├── HostConfig.java │ │ │ │ │ │ ├── Labels.java │ │ │ │ │ │ ├── Mounts.java │ │ │ │ │ │ ├── NetworkSettings.java │ │ │ │ │ │ ├── Networks.java │ │ │ │ │ │ ├── Portainer.java │ │ │ │ │ │ └── Ports.java │ │ │ │ │ ├── helper │ │ │ │ │ │ └── PortainerHttpApiHelper.kt │ │ │ │ │ ├── repository │ │ │ │ │ │ └── PortainerRepository.kt │ │ │ │ │ ├── store │ │ │ │ │ │ └── PortainerStore.kt │ │ │ │ │ └── viewmodel │ │ │ │ │ │ └── PortainerViewModel.kt │ │ │ │ └── qweather │ │ │ │ │ ├── data │ │ │ │ │ ├── Now.java │ │ │ │ │ ├── QWeather.java │ │ │ │ │ └── Refer.java │ │ │ │ │ ├── helper │ │ │ │ │ └── QWeatherHttpApiHelper.kt │ │ │ │ │ ├── store │ │ │ │ │ └── QWeatherStore.kt │ │ │ │ │ └── viewmodel │ │ │ │ │ └── QWeatherViewModel.kt │ │ │ │ ├── type │ │ │ │ └── Json.kt │ │ │ │ ├── typeExt │ │ │ │ ├── Drawable.kt │ │ │ │ ├── Float.kt │ │ │ │ ├── Int.kt │ │ │ │ ├── List.kt │ │ │ │ ├── Long.kt │ │ │ │ ├── MutableList.kt │ │ │ │ ├── PackageInfo.kt │ │ │ │ ├── Set.kt │ │ │ │ └── String.kt │ │ │ │ ├── ui │ │ │ │ └── componment │ │ │ │ │ └── DatePicker.kt │ │ │ │ ├── util │ │ │ │ ├── ActivityOpener.kt │ │ │ │ ├── Base64Utils.kt │ │ │ │ ├── ClipboardUtils.kt │ │ │ │ ├── FragmentUtils.kt │ │ │ │ ├── PackageUtils.kt │ │ │ │ ├── QRCodeGenerator.java │ │ │ │ ├── TimeUtils.java │ │ │ │ ├── UiUtils.kt │ │ │ │ └── VersionCodeUtil.java │ │ │ │ └── viewmodel │ │ │ │ └── IViewModelFactory.kt │ │ └── res │ │ │ └── layout │ │ │ └── activity_qr_scan.xml │ │ └── test │ │ └── java │ │ └── com │ │ └── wh │ │ └── common │ │ └── ExampleUnitTest.kt ├── compose │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── wh │ │ │ └── sbw │ │ │ └── compose │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── wh │ │ │ └── sbw │ │ │ └── compose │ │ │ ├── typeExt │ │ │ ├── LiveData.kt │ │ │ └── SnapshotStateList.kt │ │ │ └── ui │ │ │ └── componment │ │ │ └── IComposeFragment.kt │ │ └── test │ │ └── java │ │ └── com │ │ └── wh │ │ └── sbw │ │ └── compose │ │ └── ExampleUnitTest.kt ├── gradle.properties ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── key_debug.sample.properties ├── pushdeercommon │ ├── .gitignore │ ├── build.gradle │ ├── consumer-rules.pro │ ├── proguard-rules.pro │ └── src │ │ ├── androidTest │ │ └── java │ │ │ └── com │ │ │ └── pushdeer │ │ │ └── common │ │ │ └── ExampleInstrumentedTest.kt │ │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── pushdeer │ │ │ └── common │ │ │ └── api │ │ │ ├── PushDeerApi.kt │ │ │ └── data │ │ │ ├── request │ │ │ └── DeviceInfo.kt │ │ │ └── response │ │ │ ├── DeviceInfo.kt │ │ │ ├── Message.kt │ │ │ ├── PushKey.kt │ │ │ ├── ReturnData.kt │ │ │ └── UserInfo.kt │ │ └── test │ │ └── java │ │ └── com │ │ └── pushdeer │ │ └── common │ │ └── ExampleUnitTest.kt └── settings.gradle ├── api ├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .styleci.yml ├── README.md ├── app │ ├── Console │ │ ├── Commands │ │ │ └── CleanOldPush.php │ │ └── Kernel.php │ ├── Exceptions │ │ └── Handler.php │ ├── Http │ │ ├── Controllers │ │ │ ├── Controller.php │ │ │ ├── PushDeerDeviceController.php │ │ │ ├── PushDeerKeyController.php │ │ │ ├── PushDeerMessageController.php │ │ │ └── PushDeerUserController.php │ │ ├── Helpers.php │ │ ├── Kernel.php │ │ └── Middleware │ │ │ ├── Authenticate.php │ │ │ ├── EncryptCookies.php │ │ │ ├── EnsureMember.php │ │ │ ├── JsonRequest.php │ │ │ ├── PreventRequestsDuringMaintenance.php │ │ │ ├── RedirectIfAuthenticated.php │ │ │ ├── TokenLogin.php │ │ │ ├── TrimStrings.php │ │ │ ├── TrustHosts.php │ │ │ ├── TrustProxies.php │ │ │ └── VerifyCsrfToken.php │ ├── Models │ │ ├── PushDeerDevice.php │ │ ├── PushDeerKey.php │ │ ├── PushDeerMessage.php │ │ ├── PushDeerUser.php │ │ └── User.php │ └── Providers │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── EventServiceProvider.php │ │ └── RouteServiceProvider.php ├── artisan ├── bootstrap │ ├── app.php │ └── cache │ │ └── .gitignore ├── composer.json ├── composer.lock ├── config │ ├── app.php │ ├── auth.php │ ├── broadcasting.php │ ├── cache.php │ ├── cors.php │ ├── database.php │ ├── filesystems.php │ ├── hashing.php │ ├── logging.php │ ├── mail.php │ ├── queue.php │ ├── sanctum.php │ ├── services.php │ ├── session.php │ └── view.php ├── database │ ├── .DS_Store │ ├── .gitignore │ ├── factories │ │ └── UserFactory.php │ ├── migrations │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2014_10_12_100000_create_password_resets_table.php │ │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ │ ├── 2021_12_01_110618_create_push_deer_users_table.php │ │ ├── 2021_12_01_152401_create_push_deer_devices_table.php │ │ ├── 2021_12_06_155915_create_push_deer_keys_table.php │ │ ├── 2021_12_07_141137_create_push_deer_messages_table.php │ │ ├── 2022_01_09_095031_message_add_push_key.php │ │ ├── 2022_03_22_042738_add_index_to_messages.php │ │ ├── 2022_06_26_160358_add_index_to_message_table.php │ │ └── 2022_09_05_154456_add_simple_token_to_user_table.php │ └── seeders │ │ └── DatabaseSeeder.php ├── package.json ├── phpunit.xml ├── public │ ├── .htaccess │ ├── code.png │ ├── favicon.ico │ ├── index.php │ ├── robots.txt │ └── web.config ├── resources │ ├── css │ │ └── app.css │ ├── js │ │ ├── app.js │ │ └── bootstrap.js │ ├── lang │ │ └── en │ │ │ ├── auth.php │ │ │ ├── pagination.php │ │ │ ├── passwords.php │ │ │ └── validation.php │ └── views │ │ ├── pushdeer.blade.php │ │ └── welcome.blade.php ├── routes │ ├── api.php │ ├── channels.php │ ├── console.php │ └── web.php ├── server.php ├── storage │ ├── app │ │ ├── .gitignore │ │ └── public │ │ │ └── .gitignore │ ├── framework │ │ ├── .gitignore │ │ ├── cache │ │ │ ├── .gitignore │ │ │ └── data │ │ │ │ └── .gitignore │ │ ├── sessions │ │ │ └── .gitignore │ │ ├── testing │ │ │ └── .gitignore │ │ └── views │ │ │ └── .gitignore │ └── logs │ │ └── .gitignore ├── tests │ ├── CreatesApplication.php │ ├── Feature │ │ ├── ApiTest.php │ │ └── ExampleTest.php │ ├── TestCase.php │ └── Unit │ │ └── ExampleTest.php └── webpack.mix.js ├── doc ├── Android版self-hosted的设计和实现.md ├── api │ ├── PushDeerOS.json │ ├── PushDeerOS.md │ └── PushDeerOS.sh ├── design_and_resource │ ├── PushDeerOs.xd │ ├── avatar1.png │ ├── avatar1@2x.png │ ├── avatar2.png │ ├── avatar2@2x.png │ ├── deer.gray.png │ ├── deer.gray@2x.png │ ├── key.png │ ├── key@2x.png │ ├── logo.png │ ├── logo.with.space.png │ ├── logo.with.space@2x.png │ ├── logo@2x.png │ ├── 头像 – 1.png │ ├── 头像 – 1@2x.png │ ├── 头像.png │ ├── 头像@2x.png │ ├── 完整logo.png │ ├── 完整logo@2x.png │ ├── 消息 – 1.png │ ├── 消息 – 1@2x.png │ ├── 消息.png │ ├── 消息@2x.png │ ├── 登入.png │ ├── 登入@2x.png │ ├── 设备.png │ ├── 设备@2x.png │ ├── 设置.png │ └── 设置@2x.png ├── image │ ├── 2022-02-02-21-14-21.png │ ├── 2022-02-02-21-17-45.png │ ├── 2022-02-02-21-18-49.png │ ├── 2022-02-02-21-39-16.png │ ├── 2022-02-02-21-45-29.png │ ├── 2022-03-30-18-14-05.png │ ├── clipcode.png │ └── video.gif ├── 安装文档.md ├── 架构文档.key └── 调试文档.md ├── docker-compose.self-hosted.yml ├── docker-compose.serverless.yml ├── docker-compose.yml ├── docker ├── mqtt │ ├── Dockerfile │ ├── Dockerfile.dev │ ├── RoboFile.php │ ├── api │ │ ├── .gitignore │ │ ├── index.js │ │ ├── package.json │ │ └── yarn.lock │ ├── docker-compose.dev.yml │ ├── docker-compose.yml │ ├── init.sh │ └── mosquitto.conf └── web │ ├── Dockerfile │ ├── Dockerfile.serverless │ ├── application.conf │ ├── gorush │ ├── init.sh │ ├── larave-cron │ ├── ports.conf │ ├── supervisord-clip.conf │ ├── supervisord-ios.conf │ ├── supervisord-redis.conf │ └── vhost.conf ├── examples └── demo.php ├── ios ├── Prototype_version │ ├── Podfile │ ├── Podfile.lock │ ├── Pods │ │ ├── Alamofire │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Source │ │ │ │ ├── AFError.swift │ │ │ │ ├── Alamofire.swift │ │ │ │ ├── AlamofireExtended.swift │ │ │ │ ├── AuthenticationInterceptor.swift │ │ │ │ ├── CachedResponseHandler.swift │ │ │ │ ├── Combine.swift │ │ │ │ ├── DispatchQueue+Alamofire.swift │ │ │ │ ├── EventMonitor.swift │ │ │ │ ├── HTTPHeaders.swift │ │ │ │ ├── HTTPMethod.swift │ │ │ │ ├── MultipartFormData.swift │ │ │ │ ├── MultipartUpload.swift │ │ │ │ ├── NetworkReachabilityManager.swift │ │ │ │ ├── Notifications.swift │ │ │ │ ├── OperationQueue+Alamofire.swift │ │ │ │ ├── ParameterEncoder.swift │ │ │ │ ├── ParameterEncoding.swift │ │ │ │ ├── Protected.swift │ │ │ │ ├── RedirectHandler.swift │ │ │ │ ├── Request.swift │ │ │ │ ├── RequestInterceptor.swift │ │ │ │ ├── RequestTaskMap.swift │ │ │ │ ├── Response.swift │ │ │ │ ├── ResponseSerialization.swift │ │ │ │ ├── Result+Alamofire.swift │ │ │ │ ├── RetryPolicy.swift │ │ │ │ ├── ServerTrustEvaluation.swift │ │ │ │ ├── Session.swift │ │ │ │ ├── SessionDelegate.swift │ │ │ │ ├── StringEncoding+Alamofire.swift │ │ │ │ ├── URLConvertible+URLRequestConvertible.swift │ │ │ │ ├── URLEncodedFormEncoder.swift │ │ │ │ ├── URLRequest+Alamofire.swift │ │ │ │ ├── URLSessionConfiguration+Alamofire.swift │ │ │ │ └── Validation.swift │ │ ├── Manifest.lock │ │ ├── Moya │ │ │ ├── License.md │ │ │ ├── Readme.md │ │ │ └── Sources │ │ │ │ └── Moya │ │ │ │ ├── AnyEncodable.swift │ │ │ │ ├── Atomic.swift │ │ │ │ ├── Cancellable.swift │ │ │ │ ├── Endpoint.swift │ │ │ │ ├── Image.swift │ │ │ │ ├── Moya+Alamofire.swift │ │ │ │ ├── MoyaError.swift │ │ │ │ ├── MoyaProvider+Defaults.swift │ │ │ │ ├── MoyaProvider+Internal.swift │ │ │ │ ├── MoyaProvider.swift │ │ │ │ ├── MultiTarget.swift │ │ │ │ ├── MultipartFormData.swift │ │ │ │ ├── Plugin.swift │ │ │ │ ├── Plugins │ │ │ │ ├── AccessTokenPlugin.swift │ │ │ │ ├── CredentialsPlugin.swift │ │ │ │ ├── NetworkActivityPlugin.swift │ │ │ │ └── NetworkLoggerPlugin.swift │ │ │ │ ├── RequestTypeWrapper.swift │ │ │ │ ├── Response.swift │ │ │ │ ├── TargetType.swift │ │ │ │ ├── Task.swift │ │ │ │ ├── URL+Moya.swift │ │ │ │ ├── URLRequest+Encoding.swift │ │ │ │ └── ValidationType.swift │ │ ├── Pods.xcodeproj │ │ │ ├── project.pbxproj │ │ │ └── xcuserdata │ │ │ │ └── Easy.xcuserdatad │ │ │ │ └── xcschemes │ │ │ │ ├── Alamofire.xcscheme │ │ │ │ ├── Moya.xcscheme │ │ │ │ ├── Pods-PushDeer.xcscheme │ │ │ │ ├── Pods-PushDeerClip.xcscheme │ │ │ │ ├── PromiseKit.xcscheme │ │ │ │ └── xcschememanagement.plist │ │ ├── PromiseKit │ │ │ ├── Extensions │ │ │ │ ├── Foundation │ │ │ │ │ └── Sources │ │ │ │ │ │ ├── NSNotificationCenter+AnyPromise.h │ │ │ │ │ │ ├── NSNotificationCenter+AnyPromise.m │ │ │ │ │ │ ├── NSNotificationCenter+Promise.swift │ │ │ │ │ │ ├── NSObject+Promise.swift │ │ │ │ │ │ ├── NSTask+AnyPromise.h │ │ │ │ │ │ ├── NSTask+AnyPromise.m │ │ │ │ │ │ ├── NSURLSession+AnyPromise.h │ │ │ │ │ │ ├── NSURLSession+AnyPromise.m │ │ │ │ │ │ ├── NSURLSession+Promise.swift │ │ │ │ │ │ ├── PMKFoundation.h │ │ │ │ │ │ ├── Process+Promise.swift │ │ │ │ │ │ └── afterlife.swift │ │ │ │ └── UIKit │ │ │ │ │ └── Sources │ │ │ │ │ ├── PMKUIKit.h │ │ │ │ │ ├── UIView+AnyPromise.h │ │ │ │ │ ├── UIView+AnyPromise.m │ │ │ │ │ ├── UIView+Promise.swift │ │ │ │ │ ├── UIViewController+AnyPromise.h │ │ │ │ │ ├── UIViewController+AnyPromise.m │ │ │ │ │ └── UIViewPropertyAnimator+Promise.swift │ │ │ ├── LICENSE │ │ │ ├── README.md │ │ │ └── Sources │ │ │ │ ├── AnyPromise+Private.h │ │ │ │ ├── AnyPromise.h │ │ │ │ ├── AnyPromise.m │ │ │ │ ├── AnyPromise.swift │ │ │ │ ├── Box.swift │ │ │ │ ├── Catchable.swift │ │ │ │ ├── Configuration.swift │ │ │ │ ├── CustomStringConvertible.swift │ │ │ │ ├── Deprecations.swift │ │ │ │ ├── Error.swift │ │ │ │ ├── Guarantee.swift │ │ │ │ ├── LogEvent.swift │ │ │ │ ├── NSMethodSignatureForBlock.m │ │ │ │ ├── PMKCallVariadicBlock.m │ │ │ │ ├── Promise.swift │ │ │ │ ├── PromiseKit.h │ │ │ │ ├── Resolver.swift │ │ │ │ ├── Thenable.swift │ │ │ │ ├── after.m │ │ │ │ ├── after.swift │ │ │ │ ├── dispatch_promise.m │ │ │ │ ├── firstly.swift │ │ │ │ ├── fwd.h │ │ │ │ ├── hang.m │ │ │ │ ├── hang.swift │ │ │ │ ├── join.m │ │ │ │ ├── race.m │ │ │ │ ├── race.swift │ │ │ │ ├── when.m │ │ │ │ └── when.swift │ │ └── Target Support Files │ │ │ ├── Alamofire │ │ │ ├── Alamofire-Info.plist │ │ │ ├── Alamofire-dummy.m │ │ │ ├── Alamofire-prefix.pch │ │ │ ├── Alamofire-umbrella.h │ │ │ ├── Alamofire.debug.xcconfig │ │ │ ├── Alamofire.modulemap │ │ │ └── Alamofire.release.xcconfig │ │ │ ├── Moya │ │ │ ├── Moya-Info.plist │ │ │ ├── Moya-dummy.m │ │ │ ├── Moya-prefix.pch │ │ │ ├── Moya-umbrella.h │ │ │ ├── Moya.debug.xcconfig │ │ │ ├── Moya.modulemap │ │ │ └── Moya.release.xcconfig │ │ │ ├── Pods-PushDeer │ │ │ ├── Pods-PushDeer-Info.plist │ │ │ ├── Pods-PushDeer-acknowledgements.markdown │ │ │ ├── Pods-PushDeer-acknowledgements.plist │ │ │ ├── Pods-PushDeer-dummy.m │ │ │ ├── Pods-PushDeer-frameworks-Debug-input-files.xcfilelist │ │ │ ├── Pods-PushDeer-frameworks-Debug-output-files.xcfilelist │ │ │ ├── Pods-PushDeer-frameworks-Release-input-files.xcfilelist │ │ │ ├── Pods-PushDeer-frameworks-Release-output-files.xcfilelist │ │ │ ├── Pods-PushDeer-frameworks.sh │ │ │ ├── Pods-PushDeer-umbrella.h │ │ │ ├── Pods-PushDeer.debug.xcconfig │ │ │ ├── Pods-PushDeer.modulemap │ │ │ └── Pods-PushDeer.release.xcconfig │ │ │ ├── Pods-PushDeerClip │ │ │ ├── Pods-PushDeerClip-Info.plist │ │ │ ├── Pods-PushDeerClip-acknowledgements.markdown │ │ │ ├── Pods-PushDeerClip-acknowledgements.plist │ │ │ ├── Pods-PushDeerClip-dummy.m │ │ │ ├── Pods-PushDeerClip-frameworks-Debug-input-files.xcfilelist │ │ │ ├── Pods-PushDeerClip-frameworks-Debug-output-files.xcfilelist │ │ │ ├── Pods-PushDeerClip-frameworks-Release-input-files.xcfilelist │ │ │ ├── Pods-PushDeerClip-frameworks-Release-output-files.xcfilelist │ │ │ ├── Pods-PushDeerClip-frameworks.sh │ │ │ ├── Pods-PushDeerClip-umbrella.h │ │ │ ├── Pods-PushDeerClip.debug.xcconfig │ │ │ ├── Pods-PushDeerClip.modulemap │ │ │ └── Pods-PushDeerClip.release.xcconfig │ │ │ └── PromiseKit │ │ │ ├── PromiseKit-Info.plist │ │ │ ├── PromiseKit-dummy.m │ │ │ ├── PromiseKit-prefix.pch │ │ │ ├── PromiseKit-umbrella.h │ │ │ ├── PromiseKit.debug.xcconfig │ │ │ ├── PromiseKit.modulemap │ │ │ └── PromiseKit.release.xcconfig │ ├── PushDeer.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ ├── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcuserdata │ │ │ │ └── Easy.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── PushDeerClip.xcscheme │ │ └── xcuserdata │ │ │ └── Easy.xcuserdatad │ │ │ └── xcschemes │ │ │ └── xcschememanagement.plist │ ├── PushDeer.xcworkspace │ │ ├── contents.xcworkspacedata │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcuserdata │ │ │ └── Easy.xcuserdatad │ │ │ ├── UserInterfaceState.xcuserstate │ │ │ └── xcdebugger │ │ │ └── Breakpoints_v2.xcbkptlist │ ├── PushDeer │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── 100.png │ │ │ │ ├── 1024.png │ │ │ │ ├── 114.png │ │ │ │ ├── 120.png │ │ │ │ ├── 128.png │ │ │ │ ├── 144.png │ │ │ │ ├── 152.png │ │ │ │ ├── 16.png │ │ │ │ ├── 167.png │ │ │ │ ├── 172.png │ │ │ │ ├── 180.png │ │ │ │ ├── 196.png │ │ │ │ ├── 20.png │ │ │ │ ├── 216.png │ │ │ │ ├── 256.png │ │ │ │ ├── 29.png │ │ │ │ ├── 32.png │ │ │ │ ├── 40.png │ │ │ │ ├── 48.png │ │ │ │ ├── 50.png │ │ │ │ ├── 512.png │ │ │ │ ├── 55.png │ │ │ │ ├── 57.png │ │ │ │ ├── 58.png │ │ │ │ ├── 60.png │ │ │ │ ├── 64.png │ │ │ │ ├── 72.png │ │ │ │ ├── 76.png │ │ │ │ ├── 80.png │ │ │ │ ├── 87.png │ │ │ │ ├── 88.png │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── logo.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── logo.png │ │ │ │ ├── logo@2x.png │ │ │ │ └── logo@3x.png │ │ ├── Info.plist │ │ ├── Model │ │ │ └── Result.swift │ │ ├── Preview Content │ │ │ └── Preview Assets.xcassets │ │ │ │ └── Contents.json │ │ ├── PushDeer.entitlements │ │ ├── PushDeerApp.swift │ │ ├── PushDeerDebug.entitlements │ │ ├── Service │ │ │ ├── Api.swift │ │ │ └── Call.swift │ │ ├── Store │ │ │ └── AppState.swift │ │ └── View │ │ │ ├── ChannelView.swift │ │ │ ├── ContentView.swift │ │ │ ├── DeviceView.swift │ │ │ ├── KeyView.swift │ │ │ ├── LoginView.swift │ │ │ ├── LoginedView.swift │ │ │ ├── MainView.swift │ │ │ ├── MessageView.swift │ │ │ └── SettingsView.swift │ ├── PushDeerClip │ │ ├── Assets.xcassets │ │ │ ├── AccentColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── 100.png │ │ │ │ ├── 1024.png │ │ │ │ ├── 114.png │ │ │ │ ├── 120.png │ │ │ │ ├── 128.png │ │ │ │ ├── 144.png │ │ │ │ ├── 152.png │ │ │ │ ├── 16.png │ │ │ │ ├── 167.png │ │ │ │ ├── 172.png │ │ │ │ ├── 180.png │ │ │ │ ├── 196.png │ │ │ │ ├── 20.png │ │ │ │ ├── 216.png │ │ │ │ ├── 256.png │ │ │ │ ├── 29.png │ │ │ │ ├── 32.png │ │ │ │ ├── 40.png │ │ │ │ ├── 48.png │ │ │ │ ├── 50.png │ │ │ │ ├── 512.png │ │ │ │ ├── 55.png │ │ │ │ ├── 57.png │ │ │ │ ├── 58.png │ │ │ │ ├── 60.png │ │ │ │ ├── 64.png │ │ │ │ ├── 72.png │ │ │ │ ├── 76.png │ │ │ │ ├── 80.png │ │ │ │ ├── 87.png │ │ │ │ ├── 88.png │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── logo.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── logo.png │ │ │ │ ├── logo@2x.png │ │ │ │ └── logo@3x.png │ │ ├── ContentView.swift │ │ ├── Info.plist │ │ ├── Preview Content │ │ │ └── Preview Assets.xcassets │ │ │ │ └── Contents.json │ │ ├── PushDeerClip.entitlements │ │ ├── PushDeerClipApp.swift │ │ └── PushDeerClipDebug.entitlements │ └── apple-app-site-association └── PushDeer-iOS │ ├── .gitignore │ ├── LICENSE │ ├── Notification │ ├── Info.plist │ ├── Notification.entitlements │ └── NotificationService.swift │ ├── Podfile │ ├── Podfile.lock │ ├── PushDeer.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ ├── PushDeer-SelfHosted.xcscheme │ │ ├── PushDeer.xcscheme │ │ ├── PushDeerClip-SelfHosted.xcscheme │ │ └── PushDeerClip.xcscheme │ ├── PushDeer.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ ├── WorkspaceSettings.xcsettings │ │ └── swiftpm │ │ └── Package.resolved │ ├── PushDeer │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon-SH.appiconset │ │ │ ├── 100.png │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 144.png │ │ │ ├── 152.png │ │ │ ├── 167.png │ │ │ ├── 180.png │ │ │ ├── 20.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 50.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 72.png │ │ │ ├── 76.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── icon-1024.png │ │ │ ├── icon-20-ipad.png │ │ │ ├── icon-20@2x-ipad.png │ │ │ ├── icon-20@2x.png │ │ │ ├── icon-20@3x.png │ │ │ ├── icon-29-ipad.png │ │ │ ├── icon-29.png │ │ │ ├── icon-29@2x-ipad.png │ │ │ ├── icon-29@2x.png │ │ │ ├── icon-29@3x.png │ │ │ ├── icon-40.png │ │ │ ├── icon-40@2x.png │ │ │ ├── icon-40@3x.png │ │ │ ├── icon-60@2x.png │ │ │ ├── icon-60@3x.png │ │ │ ├── icon-76.png │ │ │ ├── icon-76@2x.png │ │ │ └── icon-83.5@2x.png │ │ ├── Colors │ │ │ ├── BtnBgColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── background2Color.colorset │ │ │ │ └── Contents.json │ │ │ ├── backgroundColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── borderColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── text2Color.colorset │ │ │ │ └── Contents.json │ │ │ ├── textColor.colorset │ │ │ │ └── Contents.json │ │ │ ├── weixinBgColor.colorset │ │ │ │ └── Contents.json │ │ │ └── weixinFgColor.colorset │ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── Images │ │ │ ├── Contents.json │ │ │ ├── avatar1.imageset │ │ │ ├── Contents.json │ │ │ ├── avatar1.png │ │ │ └── avatar1@2x.png │ │ │ ├── avatar2.imageset │ │ │ ├── Contents.json │ │ │ ├── avatar2.png │ │ │ └── avatar2@2x.png │ │ │ ├── deer.gray.imageset │ │ │ ├── Contents.json │ │ │ ├── deer.gray.png │ │ │ └── deer.gray@2x.png │ │ │ ├── logo-SH.imageset │ │ │ ├── Contents.json │ │ │ └── logo2.png │ │ │ ├── logo.imageset │ │ │ ├── Contents.json │ │ │ ├── logo.png │ │ │ └── logo@2x.png │ │ │ ├── logo.with.space.imageset │ │ │ ├── Contents.json │ │ │ ├── logo.with.space.png │ │ │ └── logo.with.space@2x.png │ │ │ └── weixin-login.imageset │ │ │ ├── Contents.json │ │ │ └── 微信LOGO_轮廓.png │ ├── Common │ │ ├── AppleSignInButton.swift │ │ ├── HToast.swift │ │ ├── ListTest.swift │ │ ├── SafariView.swift │ │ └── ViewExtension.swift │ ├── ContentView.swift │ ├── Env.swift │ ├── Info-SelfHosted.plist │ ├── Info.plist │ ├── Model │ │ ├── MessageModel.swift │ │ ├── PushDeerData.xcdatamodeld │ │ │ └── PushDeerData.xcdatamodel │ │ │ │ └── contents │ │ └── Result.swift │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ ├── PushDeer-Bridging-Header.h │ ├── PushDeer-SelfHosted.entitlements │ ├── PushDeer.entitlements │ ├── PushDeerApp.swift │ ├── Service │ │ ├── AppState.swift │ │ ├── HttpRequest.swift │ │ ├── Persistence.swift │ │ ├── PushDeerApi.swift │ │ └── WXDelegate.swift │ ├── Tool │ │ └── CommonUtils.swift │ ├── View │ │ ├── Common │ │ │ ├── BaseNavigationView.swift │ │ │ ├── CardView.swift │ │ │ ├── DeletableView.swift │ │ │ ├── EditableText.swift │ │ │ └── Line.swift │ │ ├── DeviceItemView.swift │ │ ├── DeviceListView.swift │ │ ├── EndpointView.swift │ │ ├── KeyItemView.swift │ │ ├── KeyListView.swift │ │ ├── LoginView.swift │ │ ├── MainView.swift │ │ ├── MessageItemView.swift │ │ ├── MessageListView.swift │ │ ├── SettingsItemView.swift │ │ └── SettingsView.swift │ ├── en.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ └── zh-Hans.lproj │ │ ├── InfoPlist.strings │ │ └── Localizable.strings │ ├── PushDeerClip │ ├── Info-SelfHosted.plist │ ├── Info.plist │ ├── Preview Content │ │ └── Preview Assets.xcassets │ │ │ └── Contents.json │ ├── PushDeerClip-SelfHosted.entitlements │ ├── PushDeerClip.entitlements │ ├── en.lproj │ │ └── InfoPlist.strings │ └── zh-Hans.lproj │ │ └── InfoPlist.strings │ ├── PushDeerWidget │ ├── Assets.xcassets │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Images │ │ │ ├── Contents.json │ │ │ └── deer.gray.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── deer.gray.png │ │ │ │ └── deer.gray@2x.png │ │ └── WidgetBackground.colorset │ │ │ └── Contents.json │ ├── Info.plist │ ├── PushDeerWidget.intentdefinition │ ├── PushDeerWidget.swift │ ├── PushDeerWidgetExtension-SelfHosted.entitlements │ └── PushDeerWidgetExtension.entitlements │ ├── README.md │ └── remove_unsupported_libraries.rb ├── iot ├── README.md ├── deeresp │ ├── RoboFile.php │ ├── cubic_12.h │ ├── data │ │ ├── deer.jpg │ │ └── wifi.jpg │ ├── deeresp.ino │ ├── font.hex.txt │ ├── font.txt │ └── lazyboard.cube.css ├── deeresp32 │ ├── .gitignore │ ├── RoboFile.php │ ├── User_Setup.st7735.32.h │ ├── cubic_12.gb2312.h │ ├── cubic_12.h │ ├── data │ │ ├── Cubic1112.vlw │ │ ├── deer.jpg │ │ └── wifi.jpg │ ├── deeresp32.ino │ ├── des82系列用固件.zip │ ├── font.2000.txt │ ├── font.hex.gb2312.txt │ ├── font.hex.txt │ ├── font.txt │ └── lazyboard.cube.css ├── deeresp_test │ ├── data │ │ └── cover.jpeg │ └── deeresp_test.ino ├── image │ ├── 2022-02-16-21-48-45.png │ ├── 2022-02-16-21-59-51.png │ ├── 2022-02-16-22-01-05.png │ ├── 2022-02-16-22-02-36.png │ ├── 2022-02-16-22-04-25.png │ ├── 2022-02-16-22-07-07.png │ ├── 2022-02-16-23-32-30.png │ ├── 2022-02-16-23-35-41.png │ ├── 2022-02-16-23-38-05.png │ ├── 2022-02-16-23-42-25.png │ ├── 2022-02-16-23-44-07.png │ ├── 2022-02-17-00-00-43.png │ ├── 2022-02-17-00-43-58.png │ ├── 2022-02-18-19-18-55.png │ ├── 2022-03-24-22-40-14.png │ ├── 2022-03-24-22-41-19.png │ ├── 2022-03-24-22-44-00.png │ ├── 2022-03-26-17-38-02.png │ ├── 20220422002608.png │ ├── 20220422003820.png │ ├── 20220422004159.png │ ├── 20220422005232.png │ ├── 20220422005313.png │ ├── 20220422005744.png │ ├── 20220422010516.png │ ├── 20220422011115.png │ ├── 20220422014021.png │ └── deeresp.gif ├── screen │ └── screen.ino └── upload.sh ├── plugins └── wordpress │ ├── pushdeer_wordpress_comment_notice.zip │ └── pushdeer_wordpress_comment_notice │ ├── index.php │ └── pushdeer.php ├── push ├── .DS_Store ├── LICENSE ├── c.p12 ├── cc.p12 ├── clip.yml ├── clip.yml.sample ├── gorush-with-mipush │ ├── RoboFile.php │ ├── bin │ │ ├── .gitignore │ │ └── gorush │ └── src │ │ ├── .deepsource.toml │ │ ├── .dockerignore │ │ ├── .drone.jsonnet │ │ ├── .drone.yml │ │ ├── .editorconfig │ │ ├── .github │ │ └── FUNDING.yml │ │ ├── .idea │ │ ├── .gitignore │ │ ├── gorush.iml │ │ ├── modules.xml │ │ └── vcs.xml │ │ ├── .revive.toml │ │ ├── HomebrewFormula │ │ └── gorush.rb │ │ ├── LICENSE │ │ ├── Makefile │ │ ├── Procfile │ │ ├── README.md │ │ ├── certificate │ │ ├── authkey-invalid.p8 │ │ ├── authkey-valid.p8 │ │ ├── certificate-valid.p12 │ │ ├── certificate-valid.pem │ │ ├── localhost.cert │ │ └── localhost.key │ │ ├── config │ │ ├── config.go │ │ ├── config_test.go │ │ └── testdata │ │ │ ├── .gitignore │ │ │ ├── config.yml │ │ │ └── empty.yml │ │ ├── contrib │ │ └── init │ │ │ └── debian │ │ │ ├── README.md │ │ │ └── gorush │ │ ├── core │ │ ├── core.go │ │ └── queue.go │ │ ├── doc.go │ │ ├── docker-compose.yml │ │ ├── docker │ │ ├── Dockerfile.linux.amd64 │ │ ├── Dockerfile.linux.arm │ │ ├── Dockerfile.linux.arm64 │ │ ├── Dockerfile.windows.amd64 │ │ └── manifest.tmpl │ │ ├── go.mod │ │ ├── go.sum │ │ ├── helm │ │ └── gorush │ │ │ ├── .helmignore │ │ │ ├── Chart.yaml │ │ │ ├── templates │ │ │ ├── NOTES.txt │ │ │ ├── _helpers.tpl │ │ │ ├── configmap.yml │ │ │ ├── deployment.yaml │ │ │ ├── hpa.yaml │ │ │ ├── ingress.yaml │ │ │ ├── service.yaml │ │ │ └── serviceaccount.yaml │ │ │ └── values.yaml │ │ ├── k8s │ │ ├── gorush-aws-alb-ingress.yaml │ │ ├── gorush-configmap.yaml │ │ ├── gorush-deployment.yaml │ │ ├── gorush-namespace.yaml │ │ ├── gorush-redis-deployment.yaml │ │ ├── gorush-redis-service.yaml │ │ └── gorush-service.yaml │ │ ├── logx │ │ ├── log.go │ │ ├── log │ │ │ ├── .gitkeep │ │ │ └── access.log │ │ ├── log_interface.go │ │ └── log_test.go │ │ ├── main.go │ │ ├── metric │ │ ├── metrics.go │ │ └── metrics_test.go │ │ ├── netlify.toml │ │ ├── notify │ │ ├── feedback.go │ │ ├── feedback_test.go │ │ ├── global.go │ │ ├── main_test.go │ │ ├── notification.go │ │ ├── notification_apns.go │ │ ├── notification_apns_test.go │ │ ├── notification_fcm.go │ │ ├── notification_fcm_test.go │ │ ├── notification_hms.go │ │ ├── notification_hms_test.go │ │ ├── notification_mipush.go │ │ ├── notification_mipush_test.go │ │ └── notification_test.go │ │ ├── pipeline.libsonnet │ │ ├── router │ │ ├── server.go │ │ ├── server_lambda.go │ │ ├── server_normal.go │ │ ├── server_test.go │ │ └── version.go │ │ ├── rpc │ │ ├── client_grpc_health.go │ │ ├── client_test.go │ │ ├── example │ │ │ ├── go │ │ │ │ ├── health │ │ │ │ │ └── main.go │ │ │ │ └── send │ │ │ │ │ └── main.go │ │ │ └── node │ │ │ │ ├── .gitignore │ │ │ │ ├── README.md │ │ │ │ ├── client.js │ │ │ │ ├── gorush_grpc_pb.js │ │ │ │ ├── gorush_pb.js │ │ │ │ ├── package-lock.json │ │ │ │ └── package.json │ │ ├── health.go │ │ ├── proto │ │ │ ├── gorush.pb.go │ │ │ ├── gorush.proto │ │ │ └── gorush_grpc.pb.go │ │ ├── server.go │ │ └── server_test.go │ │ ├── screenshot │ │ ├── lambda.png │ │ ├── memory.png │ │ ├── metrics.png │ │ └── status.png │ │ ├── snapcraft.yaml │ │ ├── status │ │ ├── status.go │ │ └── status_test.go │ │ ├── storage │ │ ├── badger │ │ │ ├── badger.go │ │ │ └── badger_test.go │ │ ├── boltdb │ │ │ ├── boltdb.go │ │ │ └── boltdb_test.go │ │ ├── buntdb │ │ │ ├── buntdb.go │ │ │ └── buntdb_test.go │ │ ├── leveldb │ │ │ ├── leveldb.go │ │ │ └── leveldb_test.go │ │ ├── memory │ │ │ ├── memory.go │ │ │ └── memory_test.go │ │ ├── redis │ │ │ ├── redis.go │ │ │ └── redis_test.go │ │ └── storage.go │ │ └── tests │ │ ├── README.md │ │ └── test.json ├── ios.yml └── ios.yml.smaple ├── quickapp ├── .gitignore ├── .npmrc ├── .prettierignore ├── README.md ├── package-lock.json ├── package.json ├── pushdeer素材.xd ├── scripts │ ├── gen │ │ ├── index.js │ │ └── template.ux │ └── selfCloseInputTag.js ├── src │ ├── app.ux │ ├── assets │ │ ├── images │ │ │ ├── arrow-down.png │ │ │ ├── arrow-up.png │ │ │ ├── avatar.png │ │ │ ├── avatar.svg │ │ │ ├── calander.svg │ │ │ ├── calendar.png │ │ │ ├── device-ipad.png │ │ │ ├── device-ipad.svg │ │ │ ├── device-iphone.png │ │ │ ├── device-iphone.svg │ │ │ ├── divider.png │ │ │ ├── divider.svg │ │ │ ├── home-background.png │ │ │ ├── home-background.svg │ │ │ ├── index-logo.png │ │ │ ├── index-logo.svg │ │ │ ├── logo.png │ │ │ ├── logo.svg │ │ │ ├── plus.png │ │ │ ├── plus.svg │ │ │ ├── tabbar-device-active.png │ │ │ ├── tabbar-device-active.svg │ │ │ ├── tabbar-device.png │ │ │ ├── tabbar-device.svg │ │ │ ├── tabbar-key-active.png │ │ │ ├── tabbar-key-active.svg │ │ │ ├── tabbar-key.png │ │ │ ├── tabbar-key.svg │ │ │ ├── tabbar-message-active.png │ │ │ ├── tabbar-message-active.svg │ │ │ ├── tabbar-message.png │ │ │ ├── tabbar-message.svg │ │ │ ├── tabbar-settings-active.png │ │ │ ├── tabbar-settings-active.svg │ │ │ ├── tabbar-settings.png │ │ │ ├── tabbar-settings.svg │ │ │ └── trash.png │ │ └── styles │ │ │ ├── mixins.less │ │ │ ├── style.less │ │ │ └── variables.less │ ├── helper │ │ ├── ajax.js │ │ ├── apis.js │ │ └── utils.js │ ├── manifest.json │ ├── pages │ │ ├── Home │ │ │ ├── index.ux │ │ │ └── tabbar.ux │ │ ├── component │ │ │ ├── Device │ │ │ │ ├── card.ux │ │ │ │ └── index.ux │ │ │ ├── Key │ │ │ │ ├── card.ux │ │ │ │ └── index.ux │ │ │ ├── Message │ │ │ │ ├── index.ux │ │ │ │ ├── msg-card.ux │ │ │ │ └── msg-header.ux │ │ │ ├── Settings │ │ │ │ ├── card.ux │ │ │ │ └── index.ux │ │ │ ├── devpage.ux │ │ │ └── swipeItem.ux │ │ ├── index.ux │ │ └── swipe │ │ │ └── index.ux │ └── sitemap.json └── yarn.lock └── self-hosted-push-server ├── .gitignore ├── config.js ├── index.js ├── package-lock.json ├── package.json └── public ├── css ├── app.64cb6d3f.css └── chunk-vendors.9f55d012.css ├── favicon.png ├── img ├── logo-dark.3727fec5.svg └── logo-light.73342c25.svg ├── index.html └── js ├── app.97c623ae.js ├── app.97c623ae.js.map ├── chunk-vendors.5dbfac0a.js └── chunk-vendors.5dbfac0a.js.map /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [easychen] 4 | 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | android/app_self* 4 | android/pushdeerclient 5 | android/app/java/com/pushdeer/os/values/App* 6 | android/app/build 7 | android/app/debug 8 | android/app/release 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 本项目禁止商用(包括但不限于搭建后挂广告或售卖会员、打包后上架商店销售等),对非商业用途采用 GPLV2 授权 -------------------------------------------------------------------------------- /android/app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /src/main/java/com/pushdeer/os/values/AppKeys.kt 3 | -------------------------------------------------------------------------------- /android/app/debug/PushDeer-v1.0-dev-8.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/debug/PushDeer-v1.0-dev-8.apk -------------------------------------------------------------------------------- /android/app/debug/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "com.pushdeer.os", 8 | "variantName": "debug", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 8, 15 | "versionName": "1.0-dev-8", 16 | "outputFile": "app-debug.apk" 17 | } 18 | ], 19 | "elementType": "File" 20 | } -------------------------------------------------------------------------------- /android/app/libs/MiPush_SDK_Client_5_0_5-C_3rd.aar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/libs/MiPush_SDK_Client_5_0_5-C_3rd.aar -------------------------------------------------------------------------------- /android/app/release/output-metadata.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "artifactType": { 4 | "type": "APK", 5 | "kind": "Directory" 6 | }, 7 | "applicationId": "com.pushdeer.os", 8 | "variantName": "release", 9 | "elements": [ 10 | { 11 | "type": "SINGLE", 12 | "filters": [], 13 | "attributes": [], 14 | "versionCode": 15, 15 | "versionName": "1.0-alpha-5", 16 | "outputFile": "app-release.apk" 17 | } 18 | ], 19 | "elementType": "File" 20 | } -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/AppKeys.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.values 2 | 3 | object AppKeys { 4 | 5 | const val MiPush_Id = "2882303761520124028" 6 | const val MiPush_Key = "5512012428028" 7 | 8 | const val WX_Id = "wx3ae07931d0555a24" 9 | } 10 | -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/data/api/data/response/DeviceInfo.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.data.api.data.response 2 | 3 | import com.pushdeer.os.data.api.data.request.DeviceInfo 4 | 5 | 6 | class DeviceInfoList{ 7 | var devices:List = emptyList() 8 | 9 | override fun toString(): String { 10 | return "devices:$devices" 11 | } 12 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/data/api/data/response/PushKey.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.data.api.data.response 2 | 3 | class PushKey { 4 | var id:String = "" 5 | var key: String = "" 6 | var name: String = "" 7 | var created_at = "" 8 | 9 | override fun toString(): String { 10 | return "id:$id key:$key name:$name created_at:$created_at" 11 | } 12 | } 13 | 14 | class PushKeyList { 15 | var keys: List = emptyList() 16 | 17 | override fun toString(): String { 18 | return "keys:$keys" 19 | } 20 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/data/api/data/response/ReturnData.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.data.api.data.response 2 | 3 | class ReturnData { 4 | var code: Int = 0 5 | var content: T?=null 6 | var error:String = "" 7 | 8 | override fun toString(): String { 9 | return "code:${code} error:${error} content:${content.toString()}" 10 | } 11 | } 12 | 13 | class TokenOnly{ 14 | var token:String = "" 15 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/data/database/dao/LogDogDao.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.data.database.dao 2 | 3 | import androidx.room.Dao 4 | import androidx.room.Insert 5 | import androidx.room.Query 6 | import com.pushdeer.os.data.database.entity.LogDog 7 | import kotlinx.coroutines.flow.Flow 8 | 9 | @Dao 10 | interface LogDogDao { 11 | 12 | @get:Query("select * from LogDog Order by id desc") 13 | val all:Flow> 14 | 15 | @Insert 16 | suspend fun insert(vararg logDog: LogDog) 17 | 18 | @Insert 19 | fun insert1(vararg logDog: LogDog) 20 | 21 | @Query("delete from LogDog") 22 | suspend fun clear() 23 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/data/repository/MiPushRepository.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.data.repository 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | 5 | class MiPushRepository { 6 | val regId = MutableLiveData("") 7 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/keeper/RepositoryKeeper.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.keeper 2 | 3 | import com.pushdeer.os.data.database.AppDatabase 4 | import com.pushdeer.os.data.repository.LogDogRepository 5 | import com.pushdeer.os.data.repository.MessageRepository 6 | import com.pushdeer.os.data.repository.MiPushRepository 7 | import com.pushdeer.os.store.SettingStore 8 | 9 | class RepositoryKeeper(database: AppDatabase,settingStore: SettingStore) { 10 | val miPushRepository = MiPushRepository() 11 | val logDogRepository = LogDogRepository(database.logDogDao(),settingStore) 12 | val messageRepository = MessageRepository(database.messageDao()) 13 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/keeper/StoreKeeper.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.keeper 2 | 3 | import android.content.Context 4 | import com.pushdeer.os.store.SettingStore 5 | 6 | class StoreKeeper(context: Context) { 7 | val settingStore = SettingStore(context) 8 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/ui/theme/Color.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.ui.theme 2 | 3 | import androidx.compose.ui.graphics.Color 4 | 5 | val Purple200 = Color(0xFFBB86FC) 6 | val Purple500 = Color(0xFF6200EE) 7 | val Purple700 = Color(0xFF3700B3) 8 | val Teal200 = Color(0xFF03DAC5) 9 | 10 | val MainBlue = Color(0xFF3B4789) 11 | val MainGreen = Color(0xFF296C05) 12 | val MainBottomBtn = Color(0xFF8E8E8E) 13 | val SwipeToDismissRed = Color(0x92FFF2F2) 14 | val SwipeToDismissGray = Color(0x92B6B6B6) -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/ui/theme/Shape.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.ui.theme 2 | 3 | import androidx.compose.foundation.shape.RoundedCornerShape 4 | import androidx.compose.material.Shapes 5 | import androidx.compose.ui.unit.dp 6 | 7 | val Shapes = Shapes( 8 | small = RoundedCornerShape(4.dp), 9 | medium = RoundedCornerShape(4.dp), 10 | large = RoundedCornerShape(0.dp) 11 | ) -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/values/ConstValues.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.values 2 | 3 | import androidx.compose.foundation.layout.PaddingValues 4 | import androidx.compose.foundation.shape.RoundedCornerShape 5 | import androidx.compose.ui.unit.dp 6 | 7 | object ConstValues { 8 | val MainPageSidePadding = 37.dp 9 | val MainPageSidePaddings = PaddingValues(horizontal = 37.dp) 10 | 11 | val bigRoundCorner = RoundedCornerShape(8.dp) 12 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/viewmodel/LogDogViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.viewmodel 2 | 3 | import androidx.lifecycle.ViewModel 4 | import androidx.lifecycle.viewModelScope 5 | import com.pushdeer.os.data.repository.LogDogRepository 6 | import kotlinx.coroutines.launch 7 | 8 | class LogDogViewModel(private val logDogRepository: LogDogRepository): ViewModel() { 9 | val all = logDogRepository.all 10 | 11 | // suspend fun clear(){ 12 | // logDogRepository.clear() 13 | // } 14 | 15 | fun clear(){ 16 | viewModelScope.launch { 17 | logDogRepository.clear() 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /android/app/src/main/java/com/pushdeer/os/viewmodel/UiViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os.viewmodel 2 | 3 | import androidx.compose.runtime.getValue 4 | import androidx.compose.runtime.mutableStateOf 5 | import androidx.compose.runtime.setValue 6 | import androidx.lifecycle.ViewModel 7 | import com.pushdeer.os.store.SettingStore 8 | 9 | class UiViewModel(private val settingStore: SettingStore): ViewModel() { 10 | var showMessageSender by mutableStateOf(settingStore.showMessageSender) 11 | } -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/gearshape2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/gearshape2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_baseline_arrow_back_24.xml: -------------------------------------------------------------------------------- 1 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_baseline_close_24.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ic_okok2.xml: -------------------------------------------------------------------------------- 1 | 6 | 9 | 10 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ipad_and_iphon2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/ipad_and_iphon2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/ipad_landscape2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/ipad_landscape2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/iphone2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/iphone2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/key2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/key2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/logo_com_x2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/logo_com_x2.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/logo_half.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/logo_half.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/message2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/drawable/message2x.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-zh-rCN/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | PushDeer 4 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | 11 | #3B4789 12 | #296C05 13 | #8E8E8E 14 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /android/app/src/test/java/com/pushdeer/os/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.os 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | ext { 4 | compose_version = '1.0.5' 5 | } 6 | repositories { 7 | google() 8 | mavenCentral() 9 | maven { url 'https://jitpack.io' } 10 | } 11 | dependencies { 12 | classpath "com.android.tools.build:gradle:7.0.4" 13 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31" 14 | } 15 | } 16 | 17 | task clean(type: Delete) { 18 | delete rootProject.buildDir 19 | } -------------------------------------------------------------------------------- /android/common/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android/common/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/common/consumer-rules.pro -------------------------------------------------------------------------------- /android/common/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/activity/ABaseActivity.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.activity 2 | 3 | import androidx.activity.ComponentActivity 4 | 5 | abstract class ABaseActivity : ComponentActivity() { 6 | 7 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/data/app/AppInfo.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.data.app 2 | 3 | import android.graphics.drawable.Drawable 4 | 5 | data class AppInfo( 6 | val packageName: String, 7 | val icon: Drawable, 8 | val label: String, 9 | // val installTime:Long, 10 | // val updateTime:Long 11 | ) { 12 | var selected: Boolean = false 13 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/store/AStoreFactory.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.store 2 | 3 | abstract class AStoreFactory { 4 | abstract fun create(modeClass: Class): T 5 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/store/IStore.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.store 2 | 3 | interface IStore { 4 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/toy/portainer/data/AdminPassword.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.toy.portainer.data 2 | 3 | import com.alibaba.fastjson.JSONObject 4 | import com.wh.common.type.Json 5 | 6 | 7 | class AdminPassword { 8 | var username: String? = null 9 | var password: String? = null 10 | 11 | fun toJson(): Json { 12 | return Json(JSONObject.toJSONString(this)) 13 | } 14 | 15 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/toy/portainer/data/HostConfig.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 json.cn 3 | */ 4 | package com.wh.common.toy.portainer.data; 5 | 6 | /** 7 | * Auto-generated: 2021-12-07 13:3:57 8 | * 9 | * @author json.cn (i@json.cn) 10 | * @website http://www.json.cn/java2pojo/ 11 | */ 12 | public class HostConfig { 13 | 14 | private String NetworkMode; 15 | public void setNetworkMode(String NetworkMode) { 16 | this.NetworkMode = NetworkMode; 17 | } 18 | public String getNetworkMode() { 19 | return NetworkMode; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/toy/portainer/data/NetworkSettings.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 json.cn 3 | */ 4 | package com.wh.common.toy.portainer.data; 5 | 6 | /** 7 | * Auto-generated: 2021-12-07 13:3:57 8 | * 9 | * @author json.cn (i@json.cn) 10 | * @website http://www.json.cn/java2pojo/ 11 | */ 12 | public class NetworkSettings { 13 | 14 | private Networks Networks; 15 | public void setNetworks(Networks Networks) { 16 | this.Networks = Networks; 17 | } 18 | public Networks getNetworks() { 19 | return Networks; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/toy/portainer/data/Networks.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2021 json.cn 3 | */ 4 | package com.wh.common.toy.portainer.data; 5 | 6 | /** 7 | * Auto-generated: 2021-12-07 13:3:57 8 | * 9 | * @author json.cn (i@json.cn) 10 | * @website http://www.json.cn/java2pojo/ 11 | */ 12 | public class Networks { 13 | 14 | private Bridge bridge; 15 | public void setBridge(Bridge bridge) { 16 | this.bridge = bridge; 17 | } 18 | public Bridge getBridge() { 19 | return bridge; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/toy/qweather/store/QWeatherStore.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.toy.qweather.store 2 | 3 | import android.content.Context 4 | import com.wh.common.store.IStore 5 | import com.wh.common.store.Store 6 | import com.wh.common.store.asStoreProvider 7 | 8 | class QWeatherStore(context: Context): IStore { 9 | private val store = Store( 10 | context.getSharedPreferences( 11 | "q-weather", 12 | Context.MODE_PRIVATE 13 | ).asStoreProvider() 14 | ) 15 | 16 | companion object{ 17 | const val KEY_SERVICE_KEY = "service-key" 18 | } 19 | 20 | var serviceKey by store.string(KEY_SERVICE_KEY,"") 21 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/Drawable.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | import android.graphics.drawable.AdaptiveIconDrawable 4 | import android.graphics.drawable.Drawable 5 | import android.os.Build 6 | 7 | fun Drawable.foreground():Drawable{ 8 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && 9 | this is AdaptiveIconDrawable && this.background == null 10 | ) { 11 | return this.foreground 12 | } 13 | return this 14 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/Float.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | fun Float.toDot2NumStr(): String { 4 | return String.format("%.2f",this) 5 | } 6 | 7 | fun Float.toDot2NumMoneyStr(): String { 8 | return String.format("¥%.2f",this) 9 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/Int.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | fun Int.daysToInterval(): Long { 4 | return (this-1) * 86_400_000L 5 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/Long.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | import com.wh.common.util.TimeUtils 4 | import kotlin.math.absoluteValue 5 | 6 | fun Long.toTimestamp(spf: String = "yyyy-MM-dd HH:mm:ss"): String { 7 | return TimeUtils.getFormattedTime(this, spf) 8 | } 9 | 10 | fun Long.timestampMSToDayLevel(): Long { 11 | return this / 86_400_000 12 | } 13 | 14 | fun Long.daysBetween(otherTime: Long): Int { 15 | return (this.timestampMSToDayLevel() - otherTime.timestampMSToDayLevel()).absoluteValue.toInt() + 1 16 | } 17 | 18 | fun Long.daysBetween(): Int { 19 | return (this.absoluteValue / 86_400_000).toInt() + 1 20 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/MutableList.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | fun MutableList.addOrRemove(t: T): MutableList { 4 | if (this.contains(t)) { 5 | this.remove(t) 6 | } else { 7 | this.add(t) 8 | } 9 | return this 10 | } 11 | -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/Set.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | fun Set.addOrRemove(t:T): Set { 4 | val tmp = this.toMutableSet() 5 | if (tmp.contains(t)){ 6 | tmp.remove(t) 7 | }else{ 8 | tmp.add(t) 9 | } 10 | return tmp.toSet() 11 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/typeExt/String.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.typeExt 2 | 3 | import com.wh.common.type.Json 4 | import com.wh.common.util.Base64Utils 5 | import com.wh.common.util.TimeUtils 6 | 7 | fun String.timestampParse(spf:String = "yyyy-MM-dd HH:mm:ss"): Long { 8 | return TimeUtils.getMSFromFormattedTime(spf) 9 | } 10 | 11 | fun String.base64Decode(): String { 12 | return Base64Utils.decode(this) 13 | } 14 | 15 | fun String.base64Encode(): String { 16 | return Base64Utils.encode(this).replace("\n","") 17 | } 18 | 19 | fun String.toJson(): Json { 20 | return Json(this) 21 | } -------------------------------------------------------------------------------- /android/common/src/main/java/com/wh/common/util/Base64Utils.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common.util 2 | 3 | import android.util.Base64 4 | 5 | class Base64Utils { 6 | companion object{ 7 | fun decode(input: String): String { 8 | return String(Base64.decode(input,Base64.DEFAULT)) 9 | } 10 | fun encode(input: String): String{ 11 | return Base64.encodeToString(input.toByteArray(),Base64.DEFAULT) 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /android/common/src/test/java/com/wh/common/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.wh.common 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android/compose/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android/compose/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/compose/consumer-rules.pro -------------------------------------------------------------------------------- /android/compose/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/compose/src/main/java/com/wh/sbw/compose/typeExt/SnapshotStateList.kt: -------------------------------------------------------------------------------- 1 | package com.wh.sbw.compose.typeExt 2 | 3 | import androidx.compose.runtime.snapshots.SnapshotStateList 4 | 5 | fun SnapshotStateList.addOrSkip(t:T){ 6 | if (this.contains(t)){ 7 | return 8 | }else{ 9 | this.add(t) 10 | } 11 | } -------------------------------------------------------------------------------- /android/compose/src/main/java/com/wh/sbw/compose/ui/componment/IComposeFragment.kt: -------------------------------------------------------------------------------- 1 | package com.wh.sbw.compose.ui.componment 2 | 3 | import androidx.compose.runtime.Composable 4 | 5 | interface IComposeFragment { 6 | 7 | @Composable 8 | fun ComposeView() 9 | } -------------------------------------------------------------------------------- /android/compose/src/test/java/com/wh/sbw/compose/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.wh.sbw.compose 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Dec 24 16:13:47 CST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /android/key_debug.sample.properties: -------------------------------------------------------------------------------- 1 | storeFile=/Users/easy/Code/pushdeer-andorid/com.pushdeer.com 2 | storePassword=pushdeer.com 3 | keyAlias=pushdeer 4 | keyPassword=pushdeer.com -------------------------------------------------------------------------------- /android/pushdeercommon/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /android/pushdeercommon/consumer-rules.pro: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/android/pushdeercommon/consumer-rules.pro -------------------------------------------------------------------------------- /android/pushdeercommon/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/DeviceInfo.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.common.api.data.response 2 | 3 | import com.pushdeer.common.api.data.request.DeviceInfo 4 | 5 | 6 | class DeviceInfoList{ 7 | var devices:List = emptyList() 8 | 9 | override fun toString(): String { 10 | return "devices:$devices" 11 | } 12 | } -------------------------------------------------------------------------------- /android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/Message.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.common.api.data.response 2 | 3 | 4 | class Message { 5 | var id = 0 6 | var uid: String? = null 7 | var text: String? = null 8 | var desp: String? = null 9 | var type: String? = null 10 | var pushkey_name: String? = null 11 | var created_at: String? = null 12 | } 13 | 14 | class MessageList { 15 | var messages = emptyList() 16 | } -------------------------------------------------------------------------------- /android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/PushKey.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.common.api.data.response 2 | 3 | class PushKey { 4 | var id:String = "" 5 | var key: String = "" 6 | var name: String = "" 7 | var created_at = "" 8 | 9 | override fun toString(): String { 10 | return "id:$id key:$key name:$name created_at:$created_at" 11 | } 12 | } 13 | 14 | class PushKeyList { 15 | var keys: List = emptyList() 16 | 17 | override fun toString(): String { 18 | return "keys:$keys" 19 | } 20 | } -------------------------------------------------------------------------------- /android/pushdeercommon/src/main/java/com/pushdeer/common/api/data/response/ReturnData.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.common.api.data.response 2 | 3 | class ReturnData { 4 | var code: Int = 0 5 | var content: T?=null 6 | var error:String = "" 7 | 8 | override fun toString(): String { 9 | return "code:${code} error:${error} content:${content.toString()}" 10 | } 11 | } 12 | 13 | class TokenOnly{ 14 | var token:String = "" 15 | } -------------------------------------------------------------------------------- /android/pushdeercommon/src/test/java/com/pushdeer/common/ExampleUnitTest.kt: -------------------------------------------------------------------------------- 1 | package com.pushdeer.common 2 | 3 | import org.junit.Test 4 | 5 | import org.junit.Assert.* 6 | 7 | /** 8 | * Example local unit test, which will execute on the development machine (host). 9 | * 10 | * See [testing documentation](http://d.android.com/tools/testing). 11 | */ 12 | class ExampleUnitTest { 13 | @Test 14 | fun addition_isCorrect() { 15 | assertEquals(4, 2 + 2) 16 | } 17 | } -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 3 | repositories { 4 | google() 5 | mavenCentral() 6 | maven { url 'https://jitpack.io' } 7 | // maven { url 'https://developer.huawei.com/repo/' } 8 | } 9 | } 10 | rootProject.name = "PushDeer" 11 | include ':app' 12 | include ':common' 13 | include ':compose' 14 | include ':pushdeercommon' 15 | -------------------------------------------------------------------------------- /api/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | 17 | [docker-compose.yml] 18 | indent_size = 4 19 | -------------------------------------------------------------------------------- /api/.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /api/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | .env 7 | .env.backup 8 | .phpunit.result.cache 9 | docker-compose.override.yml 10 | Homestead.json 11 | Homestead.yaml 12 | npm-debug.log 13 | yarn-error.log 14 | /.idea 15 | /.vscode 16 | -------------------------------------------------------------------------------- /api/.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | version: 8 4 | disabled: 5 | - no_unused_imports 6 | finder: 7 | not-name: 8 | - index.php 9 | - server.php 10 | js: 11 | finder: 12 | not-name: 13 | - webpack.mix.js 14 | css: true 15 | -------------------------------------------------------------------------------- /api/app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/EnsureMember.php: -------------------------------------------------------------------------------- 1 | method(), ['POST', 'PUT', 'PATCH']) 13 | && $request->isJson() 14 | ) { 15 | $data = $request->json()->all(); 16 | $request->request->replace(is_array($data) ? $data : []); 17 | } 18 | 19 | return $next($request); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/TokenLogin.php: -------------------------------------------------------------------------------- 1 | input('token'); 21 | if (strlen($token) > 0) { 22 | session_id($token); 23 | session_start(); 24 | } 25 | 26 | return $next($request); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | 'current_password', 16 | 'password', 17 | 'password_confirmation', 18 | ]; 19 | } 20 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/TrustHosts.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | public function hosts() 15 | { 16 | return [ 17 | $this->allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /api/app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | 13 | */ 14 | protected $except = [ 15 | // 16 | ]; 17 | } 18 | -------------------------------------------------------------------------------- /api/app/Models/PushDeerDevice.php: -------------------------------------------------------------------------------- 1 | create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "mix", 6 | "watch": "mix watch", 7 | "watch-poll": "mix watch -- --watch-options-poll=1000", 8 | "hot": "mix watch --hot", 9 | "prod": "npm run production", 10 | "production": "mix --production" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.21", 14 | "laravel-mix": "^6.0.6", 15 | "lodash": "^4.17.19", 16 | "postcss": "^8.1.14" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /api/public/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/api/public/code.png -------------------------------------------------------------------------------- /api/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/api/public/favicon.ico -------------------------------------------------------------------------------- /api/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /api/resources/css/app.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/api/resources/css/app.css -------------------------------------------------------------------------------- /api/resources/js/app.js: -------------------------------------------------------------------------------- 1 | require('./bootstrap'); 2 | -------------------------------------------------------------------------------- /api/resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /api/routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /api/routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /api/routes/web.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /api/storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /api/storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /api/storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | compiled.php 2 | config.php 3 | down 4 | events.scanned.php 5 | maintenance.php 6 | routes.php 7 | routes.scanned.php 8 | schedule-* 9 | services.json 10 | -------------------------------------------------------------------------------- /api/storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /api/storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /api/storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /api/storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /api/storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /api/storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /api/tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /api/tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /api/tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/webpack.mix.js: -------------------------------------------------------------------------------- 1 | const mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel applications. By default, we are compiling the CSS 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js('resources/js/app.js', 'public/js') 15 | .postCss('resources/css/app.css', 'public/css', [ 16 | // 17 | ]); 18 | -------------------------------------------------------------------------------- /doc/design_and_resource/PushDeerOs.xd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/PushDeerOs.xd -------------------------------------------------------------------------------- /doc/design_and_resource/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/avatar1.png -------------------------------------------------------------------------------- /doc/design_and_resource/avatar1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/avatar1@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/avatar2.png -------------------------------------------------------------------------------- /doc/design_and_resource/avatar2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/avatar2@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/deer.gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/deer.gray.png -------------------------------------------------------------------------------- /doc/design_and_resource/deer.gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/deer.gray@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/key.png -------------------------------------------------------------------------------- /doc/design_and_resource/key@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/key@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/logo.png -------------------------------------------------------------------------------- /doc/design_and_resource/logo.with.space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/logo.with.space.png -------------------------------------------------------------------------------- /doc/design_and_resource/logo.with.space@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/logo.with.space@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/logo@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/头像 – 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/头像 – 1.png -------------------------------------------------------------------------------- /doc/design_and_resource/头像 – 1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/头像 – 1@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/头像.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/头像.png -------------------------------------------------------------------------------- /doc/design_and_resource/头像@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/头像@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/完整logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/完整logo.png -------------------------------------------------------------------------------- /doc/design_and_resource/完整logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/完整logo@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/消息 – 1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/消息 – 1.png -------------------------------------------------------------------------------- /doc/design_and_resource/消息 – 1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/消息 – 1@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/消息.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/消息.png -------------------------------------------------------------------------------- /doc/design_and_resource/消息@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/消息@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/登入.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/登入.png -------------------------------------------------------------------------------- /doc/design_and_resource/登入@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/登入@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/设备.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/设备.png -------------------------------------------------------------------------------- /doc/design_and_resource/设备@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/设备@2x.png -------------------------------------------------------------------------------- /doc/design_and_resource/设置.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/设置.png -------------------------------------------------------------------------------- /doc/design_and_resource/设置@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/design_and_resource/设置@2x.png -------------------------------------------------------------------------------- /doc/image/2022-02-02-21-14-21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/2022-02-02-21-14-21.png -------------------------------------------------------------------------------- /doc/image/2022-02-02-21-17-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/2022-02-02-21-17-45.png -------------------------------------------------------------------------------- /doc/image/2022-02-02-21-18-49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/2022-02-02-21-18-49.png -------------------------------------------------------------------------------- /doc/image/2022-02-02-21-39-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/2022-02-02-21-39-16.png -------------------------------------------------------------------------------- /doc/image/2022-02-02-21-45-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/2022-02-02-21-45-29.png -------------------------------------------------------------------------------- /doc/image/2022-03-30-18-14-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/2022-03-30-18-14-05.png -------------------------------------------------------------------------------- /doc/image/clipcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/clipcode.png -------------------------------------------------------------------------------- /doc/image/video.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/image/video.gif -------------------------------------------------------------------------------- /doc/架构文档.key: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/doc/架构文档.key -------------------------------------------------------------------------------- /docker-compose.serverless.yml: -------------------------------------------------------------------------------- 1 | # 已废弃 2 | # version: '2' 3 | # services: 4 | # app: 5 | # image: 'ccr.ccs.tencentyun.com/ftqq/pushdeercore' 6 | # ports: 7 | # - '9000:9000' 8 | # environment: 9 | # - DB_HOST=host.docker.internal 10 | # - DB_PORT=3306 11 | # - DB_USERNAME=root 12 | # - DB_DATABASE=pushdeer_local 13 | # - DB_PASSWORD= 14 | # - DB_TIMEZONE=+08:00 15 | # - GO_PUSH_IOS_TOPIC=com.pushdeer.self.ios 16 | # - GO_PUSH_IOS_CLIP_TOPIC=com.pushdeer.self.ios.Clip 17 | # - APP_DEBUG=false 18 | # - WEB_PHP_SOCKET=127.0.0.1:8000 19 | # extra_hosts: 20 | # - "host.docker.internal:host-gateway" 21 | -------------------------------------------------------------------------------- /docker/mqtt/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:16-alpine3.15 2 | 3 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 4 | RUN sed -i 's/dl-4.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories 5 | RUN apk --no-cache add mosquitto mosquitto-clients 6 | RUN npm install -g forever 7 | 8 | ADD mosquitto.conf /mosquitto.conf 9 | RUN /usr/sbin/mosquitto -c /mosquitto.conf -v -d 10 | 11 | # 测试时注释掉下一行 12 | COPY api /api 13 | 14 | COPY init.sh /init.sh 15 | RUN chmod +x /init.sh 16 | EXPOSE 1883 17 | EXPOSE 9001 18 | EXPOSE 80 19 | 20 | ENTRYPOINT ["/bin/sh", "/init.sh"] 21 | 22 | 23 | # ENTRYPOINT ["/usr/sbin/mosquitto", "-c", "/mosquitto.conf",""] -------------------------------------------------------------------------------- /docker/mqtt/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM node:16-alpine3.15 2 | 3 | RUN apk --no-cache add mosquitto mosquitto-clients 4 | RUN npm install -g forever 5 | 6 | ADD mosquitto.conf /mosquitto.conf 7 | RUN /usr/sbin/mosquitto -c /mosquitto.conf -d 8 | 9 | # 测试时注释掉下一行 10 | # COPY api /api 11 | 12 | COPY init.sh /init.sh 13 | RUN chmod +x /init.sh 14 | EXPOSE 1883 15 | EXPOSE 80 16 | 17 | ENTRYPOINT ["/bin/sh", "/init.sh"] 18 | 19 | 20 | # ENTRYPOINT ["/usr/sbin/mosquitto", "-c", "/mosquitto.conf",""] -------------------------------------------------------------------------------- /docker/mqtt/RoboFile.php: -------------------------------------------------------------------------------- 1 | _exec("docker build -t pushdeeresp ./ "); 13 | $this->_exec("docker tag pushdeeresp ccr.ccs.tencentyun.com/ftqq/pushdeeresp"); 14 | $this->_exec("docker push ccr.ccs.tencentyun.com/ftqq/pushdeeresp"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /docker/mqtt/api/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /docker/mqtt/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "dependencies": { 7 | "async-mqtt": "^2.6.2", 8 | "body-parser": "^1.19.1", 9 | "connect-timeout": "^1.9.0", 10 | "express": "^4.17.2", 11 | "multer": "^1.4.4" 12 | }, 13 | "devDependencies": { 14 | "nodemon": "^2.0.15" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /docker/mqtt/docker-compose.dev.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | api: 4 | build: 5 | context: ./ 6 | dockerfile: ./Dockerfile.dev 7 | volumes: 8 | - './api:/api' 9 | ports: 10 | - '80:80' 11 | - '1883:1883' 12 | environment: 13 | - API_KEY=aPiKe1 14 | - MQTT_USER=easy 15 | - MQTT_PASSWORD=y0urp@ss 16 | - MQTT_PORT=1883 17 | - MQTT_BASE_TOPIC=default -------------------------------------------------------------------------------- /docker/mqtt/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | api: 4 | build: 5 | context: ./ 6 | dockerfile: ./Dockerfile 7 | # volumes: 8 | # - './api:/api' 9 | ports: 10 | - '80:80' 11 | - '1883:1883' 12 | environment: 13 | - API_KEY=aPiKe1 14 | - MQTT_USER=easy 15 | - MQTT_PASSWORD=y0urp@ss 16 | - MQTT_PORT=1883 17 | - MQTT_BASE_TOPIC=default -------------------------------------------------------------------------------- /docker/mqtt/init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 生成密码文件 4 | echo "$MQTT_USER:$MQTT_PASSWORD" > '/mospass.txt' 5 | mosquitto_passwd -U /mospass.txt 6 | 7 | # 启动 express 8 | forever start /api/index.js 9 | # mosquitto -c /mosquitto.conf -v 10 | mosquitto -c /mosquitto.conf -------------------------------------------------------------------------------- /docker/mqtt/mosquitto.conf: -------------------------------------------------------------------------------- 1 | listener 1883 2 | listener 9001 3 | protocol websockets 4 | allow_anonymous false 5 | log_dest stdout 6 | password_file /mospass.txt -------------------------------------------------------------------------------- /docker/web/gorush: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/docker/web/gorush -------------------------------------------------------------------------------- /docker/web/init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 初始化 laravel 4 | cd /app/api && composer install && cp -n .env.example .env && php artisan key:generate && php artisan migrate --seed 5 | 6 | mkdir -p /app/api/storage 7 | chmod -R 0777 /app/api/storage 8 | 9 | mkdir -p /app/api/bootstrap/cache/ 10 | chmod -R 0777 /app/api/bootstrap/cache/ 11 | -------------------------------------------------------------------------------- /docker/web/larave-cron: -------------------------------------------------------------------------------- 1 | * * * * * cd /app/api && php artisan schedule:run >> /dev/null 2>&1 -------------------------------------------------------------------------------- /docker/web/ports.conf: -------------------------------------------------------------------------------- 1 | # If you just change the port or add more ports here, you will likely also 2 | # have to change the VirtualHost statement in 3 | # /etc/apache2/sites-enabled/000-default.conf 4 | 5 | Listen 80 6 | Listen 9000 7 | 8 | 9 | Listen 443 10 | 11 | 12 | 13 | Listen 443 14 | 15 | 16 | # vim: syntax=apache ts=4 sw=4 sts=4 sr noet -------------------------------------------------------------------------------- /docker/web/supervisord-clip.conf: -------------------------------------------------------------------------------- 1 | [group:push-clip] 2 | programs=push-clip 3 | priority=20 4 | 5 | [program:push-clip] 6 | process_name=%(program_name)s 7 | command=/bin/bash -c 'cd /app/push/ && /data/gorush -c clip.yml' 8 | autostart=true 9 | startretries=10 10 | autorestart=true 11 | priority=1 12 | redirect_stderr=true 13 | stdout_logfile=/clip.log -------------------------------------------------------------------------------- /docker/web/supervisord-ios.conf: -------------------------------------------------------------------------------- 1 | [group:push-ios] 2 | programs=push-ios 3 | priority=20 4 | 5 | [program:push-ios] 6 | process_name=%(program_name)s 7 | command=/bin/bash -c 'cd /app/push/ && /data/gorush -c ios.yml' 8 | autostart=true 9 | startretries=10 10 | autorestart=true 11 | priority=1 12 | redirect_stderr=true 13 | stdout_logfile=/push.log -------------------------------------------------------------------------------- /docker/web/supervisord-redis.conf: -------------------------------------------------------------------------------- 1 | [group:redis] 2 | programs=redis 3 | priority=18 4 | 5 | [program:redis] 6 | process_name=%(program_name)s 7 | command=/usr/bin/redis-server 8 | autostart=true 9 | startretries=10 10 | autorestart=true 11 | priority=1 12 | redirect_stderr=true 13 | stdout_logfile=/redis.log -------------------------------------------------------------------------------- /examples/demo.php: -------------------------------------------------------------------------------- 1 | $text, 'desp' => $desp, 'type' => $type , 'pushkey' => $key )); 7 | $opts = array('http' => 8 | array( 9 | 'method' => 'POST', 10 | 'header' => 'Content-type: application/x-www-form-urlencoded', 11 | 'content' => $postdata)); 12 | 13 | $context = stream_context_create($opts); 14 | return $result = file_get_contents('https://api2.pushdeer.com/message/push', false, $context); 15 | } 16 | 17 | 18 | 19 | // 使用实例 20 | print_r(pushdeer_send('服务器又宕机了主人', '', 'text', 'PDU...')); 21 | -------------------------------------------------------------------------------- /ios/Prototype_version/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'PushDeer' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | pod 'Moya', '~> 15.0' 8 | pod "PromiseKit", "~> 6.8" 9 | 10 | # Pods for PushDeer 11 | 12 | end 13 | 14 | target 'PushDeerClip' do 15 | # Comment the next line if you don't want to use dynamic frameworks 16 | use_frameworks! 17 | pod 'Moya', '~> 15.0' 18 | pod "PromiseKit", "~> 6.8" 19 | 20 | # Pods for PushDeer 21 | 22 | end 23 | 24 | 25 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Moya/Sources/Moya/AnyEncodable.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | struct AnyEncodable: Encodable { 4 | 5 | private let encodable: Encodable 6 | 7 | public init(_ encodable: Encodable) { 8 | self.encodable = encodable 9 | } 10 | 11 | func encode(to encoder: Encoder) throws { 12 | try encodable.encode(to: encoder) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Moya/Sources/Moya/Image.swift: -------------------------------------------------------------------------------- 1 | #if canImport(UIKit) 2 | import UIKit.UIImage 3 | public typealias ImageType = UIImage 4 | #elseif canImport(AppKit) 5 | import AppKit.NSImage 6 | public typealias ImageType = NSImage 7 | #endif 8 | 9 | /// An alias for the SDK's image type. 10 | public typealias Image = ImageType 11 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Extensions/Foundation/Sources/PMKFoundation.h: -------------------------------------------------------------------------------- 1 | #import "NSNotificationCenter+AnyPromise.h" 2 | #import "NSURLSession+AnyPromise.h" 3 | #import "NSTask+AnyPromise.h" 4 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Extensions/UIKit/Sources/PMKUIKit.h: -------------------------------------------------------------------------------- 1 | #import "UIView+AnyPromise.h" 2 | #import "UIViewController+AnyPromise.h" 3 | 4 | typedef NS_OPTIONS(NSInteger, PMKAnimationOptions) { 5 | PMKAnimationOptionsNone = 1 << 0, 6 | PMKAnimationOptionsAppear = 1 << 1, 7 | PMKAnimationOptionsDisappear = 1 << 2, 8 | }; 9 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Extensions/UIKit/Sources/UIViewPropertyAnimator+Promise.swift: -------------------------------------------------------------------------------- 1 | #if !PMKCocoaPods 2 | import PromiseKit 3 | #endif 4 | import UIKit 5 | 6 | @available(iOS 10, tvOS 10, *) 7 | public extension UIViewPropertyAnimator { 8 | func startAnimation(_: PMKNamespacer) -> Guarantee { 9 | return Guarantee { 10 | addCompletion($0) 11 | startAnimation() 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Sources/PromiseKit.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | #import // `FOUNDATION_EXPORT` 5 | 6 | FOUNDATION_EXPORT double PromiseKitVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char PromiseKitVersionString[]; 8 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Sources/after.m: -------------------------------------------------------------------------------- 1 | #import "AnyPromise.h" 2 | @import Dispatch; 3 | @import Foundation.NSDate; 4 | @import Foundation.NSValue; 5 | 6 | /// @return A promise that fulfills after the specified duration. 7 | AnyPromise *PMKAfter(NSTimeInterval duration) { 8 | return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { 9 | dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)); 10 | dispatch_after(time, dispatch_get_global_queue(0, 0), ^{ 11 | resolve(@(duration)); 12 | }); 13 | }]; 14 | } 15 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Sources/dispatch_promise.m: -------------------------------------------------------------------------------- 1 | #import "AnyPromise.h" 2 | @import Dispatch; 3 | 4 | AnyPromise *dispatch_promise_on(dispatch_queue_t queue, id block) { 5 | return [AnyPromise promiseWithValue:nil].thenOn(queue, block); 6 | } 7 | 8 | AnyPromise *dispatch_promise(id block) { 9 | return dispatch_promise_on(dispatch_get_global_queue(0, 0), block); 10 | } 11 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/PromiseKit/Sources/race.m: -------------------------------------------------------------------------------- 1 | #import "AnyPromise+Private.h" 2 | 3 | AnyPromise *PMKRace(NSArray *promises) { 4 | return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) { 5 | for (AnyPromise *promise in promises) { 6 | [promise __pipe:resolve]; 7 | } 8 | }]; 9 | } 10 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Alamofire/Alamofire-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Alamofire : NSObject 3 | @end 4 | @implementation PodsDummy_Alamofire 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double AlamofireVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Alamofire/Alamofire.modulemap: -------------------------------------------------------------------------------- 1 | framework module Alamofire { 2 | umbrella header "Alamofire-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Moya/Moya-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Moya : NSObject 3 | @end 4 | @implementation PodsDummy_Moya 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Moya/Moya-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Moya/Moya-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double MoyaVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char MoyaVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Moya/Moya.modulemap: -------------------------------------------------------------------------------- 1 | framework module Moya { 2 | umbrella header "Moya-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PushDeer : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PushDeer 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework 3 | ${BUILT_PRODUCTS_DIR}/Moya/Moya.framework 4 | ${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework 3 | ${BUILT_PRODUCTS_DIR}/Moya/Moya.framework 4 | ${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_PushDeerVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_PushDeerVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeer/Pods-PushDeer.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PushDeer { 2 | umbrella header "Pods-PushDeer-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_PushDeerClip : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_PushDeerClip 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework 3 | ${BUILT_PRODUCTS_DIR}/Moya/Moya.framework 4 | ${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework 3 | ${BUILT_PRODUCTS_DIR}/Moya/Moya.framework 4 | ${BUILT_PRODUCTS_DIR}/PromiseKit/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Moya.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/PromiseKit.framework -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_PushDeerClipVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_PushDeerClipVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/Pods-PushDeerClip/Pods-PushDeerClip.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_PushDeerClip { 2 | umbrella header "Pods-PushDeerClip-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/PromiseKit/PromiseKit-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_PromiseKit : NSObject 3 | @end 4 | @implementation PodsDummy_PromiseKit 5 | @end 6 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/PromiseKit/PromiseKit-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ios/Prototype_version/Pods/Target Support Files/PromiseKit/PromiseKit.modulemap: -------------------------------------------------------------------------------- 1 | framework module PromiseKit { 2 | umbrella header "PromiseKit-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer.xcodeproj/project.xcworkspace/xcuserdata/Easy.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer.xcodeproj/project.xcworkspace/xcuserdata/Easy.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer.xcworkspace/xcuserdata/Easy.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer.xcworkspace/xcuserdata/Easy.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/172.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/196.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/216.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/48.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/55.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/AppIcon.appiconset/88.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "logo@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "logo@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/logo.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/logo@2x.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeer/Assets.xcassets/logo.imageset/logo@3x.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | UIBackgroundModes 6 | 7 | remote-notification 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/PushDeer.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.applesignin 8 | 9 | Default 10 | 11 | com.apple.developer.associated-domains 12 | 13 | appclips:vip.pushdeer.com 14 | webcredentials:pushdeer.ftqq.com 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/PushDeerDebug.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.applesignin 8 | 9 | Default 10 | 11 | com.apple.developer.associated-domains 12 | 13 | appclips:vip.pushdeer.com 14 | webcredentials:pushdeer.ftqq.com 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/View/ChannelView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ChannelView.swift 3 | // PushDeer 4 | // 5 | // Created by Easy on 2021/12/2. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ChannelView: View { 11 | var body: some View { 12 | Text("ChannelView") 13 | } 14 | } 15 | 16 | struct ChannelView_Previews: PreviewProvider { 17 | static var previews: some View { 18 | ChannelView() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/View/LoginedView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoginedView.swift 3 | // PushDeer 4 | // 5 | // Created by Easy on 2021/12/1. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct LoginedView: View { 11 | var body: some View { 12 | VStack{ 13 | ProgressView() 14 | } 15 | } 16 | } 17 | 18 | struct LoginedView_Previews: PreviewProvider { 19 | static var previews: some View { 20 | LoginedView() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeer/View/SettingsView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SettingsView.swift 3 | // PushDeer 4 | // 5 | // Created by Easy on 2021/12/2. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct SettingsView: View { 11 | @EnvironmentObject private var store: AppState 12 | var body: some View { 13 | Button("去消息页面"){ 14 | store.tab_selected = 1 15 | } 16 | } 17 | } 18 | 19 | struct SettingsView_Previews: PreviewProvider { 20 | static var previews: some View { 21 | SettingsView() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/100.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/128.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/144.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/16.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/172.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/196.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/20.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/216.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/216.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/256.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/32.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/48.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/50.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/512.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/55.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/64.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/72.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/AppIcon.appiconset/88.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "logo@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "logo@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/logo.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/logo@2x.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/Prototype_version/PushDeerClip/Assets.xcassets/logo.imageset/logo@3x.png -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // PushDeer 4 | // 5 | // Created by Easy on 2021/11/30. 6 | // 7 | 8 | import SwiftUI 9 | // import PromiseKit 10 | 11 | struct ContentView: View { 12 | //@EnvironmentObject private var store: AppState 13 | //@State private var show_view = "init" 14 | 15 | var body: some View { 16 | Text("clip") 17 | } 18 | } 19 | 20 | struct ContentView_Previews: PreviewProvider { 21 | static var previews: some View { 22 | ContentView() 23 | } 24 | } 25 | 26 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSAppClip 6 | 7 | NSAppClipRequestEphemeralUserNotification 8 | 9 | NSAppClipRequestLocationConfirmation 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ios/Prototype_version/PushDeerClip/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/Prototype_version/apple-app-site-association: -------------------------------------------------------------------------------- 1 | { 2 | "applinks": { 3 | "details": [ 4 | { 5 | "appIDs": [ "HUJ6HAE4VU.com.pushdeer.app.ios.Clip"] 6 | } 7 | ] 8 | }, 9 | "webcredentials": { 10 | "apps": [ "HUJ6HAE4VU.com.pushdeer.app.ios.Clip" ] 11 | }, 12 | "appclips": { 13 | "apps": ["HUJ6HAE4VU.com.pushdeer.app.ios.Clip"] 14 | } 15 | } -------------------------------------------------------------------------------- /ios/PushDeer-iOS/LICENSE: -------------------------------------------------------------------------------- 1 | 本项目禁止商用(包括但不限于搭建后挂广告或售卖会员、打包后上架商店销售等),对非商业用途采用 GPLV2 授权 2 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/Notification/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSExtension 6 | 7 | NSExtensionPointIdentifier 8 | com.apple.usernotifications.service 9 | NSExtensionPrincipalClass 10 | $(PRODUCT_MODULE_NAME).NotificationService 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/Notification/Notification.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.network.client 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | PreviewsEnabled 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/100.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/1024.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/114.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/120.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/144.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/152.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/167.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/180.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/20.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/29.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/40.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/50.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/57.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/58.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/60.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/72.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/76.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/80.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon-SH.appiconset/87.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-1024.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20-ipad.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20@2x-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20@2x-ipad.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29-ipad.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29@2x-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29@2x-ipad.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-40.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-76.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar1.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "avatar1@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/avatar1.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/avatar1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar1.imageset/avatar1@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "avatar2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "avatar2@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/avatar2.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/avatar2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/avatar2.imageset/avatar2@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "deer.gray.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "deer.gray@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/deer.gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/deer.gray.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/deer.gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/deer.gray.imageset/deer.gray@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo2.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo-SH.imageset/logo2.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "logo@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/logo.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.imageset/logo@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "logo.with.space.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "logo.with.space@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/logo.with.space.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/logo.with.space.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/logo.with.space@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/logo.with.space.imageset/logo.with.space@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/weixin-login.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "filename" : "微信LOGO_轮廓.png", 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/weixin-login.imageset/微信LOGO_轮廓.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeer/Assets.xcassets/Images/weixin-login.imageset/微信LOGO_轮廓.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Common/SafariView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SafariView.swift 3 | // PushDeer 4 | // 5 | // Created by HEXT on 2022/2/27. 6 | // 7 | 8 | import SwiftUI 9 | import SafariServices 10 | 11 | struct HSafariView: UIViewControllerRepresentable { 12 | 13 | let url: URL 14 | 15 | func makeUIViewController(context: Context) -> SFSafariViewController { 16 | let safariVC = SFSafariViewController.init(url: url) 17 | safariVC.dismissButtonStyle = .close 18 | return safariVC 19 | } 20 | 21 | func updateUIViewController(_ uiViewController: SFSafariViewController, context: Context) { 22 | // update code 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // PushDeer 4 | // 5 | // Created by HEXT on 2021/12/25. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | 12 | @EnvironmentObject private var store: AppState 13 | 14 | var body: some View { 15 | if Env.isSelfHosted && store.api_endpoint.isEmpty { 16 | EndpointView() 17 | } else if store.token.isEmpty { 18 | LoginView() 19 | } else { 20 | MainView() 21 | } 22 | } 23 | } 24 | 25 | struct ContentView_Previews: PreviewProvider { 26 | static var previews: some View { 27 | ContentView() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/PushDeer-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #if __has_include("WXApi.h") 6 | #import "WXApi.h" 7 | #endif 8 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Local Network Usage Description */ 2 | "NSLocalNetworkUsageDescription" = "APP needs access to the local network for debugging (only when developing)"; 3 | 4 | /* Privacy - Photo Library Additions Usage Description */ 5 | "NSPhotoLibraryAddUsageDescription" = "APP provides you with the function of saving pictures to albums"; 6 | 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeer/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerClip/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerClip/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Privacy - Local Network Usage Description */ 2 | "NSLocalNetworkUsageDescription" = "APP needs access to the local network for debugging (only when developing)"; 3 | 4 | /* Privacy - Photo Library Additions Usage Description */ 5 | "NSPhotoLibraryAddUsageDescription" = "APP provides you with the function of saving pictures to albums"; 6 | 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerClip/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Images/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Images/deer.gray.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "deer.gray.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "deer.gray@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Images/deer.gray.imageset/deer.gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Images/deer.gray.imageset/deer.gray.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Images/deer.gray.imageset/deer.gray@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/Images/deer.gray.imageset/deer.gray@2x.png -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Assets.xcassets/WidgetBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSAppTransportSecurity 6 | 7 | NSAllowsArbitraryLoads 8 | 9 | 10 | NSExtension 11 | 12 | NSExtensionPointIdentifier 13 | com.apple.widgetkit-extension 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/PushDeerWidgetExtension-SelfHosted.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | group.com.pushdeer.self.ios 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /ios/PushDeer-iOS/PushDeerWidget/PushDeerWidgetExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | group.com.pushdeer.app.ios 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /iot/deeresp/data/deer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp/data/deer.jpg -------------------------------------------------------------------------------- /iot/deeresp/data/wifi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp/data/wifi.jpg -------------------------------------------------------------------------------- /iot/deeresp32/.gitignore: -------------------------------------------------------------------------------- 1 | *.bin -------------------------------------------------------------------------------- /iot/deeresp32/data/Cubic1112.vlw: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp32/data/Cubic1112.vlw -------------------------------------------------------------------------------- /iot/deeresp32/data/deer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp32/data/deer.jpg -------------------------------------------------------------------------------- /iot/deeresp32/data/wifi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp32/data/wifi.jpg -------------------------------------------------------------------------------- /iot/deeresp32/des82系列用固件.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp32/des82系列用固件.zip -------------------------------------------------------------------------------- /iot/deeresp_test/data/cover.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/deeresp_test/data/cover.jpeg -------------------------------------------------------------------------------- /iot/image/2022-02-16-21-48-45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-21-48-45.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-21-59-51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-21-59-51.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-22-01-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-22-01-05.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-22-02-36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-22-02-36.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-22-04-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-22-04-25.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-22-07-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-22-07-07.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-23-32-30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-23-32-30.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-23-35-41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-23-35-41.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-23-38-05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-23-38-05.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-23-42-25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-23-42-25.png -------------------------------------------------------------------------------- /iot/image/2022-02-16-23-44-07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-16-23-44-07.png -------------------------------------------------------------------------------- /iot/image/2022-02-17-00-00-43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-17-00-00-43.png -------------------------------------------------------------------------------- /iot/image/2022-02-17-00-43-58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-17-00-43-58.png -------------------------------------------------------------------------------- /iot/image/2022-02-18-19-18-55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-02-18-19-18-55.png -------------------------------------------------------------------------------- /iot/image/2022-03-24-22-40-14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-03-24-22-40-14.png -------------------------------------------------------------------------------- /iot/image/2022-03-24-22-41-19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-03-24-22-41-19.png -------------------------------------------------------------------------------- /iot/image/2022-03-24-22-44-00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-03-24-22-44-00.png -------------------------------------------------------------------------------- /iot/image/2022-03-26-17-38-02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/2022-03-26-17-38-02.png -------------------------------------------------------------------------------- /iot/image/20220422002608.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422002608.png -------------------------------------------------------------------------------- /iot/image/20220422003820.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422003820.png -------------------------------------------------------------------------------- /iot/image/20220422004159.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422004159.png -------------------------------------------------------------------------------- /iot/image/20220422005232.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422005232.png -------------------------------------------------------------------------------- /iot/image/20220422005313.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422005313.png -------------------------------------------------------------------------------- /iot/image/20220422005744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422005744.png -------------------------------------------------------------------------------- /iot/image/20220422010516.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422010516.png -------------------------------------------------------------------------------- /iot/image/20220422011115.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422011115.png -------------------------------------------------------------------------------- /iot/image/20220422014021.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/20220422014021.png -------------------------------------------------------------------------------- /iot/image/deeresp.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/iot/image/deeresp.gif -------------------------------------------------------------------------------- /iot/screen/screen.ino: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | TFT_eSPI tft = TFT_eSPI(); 4 | 5 | void setup() { 6 | Serial.begin(115200); 7 | Serial.print("hello world\n"); 8 | 9 | // Set up LCD 10 | tft.begin(); 11 | tft.fillScreen(TFT_BLUE); 12 | 13 | pinMode(19, OUTPUT); 14 | digitalWrite(19, HIGH); 15 | } 16 | 17 | void loop() { 18 | // put your main code here, to run repeatedly: 19 | } 20 | -------------------------------------------------------------------------------- /iot/upload.sh: -------------------------------------------------------------------------------- 1 | esptool.py --chip esp8266 --port /dev/cu.wchusbserial1410 --baud 115200 --before default_reset --after hard_reset write_flash 0x0 xxx.bin 2 | -------------------------------------------------------------------------------- /plugins/wordpress/pushdeer_wordpress_comment_notice.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/plugins/wordpress/pushdeer_wordpress_comment_notice.zip -------------------------------------------------------------------------------- /plugins/wordpress/pushdeer_wordpress_comment_notice/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/.revive.toml: -------------------------------------------------------------------------------- 1 | ignoreGeneratedHeader = false 2 | severity = "warning" 3 | confidence = 0.8 4 | errorCode = 1 5 | warningCode = 1 6 | 7 | [rule.blank-imports] 8 | [rule.context-as-argument] 9 | [rule.context-keys-type] 10 | [rule.dot-imports] 11 | [rule.error-return] 12 | [rule.error-strings] 13 | [rule.error-naming] 14 | [rule.exported] 15 | [rule.if-return] 16 | [rule.increment-decrement] 17 | [rule.var-naming] 18 | [rule.var-declaration] 19 | [rule.package-comments] 20 | [rule.range] 21 | [rule.receiver-naming] 22 | [rule.time-naming] 23 | [rule.unexported-return] 24 | [rule.indent-error-flow] 25 | [rule.errorf] 26 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/HomebrewFormula/gorush.rb: -------------------------------------------------------------------------------- 1 | class Gorush < Formula 2 | desc "A push notification server written in Go (Golang)." 3 | homepage "https://github.com/appleboy/gorush" 4 | head "https://github.com/appleboy/gorush.git" 5 | 6 | depends_on "go" => :build 7 | 8 | def install 9 | ENV["GOPATH"] = buildpath 10 | gorushpath = buildpath/"src/github.com/appleboy/gorush" 11 | gorushpath.install buildpath.children 12 | cd gorushpath do 13 | system "go", "build", "-o", bin/"gorush" 14 | prefix.install_metafiles 15 | end 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/Procfile: -------------------------------------------------------------------------------- 1 | web: bin/gorush -p $PORT 2 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/certificate/authkey-invalid.p8: -------------------------------------------------------------------------------- 1 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgEbVzfPnZPxfAyxqE 2 | ZV05laAoJAl+/6Xt2O4mOB611sOhRANCAASgFTKjwJAAU95g++/vzKWHkzAVmNMI 3 | tB5vTjZOOIwnEb70MsWZFIyUFD1P9Gwstz4+akHX7vI8BH6hHmBmfZZZ 4 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/certificate/authkey-valid.p8: -------------------------------------------------------------------------------- 1 | -----BEGIN PRIVATE KEY----- 2 | MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgEbVzfPnZPxfAyxqE 3 | ZV05laAoJAl+/6Xt2O4mOB611sOhRANCAASgFTKjwJAAU95g++/vzKWHkzAVmNMI 4 | tB5vTjZOOIwnEb70MsWZFIyUFD1P9Gwstz4+akHX7vI8BH6hHmBmfeQl 5 | -----END PRIVATE KEY----- 6 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/certificate/certificate-valid.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/certificate/certificate-valid.p12 -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/config/testdata/.gitignore: -------------------------------------------------------------------------------- 1 | config.online.yml 2 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/config/testdata/empty.yml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/config/testdata/empty.yml -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/core/core.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | const ( 4 | // PlatFormIos constant is 1 for iOS 5 | PlatFormIos = iota + 1 6 | // PlatFormAndroid constant is 2 for Android 7 | PlatFormAndroid 8 | // PlatFormHuawei constant is 3 for Huawei 9 | PlatFormHuawei 10 | //PlatFormMI constant is 4 for MI 11 | PlatFormMI 12 | ) 13 | 14 | const ( 15 | // SucceededPush is log block 16 | SucceededPush = "succeeded-push" 17 | // FailedPush is log block 18 | FailedPush = "failed-push" 19 | ) 20 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/core/queue.go: -------------------------------------------------------------------------------- 1 | package core 2 | 3 | // Queue as backend 4 | type Queue string 5 | 6 | var ( 7 | // LocalQueue for channel in Go 8 | LocalQueue Queue = "local" 9 | // NSQ a realtime distributed messaging platform 10 | NSQ Queue = "nsq" 11 | // NATS Connective Technology for Adaptive Edge & Distributed Systems 12 | NATS Queue = "nats" 13 | // Redis Pub/Sub 14 | Redis Queue = "redis" 15 | ) 16 | 17 | // IsLocalQueue check is Local Queue 18 | func IsLocalQueue(q Queue) bool { 19 | return q == LocalQueue 20 | } 21 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | gorush: 5 | image: appleboy/gorush 6 | restart: always 7 | ports: 8 | - "8088:8088" 9 | - "9000:9000" 10 | logging: 11 | options: 12 | max-size: "100k" 13 | max-file: "3" 14 | environment: 15 | - GORUSH_CORE_QUEUE_NUM=512 16 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/docker/Dockerfile.linux.amd64: -------------------------------------------------------------------------------- 1 | FROM plugins/base:linux-amd64 2 | 3 | LABEL maintainer="Bo-Yi Wu " \ 4 | org.label-schema.name="Gorush" \ 5 | org.label-schema.vendor="Bo-Yi Wu" \ 6 | org.label-schema.schema-version="1.0" 7 | 8 | COPY release/linux/amd64/gorush /bin/ 9 | 10 | EXPOSE 8088 9000 11 | HEALTHCHECK --start-period=1s --interval=10s --timeout=5s \ 12 | CMD ["/bin/gorush", "--ping"] 13 | 14 | ENTRYPOINT ["/bin/gorush"] 15 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/docker/Dockerfile.linux.arm: -------------------------------------------------------------------------------- 1 | FROM plugins/base:linux-arm 2 | 3 | LABEL maintainer="Bo-Yi Wu " \ 4 | org.label-schema.name="Gorush" \ 5 | org.label-schema.vendor="Bo-Yi Wu" \ 6 | org.label-schema.schema-version="1.0" 7 | 8 | COPY release/linux/arm/gorush /bin/ 9 | 10 | EXPOSE 8088 9000 11 | HEALTHCHECK --start-period=1s --interval=10s --timeout=5s \ 12 | CMD ["/bin/gorush", "--ping"] 13 | 14 | ENTRYPOINT ["/bin/gorush"] 15 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/docker/Dockerfile.linux.arm64: -------------------------------------------------------------------------------- 1 | FROM plugins/base:linux-arm64 2 | 3 | LABEL maintainer="Bo-Yi Wu " \ 4 | org.label-schema.name="Gorush" \ 5 | org.label-schema.vendor="Bo-Yi Wu" \ 6 | org.label-schema.schema-version="1.0" 7 | 8 | COPY release/linux/arm64/gorush /bin/ 9 | 10 | EXPOSE 8088 9000 11 | HEALTHCHECK --start-period=1s --interval=10s --timeout=5s \ 12 | CMD ["/bin/gorush", "--ping"] 13 | 14 | ENTRYPOINT ["/bin/gorush"] 15 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/docker/Dockerfile.windows.amd64: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/windows/nanoserver:1809-amd64 2 | 3 | LABEL maintainer="Bo-Yi Wu " \ 4 | org.label-schema.name="Gorush" \ 5 | org.label-schema.vendor="Bo-Yi Wu" \ 6 | org.label-schema.schema-version="1.0" 7 | 8 | COPY release/gorush.exe C:/bin/gorush.exe 9 | 10 | EXPOSE 8088 9000 11 | HEALTHCHECK --start-period=1s --interval=10s --timeout=5s \ 12 | CMD ["\\gorush.exe", "--ping"] 13 | 14 | ENTRYPOINT [ "C:\\bin\\gorush.exe" ] 15 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/helm/gorush/.helmignore: -------------------------------------------------------------------------------- 1 | # Patterns to ignore when building packages. 2 | # This supports shell glob matching, relative path matching, and 3 | # negation (prefixed with !). Only one pattern per line. 4 | .DS_Store 5 | # Common VCS dirs 6 | .git/ 7 | .gitignore 8 | .bzr/ 9 | .bzrignore 10 | .hg/ 11 | .hgignore 12 | .svn/ 13 | # Common backup files 14 | *.swp 15 | *.bak 16 | *.tmp 17 | *.orig 18 | *~ 19 | # Various IDEs 20 | .project 21 | .idea/ 22 | *.tmproj 23 | .vscode/ 24 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/helm/gorush/Chart.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v2 2 | name: gorush 3 | description: A push notification micro server using Gin framework written in Go (Golang) 4 | type: application 5 | version: 0.1.0 6 | appVersion: "1.14.0" 7 | dependencies: 8 | - name: redis 9 | version: ~14.1 10 | repository: https://charts.bitnami.com/bitnami 11 | condition: redis.enabled 12 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/helm/gorush/templates/configmap.yml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: {{ .Chart.Name }} 5 | namespace: {{ .Chart.Name }} 6 | data: 7 | # stat 8 | stats: 9 | engine: {{ .Values.stat.engine }} 10 | {{- if .Values.redis.enabled }} 11 | redis: 12 | host: {{ .Values.redis.host }}:{{ .Values.redis.port }} 13 | {{- end }} 14 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/helm/gorush/templates/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: {{ .Chart.Name }} 5 | namespace: {{ .Chart.Name }} 6 | labels: 7 | {{- include "gorush.labels" . | nindent 4 }} 8 | spec: 9 | type: {{ .Values.service.type }} 10 | ports: 11 | - port: {{ .Values.service.port }} 12 | targetPort: http 13 | protocol: TCP 14 | name: http 15 | selector: 16 | {{- include "gorush.selectorLabels" . | nindent 4 }} 17 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/helm/gorush/templates/serviceaccount.yaml: -------------------------------------------------------------------------------- 1 | {{- if .Values.serviceAccount.create -}} 2 | apiVersion: v1 3 | kind: ServiceAccount 4 | metadata: 5 | name: {{ include "gorush.serviceAccountName" . }} 6 | namespace: {{ .Chart.Name }} 7 | labels: 8 | {{- include "gorush.labels" . | nindent 4 }} 9 | {{- with .Values.serviceAccount.annotations }} 10 | annotations: 11 | {{- toYaml . | nindent 4 }} 12 | {{- end }} 13 | {{- end }} 14 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/k8s/gorush-aws-alb-ingress.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: extensions/v1beta1 2 | kind: Ingress 3 | metadata: 4 | name: gorush 5 | namespace: gorush 6 | annotations: 7 | # Kubernetes Ingress Controller for AWS ALB 8 | # https://github.com/coreos/alb-ingress-controller 9 | alb.ingress.kubernetes.io/scheme: internet-facing 10 | alb.ingress.kubernetes.io/subnets: subnet-aa3dfbe3,subnet-4aff342d 11 | alb.ingress.kubernetes.io/security-groups: sg-71069b17 12 | spec: 13 | rules: 14 | - host: gorush.example.com 15 | http: 16 | paths: 17 | - path: / 18 | backend: 19 | serviceName: gorush 20 | servicePort: 8088 21 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/k8s/gorush-configmap.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ConfigMap 3 | metadata: 4 | name: gorush-config 5 | namespace: gorush 6 | data: 7 | # stat 8 | stat.engine: redis 9 | stat.redis.host: redis:6379 10 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/k8s/gorush-namespace.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Namespace 3 | metadata: 4 | name: gorush 5 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/k8s/gorush-redis-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: redis 5 | namespace: gorush 6 | spec: 7 | selector: 8 | matchLabels: 9 | app: redis 10 | role: master 11 | tier: backend 12 | replicas: 1 13 | template: 14 | metadata: 15 | labels: 16 | app: redis 17 | role: master 18 | tier: backend 19 | spec: 20 | containers: 21 | - name: master 22 | image: redis 23 | ports: 24 | - containerPort: 6379 25 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/k8s/gorush-redis-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: redis 5 | namespace: gorush 6 | labels: 7 | app: redis 8 | role: master 9 | tier: backend 10 | spec: 11 | ports: 12 | - port: 6379 13 | targetPort: 6379 14 | selector: 15 | app: redis 16 | role: master 17 | tier: backend 18 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/logx/log/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/logx/log/.gitkeep -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/logx/log/access.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/logx/log/access.log -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/metric/metrics_test.go: -------------------------------------------------------------------------------- 1 | package metric 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestNewMetrics(t *testing.T) { 10 | m := NewMetrics() 11 | assert.Equal(t, 0, m.GetQueueUsage()) 12 | 13 | m = NewMetrics(func() int { return 1 }) 14 | assert.Equal(t, 1, m.GetQueueUsage()) 15 | } 16 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "make build_linux_lambda" 3 | functions = "release/linux/lambda" 4 | 5 | [build.environment] 6 | GO_VERSION = "1.16" 7 | GO_IMPORT_PATH = "github.com/appleboy/gorush" 8 | GO111MODULE = "on" 9 | 10 | [[redirects]] 11 | from = "/*" 12 | to = "/.netlify/functions/gorush/:splat" 13 | status = 200 14 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/notify/global.go: -------------------------------------------------------------------------------- 1 | package notify 2 | 3 | import ( 4 | "github.com/appleboy/go-fcm" 5 | "github.com/msalihkarakasli/go-hms-push/push/core" 6 | "github.com/sideshow/apns2" 7 | ) 8 | 9 | var ( 10 | // ApnsClient is apns client 11 | ApnsClient *apns2.Client 12 | // FCMClient is apns client 13 | FCMClient *fcm.Client 14 | // HMSClient is Huawei push client 15 | HMSClient *core.HMSClient 16 | // MIPUSHClient is mi push client 17 | MIPUSHClient *XMPush 18 | // MaxConcurrentIOSPushes pool to limit the number of concurrent iOS pushes 19 | MaxConcurrentIOSPushes chan struct{} 20 | ) 21 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/notify/main_test.go: -------------------------------------------------------------------------------- 1 | package notify 2 | 3 | import ( 4 | "log" 5 | "os" 6 | "testing" 7 | 8 | "github.com/appleboy/gorush/config" 9 | "github.com/appleboy/gorush/status" 10 | ) 11 | 12 | func TestMain(m *testing.M) { 13 | cfg, _ := config.LoadConf() 14 | if err := status.InitAppStatus(cfg); err != nil { 15 | log.Fatal(err) 16 | } 17 | 18 | os.Exit(m.Run()) 19 | } 20 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/rpc/client_test.go: -------------------------------------------------------------------------------- 1 | package rpc 2 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/rpc/example/node/.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | node_modules 3 | npm-debug.log 4 | .yarn-cache 5 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/rpc/example/node/README.md: -------------------------------------------------------------------------------- 1 | # gRPC in 3 minutes (Node.js) 2 | 3 | ## PREREQUISITES 4 | 5 | `node`: This requires Node 12.x or greater. 6 | 7 | ## INSTALL 8 | 9 | ```sh 10 | npm install 11 | npm install -g grpc-tools 12 | ``` 13 | 14 | ## Node gRPC protoc 15 | 16 | ```sh 17 | cd $GOPATH/src/github.com/appleboy/gorush 18 | protoc -I rpc/proto rpc/proto/gorush.proto --js_out=import_style=commonjs,binary:rpc/example/node/ --grpc_out=rpc/example/node/ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` 19 | ``` 20 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/rpc/example/node/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gorush-examples", 3 | "version": "0.1.0", 4 | "dependencies": { 5 | "async": "^3.1.0", 6 | "global": "^4.4.0", 7 | "google-protobuf": "^3.10.0", 8 | "grpc": "^1.24.9", 9 | "lodash": "^4.17.21", 10 | "minimist": ">=1.2.2" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/rpc/health.go: -------------------------------------------------------------------------------- 1 | package rpc 2 | 3 | import ( 4 | "context" 5 | ) 6 | 7 | // Health defines a health-check connection. 8 | type Health interface { 9 | // Check returns if server is healthy or not 10 | Check(c context.Context) (bool, error) 11 | } 12 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/screenshot/lambda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/screenshot/lambda.png -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/screenshot/memory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/screenshot/memory.png -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/screenshot/metrics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/screenshot/metrics.png -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/screenshot/status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/push/gorush-with-mipush/src/screenshot/status.png -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/snapcraft.yaml: -------------------------------------------------------------------------------- 1 | name: gorush 2 | version: '1.0' 3 | summary: A push notification server written in Go 4 | description: | 5 | A push notification server written in Go. 6 | grade: stable 7 | confinement: strict 8 | base: core18 9 | parts: 10 | gorush: 11 | plugin: go 12 | source: https://github.com/appleboy/gorush.git 13 | go-importpath: github.com/appleboy/gorush 14 | build-packages: 15 | - build-essential 16 | apps: 17 | gorush: 18 | command: bin/gorush 19 | daemon: simple 20 | restart-condition: on-abnormal 21 | plugs: 22 | - home 23 | - network 24 | - network-bind 25 | -------------------------------------------------------------------------------- /push/gorush-with-mipush/src/tests/test.json: -------------------------------------------------------------------------------- 1 | { 2 | "notifications": [ 3 | { 4 | "tokens": ["token_a", "token_b"], 5 | "platform": 1, 6 | "message": "Hello World iOS!" 7 | }, 8 | { 9 | "tokens": ["token_a", "token_b"], 10 | "platform": 2, 11 | "message": "Hello World Android!" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /quickapp/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /build 5 | /sign 6 | 7 | # sign 8 | 9 | # local env files 10 | .env.local 11 | .env.*.local 12 | 13 | # Log files 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | 18 | # Editor directories and files 19 | .idea 20 | .vscode 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw* 26 | .ide 27 | .quickapp.preview.json -------------------------------------------------------------------------------- /quickapp/.npmrc: -------------------------------------------------------------------------------- 1 | registry="https://registry.npm.taobao.org" -------------------------------------------------------------------------------- /quickapp/.prettierignore: -------------------------------------------------------------------------------- 1 | package.json 2 | manifest.json 3 | README.md 4 | 5 | # assets/js 6 | src/assets/js/*.js 7 | -------------------------------------------------------------------------------- /quickapp/pushdeer素材.xd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/pushdeer素材.xd -------------------------------------------------------------------------------- /quickapp/scripts/gen/template.ux: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | -------------------------------------------------------------------------------- /quickapp/src/assets/images/arrow-down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/arrow-down.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/arrow-up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/arrow-up.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/avatar.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/calendar.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/device-ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/device-ipad.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/device-iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/device-iphone.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/divider.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/divider.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/divider.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /quickapp/src/assets/images/home-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/home-background.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/index-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/index-logo.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/logo.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/plus.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-device-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-device-active.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-device.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-key-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-key-active.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-key.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-message-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-message-active.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-message.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-settings-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-settings-active.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/tabbar-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/tabbar-settings.png -------------------------------------------------------------------------------- /quickapp/src/assets/images/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/quickapp/src/assets/images/trash.png -------------------------------------------------------------------------------- /quickapp/src/assets/styles/mixins.less: -------------------------------------------------------------------------------- 1 | .flex-box-mixins (@column, @justify, @align) { 2 | flex-direction: @column; 3 | justify-content: @justify; 4 | align-items: @align; 5 | } -------------------------------------------------------------------------------- /quickapp/src/assets/styles/style.less: -------------------------------------------------------------------------------- 1 | @import './variables.less'; 2 | @import './mixins.less'; 3 | -------------------------------------------------------------------------------- /quickapp/src/assets/styles/variables.less: -------------------------------------------------------------------------------- 1 | @primary-color: #3b4789; 2 | @secondry-color: #d6d6d6; 3 | @font-color: #a7a7a7; -------------------------------------------------------------------------------- /quickapp/src/sitemap.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": [{ "rule": "enable", "page": "*" }] 3 | } 4 | -------------------------------------------------------------------------------- /self-hosted-push-server/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /self-hosted-push-server/config.js: -------------------------------------------------------------------------------- 1 | module.exports = config = { 2 | port: 5003, 3 | mainServerAuthToken: "asdfghjkl", 4 | hosts: [ 5 | "127.0.0.1" 6 | ], 7 | mainServerUrl:"http://127.0.0.1:4567" 8 | }; -------------------------------------------------------------------------------- /self-hosted-push-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "self-hosted-push-server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "nodemon node index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "Wolf Hugo", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@socket.io/admin-ui": "^0.2.0", 14 | "axios": "^0.26.0", 15 | "compression": "^1.7.4", 16 | "cors": "^2.8.5", 17 | "express": "^4.17.1", 18 | "http": "^0.0.1-security", 19 | "https": "^1.0.0", 20 | "nodemon": "^2.0.14", 21 | "socket.io": "^4.3.1" 22 | } 23 | } -------------------------------------------------------------------------------- /self-hosted-push-server/public/css/app.64cb6d3f.css: -------------------------------------------------------------------------------- 1 | .chart[data-v-58987bf8],.chart[data-v-d6482f56]{max-width:160px;margin:20px}.select-room[data-v-d014ee1e],.selector[data-v-2c330798]{max-width:200px}.key-column[data-v-1a6e3452],.key-column[data-v-8d2424e4],.key-column[data-v-18284f59]{width:30%} -------------------------------------------------------------------------------- /self-hosted-push-server/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/easychen/pushdeer/1f15865c051bce258137d66ab30457bbd449d0d4/self-hosted-push-server/public/favicon.png -------------------------------------------------------------------------------- /self-hosted-push-server/public/img/logo-dark.3727fec5.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /self-hosted-push-server/public/img/logo-light.73342c25.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | --------------------------------------------------------------------------------