From e86113eaffc5e83cc48b02bcb7cf93398798fbe7 Mon Sep 17 00:00:00 2001 From: Liuyf Date: Thu, 20 Feb 2025 19:07:11 +0800 Subject: [PATCH] project init --- .DS_Store | Bin 0 -> 6148 bytes .gitignore | 1 + CHANGELOG.md | 197 +++++ LICENSE | 21 + README.md | 120 +-- android/.DS_Store | Bin 0 -> 6148 bytes android/build.gradle | 39 + android/gradle.properties | 1 + android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + android/gradlew | 160 ++++ android/gradlew.bat | 90 ++ android/settings.gradle | 1 + android/src/main/AndroidManifest.xml | 41 + .../com/jiguang/jpush/JPushCustomService.java | 6 + .../com/jiguang/jpush/JPushEventReceiver.java | 238 ++++++ .../java/com/jiguang/jpush/JPushHelper.java | 363 ++++++++ .../java/com/jiguang/jpush/JPushPlugin.java | 618 ++++++++++++++ documents/APIs.md | 282 +++++++ example/.DS_Store | Bin 0 -> 6148 bytes example/README.md | 8 + example/android/.DS_Store | Bin 0 -> 6148 bytes example/android/app/build.gradle | 96 +++ .../android/app/src/main/AndroidManifest.xml | 54 ++ .../jiguang/jpushexample/MainActivity.java | 6 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + example/android/build.gradle | 31 + example/android/gradle.properties | 22 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + example/android/gradlew | 160 ++++ example/android/gradlew.bat | 90 ++ example/android/key.properties | 4 + example/android/settings.gradle | 15 + example/ios/.DS_Store | Bin 0 -> 6148 bytes example/ios/Flutter/AppFrameworkInfo.plist | 26 + example/ios/Flutter/Debug.xcconfig | 2 + example/ios/Flutter/Flutter.podspec | 18 + example/ios/Flutter/Release.xcconfig | 2 + example/ios/Runner.xcodeproj/project.pbxproj | 494 +++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 93 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + example/ios/Runner/AppDelegate.h | 6 + example/ios/Runner/AppDelegate.m | 14 + .../AppIcon.appiconset/Contents.json | 122 +++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 11112 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + example/ios/Runner/Base.lproj/Main.storyboard | 26 + example/ios/Runner/Info.plist | 50 ++ example/ios/Runner/Runner.entitlements | 8 + example/ios/Runner/main.m | 9 + example/ios/Runner/sound.caf | Bin 0 -> 129556 bytes example/lib/main.dart | 388 +++++++++ example/pubspec.yaml | 72 ++ example/test/widget_test.dart | 54 ++ ios/.DS_Store | Bin 0 -> 6148 bytes ios/Classes/JPushPlugin.h | 5 + ios/Classes/JPushPlugin.m | 793 ++++++++++++++++++ ios/jpush_flutter.podspec | 22 + lib/jpush_flutter.dart | 525 ++++++++++++ pubspec.yaml | 61 ++ 89 files changed, 5528 insertions(+), 76 deletions(-) create mode 100644 .DS_Store create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 android/.DS_Store create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.jar create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/gradlew create mode 100644 android/gradlew.bat create mode 100644 android/settings.gradle create mode 100644 android/src/main/AndroidManifest.xml create mode 100644 android/src/main/java/com/jiguang/jpush/JPushCustomService.java create mode 100644 android/src/main/java/com/jiguang/jpush/JPushEventReceiver.java create mode 100644 android/src/main/java/com/jiguang/jpush/JPushHelper.java create mode 100644 android/src/main/java/com/jiguang/jpush/JPushPlugin.java create mode 100644 documents/APIs.md create mode 100644 example/.DS_Store create mode 100644 example/README.md create mode 100644 example/android/.DS_Store create mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/src/main/AndroidManifest.xml create mode 100644 example/android/app/src/main/java/com/jiguang/jpushexample/MainActivity.java create mode 100644 example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/values-night/styles.xml create mode 100644 example/android/app/src/main/res/values/styles.xml create mode 100644 example/android/build.gradle create mode 100644 example/android/gradle.properties create mode 100644 example/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 example/android/gradlew create mode 100644 example/android/gradlew.bat create mode 100644 example/android/key.properties create mode 100644 example/android/settings.gradle create mode 100644 example/ios/.DS_Store create mode 100644 example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 example/ios/Flutter/Debug.xcconfig create mode 100644 example/ios/Flutter/Flutter.podspec create mode 100644 example/ios/Flutter/Release.xcconfig create mode 100644 example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 example/ios/Runner/AppDelegate.h create mode 100644 example/ios/Runner/AppDelegate.m create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 example/ios/Runner/Info.plist create mode 100644 example/ios/Runner/Runner.entitlements create mode 100644 example/ios/Runner/main.m create mode 100755 example/ios/Runner/sound.caf create mode 100644 example/lib/main.dart create mode 100644 example/pubspec.yaml create mode 100644 example/test/widget_test.dart create mode 100644 ios/.DS_Store create mode 100644 ios/Classes/JPushPlugin.h create mode 100644 ios/Classes/JPushPlugin.m create mode 100644 ios/jpush_flutter.podspec create mode 100644 lib/jpush_flutter.dart create mode 100644 pubspec.yaml diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4256433339abdd63870100699f7ab01fcb3eff59 GIT binary patch literal 6148 zcmeHKu};G<5Iwh%T43qGfS9r&#;%AVRAC0G11q$t04X6APzjjw39Rq~h>;DLDug=o z0qpz+?`*e?n-sBt5W17>=lJgYF0YDR6On2Sq9##;i0WvJ-XgjZV?VcoRqV_%Q0X;N zI;JQ-Y__{;AzCIx0a4(uDZt-ujSlF9B08nq_nY)}scN)Wj7ZWj?8IpYp8DPE)8*Ce zXsawL`bJd$h<6LiR@r6J1=NyKmj;wj50#zMnb}ip6s`K@QTe*=-yX+xm8_Sf)7rj{ zbm}7}hF(3ofMyBxDW;xNoA>@ujL6qT!EI&;y=4-^Rz}cbIsm+84bpU%-4~KcfK7Y_|H6 zLFq*SQ9u-!D8T!JkH#2S%na(S1D(DC06k1=!??i%pl>m-m>Glzrc5f(q$+#GP$nJo zzKshkW(G|wiqh;@-`C-!0)x_v0-}JcK-D}p`263VfB$!rBY~v&XR>@KL;irVT!y2f)B$W)L$l`6HlZkWLi% HRRul)3n8va literal 0 HcmV?d00001 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..85e7c1d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea/ diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..bb30513 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,197 @@ +## 2.5.8 +修复onCommandResult 方法崩溃 +## 2.5.7 +修复onCommandResult 方法中没有 extra 参数问题,都放到map中 +## 2.5.6 +修复清单文件少包名问题 +## 2.5.5 +修复后台不能获取回调的问题 +## 2.5.4 +修复在map中且套map不能获取数据问题 +## 2.5.3 +1、升级 iOS SDK JPush 5.3.0, 升级 android JPush 5.4.0 +2、开放 setLinkMergeEnable、setGeofenceEnable、setSmartPushEnable、setCollectControl 接口设置 +3、删除 setLbsEnable 接口设置 +## 2.5.2 +开放支持动态设置appkey +## 2.5.1 +JPush 523 +## 2.5.0 +更新JCore 440 JPush 520 +## 2.4.9 +修复testCountryCode报错问题 +## 2.4.8 +修复不能清理本地通知问题 +## 2.4.7 +开放requestRequiredPermission API +## 2.4.6 +开放setChannelAndSound API +## 2.4.5 ++ 修复:onConnected 崩溃问题 ++ 升级:升级 Android+IOS JPush 5.0.4 + 升级 Android+IOS JCore 4.2.4 ++ 新增:setLbsEnable API +## 2.4.4 ++ 修复:优化代码结构 +## 2.4.3 ++ 升级:升级 Android+IOS JPush 5.0.0 + 升级 Android+IOS JCore 4.2.0 + + 新增:enableAutoWakeup API +## 2.4.2 +开放 onConnected 回调 +## 2.4.1 ++ 升级:升级 Android JPush 4.9.0 + 升级 Android JCore 4.1.0 +## 2.4.0 ++ 升级:升级 Android JPush 4.8.4 +## 2.3.9 ++ 升级:升级 Android JPush 4.8.3 + 升级 Android JCore 3.3.6 +## 2.3.8 ++ 新增:testCountryCode API +## 2.3.7 ++ 升级:升级 Android JPush 4.8.1 + 升级 Android JCore 3.3.2 + 升级 IOS JPush 4.8.1 + 升级 IOS JCore 3.2.5 +## 2.3.6 ++ 新增:修复崩溃问题 +## 2.3.5 ++ 新增:iOS新增getAlias接口实现 +## 2.3.4 ++ 升级:升级 Android JPush 4.7.2 + 升级 Android JCore 3.3.0 +## 2.3.3 ++ 升级:升级 Android JPush 4.7.0 +## 2.3.2 ++ 新增:修复setAuth()方法问题 +## 2.3.1 ++ 新增:iOS对外暴露setAuth()方法 +## 2.3.0 ++ 新增:对外暴露setAuth()方法 + 修复:点开通知会默认跳转到主页问题 +## 2.2.9 ++ 升级:升级 Android JPush 4.6.6 +## 2.2.8 ++ 升级:使用g版本 +## 2.2.7 ++ 升级:升级 Android JCore 3.2.4 +## 2.2.6 ++ 修复:自定义消息解析崩溃问题 +## 2.2.5 ++ 升级:jpsuh 4.6.4 jcore 3.2.2 +## 2.2.4 ++ 修复:iOS点击通知冷启动app,不回调onOpenNotification问题 +## 2.2.3 ++ 升级:jpsuh 4.6.0 +## 2.2.2 ++ 新增:getAlias接口 +## 2.2.1 ++ 升级:iOS:jpush3.7.0->jpus4.4.0 +## 2.2.0 ++ 修复channel为null时,异常崩溃问题 +## 2.1.9 ++ 升级:新增onNotifyMessageUnShow方法 +## 2.1.8 ++ 升级: jpush 4.4.5 +## 2.1.7 ++ 升级: jcore 3.1.0 +## 2.1.6 ++ 升级:升级 android push 4.4.0 jcore 3.0.0 +## 2.1.5 ++ 升级:升级 android push 4.2.8 jcore 2.9.0,ios push 3.7.0,jcore 2.7.1。 +## 2.1.4 ++ 新增:Android push 新增 setWakeEnable 接口 +## 2.1.2 ++ 升级:升级 android push 4.0.8 jcore 2.8.2,ios push 3.6.1,jcore 2.6.2。 +## 2.0.9 ++ 适配:处理 demo 运行时报错。 +## 2.0.7 ++ 适配:适配 null safety +## 2.0.5 ++ 升级:android jcore 升级 2.7.8 +## 2.0.3 ++ 升级:android push 升级4.0.6,ios push 升级 3.5.2 +## 2.0.1 ++ 适配Flutter 2.0,Flutter 2.0 以下版本请使用 0.6.3版本 +## 0.6.3 ++ 修复:Android端获取RegistrationID偶现奔溃问题 +## 0.6.2 ++ 同步更最新版本SDK +## 0.6.1 ++ 修复:Android 端 context为空时的crash问题 +## 0.6.0 ++ 修复:修复已知bug +## 0.5.9 ++ 适配最新版本 JPush SDK Android 3.8.0 , IOS 3.3.6 +## 0.5.6 ++ 修复:iOS点击本地通知的通知栏消息缺少extras 字段 +## 0.5.5 ++ 适配iOS点击本地通知的通知栏消息响应事件 ++ 更新最新Android SDK +## 0.5.3 ++ 修复一个可能引起崩溃的日志打印代码 +## 0.5.2 ++ 内部安全策略优化 ++ 同步 JPush SDK 版本 +## 0.5.1 ++ 修改 minSdkVersion 最小支持 17 +## 0.5.0 ++ 适配最新版本 JPush SDK ++ 适配新版 SDK 的新功能接口 +## 0.3.0 ++ 新增:清除通知栏单条通知方法 ++ 修复:点击通知栏无法获取消息问题 ++ 同步最新版 SDK +## 0.2.0 ++ 适配最新版本 JPush SDK ++ Android 支持设置角标 badge +## 0.1.0 ++ 修复:调用 sendLocalNotification 接口 crash 问题; ++ 修复:iOS 启动 APP 角标自动消失问题; ++ 修复执行 flutter build apk 打包错误问题; ++ 更新配置 + +## 0.0.13 + +featurn: +适配flutter 1.7.8 +升级 jpush sdk 版本为3.3.4 + +## 0.0.12 + +featurn: 修改LocalNotification的属性名为"extra" + +## 0.0.11 + +iOS: 修复 getLaunchAppNotification 返回 null 的情况。 +featurn: APNS 推送字段将 extras 字段移动到 notification.extras 中和 android 保持一致。 + +## 0.0.9 + +android: 修复 JPushReceiver 类型转换的错误。 + +## 0.0.8 + +更新 setup 方法,android 端现在支持 channel 字段,用于动态设置 channel,和 iOS 保持一致。 +注意通过 setup 设置 的 channel 会覆盖 manifestPlaceholders 中的 JPUSH_CHANNEL 字段。 + +## 0.0.7 + +修改 setup 方法,添加 boolean debug 参数,如果 debug 为 true 这打印日志,如果为 false 则不打印日志。 + +## 0.0.6 + + 增加 swift 工程支持。 + + +## 0.0.3 +添加 localnotification api。 + +## 0.0.2 + +修复 android 类名文件名不匹配问题。 + +## 0.0.1 + +第一个版本。 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..93db799 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 极光开发者 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 8ca988f..4c10820 100644 --- a/README.md +++ b/README.md @@ -1,93 +1,61 @@ -# jpush_flutter_sdk +[![QQ Group](https://img.shields.io/badge/QQ%20Group-862401307-red.svg)]() +# JPush Flutter Plugin +### 安装 - -## Getting started - -To make it easy for you to get started with GitLab, here's a list of recommended next steps. - -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! - -## Add your files - -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: +在工程 pubspec.yaml 中加入 dependencies ``` -cd existing_repo -git remote add origin http://code-internal.star-lock.cn/liuyanfeng/jpush_flutter_sdk.git -git branch -M main -git push -uf origin main + +//github 集成 +dependencies: + jpush_flutter: + git: + url: git://github.com/jpush/jpush-flutter-plugin.git + ref: dev-2.x + +// pub 集成 +dependencies: + jpush_flutter: 2.5.8 ``` -## Integrate with your tools +### 配置 -- [ ] [Set up project integrations](http://code-internal.star-lock.cn/liuyanfeng/jpush_flutter_sdk/-/settings/integrations) +##### Android: -## Collaborate with your team +在 `/android/app/build.gradle` 中添加下列代码: -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) +```groovy +android: { + .... + defaultConfig { + applicationId "替换成自己应用 ID" + ... + ndk { + //选择要添加的对应 cpu 类型的 .so 库。 + abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a', + } -## Test and Deploy + manifestPlaceholders = [ + JPUSH_PKGNAME : applicationId, + JPUSH_APPKEY : "appkey", // NOTE: JPush 上注册的包名对应的 Appkey. + JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. + ] + } +``` +##### iOS: -Use the built-in continuous integration in GitLab. +- 在 xcode8 之后需要点开推送选项: TARGETS -> Capabilities -> Push Notification 设为 on 状态 -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) +### 使用 -*** +```dart +import 'package:jpush_flutter/jpush_flutter.dart'; +``` -# Editing this README +### APIs -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. +**注意** : 需要先调用 JPush.setup 来初始化插件,才能保证其他功能正常工作。 -## Suggestions for a good README + [参考](./documents/APIs.md) -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. - -## Name -Choose a self-explaining name for your project. - -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. - -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. - -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. - -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. - -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. - -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. - -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. - -## Contributing -State if you are open to contributions and what your requirements are for accepting them. - -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. - -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. - -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. - -## License -For open source projects, say how it is licensed. - -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/android/.DS_Store b/android/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1dc61fb9af926bb83103834d1099bc71a7a6ceb5 GIT binary patch literal 6148 zcmeHKOHRWu5S^hFio~YNE`5dGAXMQ5y#Ta9tx%#=MJ!}Su%<2)(0hlqH3RZfUTM3kWkvJ84e)V-zya~30~H7Yu`$vYM-Y!EI|Xh#6A{n z1|M&Cmi^qT_xo*bi>sSm)~>ak?^W`-I0MdrGvEyTPX=&ji)2TN-a7-%fHUyPfSeBj zO)xi%is|S;mr4NO5b7itOD!QW!7w+Bim*UfLxCE~R${P*Lm$j9H;jrJPHe>oTjp)? z!YMn}56PW4SM=T)a0c2840Jk@`~L*LOmC6j4)K{Y;0*jR26$M^iYY$I?$*xd$z2=J uPSHffFUkOdaqAI)iJT+jWK?^QG5m7Fs3@z5K7|AQA&?01&KdXt20j3%L`%>B literal 0 HcmV?d00001 diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..20aa241 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,39 @@ +group 'com.jiguang.jpush' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + mavenCentral() + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.3' + } +} + +rootProject.allprojects { + repositories { + mavenCentral() + google() + jcenter() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 17 + } + lintOptions { + disable 'InvalidPackage' + } +} + +dependencies { + implementation 'cn.jiguang.sdk:jpush:5.4.0' +} \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..8bd86f6 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..ea402fd --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jul 26 11:14:36 CST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..82e13ec --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'jpush' diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..6a407ba --- /dev/null +++ b/android/src/main/AndroidManifest.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/src/main/java/com/jiguang/jpush/JPushCustomService.java b/android/src/main/java/com/jiguang/jpush/JPushCustomService.java new file mode 100644 index 0000000..2fe9d19 --- /dev/null +++ b/android/src/main/java/com/jiguang/jpush/JPushCustomService.java @@ -0,0 +1,6 @@ +package com.jiguang.jpush; + +import cn.jpush.android.service.JCommonService; + +public class JPushCustomService extends JCommonService { +} diff --git a/android/src/main/java/com/jiguang/jpush/JPushEventReceiver.java b/android/src/main/java/com/jiguang/jpush/JPushEventReceiver.java new file mode 100644 index 0000000..05a1334 --- /dev/null +++ b/android/src/main/java/com/jiguang/jpush/JPushEventReceiver.java @@ -0,0 +1,238 @@ +package com.jiguang.jpush; + +import android.content.Context; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import cn.jpush.android.api.CmdMessage; +import cn.jpush.android.api.CustomMessage; +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.JPushMessage; +import cn.jpush.android.api.NotificationMessage; +import cn.jpush.android.service.JPushMessageReceiver; +import io.flutter.plugin.common.MethodChannel.Result; + +public class JPushEventReceiver extends JPushMessageReceiver { + @Override + public void onNotifyMessageArrived(Context context, NotificationMessage notificationMessage) { + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().transmitNotificationReceive(notificationMessage); + } + }); + } + + @Override + public void onNotifyMessageOpened(Context context, NotificationMessage notificationMessage) { + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().transmitNotificationOpen(notificationMessage); + } + }); + } + + @Override + public void onMessage(Context context, CustomMessage customMessage) { + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().transmitMessageReceive(customMessage); + } + }); + } + + @Override + public void onRegister(Context context, String s) { + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().transmitReceiveRegistrationId(s); + } + }); + } + + @Override + public void onCommandResult(Context context,final CmdMessage cmdMessage) { + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().onCommandResult(cmdMessage); + } + }); + } + @Override + public void onNotifyMessageUnShow(Context context,final NotificationMessage notificationMessage) { + super.onNotifyMessageUnShow(context,notificationMessage); + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().onNotifyMessageUnShow(notificationMessage); + } + }); + } + @Override + public void onConnected(Context context,final boolean isConnected) { + //连接状态 + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().onConnected(isConnected); + } + }); + } + + @Override + public void onInAppMessageShow(Context context,final NotificationMessage message) { + Log.i("JPushPlugin", "[onInAppMessageShow], " + message.toString()); + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().onInAppMessageShow(message); + } + }); + } + + @Override + public void onInAppMessageClick(Context context,final NotificationMessage message) { + Log.i("JPushPlugin", "[onInAppMessageClick], " + message.toString()); + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + JPushHelper.getInstance().onInAppMessageClick(message); + } + }); + } + @Override + public void onTagOperatorResult(Context context, final JPushMessage jPushMessage) { + super.onTagOperatorResult(context, jPushMessage); + + final JSONObject resultJson = new JSONObject(); + + final int sequence = jPushMessage.getSequence(); + try { + resultJson.put("sequence", sequence); + } catch (JSONException e) { + e.printStackTrace(); + } + + final Result callback = JPushHelper.getInstance().getCallback(sequence);//instance.eventCallbackMap.get(sequence); + + if (callback == null) { + Log.i("JPushPlugin", "Unexpected error, callback is null!"); + return; + } + + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + if (jPushMessage.getErrorCode() == 0) { // success + Set tags = jPushMessage.getTags(); + List tagList = new ArrayList<>(tags); + Map res = new HashMap<>(); + res.put("tags", tagList); + callback.success(res); + } else { + try { + resultJson.put("code", jPushMessage.getErrorCode()); + } catch (JSONException e) { + e.printStackTrace(); + } + callback.error(Integer.toString(jPushMessage.getErrorCode()), "", ""); + } + + JPushHelper.getInstance().removeCallback(sequence); + } + }); + + } + + + + @Override + public void onCheckTagOperatorResult(Context context, final JPushMessage jPushMessage) { + super.onCheckTagOperatorResult(context, jPushMessage); + + + + final int sequence = jPushMessage.getSequence(); + + + final Result callback = JPushHelper.getInstance().getCallback(sequence);; + + if (callback == null) { + Log.i("JPushPlugin", "Unexpected error, callback is null!"); + return; + } + + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + if (jPushMessage.getErrorCode() == 0) { + Set tags = jPushMessage.getTags(); + List tagList = new ArrayList<>(tags); + Map res = new HashMap<>(); + res.put("tags", tagList); + callback.success(res); + } else { + + callback.error(Integer.toString(jPushMessage.getErrorCode()), "", ""); + } + + JPushHelper.getInstance().removeCallback(sequence); + } + }); + } + + @Override + public void onAliasOperatorResult(Context context, final JPushMessage jPushMessage) { + super.onAliasOperatorResult(context, jPushMessage); + + final int sequence = jPushMessage.getSequence(); + + + final Result callback = JPushHelper.getInstance().getCallback(sequence);; + + if (callback == null) { + Log.i("JPushPlugin", "Unexpected error, callback is null!"); + return; + } + + JPushHelper.getInstance().getHandler().post(new Runnable() { + @Override + public void run() { + if (jPushMessage.getErrorCode() == 0) { // success + Map res = new HashMap<>(); + res.put("alias", (jPushMessage.getAlias() == null)? "" : jPushMessage.getAlias()); + callback.success(res); + + } else { + callback.error(Integer.toString(jPushMessage.getErrorCode()), "", ""); + } + + JPushHelper.getInstance().removeCallback(sequence); + } + }); + } + + @Override + public void onNotificationSettingsCheck(Context context, boolean isOn, int source) { + super.onNotificationSettingsCheck(context, isOn, source); + + + HashMap map = new HashMap(); + map.put("isEnabled",isOn); + JPushHelper.getInstance().runMainThread(map,null,"onReceiveNotificationAuthorization"); + } +} diff --git a/android/src/main/java/com/jiguang/jpush/JPushHelper.java b/android/src/main/java/com/jiguang/jpush/JPushHelper.java new file mode 100644 index 0000000..0e3a96b --- /dev/null +++ b/android/src/main/java/com/jiguang/jpush/JPushHelper.java @@ -0,0 +1,363 @@ +package com.jiguang.jpush; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.text.TextUtils; +import android.util.Log; + +import org.json.JSONObject; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import cn.jpush.android.api.CmdMessage; +import cn.jpush.android.api.CustomMessage; +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.NotificationMessage; +import cn.jpush.android.local.JPushConstants; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +public class JPushHelper { + private static String TAG = "| JPUSH | Flutter | Android | "; + private List> openNotificationCache = new ArrayList<>(); + + private boolean dartIsReady = false; + private boolean jpushDidinit = false; + private Handler mHandler; + + private List getRidCache = new ArrayList<>(); + private MethodChannel channel; + private Map callbackMap = new HashMap<>(); + private WeakReference mContext; + + private JPushHelper() { + } + + private static final class SingleHolder { + private static final JPushHelper single = new JPushHelper(); + } + + public static JPushHelper getInstance() { + return SingleHolder.single; + } + + + public MethodChannel getChannel() { + return channel; + } + + public Result getCallback(int sequence) { + return callbackMap.get(sequence); + } + + public void addCallback(int sequence, Result result) { + callbackMap.put(sequence, result); + } + + public void removeCallback(int sequence) { + callbackMap.remove(sequence); + } + + public void addRid(Result result) { + getRidCache.add(result); + } + + + public Handler getHandler() { + if (mHandler == null) { + mHandler = new Handler(Looper.getMainLooper()); + } + return mHandler; + } + + public void setMethodChannel(MethodChannel channel) { + this.channel = channel; + } + + public void setContext(Context context) { + if (mContext != null) { + mContext.clear(); + mContext = null; + } + mContext = new WeakReference<>(context.getApplicationContext()); + mHandler = new Handler(Looper.getMainLooper()); + } + + public void setDartIsReady(boolean isReady) { + dartIsReady = isReady; + } + + public void setJpushDidinit(boolean jpushDidinit) { + this.jpushDidinit = jpushDidinit; + } + + public void dispatchNotification() { + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + List tempList = new ArrayList(); + if (dartIsReady) { + // try to shedule notifcation cache + List> openNotificationCacheList = openNotificationCache; + for (Map notification : openNotificationCacheList) { + channel.invokeMethod("onOpenNotification", notification); + tempList.add(notification); + } + openNotificationCacheList.removeAll(tempList); + tempList.clear(); + } + } + + public void dispatchRid() { + if (mContext == null || mContext.get() == null) { + return; + } + List tempList = new ArrayList(); + String rid = JPushInterface.getRegistrationID(mContext.get()); + boolean ridAvailable = rid != null && !rid.isEmpty(); + if (ridAvailable && dartIsReady) { + // try to schedule get rid cache + tempList.clear(); + List resultList = getRidCache; + for (Result res : resultList) { + Log.d(TAG, "scheduleCache rid = " + rid); + res.success(rid); + tempList.add(res); + } + resultList.removeAll(tempList); + tempList.clear(); + } + } + + + public void transmitMessageReceive(CustomMessage customMessage) { + Log.d(TAG, "transmitMessageReceive " + "customMessage=" + customMessage); + + if (channel == null) { + Log.d(TAG, "the instance is null"); + return; + } + Map msg = new HashMap<>(); + msg.put("message", customMessage.message); + msg.put("alert", customMessage.title); + msg.put("extras", getExtras(customMessage)); + Log.d(TAG, "transmitMessageReceive msg=" + msg); + channel.invokeMethod("onReceiveMessage", msg); + } + + public void transmitNotificationOpen(NotificationMessage notificationMessage) { + Log.d(TAG, "transmitNotificationOpen notificationMessage=" + notificationMessage); + Map notification = new HashMap<>(); + notification.put("title", notificationMessage.notificationTitle); + notification.put("alert", notificationMessage.notificationContent); + notification.put("extras", getExtras(notificationMessage)); + openNotificationCache.add(notification); + Log.d(TAG, "transmitNotificationOpen notification=" + notification); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Log.d(TAG, "instance.dartIsReady =" + dartIsReady); + if (dartIsReady) { + channel.invokeMethod("onOpenNotification", notification); + openNotificationCache.remove(notification); + } + } + + public void transmitNotificationReceive(NotificationMessage notificationMessage) { + Log.d(TAG, "transmitNotificationReceive notificationMessage=" + notificationMessage); +// Log.d(TAG, "transmitNotificationReceive " + "title=" + title + "alert=" + alert + "extras=" + extras); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Map notification = new HashMap<>(); + notification.put("title", notificationMessage.notificationTitle); + notification.put("alert", notificationMessage.notificationContent); + notification.put("extras", getExtras(notificationMessage)); + Log.d(TAG, "transmitNotificationReceive notification=" + notification); + channel.invokeMethod("onReceiveNotification", notification); + } + + public void onCommandResult(CmdMessage cmdMessage) { + Log.e(TAG, "[onCommandResult] message:" + cmdMessage); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Map notification = new HashMap<>(); + notification.put("cmd", cmdMessage.cmd); + notification.put("errorCode", cmdMessage.errorCode); + notification.put("msg", cmdMessage.msg); + notification.put("extras", bundleToMap(cmdMessage.extra)); + channel.invokeMethod("onCommandResult", notification); + } + + public void onNotifyMessageUnShow(NotificationMessage notificationMessage) { + Log.e(TAG, "[onNotifyMessageUnShow] message:" + notificationMessage); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Map notification = new HashMap<>(); + notification.put("title", notificationMessage.notificationTitle); + notification.put("alert", notificationMessage.notificationContent); + notification.put("extras", getExtras(notificationMessage)); + channel.invokeMethod("onNotifyMessageUnShow", notification); + } + + public void onConnected(boolean isConnected) { + Log.e(TAG, "[onConnected] :" + isConnected); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Map results = new HashMap<>(); + results.put("result", isConnected); + channel.invokeMethod("onConnected", results); + } + + public void onInAppMessageShow(NotificationMessage notificationMessage) { + Log.e(TAG, "[onInAppMessageShow] :" + notificationMessage); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Map notification = new HashMap<>(); + notification.put("title", notificationMessage.inAppMsgTitle); + notification.put("alert", notificationMessage.inAppMsgContentBody); + notification.put("messageId", notificationMessage.msgId); + notification.put("inAppShowTarget", notificationMessage.inAppShowTarget); + notification.put("inAppClickAction", notificationMessage.inAppClickAction); + notification.put("inAppExtras", stringToMap(notificationMessage.inAppExtras)); + channel.invokeMethod("onInAppMessageShow", notification); + } + + public void onInAppMessageClick(NotificationMessage notificationMessage) { + Log.e(TAG, "[onInAppMessageClick] :" + notificationMessage); + if (channel == null) { + Log.d(TAG, "the channel is null"); + return; + } + Map notification = new HashMap<>(); + notification.put("title", notificationMessage.inAppMsgTitle); + notification.put("alert", notificationMessage.inAppMsgContentBody); + notification.put("messageId", notificationMessage.msgId); + notification.put("inAppShowTarget", notificationMessage.inAppShowTarget); + notification.put("inAppClickAction", notificationMessage.inAppClickAction); + notification.put("inAppExtras", stringToMap(notificationMessage.inAppExtras)); + channel.invokeMethod("onInAppMessageClick", notification); + } + + private Map getExtras(CustomMessage customMessage) { + Map extra = new HashMap<>(); + extra.put(JPushInterface.EXTRA_EXTRA, stringToMap(customMessage.extra)); + extra.put(JPushInterface.EXTRA_MSG_ID, customMessage.messageId); + extra.put(JPushInterface.EXTRA_CONTENT_TYPE, customMessage.contentType); + if (JPushConstants.SDK_VERSION_CODE >= 387) { + extra.put(JPushInterface.EXTRA_TYPE_PLATFORM, customMessage.platform); + } + return extra; + } + + private Map getExtras(NotificationMessage notificationMessage) { + Map extras = new HashMap<>(); + try { + extras.put(JPushInterface.EXTRA_MSG_ID, notificationMessage.msgId); + extras.put(JPushInterface.EXTRA_NOTIFICATION_ID, notificationMessage.notificationId); + extras.put(JPushInterface.EXTRA_ALERT_TYPE, notificationMessage.notificationAlertType + ""); + extras.put(JPushInterface.EXTRA_EXTRA, stringToMap(notificationMessage.notificationExtras)); + if (notificationMessage.notificationStyle == 1 && !TextUtils.isEmpty(notificationMessage.notificationBigText)) { + extras.put(JPushInterface.EXTRA_BIG_TEXT, notificationMessage.notificationBigText); + } else if (notificationMessage.notificationStyle == 2 && !TextUtils.isEmpty(notificationMessage.notificationInbox)) { + extras.put(JPushInterface.EXTRA_INBOX, notificationMessage.notificationInbox); + } else if ((notificationMessage.notificationStyle == 3) && !TextUtils.isEmpty(notificationMessage.notificationBigPicPath)) { + extras.put(JPushInterface.EXTRA_BIG_PIC_PATH, notificationMessage.notificationBigPicPath); + } + if (!(notificationMessage.notificationPriority == 0)) { + extras.put(JPushInterface.EXTRA_NOTI_PRIORITY, notificationMessage.notificationPriority + ""); + } + if (!TextUtils.isEmpty(notificationMessage.notificationCategory)) { + extras.put(JPushInterface.EXTRA_NOTI_CATEGORY, notificationMessage.notificationCategory); + } + if (!TextUtils.isEmpty(notificationMessage.notificationSmallIcon)) { + extras.put(JPushInterface.EXTRA_NOTIFICATION_SMALL_ICON, notificationMessage.notificationSmallIcon); + } + if (!TextUtils.isEmpty(notificationMessage.notificationLargeIcon)) { + extras.put(JPushInterface.EXTRA_NOTIFICATION_LARGET_ICON, notificationMessage.notificationLargeIcon); + } + } catch (Throwable e) { + Log.e(TAG, "[onNotifyMessageUnShow] e:" + e.getMessage()); + } + return extras; + } + public static Map bundleToMap(Bundle bundle) { + Map map = new HashMap<>(); + if (bundle != null) { + for (String key : bundle.keySet()) { + if("intent_component".equals(key)||"intent_action".equals(key)){ + continue; + } + Object value = bundle.get(key); + map.put(key, value); + } + } + return map; + } + public Map stringToMap(String extra) { + Map useExtra = new HashMap(); + try { + if (TextUtils.isEmpty(extra)) { + return useExtra; + } + JSONObject object = new JSONObject(extra); + Iterator keys = object.keys(); + while (keys.hasNext()) { + String key = keys.next(); + Object value = object.get(key); + useExtra.put(key, value); + } + } catch (Throwable throwable) { + } + return useExtra; + } + + + public void transmitReceiveRegistrationId(String rId) { + Log.d(TAG, "transmitReceiveRegistrationId: " + rId); + jpushDidinit = true; + dispatchNotification(); + dispatchRid(); + } + + // 主线程再返回数据 + public void runMainThread(final Map map, final Result result, final String method) { + Log.d(TAG, "runMainThread:" + "map = " + map + ",method =" + method); + getHandler().post(new Runnable() { + @Override + public void run() { + if (result == null && method != null) { + if (null != channel) { + channel.invokeMethod(method, map); + } else { + Log.d(TAG, "channel is null do nothing"); + } + } else { + result.success(map); + } + } + }); + } +} diff --git a/android/src/main/java/com/jiguang/jpush/JPushPlugin.java b/android/src/main/java/com/jiguang/jpush/JPushPlugin.java new file mode 100644 index 0000000..a8d74c5 --- /dev/null +++ b/android/src/main/java/com/jiguang/jpush/JPushPlugin.java @@ -0,0 +1,618 @@ +package com.jiguang.jpush; + +import android.app.Activity; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.text.TextUtils; +import android.util.Log; + +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import cn.jpush.android.data.JPushConfig; +import cn.jiguang.api.JCoreInterface; +import cn.jiguang.api.utils.JCollectionAuth; +import cn.jpush.android.api.JPushInterface; +import cn.jpush.android.api.NotificationMessage; +import cn.jpush.android.data.JPushCollectControl; +import cn.jpush.android.data.JPushLocalNotification; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.MethodCallHandler; +import io.flutter.plugin.common.MethodChannel.Result; + +/** + * JPushPlugin + */ +public class JPushPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware { + private static String TAG = "| JPUSH | Flutter | Android | "; + private Context context; + private Activity mActivity; + private int sequence; + public JPushPlugin() { + this.sequence = 0; + } + + @Override + public void onAttachedToEngine(FlutterPluginBinding flutterPluginBinding) { + MethodChannel channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "jpush"); + channel.setMethodCallHandler(this); + context = flutterPluginBinding.getApplicationContext(); + JPushHelper.getInstance().setMethodChannel(channel); + JPushHelper.getInstance().setContext(context); + } + @Override + public void onAttachedToActivity(ActivityPluginBinding activityPluginBinding) { + if(activityPluginBinding!=null){ + mActivity = activityPluginBinding.getActivity(); + } + } + + @Override + public void onDetachedFromActivityForConfigChanges() { + + } + + @Override + public void onReattachedToActivityForConfigChanges(ActivityPluginBinding activityPluginBinding) { + } + + @Override + public void onDetachedFromActivity() { + + } + @Override + public void onDetachedFromEngine(FlutterPluginBinding binding) { + MethodChannel channel =JPushHelper.getInstance().getChannel(); + if(channel!=null){ + channel.setMethodCallHandler(null); + } + JPushHelper.getInstance().setDartIsReady(false); + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + Log.i(TAG, call.method); + if (call.method.equals("getPlatformVersion")) { + result.success("Android " + android.os.Build.VERSION.RELEASE); + } else if (call.method.equals("setup")) { + setup(call, result); + } else if (call.method.equals("setTags")) { + setTags(call, result); + } else if (call.method.equals("cleanTags")) { + cleanTags(call, result); + } else if (call.method.equals("addTags")) { + addTags(call, result); + } else if (call.method.equals("deleteTags")) { + deleteTags(call, result); + } else if (call.method.equals("getAllTags")) { + getAllTags(call, result); + } else if (call.method.equals("setAlias")) { + setAlias(call, result); + } else if (call.method.equals("getAlias")) { + getAlias(call, result); + } else if (call.method.equals("deleteAlias")) { + deleteAlias(call, result); + ; + } else if (call.method.equals("stopPush")) { + stopPush(call, result); + } else if (call.method.equals("resumePush")) { + resumePush(call, result); + } else if (call.method.equals("clearAllNotifications")) { + clearAllNotifications(call, result); + }else if (call.method.equals("clearLocalNotifications")) { + clearLocalNotifications(call, result); + } else if (call.method.equals("clearNotification")) { + clearNotification(call, result); + } else if (call.method.equals("getLaunchAppNotification")) { + getLaunchAppNotification(call, result); + } else if (call.method.equals("getRegistrationID")) { + getRegistrationID(call, result); + } else if (call.method.equals("sendLocalNotification")) { + sendLocalNotification(call, result); + } else if (call.method.equals("setBadge")) { + setBadge(call, result); + } else if (call.method.equals("isNotificationEnabled")) { + isNotificationEnabled(call, result); + } else if (call.method.equals("openSettingsForNotification")) { + openSettingsForNotification(call, result); + } else if (call.method.equals("setWakeEnable")) { + setWakeEnable(call, result); + } else if (call.method.equals("setAuth")) { + setAuth(call, result); + } else if (call.method.equals("testCountryCode")) { + testCountryCode(call, result); + }else if (call.method.equals("enableAutoWakeup")) { + enableAutoWakeup(call, result); + } else if (call.method.equals("setLinkMergeEnable")) { + setLinkMergeEnable(call, result); + } else if (call.method.equals("setGeofenceEnable")) { + setGeofenceEnable(call, result); + } else if (call.method.equals("setSmartPushEnable")) { + setSmartPushEnable(call, result); + }else if (call.method.equals("setCollectControl")) { + setCollectControl(call, result); + }else if (call.method.equals("setChannelAndSound")) { + setChannelAndSound(call, result); + }else if (call.method.equals("requestRequiredPermission")) { + requestRequiredPermission(call, result); + } else { + result.notImplemented(); + } + } + public void requestRequiredPermission(MethodCall call, Result result){ + JPushInterface.requestRequiredPermission(mActivity); + } + public void setChannelAndSound(MethodCall call, Result result) { + HashMap readableMap = call.arguments(); + if (readableMap == null) { + return; + } + String channel = (String)readableMap.get("channel"); + String channelId = (String)readableMap.get("channel_id"); + String sound = (String)readableMap.get("sound"); + try { + NotificationManager manager= (NotificationManager) context.getSystemService("notification"); + if(Build.VERSION.SDK_INT<26){ + return; + } + if(TextUtils.isEmpty(channel)||TextUtils.isEmpty(channelId)){ + return; + } + NotificationChannel channel1=new NotificationChannel(channelId,channel, NotificationManager.IMPORTANCE_HIGH); + if(!TextUtils.isEmpty(sound)){ + channel1.setSound(Uri.parse("android.resource://"+context.getPackageName()+"/raw/"+sound),null); + } + manager.createNotificationChannel(channel1); + JPushInterface.setChannel(context,channel); + Log.d(TAG,"setChannelAndSound channelId="+channelId+" channel="+channel+" sound="+sound); + + }catch (Throwable throwable){ + } + } + private void setLinkMergeEnable(MethodCall call, Result result) { + HashMap map = call.arguments(); + if (map == null) { + return; + } + Boolean enable = (Boolean) map.get("enable"); + if (enable == null) { + enable = true; + } + JPushInterface.setLinkMergeEnable(context,enable); + } + private void setGeofenceEnable(MethodCall call, Result result) { + HashMap map = call.arguments(); + if (map == null) { + return; + } + Boolean enable = (Boolean) map.get("enable"); + if (enable == null) { + enable = true; + } + JPushInterface.setGeofenceEnable(context,enable); + } + private void setSmartPushEnable(MethodCall call, Result result) { + HashMap map = call.arguments(); + if (map == null) { + return; + } + Boolean enable = (Boolean) map.get("enable"); + if (enable == null) { + enable = true; + } + JPushInterface.setSmartPushEnable(context,enable); + } + private void setCollectControl(MethodCall call, Result result) { + HashMap map = call.arguments(); + if (map == null) { + return; + } + JPushCollectControl.Builder builder=new JPushCollectControl.Builder(); + boolean hadValue=false; + if(map.containsKey("imsi")){ + Boolean imsi = (Boolean) map.get("imsi"); + builder.imsi(imsi); + hadValue=true; + } + if(map.containsKey("mac")){ + Boolean mac = (Boolean) map.get("mac"); + builder.mac(mac); + hadValue=true; + } + if(map.containsKey("wifi")){ + Boolean wifi = (Boolean) map.get("wifi"); + builder.wifi(wifi); + hadValue=true; + } + if(map.containsKey("bssid")){ + Boolean bssid = (Boolean) map.get("bssid"); + builder.bssid(bssid); + hadValue=true; + } + if(map.containsKey("ssid")){ + Boolean ssid = (Boolean) map.get("ssid"); + builder.ssid(ssid); + hadValue=true; + } + if(map.containsKey("imei")){ + Boolean imei = (Boolean) map.get("imei"); + builder.imei(imei); + hadValue=true; + } + if(map.containsKey("cell")){ + Boolean cell = (Boolean) map.get("cell"); + builder.cell(cell); + hadValue=true; + } + if(hadValue){ + JPushInterface.setCollectControl(context,builder.build()); + } + } + + private void setAuth(MethodCall call, Result result){ + HashMap map = call.arguments(); + if (map == null) { + return; + } + Boolean enable = (Boolean) map.get("enable"); + if (enable == null) { + enable = false; + } + JCollectionAuth.setAuth(context,enable); + } + private void testCountryCode(MethodCall call, Result result){ + String code = call.arguments(); + Log.d(TAG,"testCountryCode code="+code); + JCoreInterface.testCountryCode(context,code); + } + private void setWakeEnable(MethodCall call, Result result) { + HashMap map = call.arguments(); + if (map == null) { + return; + } + Boolean enable = (Boolean) map.get("enable"); + if (enable == null) { + enable = false; + } + JCoreInterface.setWakeEnable(context,enable); + } + private void enableAutoWakeup(MethodCall call, Result result) { + HashMap map = call.arguments(); + if (map == null) { + return; + } + Boolean enable = (Boolean) map.get("enable"); + if (enable == null) { + enable = false; + } + JCollectionAuth.enableAutoWakeup(context,enable); + } + + + + public void setup(MethodCall call, Result result) { + Log.d(TAG, "setup :" + call.arguments); + + HashMap map = call.arguments(); + boolean debug = (boolean) map.get("debug"); + JPushInterface.setDebugMode(debug); + String appKey = (String) map.get("appKey"); + if(!TextUtils.isEmpty(appKey)){ + JPushConfig config=new JPushConfig(); + config.setjAppKey(appKey); + JPushInterface.init(context,config); + }else { + JPushInterface.init(context); + } // 初始化 JPush + JPushInterface.setNotificationCallBackEnable(context, true); + String channel = (String) map.get("channel"); + JPushInterface.setChannel(context, channel); + JPushHelper.getInstance().setDartIsReady(true); + + // try to clean getRid cache + scheduleCache(); + } + + public void scheduleCache() { + Log.d(TAG, "scheduleCache:"); + JPushHelper.getInstance().dispatchNotification(); + JPushHelper.getInstance().dispatchRid(); + } + + public void setTags(MethodCall call, Result result) { + Log.d(TAG, "setTags:"); + + List tagList = call.arguments(); + Set tags = new HashSet<>(tagList); + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.setTags(context, sequence, tags); + } + + public void cleanTags(MethodCall call, Result result) { + Log.d(TAG, "cleanTags:"); + + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.cleanTags(context, sequence); + } + + public void addTags(MethodCall call, Result result) { + Log.d(TAG, "addTags: " + call.arguments); + + List tagList = call.arguments(); + Set tags = new HashSet<>(tagList); + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.addTags(context, sequence, tags); + } + + public void deleteTags(MethodCall call, Result result) { + Log.d(TAG, "deleteTags: " + call.arguments); + + List tagList = call.arguments(); + Set tags = new HashSet<>(tagList); + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.deleteTags(context, sequence, tags); + } + + public void getAllTags(MethodCall call, Result result) { + Log.d(TAG, "getAllTags: "); + + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.getAllTags(context, sequence); + } + public void getAlias(MethodCall call, Result result) { + Log.d(TAG, "getAlias: "); + + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.getAlias(context, sequence); + } + + public void setAlias(MethodCall call, Result result) { + Log.d(TAG, "setAlias: " + call.arguments); + + String alias = call.arguments(); + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.setAlias(context, sequence, alias); + } + + public void deleteAlias(MethodCall call, Result result) { + Log.d(TAG, "deleteAlias:"); + + String alias = call.arguments(); + sequence += 1; + JPushHelper.getInstance().addCallback(sequence,result); + JPushInterface.deleteAlias(context, sequence); + } + + public void stopPush(MethodCall call, Result result) { + Log.d(TAG, "stopPush:"); + + JPushInterface.stopPush(context); + } + + public void resumePush(MethodCall call, Result result) { + Log.d(TAG, "resumePush:"); + + JPushInterface.resumePush(context); + } + + public void clearAllNotifications(MethodCall call, Result result) { + Log.d(TAG, "clearAllNotifications: "); + + JPushInterface.clearAllNotifications(context); + } + public void clearLocalNotifications(MethodCall call, Result result) { + Log.d(TAG, "clearLocalNotifications: "); + JPushInterface.clearLocalNotifications(context); + } + public void clearNotification(MethodCall call, Result result) { + Log.d(TAG, "clearNotification: "); + Object id = call.arguments; + if (id != null) { + JPushInterface.clearNotificationById(context, (int) id); + } + } + + public void getLaunchAppNotification(MethodCall call, Result result) { + Log.d(TAG, ""); + + + } + + public void getRegistrationID(MethodCall call, Result result) { + Log.d(TAG, "getRegistrationID: "); + + if (context == null) { + Log.d(TAG, "register context is nil."); + return; + } + + String rid = JPushInterface.getRegistrationID(context); + if (rid == null || rid.isEmpty()) { + JPushHelper.getInstance().addRid(result); + } else { + result.success(rid); + } + } + + + public void sendLocalNotification(MethodCall call, Result result) { + Log.d(TAG, "sendLocalNotification: " + call.arguments); + + try { + HashMap map = call.arguments(); + + JPushLocalNotification ln = new JPushLocalNotification(); + ln.setBuilderId((Integer) map.get("buildId")); + ln.setNotificationId((Integer) map.get("id")); + ln.setTitle((String) map.get("title")); + ln.setContent((String) map.get("content")); + HashMap extra = (HashMap) map.get("extra"); + + if (extra != null) { + JSONObject json = new JSONObject(extra); + ln.setExtras(json.toString()); + } + + long date = (long) map.get("fireTime"); + ln.setBroadcastTime(date); + + JPushInterface.addLocalNotification(context, ln); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void setBadge(MethodCall call, Result result) { + Log.d(TAG, "setBadge: " + call.arguments); + + HashMap map = call.arguments(); + Object numObject = map.get("badge"); + if (numObject != null) { + int num = (int) numObject; + JPushInterface.setBadgeNumber(context, num); + result.success(true); + } + } + + /// 检查当前应用的通知开关是否开启 + private void isNotificationEnabled(MethodCall call, Result result) { + Log.d(TAG, "isNotificationEnabled: "); + int isEnabled = JPushInterface.isNotificationEnabled(context); + //1表示开启,0表示关闭,-1表示检测失败 + HashMap map = new HashMap(); + map.put("isEnabled", isEnabled == 1 ? true : false); + + JPushHelper.getInstance().runMainThread(map, result, null); + } + + private void openSettingsForNotification(MethodCall call, Result result) { + Log.d(TAG, "openSettingsForNotification: "); + + JPushInterface.goToAppNotificationSettings(context); + + } + + /** + * 接收自定义消息,通知,通知点击事件等事件的广播 + * 文档链接:http://docs.jiguang.cn/client/android_api/ + */ +// public static class JPushReceiver extends BroadcastReceiver { +// +// private static final List IGNORED_EXTRAS_KEYS = Arrays.asList("cn.jpush.android.TITLE", +// "cn.jpush.android.MESSAGE", "cn.jpush.android.APPKEY", "cn.jpush.android.NOTIFICATION_CONTENT_TITLE", "key_show_entity", "platform"); +// +// public JPushReceiver() { +// } +// +// +// @Override +// public void onReceive(Context context, Intent intent) { +// String action = intent.getAction(); +// +// if (action.equals(JPushInterface.ACTION_REGISTRATION_ID)) { +// String rId = intent.getStringExtra(JPushInterface.EXTRA_REGISTRATION_ID); +// Log.d("JPushPlugin", "on get registration"); +// JPushHelper.getInstance().transmitReceiveRegistrationId(rId); +// +// } else if (action.equals(JPushInterface.ACTION_MESSAGE_RECEIVED)) { +// handlingMessageReceive(intent); +// } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_RECEIVED)) { +// handlingNotificationReceive(context, intent); +// } else if (action.equals(JPushInterface.ACTION_NOTIFICATION_OPENED)) { +// handlingNotificationOpen(context, intent); +// } +// } +// +// private void handlingMessageReceive(Intent intent) { +// Log.d(TAG, "handlingMessageReceive " + intent.getAction()); +// +// String msg = intent.getStringExtra(JPushInterface.EXTRA_MESSAGE); +// String title = intent.getStringExtra(JPushInterface.EXTRA_TITLE); +// Map extras = getNotificationExtras(intent); +// JPushHelper.getInstance().transmitMessageReceive(msg, title,extras); +// } +// +// private void handlingNotificationOpen(Context context, Intent intent) { +// Log.d(TAG, "handlingNotificationOpen " + intent.getAction()); +// +// String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE); +// String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT); +// Map extras = getNotificationExtras(intent); +// JPushHelper.getInstance().transmitNotificationOpen(title, alert, extras); +// } +// +// private void handlingNotificationReceive(Context context, Intent intent) { +// Log.d(TAG, "handlingNotificationReceive " + intent.getAction()); +// +// String title = intent.getStringExtra(JPushInterface.EXTRA_NOTIFICATION_TITLE); +// String alert = intent.getStringExtra(JPushInterface.EXTRA_ALERT); +// Map extras = getNotificationExtras(intent); +// JPushHelper.getInstance().transmitNotificationReceive(title, alert, extras); +// } +// +// private Map getNotificationExtras(Intent intent) { +// Map extrasMap = new HashMap(); +// Bundle extras = intent.getExtras(); +// for (String key : extras.keySet()) { +// Object value = extras.get(key); +// if (!IGNORED_EXTRAS_KEYS.contains(key)) { +// if (key.equals(JPushInterface.EXTRA_NOTIFICATION_ID)) { +// extrasMap.put(key, intent.getIntExtra(key, 0)); +// }else if(key.equals("cn.jpush.android.EXTRA")){ +// try { +// JSONObject object=new JSONObject((String)value); +// Map useExtra = new HashMap(); +// jsonToMap(object,useExtra); +// extrasMap.put(key,useExtra); +// }catch (Throwable throwable){ +// } +// } else { +// extrasMap.put(key, value); +// } +// } +// } +// return extrasMap; +// } +// public static void jsonToMap(JSONObject object,Map map) { +// try { +// Iterator keys = object.keys(); +// while (keys.hasNext()) { +// String key = keys.next(); +// Object value = object.get(key); +// map.put(key, value); +// } +// }catch (Throwable throwable){ +// } +// } +// } + + + + +} diff --git a/documents/APIs.md b/documents/APIs.md new file mode 100644 index 0000000..eacc436 --- /dev/null +++ b/documents/APIs.md @@ -0,0 +1,282 @@ +[Common API](#common-api) + +- [addEventHandler](#addeventhandler) +- [setup](#setup) +- [getRegistrationID](#getregistrationid) +- [stopPush](#stoppush) +- [setChannelAndSound](#setChannelAndSound) +- [resumePush](#resumepush) +- [setAlias](#setalias) +- [getAlias](#getAlias) +- [deleteAlias](#deletealias) +- [addTags](#addtags) +- [deleteTags](#deletetags) +- [setTags](#settags) +- [cleanTags](#cleantags) +- [getAllTags](getalltags) +- [sendLocalNotification](#sendlocalnotification) +- [clearAllNotifications](#clearallnotifications) + + +[iOS Only]() + +- [applyPushAuthority](#applypushauthority) +- [setBadge](#setbadge) +- [getLaunchAppNotification](#getlaunchappnotification) +- [pageEnterTo](#pageEnterTo) +- [pageLeave](#pageLeave) + +**注意:addEventHandler 方法建议放到 setup 之前,其他方法需要在 setup 方法之后调用,** + +#### addEventHandler + +添加事件监听方法。 + +```dart +JPush jpush = new JPush(); +jpush.addEventHandler( + // 接收通知回调方法。 + onReceiveNotification: (Map message) async { + print("flutter onReceiveNotification: $message"); + }, + // 点击通知回调方法。 + onOpenNotification: (Map message) async { + print("flutter onOpenNotification: $message"); + }, + // 接收自定义消息回调方法。 + onReceiveMessage: (Map message) async { + print("flutter onReceiveMessage: $message"); + }, + onConnected: (Map message) async { + print("flutter onConnected: $message"); + }, + ); +``` + +#### setup + +添加初始化方法,调用 setup 方法会执行两个操作: + +- 初始化 JPush SDK +- 将缓存的事件下发到 dart 环境中。 + +**注意:** 插件版本 >= 0.0.8 android 端支持在 setup 方法中动态设置 channel,动态设置的 channel 优先级比 manifestPlaceholders 中的 JPUSH_CHANNEL 优先级要高。 + +```dart +JPush jpush = new JPush(); +jpush.setup( + appKey: "替换成你自己的 appKey", + channel: "theChannel", + production: false, + debug: false, // 设置是否打印 debug 日志 + ); +``` + +* iOS使用推送功能,需要调用申请通知权限的方法,详情见 [applyPushAuthority](#applyPushAuthority)。 + +``` +jpush.applyPushAuthority(new NotificationSettingsIOS( + sound: true, + alert: true, + badge: true)); +``` + +#### getRegistrationID + +获取 registrationId,这个 JPush 运行通过 registrationId 来进行推送. + +```dart +JPush jpush = new JPush(); +jpush.getRegistrationID().then((rid) { }); +``` + +#### stopPush + +停止推送功能,调用该方法将不会接收到通知。 + +```dart +JPush jpush = new JPush(); +jpush.stopPush(); +``` + + +#### setChannelAndSound +动态配置 channel 、channel id 及sound,优先级比 AndroidManifest 里配置的高 +备注:channel、channel id为必须参数,否则接口调用失败。sound 可选 + +#### 参数说明 +- Object + +|参数名称|参数类型|参数说明| +|:-----:|:----:|:-----:| +|channel|string|希望配置的 channel| +|channel_id|string|希望配置的 channel id| +|sound|string|希望配置的 sound(铃声名称,只有铃声名称即可,如AA.mp3,填写AA )| + +#### 示例 +```dart +JPush jpush = new JPush(); +jpush.setChannelAndSound(); +``` + + +#### resumePush + +调用 stopPush 后,可以通过 resumePush 方法恢复推送。 + +```dart +JPush jpush = new JPush(); +jpush.resumePush(); +``` + +#### setAlias + +设置别名,极光后台可以通过别名来推送,一个 App 应用只有一个别名,一般用来存储用户 id。 + +``` +JPush jpush = new JPush(); +jpush.setAlias("your alias").then((map) { }); +``` + +#### deleteAlias + +可以通过 deleteAlias 方法来删除已经设置的 alias。 + +```dart +JPush jpush = new JPush(); +jpush.deleteAlias().then((map) {}) +``` +#### getAlias + +获取当前 alias 列表。 + +``` +JPush jpush = new JPush(); +jpush.getAlias().then((map) { }); +``` +#### addTags + +在原来的 Tags 列表上添加指定 tags。 + +``` +JPush jpush = new JPush(); +jpush.addTags(["tag1","tag2"]).then((map) {}); +``` + +#### deleteTags + +在原来的 Tags 列表上删除指定 tags。 + +``` +JPush jpush = new JPush(); +jpush.deleteTags(["tag1","tag2"]).then((map) {}); +``` + +#### setTags + +重置 tags。 + +```dart +JPush jpush = new JPush(); +jpush.setTags(["tag1","tag2"]).then((map) {}); +``` + +#### cleanTags + +清空所有 tags + +```dart +jpush.setTags().then((map) {}); +``` + +#### getAllTags + +获取当前 tags 列表。 + +```dart +JPush jpush = new JPush(); +jpush.getAllTags().then((map) {}); +``` + +#### sendLocalNotification + +指定触发时间,添加本地推送通知。 + +```dart +// 延时 3 秒后触发本地通知。 +JPush jpush = new JPush(); +var fireDate = DateTime.fromMillisecondsSinceEpoch(DateTime.now().millisecondsSinceEpoch + 3000); +var localNotification = LocalNotification( + id: 234, + title: 'notification title', + buildId: 1, + content: 'notification content', + fireTime: fireDate, + subtitle: 'notification subtitle', // 该参数只有在 iOS 有效 + badge: 5, // 该参数只有在 iOS 有效 + extras: {"fa": "0"} // 设置 extras ,extras 需要是 Map + ); +jpush.sendLocalNotification(localNotification).then((res) {}); +``` + +#### clearAllNotifications + +清楚通知栏上所有通知。 + +```dart +JPush jpush = new JPush(); +jpush.clearAllNotifications(); +``` + +#### applyPushAuthority + +申请推送权限,注意这个方法只会向用户弹出一次推送权限请求(如果用户不同意,之后只能用户到设置页面里面勾选相应权限),需要开发者选择合适的时机调用。 + +**注意: iOS10+ 可以通过该方法来设置推送是否前台展示,是否触发声音,是否设置应用角标 badge** + +```dart +JPush jpush = new JPush(); +jpush.applyPushAuthority(new NotificationSettingsIOS( + sound: true, + alert: true, + badge: true)); +``` + +**iOS Only** + +#### setBadge + +设置应用 badge 值,该方法还会同步 JPush 服务器的的 badge 值,JPush 服务器的 badge 值用于推送 badge 自动 +1 时会用到。 + +```dart +JPush jpush = new JPush(); +jpush.setBadge(66).then((map) {}); +``` + +### getLaunchAppNotification + +获取 iOS 点击推送启动应用的那条通知。 + +```dart +JPush jpush = new JPush(); +jpush.getLaunchAppNotification().then((map) {}); +``` + +### pageEnterTo + +进入页面,应用内消息功能需要配置该接口,请与pageLeave函数配套使用 + +```dart +JPush jpush = new JPush(); +jpush.pageEnterTo("页面名"); +``` + +### pageLeave + +离开页面,应用内消息功能需要配置该接口,请与pageEnterTo函数配套使用 + +```dart +JPush jpush = new JPush(); +jpush.pageLeave("页面名"); +``` + diff --git a/example/.DS_Store b/example/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e7ad7e82ee84a86d585fd36cc09968c6c0b980a9 GIT binary patch literal 6148 zcmeHKJ5Iwu5S@)J2%*3d06j&o~ROFdldKzx2Y;*iY1^C^q(h*%yPM1`Bf5VYHu1lxQjA4;w{Xx-3r2YPOxBvL`vb!uR z|3TL1jK3CTYi%-Vgs-TevHy-V673u;A_4zL#jkb4qQ={Z27K|W=No{rAMnxkjqpjN z&Nsh*zPf&p`9`GC1z$57@KMTqF-_=%#xw~TS8nUEfO9tc;;d@xvz#x9hrIln%}fDP zz!azyz?#k0UiWCdDPRhi0+j;%e@M_6Q^nGw{5sId5dav&Erzk|HGl~_fT?2X5gwTH zr9fZm^oZenIsA#{rHZ9TUrtV#aUW%NdO~r!({YKUlS@5XZwi&^C4ge z=7ybOJUTGN763SgIttd(OGr#G%ndt5SRkySKn-PUF<8T)59XH}c8VHKY|RH-<#qGI zu{!dH=uVs~`s@ri11SR|eVoYse~eFNu*pwD{K*+`2L2cWJTB(N3@>GO>zCJ)yEb5) tVu*-eCkqJH$xi?tr-%1R^0mIRjf@;2nrMNJRhu literal 0 HcmV?d00001 diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 0000000..219316b --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,96 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +def keystorePropertiesFile = rootProject.file("key.properties") +def keystoreProperties = new Properties() +keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + +android { + compileSdkVersion 31 + lintOptions { + disable 'InvalidPackage' + } + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + +// applicationId "com.jiguang.jpushexample" + + applicationId "com.shikk.testJpush" //JPush 上注册的包名. + + minSdkVersion 17 + targetSdkVersion 31 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + + + ndk { + //选择要添加的对应 cpu 类型的 .so 库。 + abiFilters 'armeabi', 'armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a' + // 还可以添加 + } + + manifestPlaceholders = [ + JPUSH_PKGNAME : applicationId, + JPUSH_APPKEY : "31c7c1b2cf59c1d42895a782", //JPush 上注册的包名对应的 Appkey. + JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可. + ] + } + signingConfigs { + release { + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.release + } + } +// buildToolsVersion '28.0.1' + + packagingOptions { + exclude 'lib/arm64-v8a/libgojni.so' + exclude 'lib/x86/libgojni.so' + exclude 'lib/x86_64/libgojni.so' + } +} + +flutter { + source '../..' +} + +dependencies { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..967f188 --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/com/jiguang/jpushexample/MainActivity.java b/example/android/app/src/main/java/com/jiguang/jpushexample/MainActivity.java new file mode 100644 index 0000000..8632ac4 --- /dev/null +++ b/example/android/app/src/main/java/com/jiguang/jpushexample/MainActivity.java @@ -0,0 +1,6 @@ +package com.jiguang.jpushexample; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { +} diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/values-night/styles.xml b/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..39a3a01 --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 0000000..c08a01a --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,31 @@ +buildscript { + repositories { + mavenCentral() + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.1.3' + } +} + +allprojects { + repositories { + mavenCentral() + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/example/android/gradle.properties b/example/android/gradle.properties new file mode 100644 index 0000000..216d3a3 --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1,22 @@ +## Project-wide Gradle settings. +# +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx1024m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +#Wed Sep 19 16:44:40 CST 2018 +#systemProp.http.proxyHost=127.0.0.1 +#systemProp.https.proxyPort=1086 +org.gradle.jvmargs=-Xmx1536M +#systemProp.https.proxyHost=127.0.0.1 +#systemProp.http.proxyPort=1086 +android.enableR8=true +android.useAndroidX=true \ No newline at end of file diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ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 H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..8cfcd11 --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Aug 21 15:20:04 CST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip diff --git a/example/android/gradlew b/example/android/gradlew new file mode 100755 index 0000000..9d82f78 --- /dev/null +++ b/example/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/example/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/example/android/key.properties b/example/android/key.properties new file mode 100644 index 0000000..e2f094e --- /dev/null +++ b/example/android/key.properties @@ -0,0 +1,4 @@ +storePassword= +keyPassword= +keyAlias=key +storeFile=/key.jks> \ No newline at end of file diff --git a/example/android/settings.gradle b/example/android/settings.gradle new file mode 100644 index 0000000..5a2f14f --- /dev/null +++ b/example/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/example/ios/.DS_Store b/example/ios/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c29a295a3b93aff91b00c234259c04171973a9bf GIT binary patch literal 6148 zcmeHKOHRWu5FNKwsrX10E7*C<2B|j)Rp)Xa4>6Lrb+h%X;(!-*5GT7Dg(Qr{}x-hqt3; zUY#6X;U(`D@oFBXp)#F-%?+MKHihZ_;&_rvxcw4yNzKs@zL>1?N%1ItFpp}I2OZKa zwJD$uScNn|>&otQG56D9o|q)x#?Cb6`{P>49M*|T-wDL)mcjYv<=Vj4ax4QttAh+{((`P?T96 z^K0Wy%Cji7C?E=?6)4)*Dxd$ytMC8mAbAr7M1g;$fGYV-zmAmL*_ug?&svRghQh{v nkwp`N${ok1!AJ2PiZP67ZU8-pkwx^t + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..e8efba1 --- /dev/null +++ b/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/example/ios/Flutter/Flutter.podspec b/example/ios/Flutter/Flutter.podspec new file mode 100644 index 0000000..663d5b2 --- /dev/null +++ b/example/ios/Flutter/Flutter.podspec @@ -0,0 +1,18 @@ +# +# NOTE: This podspec is NOT to be published. It is only used as a local source! +# This is a generated file; do not edit or check into version control. +# + +Pod::Spec.new do |s| + s.name = 'Flutter' + s.version = '1.0.0' + s.summary = 'High-performance, high-fidelity mobile apps.' + s.homepage = 'https://flutter.io' + s.license = { :type => 'MIT' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :git => 'https://github.com/flutter/engine', :tag => s.version.to_s } + s.ios.deployment_target = '9.0' + # Framework linking is handled by Flutter tooling, not CocoaPods. + # Add a placeholder to satisfy `s.dependency 'Flutter'` plugin podspecs. + s.vendored_frameworks = 'path/to/nothing' +end diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..399e934 --- /dev/null +++ b/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4a7b2cf --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,494 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 342565195A7B02408C258C63 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E8558CD656C3CFECC78ECB83 /* libPods-Runner.a */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 243DB7546D048251A9867C1C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 625494FA213F7D30005E4423 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C3EB3B32DF8D367805D86460 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + E8558CD656C3CFECC78ECB83 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 342565195A7B02408C258C63 /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 014620662F76D9C7C4749081 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E8558CD656C3CFECC78ECB83 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + AB735DD26662031199114838 /* Pods */, + 014620662F76D9C7C4749081 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 625494FA213F7D30005E4423 /* Runner.entitlements */, + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + AB735DD26662031199114838 /* Pods */ = { + isa = PBXGroup; + children = ( + 243DB7546D048251A9867C1C /* Pods-Runner.debug.xcconfig */, + C3EB3B32DF8D367805D86460 /* Pods-Runner.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 7A418C368FF000006114CEC1 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0910; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = UT282795WK; + ProvisioningStyle = Manual; + SystemCapabilities = { + com.apple.ApplePay = { + enabled = 0; + }; + com.apple.BackgroundModes = { + enabled = 1; + }; + com.apple.Push = { + enabled = 1; + }; + }; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; + }; + 7A418C368FF000006114CEC1 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = UT282795WK; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = cn.jiguang.hxhg; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = cn.jiguang.hxhg; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = UT282795WK; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = cn.jiguang.hxhg; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = cn.jiguang.hxhg; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1d526a1 --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..1263ac8 --- /dev/null +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/ios/Runner/AppDelegate.h b/example/ios/Runner/AppDelegate.h new file mode 100644 index 0000000..36e21bb --- /dev/null +++ b/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/example/ios/Runner/AppDelegate.m b/example/ios/Runner/AppDelegate.m new file mode 100644 index 0000000..76d4e07 --- /dev/null +++ b/example/ios/Runner/AppDelegate.m @@ -0,0 +1,14 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" +#include +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; + +} + +@end diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..3d43d11e66f4de3da27ed045ca4fe38ad8b48094 GIT binary patch literal 11112 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 P-1+_A+?hGkL;m(J7kc&K literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..28c6bf03016f6c994b70f38d1b7346e5831b531f GIT binary patch literal 564 zcmV-40?Yl0P)Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist new file mode 100644 index 0000000..edad37b --- /dev/null +++ b/example/ios/Runner/Info.plist @@ -0,0 +1,50 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + jpush_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UIBackgroundModes + + fetch + remote-notification + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + diff --git a/example/ios/Runner/Runner.entitlements b/example/ios/Runner/Runner.entitlements new file mode 100644 index 0000000..903def2 --- /dev/null +++ b/example/ios/Runner/Runner.entitlements @@ -0,0 +1,8 @@ + + + + + aps-environment + development + + diff --git a/example/ios/Runner/main.m b/example/ios/Runner/main.m new file mode 100644 index 0000000..dff6597 --- /dev/null +++ b/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/ios/Runner/sound.caf b/example/ios/Runner/sound.caf new file mode 100755 index 0000000000000000000000000000000000000000..4428bcc6795c958eb2785bff69c41b9565d75198 GIT binary patch literal 129556 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%0D|BRjl})9Ozw5afxj^*tP|>*i|2HPtb1z z`0z#cY=&PuXm{tYyPCoDu}l`fj5SY3p>ymKXLot|uk}fud=UP-%>P>P-z)qq;=U>x z>znK`mtE}LMyuUpo!ITZQJ>Zn4e@xt_8D!6*Z&kBj!foJ@7E9M;_)$TI+323!snmh zw}J1=;KnMLvz}h7XV(MrP{&}zS^816s4;X@?AHmK`(W}o8RZ!;xP*0Uao=Iya)$q0 zqgw~D=>&fDBppzQ&%TS-HuAll{4h@4w2C41m-ND~+3a19zwz@0um2|T(QD@Ud-!S8 z&7JZ7W`7qog?st`R+zmG_r<(l)Edl%KhxNCf-y7FJktOt=UjLGOgF9GZr`^PytM&y zM>YKx%BY5AD{*4OTI z_*tA-CdUzTCadsZ1%F>lI|L8@NZhfVp56;nUcrHp^K6GTs$<0*9rCCV<6MPDz5NAx zz8FST!K&?MKkO}IMlx5d7g!d%p)ADgQ9V@5b4n@Fm2&2lbVil?t)`{crG%DC;a|h# z#OwsbE}L*y)U(vW(a05V;N$Cz^D4QB$jeoDUaFONeF=Ly{TgO}1$IA$_om{#tc3Ga zU>Nmxj2|ogeOFpa3l4DBh1gnUE^bi!s(z^5)t;7di?v%Pc}Y|PH?j9o{~l%eqef=b zq#c2OQAd0f=O5);O|;!Halx@ZstP|f^Ye&HTKM28{@zN9wZW5Ur}^e-F`T_I`rDKC zM*lhZ-Oj%4-rFwDa6*gLtzFY%7s;q)iacs24$h%|W@&{+TDd-0?<#j-x`;qdi9@^e z$ql+`u<iwri&gd-E#U4^Vxj{ zyU$|Z*=%0G=JRmde2)v0wp?spl4y=X?=58aLUu0{KQ7dV3)y`>yU+6-bHyPAIB#}R zyA(AcRj|02&lk`{IsPBTLtF>;kU4kd_TQE_NViw<(1iOIhyted-)4iG{QMfb^sw^< zHa2h9`}bgl>=a)w6z46b z4;SeRdns!d;eM~49*Xl~_mMckXDQxWD>B&u-J1F%ayrEOkGawo-tJ^i9v^#q*7N$K z^i|{(KIDTBimM~PGd*&>0{H1``WW(*D?0194I?s0WHG9^GCo14VoRYN|P8Z0z&4AOn;*V@` zNTwKN3|t;5Cz_t*MMsKbVhzN2k5j}f5$^@QFU6PN^S&)G|7CH@n=m`p!CI$n{1ocj zvc$gC5PF~gBZgA(%L97Y_Lh5yO!;`&XxB{l@;)swh!&f`hEL(9;Ha2$`Ux%YGr8av z92m7MJ+S#Y9<)b`9O!Vd^9XH}mf`0ScrV@WAN0OKNo{lN^w}V`*$VH!@3WTp%qQhE z#_OX2qN9s&s~L*zbPW~!cOFj8c5Q?Brgblnql14mL+8UVqFzp>mcLf?-Q;iQ`B&u7 z_po0r8(7iDE+gqLr+)q?{`)Mhi}M_!{_1Y)OSo?oevCbtzaU=A2UP-k=@;%<3~SU+|KU$(I0 zYwWn6pKjAf)js>%d_J`CRQxvoj*nXHh}Rxwr-$J|HXN8tcjU5t zp4j^d&m+gN!0(pAjF?BQ(9fXOMLc567!Wq+s#zk z0oc`&X!m^fjS7H;qU&Yuu9Uin9ha(UrVX%Ri&$@)ST}Yz-X$*BD>mD23?CF{+X+LP zui4!bzV3s)yNvZ6+BVuD@<*{ddlek16rYrN-x7Va5N6u})Ew3%7(Ui{xDV>%J8hB*~jFO&Me;LH9WP`}j?1CMy@~^g(sHvKWlOp#!h41CiU%7le^g?c`GrQSvsxd!R zKTM@3rpkLvm23Wwmh1IgSf1m3ISF4*@HtMAfxnY*X*SHyh7(zI~6qd?1bO)&xo)1f!{&IK%TO3t7G;_ZOV8~9YYajG`8f2Mn#;-1H|!7w(t2mgK0 ze}&HLX1gxFd5%3pQ?%i*ll=Y|EI2BE-zbJT%#WkiXt$r81HqqPmfJW)+u2XV-)+zb zwd}uv{Wsv%^=!Z1cWp4XYGH?r5*%3%%ghPDk9`pCkls1s3Y&TSDY_|q=|VC;U+->? z8o#H-f0t4+Xu1jFu^c(~Jia}PEf>;i%lK|7e629IS}kW+D}T9#KCZ`yJH;?jo4ns^ zhvE5QF?WMFq(SXK1ME16^J0wbhaXYzzbo|ti+_{l}W~7 zda}!JR3~QB|KprMk>0N@i>}CE(N7Y*T1Qt@8cT6P?p&-f4ZdX=adE<38it8=1X1VE=6;U3uYK+>)=zKf zy9!g=ao`ag_#*p7j-i4*WbBfB`-~)>8`5VN7O~wueV-RIe;yCUW2|kOtmSz9OZaaN z{)?U0BS#;&{yfY-ki3i*er$gF_3v&ksLjTPLfs*>N`fCGI<;wkY`TU9H1w9c+4r zoujV#xLC1KAG}1jZNjB%1k zp*CYa^#I)6%(`VzaGv?p9J(oXhQ3EUcZE;IF6(cy>0!S3BD;px`azOo9)sJ);JLeP zDWCj0yDjCnR-xd-Y5epFK3?GcksB?B6RY@tm2t4KPsR_v@1xb4W8$sD#nW;c*e0&V}PM;BXGy35>Vb zIR0y<$M@sDI{JLISZ_(fdnfVUk%YC=aNQMt+RnNs*f;XZk%ft!hyG(eHFEe5YcWT0 zKRp-g&aSb~MLMCAPHyMpZ8YE zN*rU|u{_=cerskbWwidwFjhv&l?=ys>GEwu;qL?D%fa;VKqF}YoQTzuVo-e`eoJQC zhtu;Zd`G=6F1aagy&-?FePPsc-e^d}`i(O)CWQ9@tL zqbnX`_i=piep;fJ?Jmk&oMSIF-O^JIykU_pI5>0@8QA<^Gwf*HKGnb>hV{> z4m)%C{S5DW!u#`KP@MCePw(aHAG^Z9sgEhSp$YF5(vrmxtXzLr8GW@ZT`%9VmyIJj zZK3@;;NV5I4>#TIK)yVjf7z9fuYV*b@u2*}BXmR_4x9%Mmea?pX@^?ay$x>s6z2X6 zemCI4*TjUciDR1Z+pFTcpW(%Q9$(O&^IEKzD2MY!;+@zxXARw>F2J z@?mZ+9*Z32csw|Yu1KdLqDJWcPun1`4V1?ps1|Mr3?IVQ>E^7QNdn(vACcGbUprf0 z#&#+Fv8Hf^`Iy+VY$LSV$%kWYP7D9-)YI2^X3YAHbXl$bcwWEkmFuv(J}h4aFKS@)=7@7*egGDo=$|D9ET$!@VA4)V78N;>Q;Ai- z)-7W3x&B?oOUhZa2J7A32d9+>zXu)df0G(}-#CL1rk>DOcSdPXB&g_{JW5~Lutqod$vuK zb&w}D@#!}0U5wbHedPHa`Qky^u*6==_<130j{2+l`l5gxXK6G1obUBqzn{Xcc2-Rp zAAASThx?piFd;DB{=x9R8Lz3xO2J<#8;!5kV(b!1Xddj!WAkjWQB;}@aKAU@4!T+V zv=)qVK#RQuH)xdHigXxviabYV|wNcZ0Qo+Mh&<6Dn1!GP%9+qiU~L{+kBvX zr|FDY^hE*uo~zB{#|x9DN)!GTdawPfaikp!**^Aqin_xhzFh>5;0;QBJSQN-^HX^tX)U#L$CeO@6y zU&ha4&BzLxrj)(o?AEndZ#{bsuc0~)%eeecbI6Hx|eZm z8##u2cAZT>7xCMuAzV!dhaQgF`W^6NFWfjxH#=<)kNptdtix$F^2*gPr&242EyY@) z*J4kC(BO~2rV;dZ>~W^<(b(C6bL%`?m&DZS!Hl*d<1SWbtP&PSy!*jgw*j7S@%oGK{jm7u1nzrV{9x?(2Zj{RDfv2X10RP8!8LbjcBMFS3LhIO&u zg=!24G6PZpL zBKW(Q|IUM#1$4$7d^MA;XTsXB_pCmvJB;%=_-!tpTL32tao| zPwHUGPIw$~^bx*#!so_1kq-Fd6WOvz?5F0`X+%TC)EP-WIe71!Rh~T%_qH)N%;?Lc zEMm8{*~a2BdemAEythWYCqicLqkd|Y2kX$@GiuGPvdsp5y)IQ{D?E*Tht|N3O14|c zCrdpR`+14B(C_EM>sk8AZmQ6EfeF5WyM+cY+-$T z7JbmFwZYQU;=r?f--$=;hYvl5mgvHd7udF&&t7ET9y}NISy$+`tNQaQl(^PE7v3+` z%8W4Bs^4SHW-ssV_04_0q0gP9xT`cs5$kgX@}z-0YEZ%|^YlXODOf=ZY|ysiyM1yE zjozhZ2mg(y4Kn%S1UNl`?I*Hh77m-lu2ZxedLoydqfPaEs@JCZ{WN`)=lywXo~PgP za9y5$j5)8^Yb4hQ%7Ir?D9TBCd=d}H#)4VYQ0&u@>DyyP>NtvTG^QSfLGI?28}-Ca z%(5AaN8WRV`&+DMX1e#s*kU5vWU$#V_Pdu}_?SMkgC7my!~pr^-_dTJV&-@F?>TsW zjxV2s>76uQ?8Oze$d~!Lv+4MEwa=*bSt>lVY|r!iYmB5gxgbW_X8&$A`s(%eUcDJB zI~#fb30E2WhPPwxPI=EBbMx2C(ch+_2fFw0y$tr4$RBfPi|K3@92oj7){vFq!3x+= zgU{k5zgTA-I(e7Jy;`ivj(zqTQ>WuaD~fSvqx^@R{k*OcPJiu_%h&@$>S0KnMqCR+ zYDCzTMqTXo75U`Ym1qX;i*cF7+sDxs!{qJL_;X|*d&FMnY3H`YhaYlp_sRvSM`5Q} zmk_5!R>0a7cx);Ca5pDfFGhY|F0Kv^KQE8>JWSppHreAb>P3I91?RPSO(lT7$%RSz z{CyTX&rR}ybLoo`7LE!nwfw$$H~Tgk0Vg5LIak`_s_(A*UCC!R@t?hX>^S8Vd-%T( z4^%I+$5y$XJ#<>w>NvZ#(Fy11g^1;PSp0(s<%^qrRJWoW^=5 z+|>aXxkFw#)`+gff3ctPGCnttU1##gX>fN6t(GNsnaO5j`gYS0^)$ruIPiH~Sf|B_ zlMx@r?+(xtaT;a(O{>3++c0U6 z2N-iBU3nI-m}WfAg$;3Pn=_Q*@iBhX&ZjQ&;9eSF5L*t%XA{KLIf;!frOswEJH7GM z>p1R1xu1Bv=F#rH>^+~|pJx9jao|)OXmwudXg>WQ|4vCTelgHYlKFAxp{>BcpQAb$#V#LXkeSGak z;&YSPdWtb0wu-!ibE?_>ZSRR3&sm(Gb$-58sY`iR!g2TGSj>^Uc+MAN!t_h!ORGF@A|1 zW6wR+$NV)@KW0FPI47J!bX9A_d&^y+S{$=Wc7sZyj224xn7fEQ`VaGvyYs2d#$ls- z-;MR^*nGWzE7)TNZz|H}`gx`n^Q$>p?3Fr^b{!8T$H7QyAjv&syNYFD-a{@3AwSeMg?6Hd6|)5ct!CJ?*x z-^OEuFiGrgFwuSI`gbPZo^Ny(YbzmOtWVvf)x+VvTJTbn)~vmy#Xg1aYF*kz?Y-o2 zia0!4cG6;w^gW*)xrz?o<4k)zH(no(^I0-b>>caNb|g485?T!R-NRi&?1vO5+Qo{g zp+04(zj(k;!PGGqJivXVVGw&VxM%r)wvU}5gXis-16QiqrV{6^;CD+CyzXYJ3v70t z?{_3|cP8H)1AAgWlh7Z-d{XGP`)QL{Q+B^k9ioqi$RnrgpNEX64BwKe&$6^!&!5od zYD@jD-21A%Kk{+03(*mubINCS`d6*At39U|%uXAp`R*X*{Yt{m+|@?+wu>Da+^NiH zV&BjP*C0-u+HTiJz8$f0=(tkY5VaK*Fg*5#s?uswLnn`-1H8hzs~e76ZUuQt|-{XZA3#O%U&qwfJ%ck5H`I}25!R%4x+4!rSIgf(IiWJPIp*jtiaZ2agwN^ZM-a=k+YA753&0^PO zY+A*S>iJwF4{u|~3$%4F`we2ZQ7|F)DSKRu5p&J+;q4MUxLgb!xlF4{ao)RlFyg{4 zvC0M9*Mu!S36~1>dZ&r8bY9>(E zajHjTdYp95KO+~j(VeW~bBp=e3|^e=l?-<}P@K^#|E5Meu}$pDdjcjOp&t&>3%rqj z7$?4q)0QK4&cJ&aULS+|#;dduwoyE&QvCrDKok`{;?`?4c4v?AMX{ zB)iQ{V&qGyvODyJQw;Im^5pR|P6~r)hj@BGep3 zSKV&}r{K3ZKjbq0>tfe;=&!Sh4hzjNnQummx}(SZe3u8$@zXATd{Lew;^>>c;U1&k zD1j+Eef|O8)8zYF*!3JPpbXhE_GAdH-b%k;pe?UMI6KKh!FiB#nR|(PzSZv3&Nfh? zo|O;tspGuqjAs{E{3?&`WuG*0GR*}O;*8a!@F3c&{IP-k4|={w+v#^(^~ok$q6Q|! z*&(q8r3h}%7st#rHlpU-?nXwxx(VNFgy{8R+T1v&)z2AMt-Q7w`X1r6hulr<+*nU( zY=M#yU)$+M3=n5>uM%~IMvb#vV$43_`D5A?Ez|GD@as|D8F`1HtTM#k58-t~^wkib zGz5AM<$>u57asH8X581trtLoCywAE|j9l^A*X4nX4*0(cC)6bI&#)v1co@&wLl^H& zzb?$=9a&IoI!Uyk`>IW+$8{e!!U-J}1_n4rk|BgF1++89?D!3FOLR z-Ab&njk?mM!zt^SR@a}TpcU`L&{L5q2*a;;b^)aGij zKSglfG|wk%Sz6>ILQjm*LR*Z&gK<7~M$%3voEW^Asl}R~$y%&0%hzUU^ZdM2TcJfx zJ969GwU}vWbX_g3F;1tAT|IBQkAd>Zfp}SbD)tU2kn3FL-sNa{xk!Xf_Rs^b^1qYt z@wDCvZSkHSx~9K++4mFqs0D0s=xX_Apk4v;=UW>hyOT1^f_m=91<@!KI&ueG2 zx3pM)wU5v5(AyhfSM+tMehgfmsqb?1-2{D??z@xS<3v&yuyvcU+61fjLY7!tP=m=U z+}Ses7xsOE&CIv3RrqP-LSxQ(Pv6IQ@P?ewRk3sAMZ3j>-E{KroUB=3h@2q9%Sd$vF)~&wp0#A_7ru5Fc;)__@ zYE=HTjHj>W>04lS>}%D;j;9mfUCchkFkmGcR;7-h7sk`cu@`Xc0Uq^ runApp(new MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => new _MyAppState(); +} + +class _MyAppState extends State { + String? debugLable = 'Unknown'; + final JPush jpush = new JPush(); + + @override + void initState() { + super.initState(); + initPlatformState(); + } + + // Platform messages are asynchronous, so we initialize in an async method. + Future initPlatformState() async { + String? platformVersion; + + try { + jpush.addEventHandler( + onReceiveNotification: (Map message) async { + print("flutter onReceiveNotification: $message"); + setState(() { + debugLable = "flutter onReceiveNotification: $message"; + }); + }, onOpenNotification: (Map message) async { + print("flutter onOpenNotification: $message"); + setState(() { + debugLable = "flutter onOpenNotification: $message"; + }); + }, onReceiveMessage: (Map message) async { + print("flutter onReceiveMessage: $message"); + setState(() { + debugLable = "flutter onReceiveMessage: $message"; + }); + }, onReceiveNotificationAuthorization: + (Map message) async { + print("flutter onReceiveNotificationAuthorization: $message"); + setState(() { + debugLable = "flutter onReceiveNotificationAuthorization: $message"; + }); + }, onNotifyMessageUnShow: (Map message) async { + print("flutter onNotifyMessageUnShow: $message"); + setState(() { + debugLable = "flutter onNotifyMessageUnShow: $message"; + }); + }, onInAppMessageShow: (Map message) async { + print("flutter onInAppMessageShow: $message"); + setState(() { + debugLable = "flutter onInAppMessageShow: $message"; + }); + }, onInAppMessageClick: (Map message) async { + print("flutter onInAppMessageClick: $message"); + setState(() { + debugLable = "flutter onInAppMessageClick: $message"; + }); + }, onConnected: (Map message) async { + print("flutter onConnected: $message"); + setState(() { + debugLable = "flutter onConnected: $message"; + }); + }); + } on PlatformException { + platformVersion = 'Failed to get platform version.'; + } + + jpush.setAuth(enable: true); + jpush.setup( + appKey: "xxxxx", //你自己应用的 AppKey + channel: "theChannel", + production: false, + debug: true, + ); + jpush.applyPushAuthority( + new NotificationSettingsIOS(sound: true, alert: true, badge: true)); + + // Platform messages may fail, so we use a try/catch PlatformException. + jpush.getRegistrationID().then((rid) { + print("flutter get registration id : $rid"); + setState(() { + debugLable = "flutter getRegistrationID: $rid"; + }); + }); + + // iOS要是使用应用内消息,请在页面进入离开的时候配置pageEnterTo 和 pageLeave 函数,参数为页面名。 + jpush.pageEnterTo("HomePage"); // 在离开页面的时候请调用 jpush.pageLeave("HomePage"); + + // If the widget was removed from the tree while the asynchronous platform + // message was in flight, we want to discard the reply rather than calling + // setState to update our non-existent appearance. + if (!mounted) return; + + setState(() { + debugLable = platformVersion; + }); + } + +// 编写视图 + @override + Widget build(BuildContext context) { + return new MaterialApp( + home: new Scaffold( + appBar: new AppBar( + title: const Text('Plugin example app'), + ), + body: new Center( + child: new Column(children: [ + Container( + margin: EdgeInsets.fromLTRB(10, 10, 10, 10), + color: Colors.brown, + child: Text(debugLable ?? "Unknown"), + width: 350, + height: 100, + ), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "发本地推送", + onPressed: () { + // 三秒后出发本地推送 + var fireDate = DateTime.fromMillisecondsSinceEpoch( + DateTime.now().millisecondsSinceEpoch + 3000); + var localNotification = LocalNotification( + id: 234, + title: 'fadsfa', + buildId: 1, + content: 'fdas', + fireTime: fireDate, + subtitle: 'fasf', + badge: 5, + extra: {"fa": "0"}); + jpush + .sendLocalNotification(localNotification) + .then((res) { + setState(() { + debugLable = res; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "getLaunchAppNotification", + onPressed: () { + jpush.getLaunchAppNotification().then((map) { + print("flutter getLaunchAppNotification:$map"); + setState(() { + debugLable = "getLaunchAppNotification success: $map"; + }); + }).catchError((error) { + setState(() { + debugLable = "getLaunchAppNotification error: $error"; + }); + }); + }), + ]), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "setTags", + onPressed: () { + jpush.setTags(["lala", "haha"]).then((map) { + var tags = map['tags']; + setState(() { + debugLable = "set tags success: $map $tags"; + }); + }).catchError((error) { + setState(() { + debugLable = "set tags error: $error"; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "addTags", + onPressed: () { + jpush.addTags(["lala", "haha"]).then((map) { + var tags = map['tags']; + setState(() { + debugLable = "addTags success: $map $tags"; + }); + }).catchError((error) { + setState(() { + debugLable = "addTags error: $error"; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "deleteTags", + onPressed: () { + jpush.deleteTags(["lala", "haha"]).then((map) { + var tags = map['tags']; + setState(() { + debugLable = "deleteTags success: $map $tags"; + }); + }).catchError((error) { + setState(() { + debugLable = "deleteTags error: $error"; + }); + }); + }), + ]), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "getAllTags", + onPressed: () { + jpush.getAllTags().then((map) { + setState(() { + debugLable = "getAllTags success: $map"; + }); + }).catchError((error) { + setState(() { + debugLable = "getAllTags error: $error"; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "cleanTags", + onPressed: () { + jpush.cleanTags().then((map) { + var tags = map['tags']; + setState(() { + debugLable = "cleanTags success: $map $tags"; + }); + }).catchError((error) { + setState(() { + debugLable = "cleanTags error: $error"; + }); + }); + }), + ]), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "setAlias", + onPressed: () { + jpush.setAlias("thealias11").then((map) { + setState(() { + debugLable = "setAlias success: $map"; + }); + }).catchError((error) { + setState(() { + debugLable = "setAlias error: $error"; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "deleteAlias", + onPressed: () { + jpush.deleteAlias().then((map) { + setState(() { + debugLable = "deleteAlias success: $map"; + }); + }).catchError((error) { + setState(() { + debugLable = "deleteAlias error: $error"; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "getAlias", + onPressed: () { + jpush.getAlias().then((map) { + setState(() { + debugLable = "getAlias success: $map"; + }); + }).catchError((error) { + setState(() { + debugLable = "getAlias error: $error"; + }); + }); + }), + ]), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "stopPush", + onPressed: () { + jpush.stopPush(); + }), + new Text(" "), + new CustomButton( + title: "resumePush", + onPressed: () { + jpush.resumePush(); + }), + ], + ), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "clearAllNotifications", + onPressed: () { + jpush.clearAllNotifications(); + }), + new Text(" "), + new CustomButton( + title: "setBadge", + onPressed: () { + jpush.setBadge(66).then((map) { + setState(() { + debugLable = "setBadge success: $map"; + }); + }).catchError((error) { + setState(() { + debugLable = "setBadge error: $error"; + }); + }); + }), + ], + ), + new Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + new Text(" "), + new CustomButton( + title: "通知授权是否打开", + onPressed: () { + jpush.isNotificationEnabled().then((bool value) { + setState(() { + debugLable = "通知授权是否打开: $value"; + }); + }).catchError((onError) { + setState(() { + debugLable = "通知授权是否打开: ${onError.toString()}"; + }); + }); + }), + new Text(" "), + new CustomButton( + title: "打开系统设置", + onPressed: () { + jpush.openSettingsForNotification(); + }), + ], + ), + ])), + ), + ); + } +} + +/// 封装控件 +class CustomButton extends StatelessWidget { + final VoidCallback? onPressed; + final String? title; + + const CustomButton({@required this.onPressed, @required this.title}); + + @override + Widget build(BuildContext context) { + return new TextButton( + onPressed: onPressed, + child: new Text("$title"), + style: new ButtonStyle( + foregroundColor: MaterialStateProperty.all(Colors.white), + overlayColor: MaterialStateProperty.all(Color(0xff888888)), + backgroundColor: MaterialStateProperty.all(Color(0xff585858)), + padding: MaterialStateProperty.all(EdgeInsets.fromLTRB(10, 5, 10, 5)), + ), + ); + } +} diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..00cdc62 --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,72 @@ +name: jpush_example +description: Demonstrates how to use the jpush plugin. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# Read more about versioning at semver.org. +version: 1.0.0+1 + +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^0.1.2 + +dev_dependencies: + test: ^1.3.0 + mockito: ^3.0.0 + flutter_test: + sdk: flutter + + jpush_flutter: + path: ../ + +# For information on the generic Dart part of this file, see the +# following page: https://www.dartlang.org/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.io/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.io/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.io/custom-fonts/#from-packages diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart new file mode 100644 index 0000000..f5f5832 --- /dev/null +++ b/example/test/widget_test.dart @@ -0,0 +1,54 @@ +// This is a basic Flutter widget test. +// To perform an interaction with a widget in your test, use the WidgetTester utility that Flutter +// provides. For example, you can send tap and scroll gestures. You can also use WidgetTester to +// find child widgets in the widget tree, read text, and verify that the values of widget properties +// are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; + +import 'package:jpush_example/main.dart'; +import 'package:jpush_flutter/jpush_flutter.dart'; + +import 'package:test/test.dart'; + +void main() { + /* + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(new MyApp()); + + // Verify that platform version is retrieved. + + // expect( + // find.byWidgetPredicate( + // (Widget widget) => + // widget is Text && widget.data.startsWith('Running on:'), + // ), + // findsOneWidget); + }); + + MockMethodChannel mockChannel; + + JPush.setup( + appKey: "a1703c14b186a68a66ef86c1", + channel: "theChannel", + production: false + ); + +test('requestNotificationPermissions on ios with custom permissions', () { + JPush.applyPushAuthority(new NotificationSettingsIOS( + sound: false, + alert: false, + badge: false)); + + // firebaseMessaging.requestNotificationPermissions( + // const IosNotificationSettings(sound: false)); + verify(mockChannel.invokeMethod('requestNotificationPermissions', + {'sound': false, 'badge': true, 'alert': true})); + }); + + */ + +} diff --git a/ios/.DS_Store b/ios/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..549ab4c70b2b6444119f8c3a57dae263807ccaa8 GIT binary patch literal 6148 zcmeHKu};H447J+|f>=5--WMQsWkA;wzMvZulp+`srBbN`3@D$#%%|`Hd>7AWE0ClW z8$y*`+3(`B?=CMaon20i{;NS>mi^#laPX^|ZNlt4#(z>{x%x|l5)r)q= ze`G+O-2qK$jo%$@e}1j`vdZ&CQ7w>{ot=L?zr24=yK9uy^4FNvL+?E~qzfwO#?I1t zlU`4;ODE#zS+1U%v-G0APqRC!eV#XL=Hd)E1J1zSGJu*bk{v6$bq1UPXP{v~z7GK^ z7!7O1^yz>}EdX!?cM^=Hmyn!b7!7Mh%s^OEftt$JVz8#eA1p2!){2@=Y|RJT&TJhD zr`@rBNa4g$(XBJ!473>->g8DK|K;xfzn$b)&VVzpR}AndpXW2&lGWDU%}K2d&}*oO n#MO#T3I?eZBUVcB2{Z}(K?cBRSS!K<@jn8I1~<;YpEB?TRy$1| literal 0 HcmV?d00001 diff --git a/ios/Classes/JPushPlugin.h b/ios/Classes/JPushPlugin.h new file mode 100644 index 0000000..faedf93 --- /dev/null +++ b/ios/Classes/JPushPlugin.h @@ -0,0 +1,5 @@ +#import + +@interface JPushPlugin : NSObject +@property FlutterMethodChannel *channel; +@end diff --git a/ios/Classes/JPushPlugin.m b/ios/Classes/JPushPlugin.m new file mode 100644 index 0000000..6e4ed8f --- /dev/null +++ b/ios/Classes/JPushPlugin.m @@ -0,0 +1,793 @@ +#import "JPushPlugin.h" +#ifdef NSFoundationVersionNumber_iOS_9_x_Max +#import +#endif + +#import "JPUSHService.h" +#import "JGInforCollectionAuth.h" + +#define JPLog(fmt, ...) NSLog((@"| JPUSH | Flutter | iOS | " fmt), ##__VA_ARGS__) + +@interface NSError (FlutterError) +@property(readonly, nonatomic) FlutterError *flutterError; + +@end + +@implementation NSError (FlutterError) +- (FlutterError *)flutterError { + return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %d", (int)self.code] + message:self.domain + details:self.localizedDescription]; +} +@end + + +#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 +@interface JPushPlugin () +//在前台时是否展示通知 +@property(assign, nonatomic) BOOL unShow; +@end +#endif + +static NSMutableArray* getRidResults; + +@implementation JPushPlugin { + NSDictionary *_launchNotification; + NSDictionary *_completeLaunchNotification; + BOOL _isJPushDidLogin; + JPAuthorizationOptions notificationTypes; +} + ++ (void)registerWithRegistrar:(NSObject*)registrar { + getRidResults = @[].mutableCopy; + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"jpush" + binaryMessenger:[registrar messenger]]; + JPushPlugin* instance = [[JPushPlugin alloc] init]; + instance.channel = channel; + + + [registrar addApplicationDelegate:instance]; + [registrar addMethodCallDelegate:instance channel:channel]; +} + +- (id)init { + self = [super init]; + notificationTypes = 0; + NSNotificationCenter *defaultCenter = [NSNotificationCenter defaultCenter]; + + [defaultCenter removeObserver:self]; + + + [defaultCenter addObserver:self + selector:@selector(networkConnecting:) + name:kJPFNetworkIsConnectingNotification + object:nil]; + + [defaultCenter addObserver:self + selector:@selector(networkRegister:) + name:kJPFNetworkDidRegisterNotification + object:nil]; + + [defaultCenter addObserver:self + selector:@selector(networkDidSetup:) + name:kJPFNetworkDidSetupNotification + object:nil]; + [defaultCenter addObserver:self + selector:@selector(networkDidClose:) + name:kJPFNetworkDidCloseNotification + object:nil]; + [defaultCenter addObserver:self + selector:@selector(networkDidLogin:) + name:kJPFNetworkDidLoginNotification + object:nil]; + [defaultCenter addObserver:self + selector:@selector(networkDidReceiveMessage:) + name:kJPFNetworkDidReceiveMessageNotification + object:nil]; + return self; +} + +- (void)networkConnecting:(NSNotification *)notification { + _isJPushDidLogin = false; +} + +- (void)networkRegister:(NSNotification *)notification { + _isJPushDidLogin = false; +} + +- (void)networkDidSetup:(NSNotification *)notification { + _isJPushDidLogin = false; +} + +- (void)networkDidClose:(NSNotification *)notification { + _isJPushDidLogin = false; +} + + +- (void)networkDidLogin:(NSNotification *)notification { + _isJPushDidLogin = YES; + for (FlutterResult result in getRidResults) { + result([JPUSHService registrationID]); + } + [getRidResults removeAllObjects]; +} + +- (void)networkDidReceiveMessage:(NSNotification *)notification { + [_channel invokeMethod:@"onReceiveMessage" arguments: [notification userInfo]]; +} + +- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"handleMethodCall:%@",call.method); + + if ([@"getPlatformVersion" isEqualToString:call.method]) { + result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); + } else if([@"setup" isEqualToString:call.method]) { + [self setup:call result: result]; + } else if([@"setUnShowAtTheForeground" isEqualToString:call.method]) { + [self setUnShowAtTheForeground:call result: result]; + } else if([@"applyPushAuthority" isEqualToString:call.method]) { + [self applyPushAuthority:call result:result]; + } else if([@"setTags" isEqualToString:call.method]) { + [self setTags:call result:result]; + } else if([@"cleanTags" isEqualToString:call.method]) { + [self cleanTags:call result:result]; + } else if([@"addTags" isEqualToString:call.method]) { + [self addTags:call result:result]; + } else if([@"deleteTags" isEqualToString:call.method]) { + [self deleteTags:call result:result]; + } else if([@"getAllTags" isEqualToString:call.method]) { + [self getAllTags:call result:result]; + } else if([@"setAlias" isEqualToString:call.method]) { + [self setAlias:call result:result]; + } else if([@"deleteAlias" isEqualToString:call.method]) { + [self deleteAlias:call result:result]; + } else if([@"getAlias" isEqualToString:call.method]) { + [self getAlias:call result:result]; + } else if([@"setBadge" isEqualToString:call.method]) { + [self setBadge:call result:result]; + } else if([@"stopPush" isEqualToString:call.method]) { + [self stopPush:call result:result]; + } else if([@"resumePush" isEqualToString:call.method]) { + [self resumePush:call result:result]; + //[self applyPushAuthority:call result:result]; + } else if([@"clearAllNotifications" isEqualToString:call.method]) { + [self clearAllNotifications:call result:result]; + } else if ([@"clearNotification" isEqualToString:call.method]) { + [self clearNotification:call result:result]; + } else if([@"getLaunchAppNotification" isEqualToString:call.method]) { + [self getLaunchAppNotification:call result:result]; + } else if([@"getRegistrationID" isEqualToString:call.method]) { + [self getRegistrationID:call result:result]; + } else if([@"sendLocalNotification"isEqualToString:call.method]) { + [self sendLocalNotification:call result:result]; + } else if([@"isNotificationEnabled"isEqualToString:call.method]) { + [self isNotificationEnabled:call result:result]; + } else if([@"openSettingsForNotification"isEqualToString:call.method]) { + [self openSettingsForNotification]; + } else if ([@"setAuth" isEqualToString:call.method]) { + [self setAuth:call result:result]; + } else if ([@"pageEnterTo" isEqualToString:call.method]) { + [self pageEnterTo:call]; + } else if ([@"pageLeave" isEqualToString:call.method]) { + [self pageLeave:call]; + } else if ([@"setCollectControl" isEqualToString:call.method]) { + [self setCollectControl:call result:result]; + } else{ + result(FlutterMethodNotImplemented); + } +} + + +- (void)setCollectControl:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setCollectControl:%@",call.arguments); + BOOL gps = [call.arguments[@"gps"] boolValue]; + JPushCollectControl *control = [[JPushCollectControl alloc] init]; + control.gps = gps; + [JPUSHService setCollectControl:control]; +} + +- (void)setup:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setup:"); + NSDictionary *arguments = call.arguments; + NSNumber *debug = arguments[@"debug"]; + if ([debug boolValue]) { + [JPUSHService setDebugMode]; + } else { + [JPUSHService setLogOFF]; + } + + [JPUSHService setInAppMessageDelegate:self]; + + [JPUSHService setupWithOption:_completeLaunchNotification + appKey:arguments[@"appKey"] + channel:arguments[@"channel"] + apsForProduction:[arguments[@"production"] boolValue]]; +} + +//设置APP在前台时是否展示通知 +- (void)setUnShowAtTheForeground:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setUnShowDidEnterBackground:"); + NSDictionary *arguments = call.arguments; + NSNumber *unShow = arguments[@"UnShow"]; + if(unShow && [unShow isKindOfClass:[NSNumber class]]) self.unShow = [unShow boolValue]; +} + +- (void)applyPushAuthority:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"applyPushAuthority:%@",call.arguments); + notificationTypes = 0; + NSDictionary *arguments = call.arguments; + if ([arguments[@"sound"] boolValue]) { + notificationTypes |= JPAuthorizationOptionSound; + } + if ([arguments[@"alert"] boolValue]) { + notificationTypes |= JPAuthorizationOptionAlert; + } + if ([arguments[@"badge"] boolValue]) { + notificationTypes |= JPAuthorizationOptionBadge; + } + JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init]; + entity.types = notificationTypes; + [JPUSHService registerForRemoteNotificationConfig:entity delegate:self]; +} + +- (void)setTags:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setTags:%@",call.arguments); + NSSet *tagSet; + + if (call.arguments != NULL) { + tagSet = [NSSet setWithArray: call.arguments]; + } + + [JPUSHService setTags:tagSet completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + if (iResCode == 0) { + result(@{@"tags": [iTags allObjects] ?: @[]}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)cleanTags:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"cleanTags:"); + [JPUSHService cleanTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + if (iResCode == 0) { + result(@{@"tags": iTags ? [iTags allObjects] : @[]}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)addTags:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"addTags:%@",call.arguments); + NSSet *tagSet; + + if (call.arguments != NULL) { + tagSet = [NSSet setWithArray:call.arguments]; + } + + [JPUSHService addTags:tagSet completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + if (iResCode == 0) { + result(@{@"tags": [iTags allObjects] ?: @[]}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)deleteTags:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"deleteTags:%@",call.arguments); + NSSet *tagSet; + + if (call.arguments != NULL) { + tagSet = [NSSet setWithArray:call.arguments]; + } + + [JPUSHService deleteTags:tagSet completion:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + if (iResCode == 0) { + result(@{@"tags": [iTags allObjects] ?: @[]}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)getAllTags:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"getAllTags:"); + [JPUSHService getAllTags:^(NSInteger iResCode, NSSet *iTags, NSInteger seq) { + if (iResCode == 0) { + result(@{@"tags": iTags ? [iTags allObjects] : @[]}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)setAlias:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setAlias:%@",call.arguments); + NSString *alias = call.arguments; + [JPUSHService setAlias:alias completion:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { + if (iResCode == 0) { + result(@{@"alias": iAlias ?: @""}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)deleteAlias:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"deleteAlias:%@",call.arguments); + [JPUSHService deleteAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { + if (iResCode == 0) { + result(@{@"alias": iAlias ?: @""}); + } else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)getAlias:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"getAlias:%@",call.arguments); + [JPUSHService getAlias:^(NSInteger iResCode, NSString *iAlias, NSInteger seq) { + if (iResCode == 0) { + result(@{@"alias": iAlias ?: @""}); + }else { + NSError *error = [[NSError alloc] initWithDomain:@"JPush.Flutter" code:iResCode userInfo:nil]; + result([error flutterError]); + } + } seq: 0]; +} + +- (void)setBadge:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setBadge:%@",call.arguments); + NSInteger badge = [call.arguments[@"badge"] integerValue]; + if (badge < 0) { + badge = 0; + } + [[UIApplication sharedApplication] setApplicationIconBadgeNumber: badge]; + [JPUSHService setBadge: badge]; +} + +- (void)stopPush:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"stopPush:"); + [[UIApplication sharedApplication] unregisterForRemoteNotifications]; +} + +- (void)resumePush:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"resumePush:"); + [[UIApplication sharedApplication] registerForRemoteNotifications]; +} + +- (void)clearAllNotifications:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"clearAllNotifications:"); + + if (@available(iOS 10.0, *)) { + //iOS 10 以上支持 + JPushNotificationIdentifier *identifier = [[JPushNotificationIdentifier alloc] init]; + identifier.identifiers = nil; + identifier.delivered = YES; //等于 YES 则移除所有在通知中心显示的,等于 NO 则为移除所有待推送的 + [JPUSHService removeNotification:identifier]; + } else { + // iOS 10 以下移除所有推送;iOS 10 以上移除所有在通知中心显示推送和待推送请求 + [JPUSHService removeNotification:nil]; + } +} +- (void)clearNotification:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"clearNotification:"); + + NSNumber *notificationId = call.arguments; + if (!notificationId) { + return ; + } + JPushNotificationIdentifier *identifier = [[JPushNotificationIdentifier alloc] init]; + identifier.identifiers = @[notificationId.stringValue]; + + if (@available(iOS 10.0, *)) { + //iOS 10 以上有效,等于 YES 则在通知中心显示的里面移除,等于 NO 则为在待推送的里面移除;iOS 10 以下无效 + identifier.delivered = YES; + } else { + // Fallback on earlier versions + } + [JPUSHService removeNotification:identifier]; +} + +- (void)getLaunchAppNotification:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"getLaunchAppNotification"); + result(_launchNotification == nil ? @{}: _launchNotification); +} + +- (void)getRegistrationID:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"getRegistrationID:"); +#if TARGET_IPHONE_SIMULATOR//模拟器 + NSLog(@"simulator can not get registrationid"); + result(@""); +#elif TARGET_OS_IPHONE//真机 + + + if ([JPUSHService registrationID] != nil && ![[JPUSHService registrationID] isEqualToString:@""]) { + // 如果已经成功获取 registrationID,从本地获取直接缓存 + result([JPUSHService registrationID]); + return; + } + + if (_isJPushDidLogin) {// 第一次获取未登录情况 + result(@[[JPUSHService registrationID]]); + } else { + [getRidResults addObject:result]; + } +#endif +} + +- (void)sendLocalNotification:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"sendLocalNotification:%@",call.arguments); + JPushNotificationContent *content = [[JPushNotificationContent alloc] init]; + NSDictionary *params = call.arguments; + if (params[@"title"]) { + content.title = params[@"title"]; + } + + if (params[@"subtitle"] && ![params[@"subtitle"] isEqualToString:@""]) { + content.subtitle = params[@"subtitle"]; + } + + if (params[@"content"]) { + content.body = params[@"content"]; + } + + if (params[@"badge"]) { + content.badge = params[@"badge"]; + } + + if (params[@"action"] && ![params[@"action"] isEqualToString:@""]) { + content.action = params[@"action"]; + } + + if ([params[@"extra"] isKindOfClass:[NSDictionary class]]) { + content.userInfo = params[@"extra"]; + } + + if (params[@"soundName"] && ![params[@"soundName"] isEqualToString:@""]) { + content.sound = params[@"soundName"]; + } + + if (@available(iOS 15.0, *)) { + content.interruptionLevel = UNNotificationInterruptionLevelActive; + content.relevanceScore = 1; + } + + JPushNotificationTrigger *trigger = [[JPushNotificationTrigger alloc] init]; + if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0) { + if (params[@"fireTime"]) { + NSNumber *date = params[@"fireTime"]; + NSTimeInterval currentInterval = [[NSDate date] timeIntervalSince1970]; + NSTimeInterval interval = [date doubleValue]/1000 - currentInterval; + interval = interval>0?interval:0; + trigger.timeInterval = interval; + } + } + + else { + if (params[@"fireTime"]) { + NSNumber *date = params[@"fireTime"]; + trigger.fireDate = [NSDate dateWithTimeIntervalSince1970: [date doubleValue]/1000]; + } + } + JPushNotificationRequest *request = [[JPushNotificationRequest alloc] init]; + request.content = content; + request.trigger = trigger; + + if (params[@"id"]) { + NSNumber *identify = params[@"id"]; + request.requestIdentifier = [identify stringValue]; + } + request.completionHandler = ^(id result) { + NSLog(@"result"); + }; + + [JPUSHService addNotification:request]; + + result(@[@[]]); +} + +/// 检查当前应用的通知开关是否开启 +- (void)isNotificationEnabled:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"isNotificationEnabled:"); + [JPUSHService requestNotificationAuthorization:^(JPAuthorizationStatus status) { + BOOL isEnabled = NO; + if (status == JPAuthorizationStatusAuthorized) { + isEnabled = YES; + } + + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:isEnabled],@"isEnabled", nil]; + dispatch_async(dispatch_get_main_queue(), ^{ + result(dict); + }); + }]; + + +} +- (void)openSettingsForNotification { + JPLog(@"openSettingsForNotification:"); + [JPUSHService openSettingsForNotification:^(BOOL success) { + JPLog(@"openSettingsForNotification: %@",@(success)); + }]; +} + +- (void)setAuth:(FlutterMethodCall*)call result:(FlutterResult)result { + JPLog(@"setAuth:%@",call.arguments); + BOOL enable = [call.arguments[@"enable"] boolValue]; + [JGInforCollectionAuth JCollectionAuth:^(JGInforCollectionAuthItems * _Nonnull authInfo) { + authInfo.isAuth = enable; + }]; + +} + +- (void)pageEnterTo:(FlutterMethodCall*)call { + JPLog(@"pageEnterTo:%@",call.arguments); + NSString *pageName = call.arguments; + [JPUSHService pageEnterTo:pageName]; +} + +- (void)pageLeave:(FlutterMethodCall*)call { + JPLog(@"pageLeave:%@",call.arguments); + NSString *pageName = call.arguments; + [JPUSHService pageLeave:pageName]; +} + + +- (void)dealloc { + _isJPushDidLogin = NO; + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + + +#pragma mark - AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + _completeLaunchNotification = launchOptions; + if (launchOptions != nil) { + _launchNotification = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; + _launchNotification = [self jpushFormatAPNSDic:_launchNotification.copy]; + } + + if ([launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]) { + UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]; + NSMutableDictionary *localNotificationEvent = @{}.mutableCopy; + localNotificationEvent[@"content"] = localNotification.alertBody; + localNotificationEvent[@"badge"] = @(localNotification.applicationIconBadgeNumber); + localNotificationEvent[@"extras"] = localNotification.userInfo; + localNotificationEvent[@"fireTime"] = [NSNumber numberWithLong:[localNotification.fireDate timeIntervalSince1970] * 1000]; + localNotificationEvent[@"soundName"] = [localNotification.soundName isEqualToString:UILocalNotificationDefaultSoundName] ? @"" : localNotification.soundName; + + if (@available(iOS 8.2, *)) { + localNotificationEvent[@"title"] = localNotification.alertTitle; + } + _launchNotification = localNotificationEvent; + } + //[self performSelector:@selector(addNotificationWithDateTrigger) withObject:nil afterDelay:2]; + return YES; +} +- (void)addNotificationWithDateTrigger { + + JPushNotificationTrigger *trigger = [[JPushNotificationTrigger alloc] init]; + + if (@available(iOS 10.0, *)) { + trigger.timeInterval = 10; + } else { + NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:10]; + trigger.fireDate = fireDate; + } + + JPushNotificationContent *content = [[JPushNotificationContent alloc] init]; + content.title = @"title"; + content.subtitle = @"subtitle"; + content.body = @"body"; + content.badge = @(1); + content.action = @"action"; + content.categoryIdentifier = @"categoryIdentifier"; + content.threadIdentifier = @"threadIdentifier"; + + JPushNotificationRequest *request = [[JPushNotificationRequest alloc] init]; + request.content = content; + request.trigger = trigger; + request.completionHandler = ^(id result) { + // iOS10以上成功则result为UNNotificationRequest对象,失败则result为nil + // iOS10以下成功result为UILocalNotification对象,失败则result为nil + if (result) { + NSLog(@"添加日期通知成功 --- %@", result); + } + }; + request.requestIdentifier = @"123"; + [JPUSHService addNotification:request]; +} + + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // _resumingFromBackground = YES; +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // application.applicationIconBadgeNumber = 1; + // application.applicationIconBadgeNumber = 0; +} + +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + [JPUSHService registerDeviceToken:deviceToken]; +} + +- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { + NSDictionary *settingsDictionary = @{ + @"sound" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeSound], + @"badge" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeBadge], + @"alert" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeAlert], + }; + [_channel invokeMethod:@"onIosSettingsRegistered" arguments:settingsDictionary]; +} + +- (BOOL)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { + JPLog(@"application:didReceiveRemoteNotification:fetchCompletionHandler"); + [JPUSHService handleRemoteNotification:userInfo]; + if (@available(* ,iOS 10)) { + [_channel invokeMethod:@"onReceiveNotification" arguments:userInfo]; + + /** + * 下面这段代码是解决 app处于杀死状态,点击通知启动app,但是不回调onOpenNotification的问题。 + * 上诉情况不会走didReceiveNotificationResponse:回调。但是会走didReceiveRemoteNotification:fetchCompletionHandler:回调。iOS原生项目中正常情况下,点击通知冷启动app是会回调didReceiveNotificationResponse,不回调didReceiveRemoteNotification:fetchCompletionHandler:的。 + * 因为不走didReceiveNotificationResponse:回调 所以没有onOpenNotification回调。这跟生命周期有关,didReceiveNotificationResponse:的代理需要通知的远程代理设置要在didFinishLaunch结束之前。但是flutter初始化jpush是在didFinishLaunch之后。 + * 在这个方法里做一个判断吧,如果收到的消息和启动时的消息是同一个消息,则判断该消息为app杀死状态下通过点击通知唤醒的。 + */ + + if (_launchNotification && userInfo && [_launchNotification isKindOfClass:[NSDictionary class]] && [userInfo isKindOfClass:[NSDictionary class]]) { + // 拿到启动时的推送数据里的msgid + NSNumber *launchMsgid = [_launchNotification valueForKey:@"_j_msgid"]; + // 拿到收到的消息的msgid + NSNumber *msgid = [userInfo valueForKey:@"_j_msgid"]; + // 如果消息id一致 + if ([launchMsgid isKindOfClass:[NSNumber class]] && [msgid isKindOfClass:[NSNumber class]] && [[launchMsgid stringValue] isEqualToString:[msgid stringValue]]) { + [_channel invokeMethod:@"onOpenNotification" arguments:_launchNotification]; + } + } + } + completionHandler(UIBackgroundFetchResultNewData); + return YES; +} + +// iOS 10 以下点击本地通知 +-(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { + JPLog(@"application:didReceiveLocalNotification:"); + + NSMutableDictionary *dic = [NSMutableDictionary dictionary]; + NSString *title = @""; + if (@available(iOS 8.2, *)) { + title = notification.alertTitle; + } else { + // Fallback on earlier versions + } + + NSString *body = notification.alertBody; + NSString *action = notification.alertAction; + + [dic setValue:title?:@"" forKey:@"title"]; + [dic setValue:body?:@"" forKey:@"body"]; + [dic setValue:action?:@"" forKey:@"action"]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [self.channel invokeMethod:@"onOpenNotification" arguments:dic]; + }); +} + +//前台收到本地通知 +- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler API_AVAILABLE(ios(10.0)){ + JPLog(@"jpushNotificationCenter:willPresentNotification::"); + NSDictionary * userInfo = notification.request.content.userInfo; + if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { + [JPUSHService handleRemoteNotification:userInfo]; + if (@available(iOS 10 , *)) { + [_channel invokeMethod:@"onReceiveNotification" arguments: [self jpushFormatAPNSDic:userInfo]]; + } + }else{ + JPLog(@"iOS10 前台收到本地通知:userInfo:%@",userInfo); + } + if (!self.unShow) completionHandler(notificationTypes); +} + +- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler API_AVAILABLE(ios(10.0)){ + JPLog(@"jpushNotificationCenter:didReceiveNotificationResponse::"); + NSDictionary * userInfo = response.notification.request.content.userInfo; + if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { + [JPUSHService handleRemoteNotification:userInfo]; + [_channel invokeMethod:@"onOpenNotification" arguments: [self jpushFormatAPNSDic:userInfo]]; + }else{ + // iOS 10 以上点击本地通知 + JPLog(@"iOS10 点击本地通知"); + NSMutableDictionary *dic = [NSMutableDictionary dictionary]; + NSString *identifier = response.notification.request.identifier; + NSString *body = response.notification.request.content.body; + NSString *categoryIdentifier = response.notification.request.content.categoryIdentifier; + NSString *title = response.notification.request.content.title; + NSString *subtitle = response.notification.request.content.subtitle; + NSString *threadIdentifier = response.notification.request.content.threadIdentifier; + + [dic setValue:body?:@"" forKey:@"body"]; + [dic setValue:title?:@"" forKey:@"title"]; + [dic setValue:subtitle?:@"" forKey:@"subtitle"]; + [dic setValue:identifier?:@"" forKey:@"identifier"]; + [dic setValue:threadIdentifier?:@"" forKey:@"threadIdentifier"]; + [dic setValue:categoryIdentifier?:@"" forKey:@"categoryIdentifier"]; + if (userInfo && userInfo.count) { + NSMutableDictionary *extras = [NSMutableDictionary dictionary]; + for (NSString *key in userInfo) { + extras[key] = userInfo[key]; + } + dic[@"extras"] = extras; + } + dispatch_async(dispatch_get_main_queue(), ^{ + [self.channel invokeMethod:@"onOpenNotification" arguments:dic]; + }); + } + completionHandler(); +} + +- (void)jpushNotificationAuthorization:(JPAuthorizationStatus)status withInfo:(NSDictionary *)info { + JPLog(@""); + BOOL isEnabled = NO; + if (status == JPAuthorizationStatusAuthorized) { + isEnabled = YES; + } + + NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:isEnabled],@"isEnabled", nil]; + __weak typeof(self) weakself = self; + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(self) strongself = weakself; + [strongself.channel invokeMethod:@"onReceiveNotificationAuthorization" arguments: dict]; + }); +} +- (NSMutableDictionary *)jpushFormatAPNSDic:(NSDictionary *)dic { + NSMutableDictionary *extras = @{}.mutableCopy; + for (NSString *key in dic) { + if([key isEqualToString:@"_j_business"] || + [key isEqualToString:@"_j_msgid"] || + [key isEqualToString:@"_j_uid"] || + [key isEqualToString:@"actionIdentifier"] || + [key isEqualToString:@"aps"]) { + continue; + } + extras[key] = dic[key]; + } + NSMutableDictionary *formatDic = dic.mutableCopy; + formatDic[@"extras"] = extras; + return formatDic; +} + + +#pragma mark - 应用内消息回调 +- (void)jPushInAppMessageDidShow:(JPushInAppMessage *)inAppMessage { + [_channel invokeMethod:@"onInAppMessageShow" arguments: [self convertInappMsg:inAppMessage]]; +} + +- (void)jPushInAppMessageDidClick:(JPushInAppMessage *)inAppMessage { + [_channel invokeMethod:@"onInAppMessageClick" arguments: [self convertInappMsg:inAppMessage]]; +} + +- (NSDictionary *)convertInappMsg:(JPushInAppMessage *)inAppMessage { + NSDictionary *result = @{ + @"mesageId": inAppMessage.mesageId ?: @"", // 消息id + @"title": inAppMessage.title ?:@"", // 标题 + @"content": inAppMessage.content ?: @"", // 内容 + @"target": inAppMessage.target ?: @[], // 目标页面 + @"clickAction": inAppMessage.clickAction ?: @"", // 跳转地址 + @"extras": inAppMessage.extras ?: @{} // 附加字段 + }; + return result; +} + + +@end diff --git a/ios/jpush_flutter.podspec b/ios/jpush_flutter.podspec new file mode 100644 index 0000000..5d1ae7a --- /dev/null +++ b/ios/jpush_flutter.podspec @@ -0,0 +1,22 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'jpush_flutter' + s.version = '0.0.2' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'xudong.rao' => 'xudong.rao@outlook.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.dependency 'JCore','>= 4.6.2' + s.dependency 'JPush','5.3.0' + s.ios.deployment_target = '8.0' + s.static_framework = true +end diff --git a/lib/jpush_flutter.dart b/lib/jpush_flutter.dart new file mode 100644 index 0000000..fd9ee45 --- /dev/null +++ b/lib/jpush_flutter.dart @@ -0,0 +1,525 @@ +import 'dart:async'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:platform/platform.dart'; + +typedef Future EventHandler(Map event); + +class JPush { + static const String flutter_log = "| JPUSH | Flutter | "; + + factory JPush() => _instance; + + final MethodChannel _channel; + final Platform _platform; + + @visibleForTesting + JPush.private(MethodChannel channel, Platform platform) + : _channel = channel, + _platform = platform; + + static final JPush _instance = + new JPush.private(const MethodChannel('jpush'), const LocalPlatform()); + + EventHandler? _onReceiveNotification; + EventHandler? _onOpenNotification; + EventHandler? _onReceiveMessage; + EventHandler? _onReceiveNotificationAuthorization; + EventHandler? _onNotifyMessageUnShow; + EventHandler? _onConnected; + EventHandler? _onInAppMessageClick; + EventHandler? _onInAppMessageShow; + void setup({ + String appKey = '', + bool production = false, + String channel = '', + bool debug = false, + }) { + print(flutter_log + "setup:"); + + _channel.invokeMethod('setup', { + 'appKey': appKey, + 'channel': channel, + 'production': production, + 'debug': debug + }); + } + + void setChannelAndSound({ + String channel = '', + String channelID = '', + String sound = '', + }) { + if (_platform.isIOS) { + return; + } + print(flutter_log + "setChannelAndSound:"); + + _channel.invokeMethod('setChannelAndSound', + {'channel': channel, 'channel_id': channelID, 'sound': sound}); + } + + //APP活跃在前台时是否展示通知 + void setUnShowAtTheForeground({bool unShow = false}) { + print(flutter_log + "setUnShowAtTheForeground:"); + _channel.invokeMethod('setUnShowAtTheForeground', {'UnShow': unShow}); + } + + void setWakeEnable({bool enable = false}) { + _channel.invokeMethod('setWakeEnable', {'enable': enable}); + } + + void enableAutoWakeup({bool enable = false}) { + if (_platform.isIOS) { + return; + } + _channel.invokeMethod('enableAutoWakeup', {'enable': enable}); + } + + void setAuth({bool enable = true}) { + print(flutter_log + "setAuth:"); + _channel.invokeMethod('setAuth', {'enable': enable}); + } + + void setLinkMergeEnable({bool enable = true}) { + if (_platform.isIOS) { + return; + } + print(flutter_log + "setLinkMergeEnable:"); + _channel.invokeMethod('setLinkMergeEnable', {'enable': enable}); + } + + void setGeofenceEnable({bool enable = true}) { + if (_platform.isIOS) { + return; + } + print(flutter_log + "setGeofenceEnable:"); + _channel.invokeMethod('setGeofenceEnable', {'enable': enable}); + } + + void setSmartPushEnable({bool enable = true}) { + if (_platform.isIOS) { + return; + } + print(flutter_log + "setSmartPushEnable:"); + _channel.invokeMethod('setSmartPushEnable', {'enable': enable}); + } + + void setCollectControl({ + bool imsi = true, // only android + bool mac = true, // only android + bool wifi = true, // only android + bool bssid = true, // only android + bool ssid = true, // only android + bool imei = true, // only android + bool cell = true, // only android + bool gps = true, // only ios + }) { + print(flutter_log + "setCollectControl:"); + + _channel.invokeMethod('setCollectControl', { + 'imsi': imsi, + 'mac': mac, + 'wifi': wifi, + 'bssid': bssid, + 'ssid': ssid, + 'imei': imei, + 'cell': cell, + 'gps': gps + }); + } + + /// + /// 初始化 JPush 必须先初始化才能执行其他操作(比如接收事件传递) + /// + void addEventHandler({ + EventHandler? onReceiveNotification, + EventHandler? onOpenNotification, + EventHandler? onReceiveMessage, + EventHandler? onReceiveNotificationAuthorization, + EventHandler? onNotifyMessageUnShow, + EventHandler? onConnected, + EventHandler? onInAppMessageClick, + EventHandler? onInAppMessageShow, + }) { + print(flutter_log + "addEventHandler:"); + + _onReceiveNotification = onReceiveNotification; + _onOpenNotification = onOpenNotification; + _onReceiveMessage = onReceiveMessage; + _onReceiveNotificationAuthorization = onReceiveNotificationAuthorization; + _onNotifyMessageUnShow = onNotifyMessageUnShow; + _onConnected = onConnected; + _onInAppMessageClick = onInAppMessageClick; + _onInAppMessageShow = onInAppMessageShow; + _channel.setMethodCallHandler(_handleMethod); + } + + Future _handleMethod(MethodCall call) async { + print(flutter_log + "_handleMethod:"); + + switch (call.method) { + case "onReceiveNotification": + return _onReceiveNotification!(call.arguments.cast()); + case "onOpenNotification": + return _onOpenNotification!(call.arguments.cast()); + case "onReceiveMessage": + return _onReceiveMessage!(call.arguments.cast()); + case "onReceiveNotificationAuthorization": + return _onReceiveNotificationAuthorization!( + call.arguments.cast()); + case "onNotifyMessageUnShow": + return _onNotifyMessageUnShow!(call.arguments.cast()); + case "onConnected": + return _onConnected!(call.arguments.cast()); + case "onInAppMessageClick": + return _onInAppMessageClick!(call.arguments.cast()); + case "onInAppMessageShow": + return _onInAppMessageShow!(call.arguments.cast()); + default: + throw new UnsupportedError("Unrecognized Event"); + } + } + + /// + /// iOS Only + /// 申请推送权限,注意这个方法只会向用户弹出一次推送权限请求(如果用户不同意,之后只能用户到设置页面里面勾选相应权限),需要开发者选择合适的时机调用。 + /// + void applyPushAuthority( + [NotificationSettingsIOS iosSettings = const NotificationSettingsIOS()]) { + print(flutter_log + "applyPushAuthority:"); + + if (!_platform.isIOS) { + return; + } + + _channel.invokeMethod('applyPushAuthority', iosSettings.toMap()); + } + + // iOS Only + // 进入页面, pageName:页面名 请与pageLeave配套使用 + void pageEnterTo(String pageName) { + print(flutter_log + "pageEnterTo:" + pageName); + if (!_platform.isIOS) { + return; + } + _channel.invokeMethod('pageEnterTo', pageName); + } + + // iOS Only + // 离开页面,pageName:页面名, 请与pageEnterTo配套使用 + void pageLeave(String pageName) { + print(flutter_log + "pageLeave:" + pageName); + if (!_platform.isIOS) { + return; + } + _channel.invokeMethod('pageLeave', pageName); + } + + /// + /// 设置 Tag (会覆盖之前设置的 tags) + /// + /// @param {Array} params = [String] + /// @param {Function} success = ({"tags":[String]}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> setTags(List tags) async { + print(flutter_log + "setTags:"); + + final Map result = + await _channel.invokeMethod('setTags', tags); + return result; + } + + /// + /// 清空所有 tags。 + /// + /// @param {Function} success = ({"tags":[String]}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> cleanTags() async { + print(flutter_log + "cleanTags:"); + + final Map result = + await _channel.invokeMethod('cleanTags'); + return result; + } + + /// + /// 在原有 tags 的基础上添加 tags + /// + /// @param {Array} tags = [String] + /// @param {Function} success = ({"tags":[String]}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + + Future> addTags(List tags) async { + print(flutter_log + "addTags:"); + + final Map result = + await _channel.invokeMethod('addTags', tags); + return result; + } + + /// + /// 删除指定的 tags + /// + /// @param {Array} tags = [String] + /// @param {Function} success = ({"tags":[String]}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> deleteTags(List tags) async { + print(flutter_log + "deleteTags:"); + + final Map result = + await _channel.invokeMethod('deleteTags', tags); + return result; + } + + /// + /// 获取所有当前绑定的 tags + /// + /// @param {Function} success = ({"tags":[String]}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> getAllTags() async { + print(flutter_log + "getAllTags:"); + + final Map result = + await _channel.invokeMethod('getAllTags'); + return result; + } + + /// + /// 获取所有当前绑定的 alias + /// + /// @param {Function} success = ({"alias":String}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> getAlias() async { + print(flutter_log + "getAlias:"); + final Map result = + await _channel.invokeMethod('getAlias'); + return result; + } + + /// + /// 重置 alias. + /// + /// @param {String} alias + /// + /// @param {Function} success = ({"alias":String}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> setAlias(String alias) async { + print(flutter_log + "setAlias:"); + + final Map result = + await _channel.invokeMethod('setAlias', alias); + return result; + } + + void testCountryCode(String code) { + print(flutter_log + "testCountryCode:" + code); + _channel.invokeMethod('testCountryCode', code); + } + + /// + /// 删除原有 alias + /// + /// @param {Function} success = ({"alias":String}) => { } + /// @param {Function} fail = ({"errorCode":int}) => { } + /// + Future> deleteAlias() async { + print(flutter_log + "deleteAlias:"); + + final Map result = + await _channel.invokeMethod('deleteAlias'); + return result; + } + + /// + /// 设置应用 Badge(小红点) + /// + /// @param {Int} badge + /// + /// 注意:如果是 Android 手机,目前仅支持华为手机 + /// + Future setBadge(int badge) async { + print(flutter_log + "setBadge:"); + + await _channel.invokeMethod('setBadge', {"badge": badge}); + } + + /// + /// 停止接收推送,调用该方法后应用将不再受到推送,如果想要重新收到推送可以调用 resumePush。 + /// + Future stopPush() async { + print(flutter_log + "stopPush:"); + + await _channel.invokeMethod('stopPush'); + } + + /// + /// 恢复推送功能。 + /// + Future resumePush() async { + print(flutter_log + "resumePush:"); + + await _channel.invokeMethod('resumePush'); + } + + /// + /// 清空通知栏上的所有通知。 + /// + Future clearAllNotifications() async { + print(flutter_log + "clearAllNotifications:"); + + await _channel.invokeMethod('clearAllNotifications'); + } + + Future clearLocalNotifications() async { + if (_platform.isIOS) { + return; + } + print(flutter_log + "clearLocalNotifications:"); + await _channel.invokeMethod('clearLocalNotifications'); + } + + /// + /// 清空通知栏上某个通知 + /// @param notificationId 通知 id,即:LocalNotification id + /// + void clearNotification({int notificationId = 0}) { + print(flutter_log + "clearNotification:"); + _channel.invokeListMethod("clearNotification", notificationId); + } + + /// + /// iOS Only + /// 点击推送启动应用的时候原生会将该 notification 缓存起来,该方法用于获取缓存 notification + /// 注意:notification 可能是 remoteNotification 和 localNotification,两种推送字段不一样。 + /// 如果不是通过点击推送启动应用,比如点击应用 icon 直接启动应用,notification 会返回 @{}。 + /// @param {Function} callback = (Object) => {} + /// + Future> getLaunchAppNotification() async { + print(flutter_log + "getLaunchAppNotification:"); + + final Map result = + await _channel.invokeMethod('getLaunchAppNotification'); + return result; + } + + /// + /// 获取 RegistrationId, JPush 可以通过制定 RegistrationId 来进行推送。 + /// + /// @param {Function} callback = (String) => {} + /// + Future getRegistrationID() async { + print(flutter_log + "getRegistrationID:"); + + final String rid = await _channel.invokeMethod('getRegistrationID'); + return rid; + } + + /// + /// 发送本地通知到调度器,指定时间出发该通知。 + /// @param {Notification} notification + /// + Future sendLocalNotification(LocalNotification notification) async { + print(flutter_log + "sendLocalNotification:"); + + await _channel.invokeMethod('sendLocalNotification', notification.toMap()); + + return notification.toMap().toString(); + } + + /// 调用此 API 检测通知授权状态是否打开 + Future isNotificationEnabled() async { + final Map result = + await _channel.invokeMethod('isNotificationEnabled'); + bool isEnabled = result["isEnabled"]; + return isEnabled; + } + + /// 调用此 API 跳转至系统设置中应用设置界面 + void openSettingsForNotification() { + _channel.invokeMethod('openSettingsForNotification'); + } + + void requestRequiredPermission() { + if (_platform.isIOS) { + return; + } + _channel.invokeMethod('requestRequiredPermission'); + } +} + +class NotificationSettingsIOS { + final bool sound; + final bool alert; + final bool badge; + + const NotificationSettingsIOS({ + this.sound = true, + this.alert = true, + this.badge = true, + }); + + Map toMap() { + return {'sound': sound, 'alert': alert, 'badge': badge}; + } +} + +/// @property {number} [buildId] - 通知样式:1 为基础样式,2 为自定义样式(需先调用 `setStyleCustom` 设置自定义样式) +/// @property {number} [id] - 通知 id, 可用于取消通知 +/// @property {string} [title] - 通知标题 +/// @property {string} [content] - 通知内容 +/// @property {object} [extra] - extra 字段 +/// @property {number} [fireTime] - 通知触发时间(毫秒) +/// // iOS Only +/// @property {number} [badge] - 本地推送触发后应用角标值 +/// // iOS Only +/// @property {string} [soundName] - 指定推送的音频文件 +/// // iOS 10+ Only +/// @property {string} [subtitle] - 子标题 +class LocalNotification { + final int? buildId; //? + final int? id; + final String? title; + final String? content; + final Map? extra; //? + final DateTime? fireTime; + final int? badge; //? + final String? soundName; //? + final String? subtitle; //? + + const LocalNotification( + {@required this.id, + @required this.title, + @required this.content, + @required this.fireTime, + this.buildId, + this.extra, + this.badge = 0, + this.soundName, + this.subtitle}) + : assert(id != null), + assert(title != null), + assert(content != null), + assert(fireTime != null); + + Map toMap() { + return { + 'id': id, + 'title': title, + 'content': content, + 'fireTime': fireTime?.millisecondsSinceEpoch, + 'buildId': buildId, + 'extra': extra, + 'badge': badge, + 'soundName': soundName, + 'subtitle': subtitle + }..removeWhere((key, value) => value == null); + } +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..06de9c2 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,61 @@ +name: jpush_flutter +description: JIGUANG officially supported JPush Flutter plugin (Android & iOS). 极光推送官方支持的 Flutter 插件(Android & iOS)(https://www.jiguang.cn). +version: 2.5.8 +# author: xudong.rao +homepage: https://www.jiguang.cn + +environment: + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" + +dependencies: + platform: ^3.0.0 + flutter: + sdk: flutter + +dev_dependencies: + test: ^1.17.4 + mockito: ^5.0.7 +# For information on the generic Dart part of this file, see the +# following page: https://www.dartlang.org/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + plugin: + platforms: + android: + package: com.jiguang.jpush + pluginClass: JPushPlugin + ios: + pluginClass: JPushPlugin + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.io/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.io/assets-and-images/#resolution-aware. + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.io/custom-fonts/#from-packages