From 6e02aaf22b9798f4b01554a9153d2c66591da8c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=8D=8E=E8=BD=A9?= <646903573@qq.com> Date: Wed, 14 Oct 2020 09:13:22 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=88=9D=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E5=AE=8C=E6=88=90=E9=98=BF=E9=87=8C=E7=99=BE?= =?UTF-8?q?=E5=B7=9D=E6=B8=A0=E9=81=93=E6=8E=88=E6=9D=83=E3=80=81=E5=95=86?= =?UTF-8?q?=E5=93=81=E8=AF=A6=E6=83=85=E7=9A=84=E6=89=8B=E6=B7=98=E8=B0=83?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 20 + .metadata | 10 + CHANGELOG.md | 62 ++ LICENSE | 21 + README.md | 218 ++++++ android/.gitignore | 8 + android/build.gradle | 70 ++ android/gradle.properties | 2 + android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + android/gradlew | 172 +++++ android/gradlew.bat | 84 +++ android/libs/sweet-alert-dialog_v1.3.aar | Bin 0 -> 35825 bytes android/settings.gradle | 1 + android/src/main/AndroidManifest.xml | 12 + .../flutter_alibc/FlutterAlibcHandle.java | 334 +++++++++ .../flutter_alibc/FlutterAlibcPlugin.java | 48 ++ .../wxwx/flutter_alibc/PluginConstants.java | 29 + .../wxwx/flutter_alibc/PluginResponse.java | 35 + .../com/wxwx/flutter_alibc/PluginUtil.java | 54 ++ .../com/wxwx/flutter_alibc/WebActivity.java | 528 ++++++++++++++ .../flutter_alibc/web/WebViewActivity.java | 143 ++++ .../src/main/res/layout/activity_web_bc.xml | 26 + .../src/main/res/layout/webview_activity.xml | 12 + example/.flutter-plugins-dependencies | 1 + example/.gitignore | 72 ++ example/.metadata | 10 + example/README.md | 16 + example/android/app/build.gradle | 77 +++ example/android/app/release.keystore | Bin 0 -> 2184 bytes .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 37 + .../flutter_alibc_example/MainActivity.java | 13 + .../main/res/drawable/launch_background.xml | 12 + .../main/res/drawable/yw_1222_baichuan.jpg | Bin 0 -> 87936 bytes .../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/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + example/android/build.gradle | 29 + example/android/gradle.properties | 5 + .../gradle/wrapper/gradle-wrapper.properties | 6 + example/android/settings.gradle | 15 + example/ios/Flutter/.last_build_id | 1 + example/ios/Flutter/AppFrameworkInfo.plist | 26 + example/ios/Flutter/Debug.xcconfig | 2 + example/ios/Flutter/Flutter.podspec | 18 + example/ios/Flutter/Release.xcconfig | 2 + .../ios/Flutter/flutter_export_environment.sh | 10 + example/ios/Podfile | 73 ++ example/ios/Podfile.lock | 64 ++ example/ios/Runner.xcodeproj/project.pbxproj | 643 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + example/ios/Runner/AppDelegate.h | 6 + example/ios/Runner/AppDelegate.m | 30 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 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 | 67 ++ example/ios/Runner/main.m | 9 + .../ios/Runner/mtopsdk_configuration.plist | 8 + example/ios/yw_1222_baichuan.jpg | Bin 0 -> 87768 bytes example/lib/main.dart | 161 +++++ example/pubspec.lock | 202 ++++++ example/pubspec.yaml | 63 ++ example/test/widget_test.dart | 27 + ios/.gitignore | 36 + ios/Assets/.gitkeep | 0 .../FlutterAlibcConstKey.h | 14 + ios/Classes/FlutterAlibcPlugin.h | 4 + ios/Classes/FlutterAlibcPlugin.m | 86 +++ ios/Classes/Handle/FlutterAlibcHandle.h | 99 +++ ios/Classes/Handle/FlutterAlibcHandle.m | 515 ++++++++++++++ ios/Classes/Tools/FlutterAlibcTools.h | 23 + ios/Classes/Tools/FlutterAlibcTools.m | 116 ++++ .../WKWebView/ALiTradeWebViewController.h | 23 + .../WKWebView/ALiTradeWebViewController.m | 89 +++ .../FlutterWxViewCtrlViewController.h | 19 + .../FlutterWxViewCtrlViewController.m | 61 ++ ios/flutter_alibc.podspec | 36 + lib/albc_tools.dart | 62 ++ lib/alibc_const_key.dart | 47 ++ lib/alibc_model.dart | 134 ++++ lib/flutter_alibc.dart | 264 +++++++ pubspec.lock | 188 +++++ pubspec.yaml | 58 ++ test/flutter_alibc_test.dart | 21 + 113 files changed, 5846 insertions(+) create mode 100644 .gitignore create mode 100644 .metadata create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 android/.gitignore 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/libs/sweet-alert-dialog_v1.3.aar create mode 100644 android/settings.gradle create mode 100644 android/src/main/AndroidManifest.xml create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcHandle.java create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcPlugin.java create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/PluginConstants.java create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/PluginResponse.java create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/PluginUtil.java create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/WebActivity.java create mode 100644 android/src/main/java/com/wxwx/flutter_alibc/web/WebViewActivity.java create mode 100644 android/src/main/res/layout/activity_web_bc.xml create mode 100644 android/src/main/res/layout/webview_activity.xml create mode 100644 example/.flutter-plugins-dependencies create mode 100644 example/.gitignore create mode 100644 example/.metadata create mode 100644 example/README.md create mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/release.keystore create mode 100644 example/android/app/src/debug/AndroidManifest.xml create mode 100644 example/android/app/src/main/AndroidManifest.xml create mode 100644 example/android/app/src/main/java/wxwx/com/flutter_alibc_example/MainActivity.java create mode 100644 example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 example/android/app/src/main/res/drawable/yw_1222_baichuan.jpg 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/styles.xml create mode 100644 example/android/app/src/profile/AndroidManifest.xml create mode 100644 example/android/build.gradle create mode 100644 example/android/gradle.properties create mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 example/android/settings.gradle create mode 100644 example/ios/Flutter/.last_build_id 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 100755 example/ios/Flutter/flutter_export_environment.sh create mode 100644 example/ios/Podfile create mode 100644 example/ios/Podfile.lock 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/main.m create mode 100644 example/ios/Runner/mtopsdk_configuration.plist create mode 100644 example/ios/yw_1222_baichuan.jpg create mode 100644 example/lib/main.dart create mode 100644 example/pubspec.lock create mode 100644 example/pubspec.yaml create mode 100644 example/test/widget_test.dart create mode 100644 ios/.gitignore create mode 100644 ios/Assets/.gitkeep create mode 100644 ios/Classes/FlutterAlibcConstKey/FlutterAlibcConstKey.h create mode 100644 ios/Classes/FlutterAlibcPlugin.h create mode 100644 ios/Classes/FlutterAlibcPlugin.m create mode 100644 ios/Classes/Handle/FlutterAlibcHandle.h create mode 100644 ios/Classes/Handle/FlutterAlibcHandle.m create mode 100644 ios/Classes/Tools/FlutterAlibcTools.h create mode 100644 ios/Classes/Tools/FlutterAlibcTools.m create mode 100644 ios/Classes/WKWebView/ALiTradeWebViewController.h create mode 100644 ios/Classes/WKWebView/ALiTradeWebViewController.m create mode 100644 ios/Classes/WKWebView/FlutterWxViewCtrlViewController.h create mode 100644 ios/Classes/WKWebView/FlutterWxViewCtrlViewController.m create mode 100644 ios/flutter_alibc.podspec create mode 100644 lib/albc_tools.dart create mode 100644 lib/alibc_const_key.dart create mode 100644 lib/alibc_model.dart create mode 100644 lib/flutter_alibc.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/flutter_alibc_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..816fcc4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +.DS_Store +.dart_tool/ + +.packages +.pub/ + +build/ +*.iml +.idea/ +.gradle/ +.vscode/ + +android/.classpath +android/.project +android/.settings/org.eclipse.buildship.core.prefs +example/android/.project +example/android/.settings/org.eclipse.buildship.core.prefs +example/android/app/.classpath +example/android/app/.project +example/android/app/.settings/org.eclipse.buildship.core.prefs diff --git a/.metadata b/.metadata new file mode 100644 index 0000000..29735e9 --- /dev/null +++ b/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: e4ebcdf6f4facee5779c38a04d91d08dc58ea7a4 + channel: beta + +project_type: plugin diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..71f6d97 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,62 @@ + +## 0.0.1 +完成开发 +* TODO: Describe initial release. +## 0.0.2 +修改readme +## 0.0.3 +Android 修正缺少的接口参数 + +## 0.0.4 + +AndroidX 测试 + +## 0.0.5 +1.修复Android与iOS逻辑不一致的地方 +2.修复枚举混乱的问题 +3.修复Android返回参数不正确的问题 +4.通过openurl,openItem,openShop,openCart的返回值在失败的情况下,移除tradeFailResult这个失败的回调data(因为Android没有) + +## 0.0.6 +升级到百川V4.0.2版本 +具体升级变动[百川官方更新说明](https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.749bbe48KRlbQC&treeId=129&articleId=106383&docType=1#s1) + +## 0.0.7 +1.修正iOS的回调,感谢[JarvanMo](https://github.com/JarvanMo) +2.修正iOS不传入backUrl导致的崩溃问题 +## 0.0.8 +新增二次授权获取accessToken用于二次授权登录 + +## 0.0.8 +1.新增淘客登录返回token用于服务端二次登录 + +## 0.0.9 +更新百川sdk到4.0.8 + +## 0.0.12 +iOS 更新到 4.0.1.0 + UIwebview换成Wkwebview +Android4.0.0.8 + +## 0.0.13 +iOS 更新到 4.0.1.0 + UIwebview换成Wkwebview + 支持swift +Android4.0.0.8 + +## 0.0.14 +iOS 4.0.1.0 +Android4.0.0.8 +iOS的依赖不再保存百川的库了,请自行添加淘宝pod源拉取 + + +## 0.0.15 +iOS升级 +iOS 4.0.1.6 +Android4.0.0.8 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..76bfb8b --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 FlutterTaoBaoKe + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..eae5e21 --- /dev/null +++ b/README.md @@ -0,0 +1,218 @@ + +# flutter_alibc + +Flutter版本的阿里百川 +android V4.0.0.8版本 +ios V4.0.1.6 版本 + +pub地址:[flutter_alibc](https://pub.dev/packages/flutter_alibc) +github地址:[flutter_alibc](https://github.com/FlutterTaoBaoKe/flutter_alibc.git) + +可以给个star🐴,混口饭吃 + +支持Android和iOS + +邮箱: + +Android:983598009@qq.com + +iOS:329106954@qq.com +P.S:另有开普勒插件[flutter_kepler](https://github.com/FlutterTaoBaoKe/flutter_kepler) +## Getting Started + +### 工程性配置 + +参考[阿里百川官网](https://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.3043be48zxxuk5&treeId=129&articleId=118102&docType=1) + +### 引入 +[如何引入项目](https://pub.dev/packages/flutter_alibc#-installing-tab-) +iOS请在podfile文件非注释的第一行,加入淘宝源,如果有其他源,请放在其他源下方,没有其他源只需要加这一个即可 +``` +source 'http://repo.baichuan-ios.taobao.com/baichuanSDK/AliBCSpecs.git' +``` +看不懂这句话就看下demo中的example/ios/podfile文件第4行代码,第3行是其他源的示例可以不加 + +### 支持swift了 +### 感谢[@a4081675](https://github.com/a4081675)同学 +[issues44](https://github.com/FlutterTaoBaoKe/flutter_alibc/issues/44) +### 方法说明 +* 头文件引入 +``` +import 'package:flutter_alibc/flutter_alibc.dart'; +``` + +* 初始化 + +``` + /** + * 初始化 + * version:当前app版本 + * appName:当前app名称 + * result:{ + * errorCode, //0为初始化成功,其他为失败 + * errorMessage, //message + * } + */ +var result = await FlutterAlibc.initAlibc(version:"",appName:""); +``` + +* 登录淘宝 +``` +/** + * 登录淘宝 + * version:当前app版本 + * appName:当前app名称 + * result:{ + * errorCode, //0为初始化成功,其他为失败 + * errorMessage, //message + * data:{ //登录成功的情况下返回data,为用户数据 + * //nick 用户昵称,avatarUrl 头像地址 + * nick,avatarUrl,openId,openSid,topAccessToken,topAuthCode + * } + * } + * 备注:登录过会直接返回淘宝用户的信息,不会多次唤醒淘宝,请放心 + */ +var result = await FlutterAlibc.loginTaoBao(); +``` + +* 淘宝登出 +``` +FlutterAlibc.loginOut(); +``` + +* 淘客登录,二次授权获取access_token + +``` + /** + * @description: 获取access_token + * @param + * url:用于授权登录的url + * openType:打开类型,默认auto + * isNeedCustomNativeFailMode:是否需要设置唤端失败策略,默认false + * nativeFailMode:唤端失败策略,默认None + * schemeType:唤起哪个端,默认天猫 + * taokeParams:淘客数据 + * backUrl: 跳转回来的url + * @return: {accessToken:""}//获取成功为token,获取失败为空字符串 + */ + var result = await FlutterAlibc.taoKeLogin( + url:"", //必须参数,用于授权登录的url + openType : AlibcOpenType.AlibcOpenTypeAuto, + isNeedCustomNativeFailMode : false, + nativeFailMode : AlibcNativeFailMode.AlibcNativeFailModeNone, + schemeType : AlibcSchemeType.AlibcSchemeTmall, + taokeParams : {}, + backUrl:"", + ); +``` + +* 唤起淘宝,openByUrl方式 + +``` + /** + * @description: 通过url打开,包括h5,唤起手淘等 + * @param + * url:目标url + * openType:打开类型,默认auto + * isNeedCustomNativeFailMode:是否需要设置唤端失败策略,默认false + * nativeFailMode:唤端失败策略,默认None + * schemeType:唤起哪个端,默认天猫 + * taokeParams:淘客数据 + * backUrl: 跳转回来的url + * @return: { + * errorCode, + * errorMessage, + * type, //0为添加购物车,1为付款成功 + * payResult, //type为1时返回 + * } + */ + var result = await FlutterAlibc.openByUrl( + url:"", //必须参数 + openType : AlibcOpenType.AlibcOpenTypeAuto, + isNeedCustomNativeFailMode : false, + nativeFailMode : AlibcNativeFailMode.AlibcNativeFailModeNone, + schemeType : AlibcSchemeType.AlibcSchemeTmall, + taokeParams : {}, + backUrl:"", + ); +``` + +* 唤起淘宝,openItemDetail方式 +``` +/** + * @description: 打开商品详情 + * @param + * itemID 商品id,可以是真实的也可以是混淆的,必须参数 + * trackParam 需要额外追踪的业务数据 + * 其他同上 + * @return: 同openByUrl + */ +var result = await FlutterAlibc.openItemDetail( + itemID:"", //必须参数 + openType : AlibcOpenType.AlibcOpenTypeAuto, + isNeedCustomNativeFailMode : false, + nativeFailMode : AlibcNativeFailMode.AlibcNativeFailModeNone, + schemeType : AlibcSchemeType.AlibcSchemeTmall, + taokeParams : {}, + trackParam : {}, //需要额外追踪的业务数据 + backUrl:"", +); +``` + +* 打开店铺,openShop方式 +``` +/** + * @description: 打开店铺 + * @param + * shopId 店铺id,必须参数 + * 其他同上 + * @return: 同openByUrl + */ +var result = await FlutterAlibc.openShop( + shopId:"", //必须参数 + openType : AlibcOpenType.AlibcOpenTypeAuto, + isNeedCustomNativeFailMode : false, + nativeFailMode : AlibcNativeFailMode.AlibcNativeFailModeNone, + schemeType : AlibcSchemeType.AlibcSchemeTmall, + taokeParams : {}, + trackParam : {}, //需要额外追踪的业务数据 + backUrl:"", +); +``` + +* 打开购物车,openCart方式 +``` +/** + * @description: 打开购物车 + * @param + * 无必须参数 + * 其他同上 + * @return: 同openByUrl + */ +var result = await FlutterAlibc.openCart( + openType : AlibcOpenType.AlibcOpenTypeAuto, + isNeedCustomNativeFailMode : false, + nativeFailMode : AlibcNativeFailMode.AlibcNativeFailModeNone, + schemeType : AlibcSchemeType.AlibcSchemeTmall, + taokeParams : {}, + trackParam : {}, //需要额外追踪的业务数据 + backUrl:"", +); +``` + + +* 是否设置同步打点 +``` +FlutterAlibc.syncForTaoke(true); +```` + +* 是否使用Native Alipay +``` +FlutterAlibc.useAlipayNative(true); +``` diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 0000000..c6cbe56 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,8 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..ffa57ef --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,70 @@ +group 'com.wxwx.flutter_alibc' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + google() + jcenter() + maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +rootProject.allprojects { + repositories { + google() + jcenter() + maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} + maven { + url "http://repo.baichuan-android.taobao.com/content/groups/BaichuanRepositories/" + } + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + + defaultConfig { + buildConfigField "boolean", "LOG_DEBUG", "true" + minSdkVersion 16 + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } + compileOptions { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' + } +} + +dependencies{ + +//登陆 + implementation 'com.ali.auth.sdk:alibabauth_core:2.0.0.11@aar' + implementation 'com.ali.auth.sdk:alibabauth_ui:2.0.0.11@aar' + implementation 'com.ali.auth.sdk:alibabauth_ext:2.0.0.11@aar' + //安全组件 + implementation 'com.taobao.android:securityguardaar3:5.4.171@aar' + implementation 'com.taobao.android:securitybodyaar3:5.4.99@aar' + implementation 'com.taobao.android:avmpaar3:5.4.36@aar' + implementation 'com.taobao.android:sgmiddletieraar3:5.4.9@aar' + //Mtop + implementation 'com.taobao.android:mtopsdk_allinone_open:3.1.2.5@jar' + //applink + implementation 'com.alibaba.sdk.android:alibc_link_partner:4.1.15@aar' + //ut + implementation 'com.taobao.android:utdid4all:1.5.2' + implementation 'com.alibaba.mtl:app-monitor-sdk:2.6.4.5_for_bc' + // 电商基础组件 + implementation 'com.alibaba.sdk.android:AlibcTradeCommon:4.0.0.16@aar' + implementation 'com.alibaba.sdk.android:AlibcTradeBiz:4.0.0.16@aar' + implementation 'com.alibaba.sdk.android:nb_trade:4.0.0.16@aar' + implementation 'com.alibaba:fastjson:1.2.52@jar' + +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..2bd6f4f --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,2 @@ +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..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 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 F{|7XC?P&l2 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..3851bbe --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Oct 09 15:41:03 CST 2020 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/android/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# 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 + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# 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 +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +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" -a "$nonstop" = "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 + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,84 @@ +@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 + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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= + +@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 Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_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=%* + +: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/libs/sweet-alert-dialog_v1.3.aar b/android/libs/sweet-alert-dialog_v1.3.aar new file mode 100644 index 0000000000000000000000000000000000000000..183c3dd173f446edef672a36db64677528f53dad GIT binary patch literal 35825 zcmZ^qLyRyCuw~n}?e4E_+qP}nwr$(CZQHhObN)A(&09=Ti<`TtRBBVXIVCRz3<3oJ z0099203ZOMJ2joy{+}WO1OPz(AIH|%(ayqH#=zFX)Wpe|*4@V1CT_}hkRCzgE#V#9 z>b0RD3QEMI{4!UDU|vd`WX$SA!hce zBgl$(#S7!J5_bGoIB})2iFw>MV%Noff`er=yhomYA;bzhXn;8*WEcf3OR^?yUe>)7 zj`~U%j^pYfjNEUg`S>t7u5|e`*7k*OHw+xc`K||e#jet?qz6iZ#@2Ik;OV^d$m#SS z`O_jp$%fXnm8!iJUeFhx{Qnvh^f?a8ixdDrc>(|c^uIwBX`S7jOMEsQw>eX9y!=9V z^YIgn81YRiDzDAIaN0^ZYh$t5FbE=~8>UH`GNh*}W54dufg!E+?cg|nL*l|Kr3Rvc7y#P5t&n zt#P0EiiO=Sgo@^Dx{B*Iu#>ed8HE+{8=EY+-Gs09tM-dDeZxZ0GT_LU1LpJ7KZ#S? z+u58n6axBc>Ds29qx+twp(V1Hd+7rpDn&>u#mfzC1KUS}Iuld`dYp!W**RbG07ipwN1ojBBqa*qecd@}@Op7biTi?K76NLAe;?e+vOfGd z8Pu5DL^^iO2Ig~?F=L@vC)8GR5R3sTc0_ugcUF^a;pEpe+mGY%G65YXno(N6eGDxS z2St5m)hAIDjQF-f5s2uh_8%dI{djwqrsJOo4^YF9oR8u64|CKeb$izdd zxLfO0;=M00SgRTc5%>8k|ELOkV16^>>E`Kn7DV=fbcKcs*hOnc9}1UL^|57Oh`=0{ zgL9N5sC27gl+F#XqH_4PZr zDf&&ak?MB3M@O9f@lE*91dRiRa3Jnr7q-Cf>itbKhdO^^7c8%Lr!c0l2#pDZlO*cZV0?O#aZ;1HYC&nif$dezcm4BLX{1X+DYDMl^?6 zj#7Ie5JEF#kHQS?;AIArBpcnzlU!#-HAnw*F|cvrgM+p11VpS zayxxn>(k?HNtsUobk;`dBA??&$`@`?8d#Pok7KFh?dEwT?qczWUltRV_TK;LunkE< zA^xsFUm{WqON1G`DlnZPsQ@oPB+$!ee|c%TCScQ+^PgN6eDH>r^dDr_%?fB`77P%1 zmro;*B;#yw#B4$|9OT&#v>_Q&xi(wPvp&7BO}QuW?pldwRwszYJ$1ie*8bOy#|0|6 z?p!uY2GGORq__FojVB)Pn8VSv>-pP*r>k65q8?n-s-7Qr)>(-~Sig`bke3GJV?9$& zk2O!+m+Ir=pe>fE05Yb!1Pq!m&>R9_a~(W|C@|%t)eC?s8NjRSEH@~?Ory}qbzXuB z(%enBZ9d5p4Kq>_qh zfjD+#7;n^OkoO^x!e|>fr2|55_$!Yx-n+9NsWb8i@346*v5GQRY{QIXn(E14ATM99 zS^Shh1bm$&pX$%&=m(qd%ICs>ceUT=HlQ^eU;$U^ZCm2G7%o`|j&05kUF!^{d{||M z2v=wVh!0Z?Q3Ha(@st|;IAf)jS`*yw+!GO(1!o$ODW7{S?e^u@Q;$!mOYcp0As{8O>5win+J|8VPv@BvZRM3K*@)`s5>4ALSKoS~!TA|uVVQJ(m4 zZ6Zr^&>)qdyF-~A+Qdqp&6yp=$-T$(IYv(e<2{%}$F_i{E88-axJsBgs|)00$NAUq zP5{|o5^nZ)Pz;f1Y zAy+yK6s9u97${>tG2aPwKjs`%{=YiP{`Ndq1ZuMMk?&d{fi732U}j}bm*5!hYrQMI z?nS_7^jEq4yeM}_%{GM0c=;2=9_b~};;b^&I>B)9n~RH(E$wisv$H_84vZ!-9jR&E zHAYVK1w%H$Py8}o5D3}r;F|<2MyZ0%~PA&&xbFjd&^wv6MCh}y%**&D)YMpXPoT4PtgZz zdM&V18ufCS8Pzjx-C6ruoM%ogLURit(EtoVld2Y5O18%C*h&H!nx#3^e)M?VQZWEf zPG4)zg7h1U(qM-zXW$tcS_t!9X^I1=%_$sBnT2h4U6{eM9LM^TgiIb~80?pUFd-pw zPYpxgYfs))ljf2Qvf?{qFPTlc#Vb{qKs8=9*H_*~wP%9_9wm}3(Z|R@(_*)U(?`1h z>4q9g`SdspZBtS?cb9PUz@yyedSII?m4*g}jiF08@B3VkcQx>H#&d%gVB#=WIs-U0@y-W$yWaP9zW*|1;>nx$@D4+gpsiqd-c zP4p@I4F$-o83bhA9Ua0VzM2mJ-QoomRtz;wF5Ij)(#45r0%AaRH-xl2m5Qj2%YFG% z-N6_+!(G?!nA(0FQe?@sK!tSaLuX&i6&1@I`D)6b{Mp;9o!PO#0f!cED`Hgss9WDo z9n0BD*W}5*Y%joNAEGA>VPBUKLX5FiXD{ zJEWSq24>DJJdG$stUzqjyRB%BT~}>q5-da9!VrG%-}XD~m)N$;&E~SUJuU5l-f<*~ zEdX~m;mE}O$ALGhK2DT5XSj)>_}8A9QaL^CEU~JR$AK*JGkK5@FfDC|ZUIb%^0Gqf zXJ(ox#Wc3E^MKN(Kjk7+Sn&nx0kdPm8)Quu#6W_Ut-*k=T2VOwl4N7-dW48X6g4c%ppd{gZe9q&dbj>MSpYmoQ&>HSyOjJP!?RWDvta z5uZWvgr<8}Zn?izvKcTt(r4Sj?YO@}cTeM>JraNAU75G?0FrmSg-3D`-~7r&bWbB! zmjH2ua;evI0(g7f-^Lk-goLuU4KR}Prx9tVld8z*k{Yo84ran}RKeQF(@SH3wnDNO zOHW0l-g}|1DqZgl+*pl1OUZDu4>Hk4BxQNri#2dxGtM~MU1?_)c({dF46z~_JkLfT z)jnxM7kHorr@sxg;Tw3A6*shyy8-icL>oo=WokS@yTo`JV_ri&mWsvD?fHr+IF;~E zC1m#sc$^nua|%Nc_hdH&S7=&P%=B~t+P-TmA%lY%FfSDIpHpj~>k}=`GloXv>EmE| zJS~&bxryk}`yPU35Tx*E?)AXK*tB#>*-(jRGWBCscR#_m>j$wP;saLs;=rg56^?vG zP)r+vgsk)=y6*4&^0mGZ6&9~^$8&_x-f@@3t!I6~3MYj)HAR6$V-aVe;RTX+t>IS< ziF!jcnT$h^(lTv*_Yjx6fVl_ElO&;9eJstQ$KGU0Y*Gno6*DfzC$5I=(L^MrOWQOQ z(@BD%8^z=xBx+sC=w#t2(5x?}SRx6vxNx^{PO1LHSk=?3lKmhp%LM7QguUDjRvbOW zfKrgchR&{OCK^JiiMeB49C-wNb%f)sr|pqhpw#->aL+iEmeUFejLl&T_{cGWB#Jmj z79l0RNCJdW)f5XLLMoZ~W%2-43Oy^T8t}_lE*pV$jB!UV8-cV8=;2WhaARO_0>x|t zm7OD|M5@t3a14d>QcIb|!Gs9{SSbd=O)D>nHH^}BX;`ogMeGJd*so}<^)lryndHA} z8z))a5(sGLCPrW$1^7Xt zx4U?}Y1ya%xu{l<#U|RG5Q;b^2%2vb0}4nbz)nyPuwpi{GpdV>7>qD1S1Xb8Ev;xX zVoN7|Ua>jeekDjWrFo1#np{L_sX^ZALIbq}4Qg>JPo13&7V#YQ%!-JlbUC;1r-$AG zkuVU=K=mERcnjhF&st#25fH;?UbJL+f-`p;i&J#k$)IbVaLY6ZpPbxr?s&)ES)0+t zX;kiIkv#bz_S2)z$gUGqrtojhZ766eiuBHZ+?9nPstA>!<#qvAD!e2zRTwi=UR|5P zN6GT{N%0XJ$6A@~I;8tLmXD>j?d!tC-n<>fi@_O>b*~E;S)R^HHNt|#CO+xT zmL@ZGzFb57A(IYM+0t|}803q3`dmX0zZ$zs%@U%EudgN+L<}EiM{RKCy5=NTk<83Q zDFbOeWQv*T7Sf7JKv||BYtGeyo%mQ27j8Dwhkh1xia*MRv&Wv zyn@7StyX~F=6}|5f~jQn2#`yUD{ttt0-pP2RRzbZ0AVO05JwiaD1^gNZYf>NMSc7g zD_CD{#C;6Y%QkoaIwdhobU)7tzyUbi5ln<@1%#)EvN_q}2BpwHQ@JFu zQt%EJ)1hrkFzam|Tj+GyOvJ7%f<$Fvb2Kq%+GEE`WE8uBCFt@8I4Y z1wFa71sM?=J@u+uuwIYo+3m-PrW*qNZEPRY%+Pj=X9&{PNr*-owmv;xC)*XjZ8kw; zB_k6HT*V+0vtQjI6F2y6^u;71apbo1x>LKg<;ZM1B-crwv+07oy_UO-Y4o{k5A4zU z;rn?7uib*C?<&e$*p7Db4wdF=ALF*8u=a}u*(HV=kXQP&7>x8Ir@u6cyI4&EP{ z8(twg_UOOr-#p#D#pU^aWl6$bgH|!DJP9#=PgC8Y2KVpQ zZ;mF8g@!=aADhQmzhA_n7<8`%CQpPjri&d#%x!0b-aJf=g=i(l=SmeD?Y;Oyr8KYzSA0-M=ZD& z=3IbK*h5}TgM&?Tf#w?Ie3s8)2c(wXodk~F?oGu|vw6|6wQdiY-i|#KC!aLVY|DM7 zrj(#%RlL#^5rE1X5hJE)+syIj94*-Oo}O|5_6dIbW##$s6N(44Y0TY4aVnXnkB(TI z6!t>4Znb-;|L2=&o(-JgQ2TY22>IS}6C)PiJy_X_&e_s#`S??H>30Fk3sd{w=nAuXSH@kZcN)NwS7S+SFBxa z@qp$aS8BEI1hI2Wg8tj~IdHWLbaKkVvUQ_3QoVN}$(nKHYdU-xx`{O%*$dmsnMqIb zO9v(H@X*ao{qa`OELleM!!Y|IOsfoS8)Cag}_O$$i*CCX$D3U?PHC z#iB;-BFwbZoq@gfS+=3BRK7Mf|21pULt6i;kLGw8hD*duw~Eb2V^#nf}cSP$1ygxK?9yaduW~)Si_*f zW)OF|Vccjt>kF1^LUyGpbG+}`-{~-C98hXA(OH44(E-(Nd(RrBL8adI%aA0ZrTzxM ziT)NKC!*8l6Bqd-)_Dub+eO!*b=irY-W#tEGnu%i<4?#HBfBPp|EAn&`zYnpYkqe`SK^+7Znx43x3xD7l1+68Og7tYh%Z70MulanTh*D<+I z?R!1+X2OU*cwNMo1kc#$)6IZwRBmgP$R~tu6xAF3(bkI%?@=+m$d{7Aw14x4{ZwC? z?q~4tiLr8$*h>v>ed-q8k2XkKb?El_X5)_tyX&Hj?$?<0&w_1V>8bedtI6R6xW>4{xTChT1KHip%@^8KD|!u58a_+fO(QZ)CbXNNZ-^|()$6T(BKN{(Z-}hu)y*3|%i7bn z=|8Kv$9Kbc{dxD$ASr)MZ(SedDH;=h{_qDjWqkPKbBOa{)#!Ysq)5re8X*T#{MN;lW$k@Q)WQR|-kZe7F_ zy4K_ij8V&;75gnVx-S6&Lhe)=wr_2TLnA2|9e)i zWdL>`x7#x4fX@0r1zS3A9l44X<0}-m)^g<1tkYv;(u~V}q_;vxrPq8$9mjhi935l; zT_)`ktk=A98IDq~c{XK6snG>v>ZZoG&Dz(+z5nDN)PBW*kZxX%6#>Xl} z$Vmv@3l&In^%*1GM{xQu`Qkh8uPWhEglen(Pl5i!WrY6I?TZVn5BZCWvi}b0ySCpB z&KLjYjvb&+=pOqx$-nPkJ}+ds9MEM_@xB|FZ;)rHe-`7H7yRP}@a?a@AHM58TRAqc zi_!J%pN2sD&Q-TrE8sIp9#98#E5S<}+U=mmwR_%glJ~uy?={P2@He&IUId#!UxkND zBV-jHY1XXKN*3iR%xE3eof+iO(oJ6#Y{!*OE5Nc`46Z3+_W@ta4d@di7GDtJ^wg;c z%9GbuKK76DBwgkn=+j}wuGuGZPpLclw3K+@7%k*!NYSnj#3`uaP~DIm@3%xpoW3se zqlo`S*6=_#Kh{UQ6g?gI*NiM`7}(RJJiK`MNK}`-E&)0hm`n@wSqSia=fFX?@wArv zK{x+B_|T9?M|8&w^ynOAj@x<>ns^)THBd)3%bgE1tC`J;n;}uTp8vQUPZC4RtC%q1 zk_HTmpxg<_ftR@#eAa5{3Xt4I^qR&Fgade62mTZ;c-`teCWDK?*%gV+VROBJK{}6t& zjm4gtVQK*&v>+c2BA}E@rxKy|t1!s6=&RArZEmx@RGh4<*_82iFUybu!T&;2Obe1N z^&e2p0EtY)iqIDaQR%s$nb%EH@b1ityFe_W?0-};!RH);>IFcIW;9*ZoIM6zSq7bQ zmiGz;Pza>R{qkG_jlDaIoH=s0Vv}-_iB2^3|FY~B@?j79^CbOg09G8v!rW#yqRIKa&$tHwYBx#k?b9VtwkhsSEo?#Dd{`4Z#CSu>I?hMC7a z9dHp};j-~jJ+0**zLq&i3;*ufo}_ME^;cXJ{N%Qi4ge zGvf*G7_Ye6i}&lluSIWtu3&-L2pLG(67VM}Rno?3%+!@qM(put;JX@* zX?l-A4750k6RGVAC?d}&^=lWdVKy*nC{Ky zgK?(i^zs?7b{Wo|Hsio!k6X@HN$s1DN_e4gvQnGd<>#_n7Ou1=pKE`c1Vn0^F#U0C z9${aRKnaz@$7g;|LpNyRCoQb4@nG&HgZPTyzNhmTI|O=3@8!LekNF%s z5SnLIh6%{$#w}op^YCALawJUu$@7bbTVUM-M5)#ZJRhyJY)T$&w%Ty^q1L|^(#q(P zff8JTHXilR^&k&RutL1h8E}(4{IA>ZaXImB437#w*CD=meKY^R5aFl*$AF)Yo52Kg z2Iq5QQln)(eX2$2PD;}vM(q3$S9VB#u~7RuXbfo}PIf>m0m${M&7r-12&VoSehu*Y zUybW{`+nT^iIxhv;)E+Z5cTw(=8Qw=2*Lj%^?c7gbQD0|CcV8InqcB0hz3K*9|LI^|ykiCGX`Qrs1*&V&`=NQ;1zp zfW%=K87(A6BzT^hTLPvBd*A1vXj4yoZLt)~hpMw0?s{&}%ynnc*hwuI-Loj&N-;3z z0~8SKnRISmg<3aQhwCD_m_ijTE-v_+PipO?nSCT4`#yV59{@2BIDonRRis^vAeBZZ zQbc2D1tXDc&^Glq@#=4Jf>llk6+Qd}GxCH)4)Ttg7ivC&@Rg~73P10R*7x{GgX`@; zD!`XhBJnl?p%!hV((i;&4)c{pU`2wSC79HJ{`W56z}qkKdf;9gaKj*6`B~g>aG-r+VEHqEWexxrIR2dfzZ@2qy*3sD#2^YG_(H&A1Dc8C zZz7tnhQL$#Pwv0snyZ3jq6Tpr#mm9GITPS5Gl9K0$5Ia5D9^(}o`<5?VgoUh=J!yP zYe79q7)Zm1N&ANlS%UrG_Z!%NWm-7L;gWZFk zCjl+@`5(}i`vDrO`E#PX8;I$}8!S0QSa1xz&Es7sbmii{ZjCVQFr1sG&CM5l`Yf#rqJ>aW zJZj;h^^&QZl-a+y%5)mdtO$C)5&-Qo}buJB6>pTL@%XM--V-%!%uuI}wY&BhvJRDun))@q=J2JSp{m zEH>M_c#?eVT69CC;eq&7&(nQ=n;_P-Mc`fuKuZ_&y}4pa@+xaiCJ^1Bh_$#N&xT9Q zGm+*=#aU{^lvD5z`eUF;M`V|AzBANhT$*<6RAq>@YmP33SE<-}&BgcFdy<5kz<+TF zOi#tYzqHQJ+TR10P3!6kop~n5>nE1cY24nRBKl_J2yv+y`sH` z+E!=M^d|Nlo?l#a`bHF#va}zhDM^35RhFEZK7tsiD8i+nVZ*9f;V20?SKQ~~KShk> zp;`4P^>sIti`pof=-kjtHu~>-JV`*Na*(dKR8{u*kg`wGX$XnB< z-CQDi)j!HYar4q_N1!nx04^)3I=B?@x+&|e_k&XFDg%vLaG{#Vq>=Vl%@r`qSs)VD z&v6Pz&mYY)GNr+#jvNZPN6>8t^7FeZsYaQOSE}z!2-M)|#yQar3BYvFrwGhJp0>zvUZ&Gs^-I9*muSy+{MUc3|oQVM6 zz8z?KMl`bB-=F9RQ_sncdlx`w|Cid(%wbS|OlL@5spXTKo$hT^z6{KLHOfxI%zZRE zes(J;-O6w)DcwjodDViDXI$_)EJg>&Egc!RV7u+V3hv|V{f2Ic3R`;hJK(D{CfPQ) z^#xc)<0fVw$VqZ#$>d-5Req^B{z~2_q~}wJ%}<|sAvpgB{=ez0p{Lf2Z$SV6a!CLH z=>O;}BWnXECle=HO9RL1PNQf#nXhuL)*B6@x(1sqU8C>OR-3K=TV6BSXFK?=u8y-$ zr+GO`_?#)Sloz#~x1DueohZcu1M~j*`T73-{^9<=b5S@DxZ~rYyR*aV{i6}O8!N-Z z67!S80};C88-tVT>#L*7gV${dDFH=Al~CLW$A23yUO*7!>JB@m3V;!A39F=)Oc=nD z*i9wlb)3@Knak0Y1MCITiMG5hgTHU~jyyBw<249zd0Tkr*eCI_RVX(;dixh+Xm1zF zo}aaKb8O?d(&7*;QI{zro92XYEm|wO?)(<<$~UxSUCz0W{9sgYWmA@;oBDpAtP_f? z*EU5O;kijN(?k~Q(Y%$KWjs;dY$Z-?z?3dp4KdZhzAffqJ zXXS`1Sie(Yv*&l8hsObZK6phc`K9j&kq$h<5}3{vP;A80fmpSGNcOOglMjqKXvrce zR&|0^iv$NP&q-%Re#fiYeWRW8=~~lZEixA@L z;5~NnCD2&DA#w3w&D{Wf0bW6SxN+%Fi}CW;LjJJ|`ULqF2m}NnekUPt5FdY8=pJ1E z1hAp4fd4^jVPk3m8zG1J4UlR5ETO95{CJUsoD3W#YTrr@|3(VQN^FV^`^1uZDD@}y zbnvB)kTwkQm2^yyT2wm?E*2+=jnj#2^NH~EsRNWothhoKgSsR%L!VB#&aE6>XZOwV zjjPgxxHga2$2t-B>^wM!{;Zt2oSG)}h=Om!O`z%XuA>2oK+m=M2i4z+gqlfLBI~lC zpgdZU(94`~QUo97I(#(25^48ZCkI})ePD0iMV@YBA-eYp25uX(RhW8=d&$0UD@ZTq zG8Pgv`L_iZD63Mv+-O4PN(RkC^G159xNk(tt=?<)YvyB0&GUG-*Py`v@ZesFO(9Un z?#5G9=niVl%v<$m!7EZmjr$0Nvqdwa_-$+T_Up=1N53%OP95;i5%Jz|R@zyJ|qrN$-^wy3J zN+SbD7GRciFQ}PTh0pHvrFIgQTnt?%eW=JtxsQ(XiyHf8KY^W(azaMU2c*nz~Q-3c1 z+AdUw;Y<u+H<|G;g+|JpyZP}WF zmD3XjyVmC}#O87tX`r|GT)}JXS9MFJAfmvgj6K4o5enzBiYYJ_WJQ@w}@FVBfG{rrRvf5%dnKd@^66l(wk6VPZlFK0gMjKnH--~EN zwf8_x2;+S1<<+`Yn$WejL+eY z6SS(x*)q5OrPe)sbHGj$vBN;4MS<^7fp}(`lQ0t{C^zP}SCHb_Oj*DgjsUDlpSUfn zNajj5$8h&oP->NbI%be@SNFodD3%CXbX)G31~W;=@CJ7s3uD+A#8@?Axpor5R4dI_ zn%T!}YUn4cQ@*UqmZ(~Xsi-M@57PNyS|TPbFhHp?C>q3Alj zqIHzPRUvb2F|b{^u3?G8$yWhWxm$`{SU;A0UMj$(@-c6XgDcm3BtRF~1x77h zfH5h&B@hdeI9K0#pZzn1_B*@v&%v=J^sdf%1GU3gIn3t4j!r!N$V#o_@C)a;1>wUw zpuY>x#j1tQ+VAswJcfFPeH))4n=sTz{1gKx9a88+aP$4?IDneM|0Q){+Rm&MiVE?B z$y}4K-efj%9#=9j1-4;DDNn25R;Q&*fO+Njz?xi|d7imNL%PIZ+z9vq1YV%vJXXok zr0Xc#ceAp}^?4fxYy~ymg^g_!6Pr-e-{5T10*Y#6v0U zanKZV1FHA;t0UA%oT8#>h&y$h&AEVh@{T$^w_4Ou5yGy_; z%io-l?djojEb$a0J&b1gnFtn?RzVMgc+o9|wq~ZAZL+ia%P`J8&dIolktw$Sy#17-=bNuFx(}ppzzO;8gz5h z1iCwxhQEtjw9gEr-KLd)Cl;Fq%qB@Ah_+owG93hUAH<}J^ceRU3l?pw*G+pCQ6tym z;Wi`@MpOJpY!OPr{z*&Jv}(iad(A6#7qWm2ibG)9WUgMA_Tt+-k4o|Jx{$UH3NHYm+4B%4C))juKR2M{Zbe?Z2;EKwcit%ul3x%l!0 zfR}-P)JsCmc3s0=tx_Cy3xNNjTnz2Dywp3zTDMqpVad7SnU*)>ij1?Yw5<@QutA9J zz4{_$ig#K$0D(K#Rt6D_+5a4f9V)San`<9Fgb+j(K$t1jahn(f4Y?QWvBk)cc``yU zr{fW#-IYcyd5*;p;9;<#mHE1@E>v!ybd~_Pjd8#&&`s}zP|6+TYa-_))iv*P$uGQE_7J)N*d)$yNYNch|%U+8m zj>St;Ysz$ahsC{*=GIKXz#CF(+=_1jc^&L;ERbc*k<|Qf zITzoGOfCzGG^sok}l&Ibm^<4GJ^Fcuv|pzc~w|Vpuw#l6e5PG(Ip@ znUYCPN*Mt*8#{{cPm#8Z1Ql6p5Qf>?)No#g)mW50k}{ZVZ`0L4c*a6}*l+7q#}~R@ z7G`H8w6B&BHd)^B6$Qv>}3x{FhMP=iJP^}@% zA8&~)0CBD88fYVB_3@-47E1?+G6wI{KyKE1VdFZT5zfwW=pY3@4(HDtv2DFX>|0|O zdh%1UCVx)ijGsT5MD4LvFz3rgPB*y#QH~^z|~G<}x=l`WVk5zx*O2 zm?RuM2RBo`smWJJ+gA=6KS|ihm{0`ZQ4k`A%T^}A16%N7pnF$jr!#+LWhnh zcq4anc&`*s0c)3c{%OZILZPK27#mtgVDom?KUGIa=l-k3(Rs1hhDQM0-a9Iu*^pMD z%utRrlZmBJDw9cOKx+#SNjL;sKpfd~sHJy6s%uCPXJ_U~_W8QvE+FV1ikM&$5UokPeVh@QAG2 zJwvO<7oxWgF}r7vPT%TBXG34N@!eze918NBg=_`mLe7Nr4a1qkRGq-A$u7NuBF?Nl z1+Xzm)zW0HQ>gUSIZn%HmIFp`rDL&KGM=lmRJ5mFH1wSF$9VkK`qM<4{9N@5dOVwk z%KiPE^JqxH{c_5^bpJ9o5{hQZedAoU4EjAA;TFFy)k?Z@IiPK!Zj*UmDhs*9X2ILI z>co1$4S7XVu+qa+^jpOcsq8nAx4mAYtl?{MeNoD4f)s$sPJxtpVr*q$3_VA3dQdZ` zMRmuc(Pu%c=dSbTJ=gXR#ISc_?;uuB$NwnQxmdl0)b^%+ZszvaVtnUAxe9g#OH#$* zu!bGYv?l8=R-}Wmo!&7tNpmzWh$4FWxe~m+hDTZuVHjY0XH%aRB(xqnf94n*yh8R~ z0s*p$GO2R89cnU-H4-g7!y&nG5#h~V! zV=oTm)6(LWkHZefP|1vqybprX6amIxGCsMdt|=iQOXw(%*S}=t%gOIvh$BedLGdoa zOH1$A<^);vF4xM1k)rQ2%|mkQJ_X^v|1Fl979zL}if9DrumHphO*o$b#6$EeT`1Kp z6Y!W2a9Rbfml@uLOfn7q^Lp&$xXi2(7{Ke1A5}d#qp0v}C7e60f;3(bK@IM6__bXq z`HUQzS%#utB8`oh%pMwm_qQym2|w>4mVG^mr;;BULdxW|VU)1O4wOBL)0av%cfZRS z?;iQx2;M^12238z&;qqxJCjP*7U5~s|3?gms3^}o<~NV$_pew+2p%|31A>6ydF@5XPc5b8%U2ufUIHN!CK)c+*vpkEKPTiu1r z{DYEyz{4+6Pc7$k1zi!jbGg_21eoCC%TQtc4ERm>B7>`g3;Um!cbBLC+;26Mk=d{9 zf=!^{pD_b)Kv<>%R_t+yKu!NP{abP|$#5J^rF04+1^iCC7ppOsM`9E!r5PrPN@p7R zY35Cg@ZYo%T4$_zv9@cqFluiQPQzBXvP=a$6B9k$ezIKUU0;-*8$)7K>(ny6g&FVI zfr{_mm6)_MjDFfcJ;vi~Z_B&aK$@*A+yVFV?`#1IgXqQ}~wm?Lic3$4J2m4a=UyY95OUg{? z&BH(ZYnr>3<8hRiaH?VZ%6eVGnZsVgo6CAukQ==1gYccRJLC^X_zD{A*GT@dl@tmx zmiHRvZ!oeub@(%vwg5PpC(H=N4}pMR0Yq)|zQmJ)dj`b8-w`b$kUPI#?CF3GLAJ);a3!-|$i(ZdZB?ivk$5+rHEt+?mPs5RuMTQ6LexoI zxv?>BfT)-=biI{aTi9%(Ktv^zwsd`vgIC3M;Kbc zZNr*Hz8rdg1$g5qCdfBrU{4aY_s{EFkwZ$d&aL*=*VxgKO)zx90o`~O>?hZfG^{6d z(?~KNc6dA>>-8T(W5yaJMz3|HV2R#QrKe13puhv7SmKBxWf)tQ4492xgzU?hw{1-p zLGeH_zKnGU$J}86qX*8afccLx`h#57>lm)Y-;TBf!oaov51<{-24qGvgVe{ieQ`` z{l-S^8{xF{&7>EMULPpo?PByR_=`%P&Bd87UMRV`>QbmEwUviA7-V1A^8e>Fnbp1j zykn8}`H(Kz%XFE-Hx}GDSU!D~CnG{U0Y)tC<1DNVNBl|4OG>G`GD;ozPy5iC4GkZi zvF2&hv@@rtM~-c%+n%>L!AfQlN4#ajhCiJUC$3C0{ZO|#d-c@~G{0-QGBVLvp%NyB zaD^o*X_1pj%_0)F-Yp#K*IqAM(0{Z}R69U&!1XWH>K>s*h35b_gHdPv;&Tc1ip6Y1&1vg*XCPSNqjw2lPSg^l0ttj4NtOBO zMq$BfHUivL&40P>t)Z~E+5enAQo3}7=;VC6f#g=a{ckHf|0EImHZjx%UaCfbM}K^Q z(|rTj9!$XObjx{nE3-quBzB*b2T5|Ymnnx6SU|Cb1XyoBAs9kSlXz)xk`Iq`#3tS( zHnL`*{#rvmSDWNZy)82s@w-3yqhO{u`t^60v8R;KC@F7QH(1f!lj;$Jun}gKSIHnS zSe-79q)f|{!Elq0Ay(xaLAl00r@9!VZ}!`H^Ejs-@1#$}jFYJ2w?1c{2%5GcC5X8d z+F6KBXObjs>E@w<{&*jmmzOdURwcF?p4u%d`OGIU_?-~}OKDU>~oV;~tDUtUq z{QalwHs^xs<7;7?TTe#piFYmp;JwWQOzfRSXHomfApma>qfaFu^I z_pYsrAlWyEz-nooK3VsCD(U86WsBscpB>Sx_E<{`Zhr)fG$bLpe!2v1{Cw%Z*!*Hh zW9@6I0;YyK;Wo_T8E+!xGQo4wqHqld1JSc$2(%fa2JK68O`7^3S@A(%3?4GABI%fd z+0yidT6aH*i!!}W#dUBi>HZF@uNcLsSox6%Cp^DudN2!1n3dT<6C0D4*)S565Bw1 z6m5Ag*MN`zt!q&)UnrPl4<}3DNE$?}8-(&kb#{CV?o4S6`XXuM|1|a$P<13**SHf1 zt^tC(ySux)ySuwfaCaxTyK8WFNrJn(|77IN4DZdi{$>FUx6Zy@yX(|BwX1G*cwDX| zR#^?o)>z+At7~!V)2_qReJ17Uh#{Y%*m&w!k(}9fCDW}Q9~c&af$nb7Ag?BYO4<@@ zrxQ~MX1?Rm{jg#>mW3MzaEm1Q!cz3O`lF$iQ7Up|3siha#9^2z3D0mDdlhy8udE8P zJc^;hjpw1}rC?9+Wrdt^5+e2T=dH4_KBzg?e)w^~gpVIy;OVIK;2D*5Z@K%ccj67> z3x=8x*k6ida{DB^lh7O(p&4BTwDzWyGZ^x&XX}b~aqpRK&;*_ZNG1HP4dsRjHQ_3* zRXYzz(I7u!Hs1&EKooIama)Py5gg<@+E6+T_W%sHz(S!=_Sq3E(3V1zN9OLV&V(0j zuqY%nMJI)vDUqwe?j$mRf|Z~FHas?c;9FIHA~_M@o+GPHu`API*XpX;k|wR1-RQ4J z>!*y5DPyuES6j~r5(VX=h)JQgjNC80rm7WgQ!>bcUW+j&C3Z&a+iIV^Ubw9}Je}4~i1#P>FlKyXxz}aD0g;*hD05!e zgjS+)8UFH>*by820)di(do{3kczAFlmIKnM4_S5Pa)N{I!d3=fn~o*4_Dj-3ODoP^ z`}3y4Fv+WOSizBnfx*V!S3O-2nOYiKLc=HKHN}kjenr8D@qH^6YZ(|CF{_W!M^)YH zR8FjSA9QBaWn2Q|N6Z^4vxW9c?8f2^57V3Rgr&Xs3ljOs-IlrqWru}>2+Dm^tMd?h z%n!lgk`B_Aabx8PJrlMXj$Ij#Z5tUKU5}5BpM&7Lv^waLL|^Vy!uXcGsxaYv zMV=5g+I~fnxegA!hM|ahgUVb6$HllDpqy35hhvc)?JV2Kj$)$Y9F^1BMH!!VDE#U% zTyfxF%$bgLg#=S3Cl$xRVv>h&Z(`+^U^43if2jxQwa}H}g+U=8wh>uB21&P|as_f^ zldtWi8yz%tu4EGw5yeza5JIoFU9|VEvpT&E(4EMOKxK@bLV8a*#1IGTb^~#Vua@!x zh1E)O;~Q*au<8yJ6EW%>ZgGt*$!gnPa~|wyDG?AMcfud(lv3{eq?|Uc(~1M77W1NV zd9H~oIs?hPqK?H`m@}O`jQIR7Kh#on%A;1~sm&-JCZFJ@j1Obiqlqi|yalOHd8UEd zuyPz;e6!n3TFzjydR}-Oysc&iTM-e=x_~Pz`v98hbOXX^NH_Xk&Xhr}k6|zHn8rYg zz%)Ug%TrP?4-mjT@KT!|J0wpR9SRvPe$iBGDJ*!lZZ_Q~x5&IfMpH9JC*xJ)TsAWN zXQV*`9q47d^6>?#FCD%;fywS=Z`VqmTG)s z?$?Ih)mz83;@L5^N65a+zOq5Qf_PZAkpRWe>fS2Am1r~QQ&M!s;Y@zVX?hyxKK1I{ zdl`SlXN8xMg*@Z~(VGy0|6nm>{iBrWKEgsPFcS`hWDo97JpBFja4 zV15q@3>0YD=g#_E>X|#@);sjZ$Wan`RsPBvg0`v3OD(q^A{S*KalI8QjEHfN86|Ba4xhwb^oI~QBShwCjXU6Pja1~+-6iSyCT_{MAW`aR+PYW4VzIUD8Y>sCtKyA% zcs%oi2bwpOAy+Xt3ZYlB^5z9e7I8Q9KjfHra!~y(0j=#s?yQ-3m z2^gsu9|kQDyu~Q(F*q-pKSvNLFqc@OFU++{vw38HHPqOjOiiW1Zqcv=Rh8z}V<;*R zgG?RC?QT=(rN5!etO%?;`yysV#5Pcs+LGlPTkFTzuHO_gS-iVztMSoht14r;p}@nk z!zhwFHL~k4o27%evDkP#O4KeDY%#HCsvB&&0p$4!s59P(+$A@zaF-e?LXF0{jm;3bl}`LA{J#dS_l`U>Aq7?7)T>Si_WtB%`y^xeBZ3i!a0Dc}YGjEGv4(V(E- z4#^mT5S<($4SgINb@bQD<0eW;$Sy4`Yn>389W##3Ws*z*DdZX;I+DGD|hPdNORWM z{TK<@{c_;0*iBVoq`dgrh=<#X^nnAeL`>&x~4E8U=rPJEJhSJn6t#-$m2=2!5AaBtQIWO%_NLgh9fq^f(nQ5 zr0O+Qg+i{eXv2>yIKsrq?20q=k>o>czAec$=zF?z_SxvLjL9&EPM^3!e8&SM8!HM- zm^@Q{GBi7bthWv~t}aF^E3VWe<`8mf@nlk5AqDmY9rMXVVR&yE8^OC~|zY$w|Ap!K7Ux$7pNeQl@0?2;jsh}vxUCP*T(-%ER&AEIiJ3G8Vy}i%4g%4jMHs(rHciAq?b5}3mjB?*# zh(Y9){3rsa^9MV@o^o-E;}DO2Wd3$bD6bWs2I04@d~hR(iIy^F`B#8Piz{bFA7ogT zZNwND?8zCGF8fVYj`#5exW83kxM^Ws@z2_j>pBT}hXB=@4B(JfCyu0%uyr{HojdNM zDs$u<;gU--rQ*jUa`qa;Q@6~8i>lxcf$y4xIY;XYnW*(xxCvuk6EkoRvfXN|JOgK79sUlcZsuo1T??t@Yv0II{=l<>Ve1b~ z>)P_#J4k{UAh&`RKiYK^@r`;p`>cj$Y^mmm)s2qVHT^=JDeG?fXxYMzY3UNKgzFh$ zGna&}ijNkj0A=e6cr;nXIeuW3PyAp+2ffc=a+; z?$r&KGz=aMZ@dPXaE5tukZWKfsIFNUt_FrwY+ecK?3;9AraA4ra;$Q~OO!rnymPVaQRpxzexriSg0)4AjA^)D#zkXZ&%FA^oh-DMmtk z>V!T{Q5KeMDflp-3&adDZnsXasJis7M6PRY?xe(w{9UAg_3+NAI+~a`OyYLMHps3q|VG$G(+*t98r@$Q9U{c0xXrs*@4Lubb{F~il4>L4OHFB zikw~jOp(vJkSGd0y+R%nwKViTsBAh3&J-_2r7L_66{ZTrX6jr_IrS#Mzo6fLI>f<; z=XRFx#;zGw9aa3yCCbinZi>smo0jT|` z01a!fz6(7)fHBiVu+IKgt3l?rucMzTD zUKR&mHsF1e2skLuErOoygl|w`5Yeg%HG&?*W7}J6+V#XwdtCI}aa3 zy2b?|G7yOY zp^0nWI#mea*l;k1m2F`=Q3EMR1=NUHfo&o<2@SnZd{H}w$B5o@^h<9Xeb~@@sDx)u+~!%QB*2 zk(aOFGpHIE0ksTHS;B`yCO)~%50P@O+qbNp$#~sSdRr7Nc`Y|6WoyDA^yE)z_I|om zU+x4q4wOsVn4h3&T^*9|tmM}|ryQvw^8JARnNoT(P{0MJ=xsrp19s_S4QW4DIw+sH zdW#fBdE+bPk$=-Mpqr|KuCJ*|0SL<(*?z<+9GSk5nyp_dnz~t%PQ|N_sav2VZy9YQ_hYGnQLlPVf4> zwMrKqgj0Bz$g}+NllOHNjCd`w5ClQWRUIALZ)7@^Z6VvDD)R$i+tr5PIPBPSb|z@d zw(rK(+KO>WI*mP$6HlIA8s8pM6Y(N8-QOHk-Jd?{bJSegr&B~O@b2RT)Gp@5fCW%5lgN% z0(|yG-CvGp1jJf+zZ9qy8cQW_VNvYgU(5#2E!2F7^rtS5yAT0JH@UY0axF0Ma#uj# z4;VE6>KlQlM7T0)oaQV${nR?k*kaSl6sQOJh!Q}PBh*|Shubba?u={LX0C#KID>V! zeCc+SWqeQXd@lvmB>1*+phH%c@_Y%1-2?%U-vXstaX1F{i>T;D$7y!Gcqg}ljz1Aw zY^P9suacmVU@SG{k*w!ak#zB&kGcIBzsf(!;UI^hR+(|=%GhNRh&}!cHx~=Aiz)uLB-8!u)%&Z_ z19M42`L--*jE5YJkz7D=4v8+*vM2uTiM=wM7oOQxJgVTSsG<#2oQNfh2p z&Y5$cZdX+MIoC{Yk1y8<`K&s@^sqgAe+AoixsK?Wlnyh&Ul+)xYWsLVPfQeL}g3 zhJ~g1iZ7*AYv2v3_TyH-2`=X(nPj$}ba`}Jr7S1#47rd_1@C)x!1peZCT=OpG@8X~ z1nBJ##Txs%{*9zc{^Tz+oY`jIL6{+nw-|Ehy=ETIxE7pZ3vv^c5N3ipaP$jwbP~#) zn`2;5`RcGTd2K%9AxgMRZE(U`vm3DR&mv2=$5X0r5~bbLSJ2QH*)Pd`TK72Vev)ZL zTz%Lsf|;alq?lGxd;92YM>^(F*maI4=A)zP96b53y|Q!N-HDUKAj!_yOl4WTiZXOj zI$PoG!r+?ZC~QlzZP@H21FV>pykiO|C*Kd-g}HuDnpBMTFN)~(hIRpf{Kl5AV^4?k zNaWVy$nfo;lTMm(Jsfk!!wdL2?FNt++P2bWul;C2!#_92v(3@Wdslb6hAI|++B#u} zsqlb7c%_Kui-+!qFJ`zCgqtP-!G8c=qZ89et?jkx0bIbD$QVP@DIZ?wCS~M}6+XEA z)@L8;3gBetd>3fdJJwO%=6T8wHx92@*pGP!%VYP&42Cu;4uFJ!zcvVf#c6n419k_cx79Hlx zPzlvLgklOAj9$FwE=8X1R6u$<3z*zC`#KV<>~D{$A1ZpY>}>N&Z_peKm?Zhy#(nGk zydZhWja}o7o}ou+LXACV=moW73&7f5FOd5szwQP|oM}|gfgf>MD5mb7FV0{93rs`L zt>iol3G8jJfK53P8;5SkD^YnBJyW`E4mCwNvxATZ?HE8;8C+bNkGS5Q((X+KL$Wz` zuP>ZSPU+iRYj)|5Dc4-Wgj?SJe1+^`bCzQHtVR}*?lu!Yd378QeK;c!hSA}$Py38Y zq|gdr%VrhP&0s1J@ohj_Up!}D`a?xo@INr}*X(_uO=J6no6n2_S>&wP)wl2wrPbO& zgS$?7RDfrS0o`GDhdS8cI~5PGlCKs~QWA{pA&qpYuyK=LfxWsu^tBoUsxJg(ac4DL+!w>x@K%NqE#{ebG_kn;grAmn#> zyhL*?r|5Q4RUfy5LF!RUkLo&g5hPpL!%6bAe(>$Md}>oZOMkiN zJ$^2!KyBf|_Jp+q|GCJ;egb8B*t`zJnJpi!gK8T7oYg^ke68CFXPILu_qbHuj`66T z607Q8&%I}IWwZW$%OWS}!|eR$CR3>s z_SXTrUJ69y+DfS85zNjmOjlPjc9Zy39Nr$4(_arxw-^JkT}=kjiecTCCEoUZxp7Xb zwXj0(_?{S-w?f!vKi81t&7+*>uZ4oCGr1Mh9^+;pWi-OJ)Zqel_`NYEX{X!Qu0YmM z3ezlS^ULdejV3*?w6nQDZbU30sC&%#Y_&5eHSR^5PY(ZVs&lKylz)aBN{Q2cPKOV; zl2qjh#v+nDn(CScCmliuMMNja2qG=v&GF^Vxi$12#49wKqaBUs&3IO8kgwS5h}x;q+2p^z6BTI%uk zas|B9iD?lui;M(CTEuhkj*}^_#V^x@#F|ZxP8-{JwwzQqwx6q=w~| z3+N0~?%20(_keY_3BNeN{>QQ5G8jq?)`YWLS9#Rev|6;%a+=522Zul2ww=%jL_^CM=cQxvl2sT+(5 zJ$&ZcPkb5?U_79T?C!fGQx+7j?j0h!??YyD1linbbayb#=(J44)u1bI+-AblNF43Ia>+Ih zK`6$paTuSbYnEb+o9eq7-khdxWb;*qO)VXi4Xz^OK{yA#VDrl#8L}=lcyuZly5uGB zG&k+S&}W0&Z}OtwAVpR5x=_+kDV|SUZxmd~Al7DmrTkG|qxSidTE3vgq?=g;i6>9W z97$aptt3KjT28-^Mn58GVnI%CoGyzL`luHEbOxfC@TA_gSgl=b8g8U(Iucy65d_JRnhaCWrPD&@2n*^M1I4ptAlU?x9(lO*9pjpMQ}D(0i18$z}Q2`T@wkQ0eh znyO0a+|0eaCP3LVN4gL(xnkwSc-@XTajy1YOl8!aDe*dKq^dp&0++5%R=6PlI;}7k za}6s8DD9w`PVkKbULgH7V-Y{zEkvLRi)WmiBjX%S5~j{&E8CT<=2a&*z}DEOBm^^X*1m=(xzAW0b$$_ z&+Y;8hRp>z?M>hKlvmYU-GMeu=qo&*E;AtDGSjsSnVzA;aD>=PhAJu?8RX3$A+Aa- zJe(CyB*f2w5d@S~IFHFCd2pU7kOY+Fo>A*v%pURpRU^-P*B5d&@F{y)v$LgNVA;;q zyOOrcRFf%u(iK_q`)>g$GHs8^Ah)>e!nz`BZdM_kqcG^j>Kb<5wro8OyJ|Hy<9b$wfoNs?w@-lLmWHoj*Lp z6W_bO63^XLQl~h9q{LeJMh7A^m0KQ@_&Gq{WQ)t-_8TIgu%~a%O~B0>ELzP$sO>MM zqd^HGX(O#N$JQT4m>3nTKi9`@ZPvO9N?qzux?^a6V@xadFBo&*;c?{1;@TLqY}cMq z{9=oD9xyyT>ptlmjF&9B5V$QVZ{ivD0oxgTpB8n{%Ol`x4J8~K2!~y{S3J}wmGtM^ z(}~YGIEfk_8HqpAL_tFJW<6m}SQ59F)56-{c6PGU+PHSBJqQS5if z2sSQ_lR0_Ti6El#iiCy(jN}t>Mb4%rd0c(^@omJzG{m17=S+3T71a`DG2|5I8D3Xg zWIjiLhNnREPby40?gF_EQCY4$Gert-s?xe2cTK$P$yT{pvN|_%(%uz(+D1~zfne`E z*5v!#Laz9%R8)|nImjh1kCP)=Uh)jR3G)Hw>P3x+!D!-?bV+Qm%*sjka>HV<#UHb% z6Mg2BNQ}__)GQ{V#9{41`pm^R`u-)cT;MNzG(T<#WBed;$+hCW?EMxf-F zPupI(Z?<#yU1X}PamQg3STjjq7;(?tP}GN`fCKvu)T+Xtr7iU1yL^XjM2AgOK%sm< zo)(PI4+8lP)d=p%86DXS5!R<{Vyh24(*u@88q{GgYcI{gyJE&8WI#UjqJRqIg>Yw` zV&0YCF2yEhV?w~~)cj5pqC|c$C$U*CbADUs`_f?4HOYRKgT1Vsuq(dI{q5`mMl;Gc zH-lYP)nYHMaf^Q)Y1lqjxY8$f9r^n;9nuFjKk5c8IQfyOAxu%bv&x0wAi;<^T zQoO1HZ=V=FpQ;oCJKJ_@I}KCy8zC*m8F47ECsUdhALScTo-vP3LF}2fJz|tW>Ru<; zLMb({Zd0teoL?ZweZ;~W$epuJrlY$A3%1;nP}`>Sld87~SXVU2Rm`UvvsKxJO|_Fk z!K(u)%?K$Em!Jg4tlbVnBsHX)`1$a{M!OFcKb~^6AA0D!F9QO@XXTY{Z}+xzQ8;tc zIiw8}Z^mjQVtg*McI7zSbm$7q*a-7QGHgwChu>GP$g#Ee1m9SPz5Up`(r=vu83t3I zdlP1q7J3#q7WFyE01u#=TC;7b0Xs0o5j_Ic+Fddm-UDmeUBGhKUJfRt`%y9MkqKtZ z5inqaoQBP*-pK%&D?zT>3T~Nze$GrVDl08GjOG@gOi%$@q^zC6N_S(H2-EJS&V*=Q zAH`*$npg1f_+arvHMCK$j;2-UEz7gh2@XIhr>aE4PkUw3yO}~4 z1bnbE?9n<5f4xK;rZStKu?q#59g{%jcF*eh+R4)jT$Lfrlk1@1Mk#625jH1{Xg7Ga z!Vg>MLXirkz=r`C^=+-th#)eJAfBC_t^OyuTX6oQP;A;uK~RXzI$~+jKTh57}mRmY%3g`A|cN`)XE|Vr;P!Cx1V%) z+H1!8O;oK#=C4hOSp4L^HTSkpsPJaM0d)q0p!muLy&rZt+$XZb?%#Pe%9cwtN zA={v--ObVMAlmf!4F$?N)XbQ3RANPrEskjIyN0?DB|ITeHcj@KgOa1!Ybmsn-}lPD zk3ExGwDd_{`7Nha4DVYVOf&6WRRFY12-1f0fq&}h3Q)=W#*+XrsmC(l#BgjjsXI~! zw6}$@xPw?qaW>#JM*&6wKpENjysb`8;y86>HLhTcl7oKMV|qka>~ zRU5iwjwvts)*33$FgrT^E=*{9GKt3dG~r)aZHdQ+PH=BO8@bgmGA)mvz}sUZbe!9m zSvb}i`lxe#HZl|FX+haZ2^bmDl>jp3%jGE@-?ZRp30WN%YAZcqDZ_I6f~6JaL+!l` z<1z-lbvE}i=a9Z1cf1>SIP~Lsw{eCICXY>3Q-;=gOnmErb(VyTu+Q7NtxhYI8iQR{ zK?kg+tVa;`!*R0e&cbwo^+;~4(?PN0u;4V{PE)nwyJr(p-X>}$fbkqH{UYiHHjO5CQgz1jSpXs*1f{n(JToS&(l9YZk_ufqU(@s${ z%b?-&c~i_RlStf`UHWv6s8VQjBw! zV141pp(syxteF}O|7MltT5^7WCb5)e?0K2#xNIQi(ZF8c%CR-NrI$B>K@S4#S7~9j zyl^?yx3y5}*bRuCboxqvdxHA1Z)=z*KO0)>+>%R8<$1x8`nH*Q>**&oa1QUpI^n14 znZVYUa;8r~uRxfu9Gymw-|o6C{R_RGg&U~r=3Ykp2gce0(J&?;X=yYTz`mr>(uLCC z3XMlkjLYc%G~@y8%dG5yLgxd{DD|@fyzo-j1d}4@g-y0m@p}ruJA3xYG1Fg+Bl+b1m_7z%MiaO0dn` z`j&MCx;|`m+k+#qXJWvcgLklkVa+`?fQ*rw0B%%0T{6=IvQdmj6}IPvT=0!rMcibl(s$|6b70&d%CS z+sN*1g^sqV)vpIYeTnUs>ZO6(NNB9JN&%0BR8 z#wmlT0WU`V=_!3tw0gOLXiX+$Srs%~f={f$uD$^WicM?cRHt6TXs9ft&os+IKeFM2 z)B+TSQ5N*a(jc{nC8PBI9{6Y+8-4Tisb9UqYUPsCCR;_Eil~W1gL>b)!H_U+FYBQ8c@d0QsVCV zK#KA`(HNl64A&h=Akd4}DWkYShSmr*hj1o(jmR6hS4MUP1oChQS7b0_tpU##W@26HsbMGNqj}O7Tfnm4{9}`a8)T z4(_4gCpc;2Pmre_Y1IGZQ70M4iu8>~jkm^){C6HLtqpW7{$x?UTk4I)wzxC6{7_+2 zRY6TYRZh2ypN6a{s3g-6l%^vC6R0Xo;bM5H$K}@F(_HCIH`m@+1TSPr^2_Za9@PIF z$BKH2RA1QS#nam7s6jkG>Y`aY`7uO8G*eyyV@3e&u*`tb#JlVB@^)fIV6E$bjjDqhg_w%Nf8s;$a{xn5LtW{-QK@v|E_Lc@UF}T?%KWUEBa%dl z;T3HpEh|!CVPeKV5#*nC78OZ(m`;i4-D_&Rwm-l-U+A zXRL!Kf(k)}IEbw}qHpj1ghqQ(F@*Y0Zd>=;>yO?zWq5OUl>g?|+VQtXy?u%0mhPp2 z@4pqf|FA73jFTl`TL2^($lUqEy@NgD{$<3(E*6i> z7?ficCZw(%GyWN#ra=E14O^s$MSl#Ggnh;9?qe(FV@C9oas;Jh6?rRuAyKT`j~1?M*?aRZ#ydrvY2si zTw7_Q)XiB09pTK0D2^esW^nU9!v2$=k1sc6GjF^Ey|uqjf9J>EQD5KC-ddYPtYWauM)mlBnS^o!ybIAcf7aMhtH6JYF}N`5R+ooezdA zb?tPNR!t($GG_FoY|Z&}+{3k@@4ZCpQiXb@w#>AQBj|Zt5S9S0qm!rh*R;80$-=B! zvENZCYO1Yy1OAf^bQOQt);AhR-_gHHnf| zTBdE{r&99remLgdmr7zSfg||9iq66?kxkQl#E$_>adC46RkXRu{|#+Qlt}TuuUs%cB2MA+mtx_Kp%PKxFa6BypDaQJ3TcD6>zq91m=SSVcYJ2 zZf%Md5^hW$QjfWIxdra?AQZoMJl#S5v-zN%cj~3S5wiI9{rNpH2Bx|e*2eER;f&;k z`t2c;e$EiJjd_?cv31|``v@Ak84&4;-8}S*$9H-+pVvoTIKj^yQaA-ci*_J-1o`K` z$#%<~1Vdk~c@eu#4~3EmTRGOHv?CW4M~?xv{pvOBd8Q?I*dYhO*P#^Sk!Z^rF9u z{MJX5y~TQ*_ci-Hb<#Jqaxk>hcKLOykL4xbI#if;{Bs;KajZs*2vPYt3#_}3HmSLN z=6UtD+b)}%3-Zg;k;TMKvEm!3ox6+DLr&I;Dd{nJMcKNn+B|;Uv6pxYHnF`Hz^%u} zl1i!0TdMnc1hDvhvmoELGJ^Q>r4qs#x`z8)qb4X7hi8TR(G;V2@#7iDFZ~p~t@Md# z{Y0}8KP8tCkD}9>xv2Eo;4wfhyhvP>>9#ku0%^0I=Sr; z#|EvC6W2y3l31)yd-~zsAbfsRahX4jB46zoFUpayBHCp6+BaDl2db(8G=tD|#crru z;&}2gJd31t`q*WcFfR?~tAfq9Y|u0%{urd*k0*qoYE7>x)g_yB?1U9MXEsU+;Lo*I zD00Zy%tK9lHYDEqU*+Y4l0&PplLCct=7=$rt<>p$KA0Vj7cu{{x)AC<>2q(@{GWY> zv7N5#|5u-(F{!|aX)R|MYKlM2QX>yyEj?eaZ}Y>h`r>iM`c>5VE;aW-AdzRNOZ*ZB zDh?lKT1SWKRGOXT2nUC)JEQ`>beP!G@(Sm~9t3ca?-MVS)O`>pRzK z+0_3y{l*ObTW?DAz9HBd8vJi!>SMaCdU4?ePGcV6Oime(3rZ;BwxlV5)GX*tHmd7ST3avy|#@#207_9rjem0326ok#ySFUDgeZgbhoUt3yaY~)H8 z#i~IcHCVgNlwAg3HFVG|2fQEb=(-rgB>CI;Uv0v=wQYrC7Q1Yh%u#-1i5*DyGF56* z@$3s@3a1~WX?$6Hpb7Vd%UVY{xr#M0FQlHcGUw_Xio;NFeLj1BmlQ9n(myx6u|f6b z9$4>L`CD@GtGD@wcL=Rm1~mQV9bewOW90aE?>P9)J4VQfFY|L{7kivLp*BF zzIGPjG^Ixc^Aa=1*5Y>~e}L$uyd2eC0)hNPgaxT?Bb zRo@A0_LQ50X=GZiou7gI(?0-W6HuGq>dEj{-~Z}h|E#b6Ume2RE|k5vFoHkGuW_P( zU|L(tBQ3v(26UOrbVt%0-`w+4gfY!g-#yq>=(c$58e}RkK&iXneD8vHhm5gC`E-4G z1(I{)gEmk>F*rj=L+R_dN&ziiei-uAE9b~zamPO?!m3>#uip}kaDvb4*xI8elkThCVPx>TAtZ>VNowOCclp0+?W}8OWol)t{kK|6^M<{3gKek};Cb$O z$K`J~TH3F={@0COS~qNz3Ft!aoUv3|z@+7d7VAab`jlT9IP~e9NHnv!Y5tfhU zWKS(R+w=S*LJ>P@iS(_~tu-Ya`}{3p-=&(j(Uhl~e5&k!(9Ray@{jf{ejn+{i#kC3 zGGfI^{}Z9X@mue^I(u-Hlz_k8<@`5)|F4e!&pO+i8k_uT+Vyh0ZyE%A8~%B)$>|qy zz~Zot#4Lq@??g)2)&|zzHH7A%IwZs#cWn?1T;mkBQ3ow)Ztb@b}CQ2e+ zSr;KW@83^OE03>hu7<`FEG*?zC{v}lrr$1Agls;y!E-=}Z!7ZCgbgjRVH$>YHMsvv?>7*cv@5zej-C$Aa9`Xf`CX+dD*zG&2LhPLYA&+$oJgbY1xz)M4T405Nb%O_ zB|#*v&@^R5Yx1{GVu_gm`^XFF&+RcUTgSB!KFf7nJjEM=GaEN4`?m*_kQ~D?kPS|0 z6~Nc@2wz2@ff0Z&;X!3J%#(z9dPF2MB(nRyrIYHE6vBYE5SuYNR&{{qKC?c5rV8nZ zm`!aGs)P`#D@?&}g8`LJK{vvc3EDww^T8eF_ja$HC*$SivW>HiW^r4-SlQLqL+Wt` zQhn)6z?Ul6sFseHH9aWdiTZGT$u5W)@mzuy8eN4hU00>3EYU?AtrAV}&5Lw75__2PfQkWHRCJKEDGiFb2@OJfDV-5i)P_*N?`Dd%MU_}c~U^a9( zQt>!j8dfa1*9u$DZY6lj1?cUbkwPogKZ znLUItzKu%a@<=p0qx-Zlo$8#tJ(N)BY+7%CnR5@dU|T%@UUPc}2C^``>(%1{%iR)} z>zHyqi|jQmM{MnOGwijtJQd;-RPDe8^pJM+V@rDsuB`hSlp~mf9F>OK2p_OrF6k082vm~}9jH%GL2 zxYg6AW7n^nvK%6nr0nUJAQ=OrgW(7HK3vu}B!0+OlT~qdP-GL%C9NBI6t9VNRID@4 z6uj_=D#&!cR`6cgH@|U{RH$b6#ftQ zcG7(tR{po_JByndr1j?BTW{UKpVHYMMSuVG%dry@)vfbbkiPxcm9P39?3v0lSg;>P zmlkj2R5usFP|i?0EjHK<9%g1?ATcvq^h4iDGA;g4+cOO0@(6>eW9m300ITfzSj@*`QY(f>|vfjiAhn_~mpY z?WYmv_0hqrb21hxwU6V`wnzPk)lUtxYGE?HwI|7rju}Qgq{Tgar zu?I5bWMS!K@EGVt%~JBAxvl)pAd$_%w81ATV`HAFV_(4%wrfAZ-3aDNL+KXNXG_0}ScTagPfiXheIr*5T@j+UJ zC8f=HGm*^q%lg+yl+ro80o)B0dK~EXO&(^fRKgDNFShAb1tPTBiw+{N3h;Aks?`d2 zVB$*g=%&4Rtero$tB5NA@=OUP`rLApzbN@*=wwT2rM|S#-yjVy^_oh> zB2NL0Zp)P}tv^~I!%!SI+j4y%xSpWDer<4@;0lw%tY-k8qKWsPUS~3V@Vz@J=(XD# zePphS8Kturk}diCfs%e7-;NMbUWGD`M0^A&XCE(cD2R1Ir}0N(cT#0ms5g0WifrE0 zV6Az-x?SpSj_c=_4ARO1Rymmj6`VOFT>(Lm^t*+*AAkV<$%$CRLM5zL_sk@Br%^q* zNG4HsF?GYDU~hZK-BQ+pTfU=9-m1oNv{vNb z+81R|&3#k8Ms`f+<(5nI`BZ+e@H}tR5@)!8-w?LLf*9~=Z!pNqhrzW=USgo|V!{^C zErYa$k*e-?9I1mOsLU8_PxApBzoxx@ zKi~n5dCN?H&w2hYi(lmbWik1O#c#a4H+w%N_NQUK@BQD+{(FM#J<$6Jp}&9x%zwY) z-`@Xspg*UF-h;fK4fzWs!s2frf1ew95Aj~~{|jQz^1mSdP;%d6ycfp*!ho>;8^)g_ zvwz6s@3G#i%70;@+WZf!cN+71v|rYLwu@g_!l0H{X4w>79QV&y;s@(0`qhD-(de4V!wxa zuVDQJW$XA3>fiOO_n_~^pT9uEo!)`|s}%Ge^SyNP7iNz0JIuc|-(Q*1d!+ZG#9v4; zF8_k`*I@lU*!!{mUtqzm@4)^X1^+wP`$6>zhA*0Veh@+`}Fs(EBN+L!@rW@ z_Yi-7?|;S&75~45@Bho}SNQ(@_(huUo7uk*_N&mJ_57#N*EgeospH>`{tCIj-f7~^ Y=#PK~3ihkmr?;=&H{h$c7XSeMAF2lGmH+?% literal 0 HcmV?d00001 diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..07771b9 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'flutter_alibc' diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..8c60934 --- /dev/null +++ b/android/src/main/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcHandle.java b/android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcHandle.java new file mode 100644 index 0000000..aeb4651 --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcHandle.java @@ -0,0 +1,334 @@ +package com.wxwx.flutter_alibc; + +import android.util.Log; +import android.webkit.WebChromeClient; +import android.webkit.WebViewClient; +import android.widget.Toast; +import android.content.Intent; +import com.ali.auth.third.core.model.Session; +import com.alibaba.baichuan.trade.biz.context.AlibcResultType; +import com.alibaba.baichuan.android.trade.AlibcTrade; +import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback; +import com.alibaba.baichuan.android.trade.model.AlibcShowParams; +import com.alibaba.baichuan.android.trade.model.OpenType; +import com.alibaba.baichuan.android.trade.page.AlibcBasePage; +import com.alibaba.baichuan.android.trade.page.AlibcDetailPage; +import com.alibaba.baichuan.android.trade.page.AlibcMyCartsPage; +import com.alibaba.baichuan.android.trade.page.AlibcShopPage; +import com.alibaba.baichuan.trade.biz.applink.adapter.AlibcFailModeType; +import com.alibaba.baichuan.trade.biz.context.AlibcTradeResult; +import com.alibaba.baichuan.trade.biz.core.taoke.AlibcTaokeParams; +import com.alibaba.baichuan.trade.biz.login.AlibcLogin; +import com.alibaba.baichuan.trade.biz.login.AlibcLoginCallback; +import com.alibaba.baichuan.android.trade.AlibcTradeSDK; +import com.alibaba.baichuan.android.trade.callback.AlibcTradeInitCallback; +import com.alibaba.baichuan.trade.common.utils.AlibcLogger; +import io.flutter.plugin.common.PluginRegistry.Registrar; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.MethodCall; +import java.util.HashMap; +import android.app.AlertDialog; +import static com.wxwx.flutter_alibc.PluginConstants.*; +import static com.wxwx.flutter_alibc.PluginUtil.*; +import com.wxwx.flutter_alibc.web.WebViewActivity; +import java.util.Map; + +/** + * @Author karedem + * @Date 2019/9/7 19:55 + * @Description 接口处理者 +**/ +public class FlutterAlibcHandle{ + + private static FlutterAlibcHandle handle; + private Registrar register; + + //第一次调用getInstance register不能为空 + public static FlutterAlibcHandle getInstance(Registrar register){ + if (handle == null){ + synchronized (FlutterAlibcHandle.class){ + handle = new FlutterAlibcHandle(); + handle.register = register; + } + } + return handle; + } + + /** + * 初始化阿里百川 + * @param call + * @param result + */ + public void initAlibc(MethodCall call, Result result){ + AlibcTradeSDK.asyncInit(register.activity().getApplication(), new AlibcTradeInitCallback() { + @Override + public void onSuccess() { + result.success(PluginResponse.success(null).toMap()); + } + @Override + public void onFailure(int code, String msg) { + result.success(new PluginResponse(Integer.toString(code), msg, null).toMap()); + } + }); + } + + /** + * 登陆淘宝 + * @param result + */ + public void loginTaoBao(Result result){ + final AlibcLogin alibcLogin = AlibcLogin.getInstance(); + if (alibcLogin.isLogin()){ + Session session = AlibcLogin.getInstance().getSession(); + Map userInfo = new HashMap<>(); + userInfo.put("nick", session.nick); + userInfo.put("avatarUrl", session.avatarUrl); + userInfo.put("openId", session.openId); + userInfo.put("openSid", session.openSid); + userInfo.put("topAccessToken", session.topAccessToken); + userInfo.put("topAuthCode", session.topAuthCode); + result.success(PluginResponse.success(userInfo).toMap()); + return; + } + alibcLogin.showLogin(new AlibcLoginCallback() { + @Override + public void onSuccess(int loginResult, String openId, String userNick) { + Map userInfo = new HashMap<>(); + Session session = AlibcLogin.getInstance().getSession(); + userInfo.put("nick", session.nick); + userInfo.put("avatarUrl", session.avatarUrl); + userInfo.put("openId", session.openId); + userInfo.put("openSid", session.openSid); + userInfo.put("topAccessToken", session.topAccessToken); + userInfo.put("topAuthCode", session.topAuthCode); + result.success(PluginResponse.success(userInfo).toMap()); + } + @Override + public void onFailure(int code, String msg) { + // code:错误码 msg: 错误信息 + result.success(new PluginResponse(Integer.toString(code), msg, null).toMap()); + } + }); + } + + /** + * 登出 + * @param result + */ + public void loginOut(Result result){ + AlibcLogin alibcLogin = AlibcLogin.getInstance(); + alibcLogin.logout(new AlibcLoginCallback() { + @Override + public void onSuccess(int loginResult, String openId, String userNick) { + } + @Override + public void onFailure(int code, String msg) { + // code:错误码 msg: 错误信息 + } + }); + } + + /** + * 淘宝授权登陆 获取access_token + * 官方说明文档 {https://open.taobao.com/doc.htm?docId=118&docType=1} + * @param call + * @param result + */ + public void taoKeLogin(MethodCall call, Result result){ + HashMap map = (HashMap)call.arguments; + String url = call.argument("url"); + WebViewActivity.setCallBack(new WebViewActivity.CallBack() { + @Override + public void success(String accessToken) { + Map resMap = new HashMap(); + resMap.put("accessToken", accessToken); + result.success(resMap); + } + + @Override + public void failed(String errorMsg) { + Map resMap = new HashMap(); + resMap.put("accessToken", ""); + result.success(resMap); + } + }); + Intent intent = new Intent(register.activity(), WebViewActivity.class); + intent.putExtra("url", url); + intent.putExtra("arguments", map); + register.activity().startActivity(intent); + } + + /** + * 通过URL方式打开淘宝 + * @param call + * @param result + */ + public void openByUrl(MethodCall call, Result result){ + AlibcShowParams showParams = new AlibcShowParams(); + AlibcTaokeParams taokeParams = new AlibcTaokeParams("","",""); + + showParams.setBackUrl(call.argument(key_BackUrl)); + + ///渠道授权 + if((Boolean) call.argument(login_And_Auth)){ + ///先APP授权 + + if (!AlibcLogin.getInstance().isLogin()) { + + AlibcLogin.getInstance().showLogin(new AlibcLoginCallback() { + @Override + public void onSuccess(int i, String s, String s1) { + Log.d("阿里百川打开WebView","webview"); + register.activity().startActivity(new Intent(register.activity(),WebActivity.class)); + } + + @Override + public void onFailure(int i, String s) { + Log.d("阿里百川授权失败",s); + } + }); + } else { + Log.d("阿里百川打开WebView","webview"); + register.activity().startActivity(new Intent(register.activity(),WebActivity.class)); + } + ///后渠道信息 + return; + } + +// if (call.argument(key_OpenType) != null){ +// System.out.println("openType" + call.argument(key_OpenType)); +// showParams.setOpenType(getOpenType(""+call.argument(key_OpenType))); +// } +// if (call.argument(key_ClientType) != null){ +// System.out.println("clientType " + call.argument(key_ClientType)); +// showParams.setClientType(getClientType(""+call.argument(key_ClientType))); +// } + if (call.argument("taokeParams") != null){ + taokeParams = getTaokeParams(call.argument("taokeParams")); + } +// if ("false".equals(call.argument("isNeedCustomNativeFailMode"))){ +// showParams.setNativeOpenFailedMode(AlibcFailModeType.AlibcNativeFailModeNONE); +// }else if (call.argument(key_NativeFailMode) != null){ +// showParams.setNativeOpenFailedMode(getFailModeType(""+call.argument(key_NativeFailMode))); +// } + + Map trackParams = new HashMap<>(); + String url = call.argument("url"); + // 以显示传入url的方式打开页面(第二个参数是套件名称) + AlibcTrade.openByUrl(register.activity(), "", url, null, + new WebViewClient(), new WebChromeClient(), showParams, + taokeParams, trackParams, new AlibcTradeCallback() { + @Override + public void onTradeSuccess(AlibcTradeResult tradeResult) { + Map results = new HashMap<>(); + if (AlibcResultType.TYPECART == tradeResult.resultType){ + results.put("type", 1); + }else if (AlibcResultType.TYPEPAY == tradeResult.resultType){ + results.put("type", 0); + results.put("payFailedOrders", tradeResult.payResult.payFailedOrders); + results.put("paySuccessOrders", tradeResult.payResult.paySuccessOrders); + } + result.success(PluginResponse.success(results).toMap()); + } + @Override + public void onFailure(int code, String msg) { + result.success(new PluginResponse(Integer.toString(code), msg, null).toMap()); + } + }); + + + } + + /** + * 打开商店 + * @param call + * @param result + */ + public void openShop(MethodCall call, Result result){ + AlibcBasePage page = new AlibcShopPage(call.argument("shopId")); + openByBizCode(page, "shop", call, result); + } + + /** + * 打开购物车 + * @param result + */ + public void openCart(MethodCall call, Result result){ + AlibcBasePage page = new AlibcMyCartsPage(); + openByBizCode(page, "cart",call, result); + } + + /** + * 打开商品详情 + * @param call call.argument["itemID"] 详情id + * @param result + */ + public void openItemDetail(MethodCall call, Result result){ + AlibcBasePage page = new AlibcDetailPage(call.argument("itemID")); + openByBizCode(page, "detail", call, result); + } + + private void openByBizCode(AlibcBasePage page,String type, MethodCall call, Result result){ + AlibcShowParams showParams = new AlibcShowParams(); + AlibcTaokeParams taokeParams = new AlibcTaokeParams("", "", ""); + + showParams.setBackUrl(call.argument(key_BackUrl)); + + if (call.argument(key_OpenType) != null){ + showParams.setOpenType(getOpenType(""+call.argument(key_OpenType))); + } + if (call.argument(key_ClientType) != null){ + showParams.setClientType(getClientType(""+call.argument(key_ClientType))); + } + if (call.argument("taokeParams") != null){ + taokeParams = getTaokeParams(call.argument("taokeParams")); + } + + if ("false".equals(call.argument("isNeedCustomNativeFailMode"))){ + showParams.setNativeOpenFailedMode(AlibcFailModeType.AlibcNativeFailModeNONE); + }else if (call.argument(key_NativeFailMode) != null){ + showParams.setNativeOpenFailedMode(getFailModeType(""+call.argument(key_NativeFailMode))); + } + + Map trackParams = new HashMap<>(); + AlibcTrade.openByBizCode(register.activity(), page, null, new WebViewClient(), + new WebChromeClient(), type, showParams, taokeParams, + trackParams, new AlibcTradeCallback() { + @Override + public void onTradeSuccess(AlibcTradeResult tradeResult) { + Map results = new HashMap<>(); + if (AlibcResultType.TYPECART == tradeResult.resultType){ + results.put("type", 1); + }else if (AlibcResultType.TYPEPAY == tradeResult.resultType){ + results.put("type", 0); + results.put("payFailedOrders", tradeResult.payResult.payFailedOrders); + results.put("paySuccessOrders", tradeResult.payResult.paySuccessOrders); + } + result.success(PluginResponse.success(results).toMap()); + } + @Override + public void onFailure(int code, String msg) { + // 失败回调信息 + result.success(new PluginResponse(Integer.toString(code), msg, null).toMap()); + } + }); + } + + /** + * 设置淘客打点策略 是否异步 + * @param call + */ + public void syncForTaoke(MethodCall call){ + AlibcTradeSDK.setSyncForTaoke(call.argument("isSync")); + } + + /** + * TODO + * @param call + */ + public void useAlipayNative(MethodCall call){ + AlibcTradeSDK.setShouldUseAlipay(call.argument("isNeed")); + } + + +} \ No newline at end of file diff --git a/android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcPlugin.java b/android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcPlugin.java new file mode 100644 index 0000000..4a6701d --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/FlutterAlibcPlugin.java @@ -0,0 +1,48 @@ +package com.wxwx.flutter_alibc; + +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; +import io.flutter.plugin.common.PluginRegistry.Registrar; + +/** FlutterAlibcPlugin */ +public class FlutterAlibcPlugin implements MethodCallHandler { + + private static com.wxwx.flutter_alibc.FlutterAlibcHandle handle; + /** Plugin registration. */ + public static void registerWith(Registrar registrar) { + handle = com.wxwx.flutter_alibc.FlutterAlibcHandle.getInstance(registrar); + final MethodChannel channel = new MethodChannel(registrar.messenger(), "flutter_alibc"); + channel.setMethodCallHandler(new FlutterAlibcPlugin()); + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + if (call.method.equals("getPlatformVersion")) { + result.success("Android " + android.os.Build.VERSION.RELEASE); + } else if (call.method.equals("initAlibc")){ + handle.initAlibc(call, result); + }else if (call.method.equals("openItemDetail")){ + handle.openItemDetail(call, result); + } else if (call.method.equals("loginTaoBao")){ + handle.loginTaoBao(result); + } else if (call.method.equals("taoKeLogin")){ + handle.taoKeLogin(call, result); + } else if (call.method.equals("loginOut")){ + handle.loginOut(result); + }else if (call.method.equals("openByUrl")){ + handle.openByUrl(call, result); + }else if (call.method.equals("openShop")){ + handle.openShop(call, result); + }else if (call.method.equals("openCart")){ + handle.openCart(call, result); + }else if (call.method.equals("syncForTaoke")){ + handle.syncForTaoke(call); + }else if (call.method.equals("useAlipayNative")){ + handle.useAlipayNative(call); + }else { + result.notImplemented(); + } + } +} diff --git a/android/src/main/java/com/wxwx/flutter_alibc/PluginConstants.java b/android/src/main/java/com/wxwx/flutter_alibc/PluginConstants.java new file mode 100644 index 0000000..5789134 --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/PluginConstants.java @@ -0,0 +1,29 @@ +package com.wxwx.flutter_alibc; + +import java.lang.annotation.Native; + +/** + * @Author karedem + * @Date 2019/9/10 11:28 + * @Description 常量类 +**/ +public interface PluginConstants { + + String login_And_Auth="auth"; + + String key_OpenType = "openType"; + String key_ClientType = "schemeType"; + String key_BackUrl = "backUrl"; + String key_NativeFailMode = "nativeFailMode"; + + + String Tmall_ClientType = "0"; + String TaoBao_ClientType = "1"; + + String Auto_OpenType = "0"; + String Native_OpenType = "1"; + + String JumpH5_FailMode = "0"; + String JumpDownloadPage_FailMode = "1"; + String None_FailMode = "2"; +} diff --git a/android/src/main/java/com/wxwx/flutter_alibc/PluginResponse.java b/android/src/main/java/com/wxwx/flutter_alibc/PluginResponse.java new file mode 100644 index 0000000..89ea5e2 --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/PluginResponse.java @@ -0,0 +1,35 @@ +package com.wxwx.flutter_alibc; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author karedem + * @Date 2019/9/7 19:55 + * @Description 插件 响应返回实体类 +**/ +public class PluginResponse implements Serializable { + + private String errorCode; + private String errorMessage; + private Object data; + + public static PluginResponse success(Object obj){ + return new PluginResponse("0", "成功", obj); + } + + public PluginResponse(String errorCode, String errorMessage, Object data) { + this.errorCode = errorCode; + this.errorMessage = errorMessage; + this.data = data; + } + + public Map toMap(){ + HashMap map = new HashMap<>(); + map.put("errorCode", errorCode); + map.put("errorMessage", errorMessage); + map.put("data", data); + return map; + } +} diff --git a/android/src/main/java/com/wxwx/flutter_alibc/PluginUtil.java b/android/src/main/java/com/wxwx/flutter_alibc/PluginUtil.java new file mode 100644 index 0000000..5de3d6b --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/PluginUtil.java @@ -0,0 +1,54 @@ +package com.wxwx.flutter_alibc; + +import static com.wxwx.flutter_alibc.PluginConstants.*; +import com.alibaba.baichuan.android.trade.model.OpenType; +import com.alibaba.baichuan.trade.biz.applink.adapter.AlibcFailModeType; +import com.alibaba.baichuan.trade.biz.core.taoke.AlibcTaokeParams; + +import java.util.Map; + +/** + * @Author karedem + * @Date 2019/9/10 11:42 + * @Description 映射返回对应值 +**/ +public class PluginUtil { + + public static OpenType getOpenType(String open){ + if (Auto_OpenType.equals(open)){ + return OpenType.Auto; + }else { + return OpenType.Native; + } + } + + public static String getClientType(String client){ + if (client.equals(Tmall_ClientType)){ + return "tmall"; + }else { + return "taobao"; + } + } + + public static AlibcFailModeType getFailModeType(String mode){ + if (JumpH5_FailMode.equals(mode)){ + return AlibcFailModeType.AlibcNativeFailModeJumpH5; + }else if (JumpDownloadPage_FailMode.equals(mode)){ + return AlibcFailModeType.AlibcNativeFailModeJumpDOWNLOAD; + }else { + return AlibcFailModeType.AlibcNativeFailModeNONE; + } + } + + public static AlibcTaokeParams getTaokeParams(Map taokePar){ + String pid = (String) taokePar.get("pid"); + AlibcTaokeParams taokeParams = new AlibcTaokeParams("", "", ""); + if (pid != null){ + taokeParams.setPid(pid); + } + Object extParams = taokePar.get("extParams"); + //TODO 其他参数待添加 + return taokeParams; + } + +} diff --git a/android/src/main/java/com/wxwx/flutter_alibc/WebActivity.java b/android/src/main/java/com/wxwx/flutter_alibc/WebActivity.java new file mode 100644 index 0000000..c32e488 --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/WebActivity.java @@ -0,0 +1,528 @@ +package com.wxwx.flutter_alibc; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.graphics.Bitmap; +import android.net.Uri; +import android.net.http.SslError; +import android.os.Bundle; +import android.util.Log; +import android.util.Patterns; +import android.view.View; +import android.webkit.GeolocationPermissions; +import android.webkit.JavascriptInterface; +import android.webkit.SslErrorHandler; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.ImageView; +import android.widget.Toast; + +import com.alibaba.baichuan.android.trade.AlibcTrade; +import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback; +import com.alibaba.baichuan.android.trade.model.AlibcShowParams; +import com.alibaba.baichuan.trade.biz.context.AlibcTradeResult; +import com.alibaba.baichuan.trade.biz.core.taoke.AlibcTaokeParams; +import com.alibaba.baichuan.trade.biz.login.AlibcLogin; +import com.alibaba.baichuan.trade.biz.login.AlibcLoginCallback; + +import java.util.HashMap; +import java.util.Map; + +public class WebActivity extends Activity { + WebView mainWeb; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_web_bc); + mainWeb = findViewById(R.id.webview_main); + mainWeb.getSettings().setJavaScriptEnabled(true); + mainWeb.getSettings().setDomStorageEnabled(true); + mainWeb.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); + mainWeb.getSettings().setLoadWithOverviewMode(true); + mainWeb.getSettings().setAllowFileAccess(true); + mainWeb.getSettings().setDatabaseEnabled(true); + + + ImageView imageView = findViewById(R.id.go_to_back); + imageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + Map exParams = new HashMap<>();//yhhpass参数 +// AlibcTaokeParams alibcTaokeParams = new AlibcTaokeParams("", "", ""); +// alibcTaokeParams.pid = SPUtils.getPrefString(mActivity, Pkey.pid, ""); +// alibcTaokeParams.adzoneid = SPUtils.getPrefString(mActivity, Pkey.APP_adzoneId, ""); +// alibcTaokeParams.extraParams = new HashMap<>(); +// alibcTaokeParams.extraParams.put("taokeAppkey", SPUtils.getPrefString(mActivity, Pkey.APP_alliance_appkey, "")); + AlibcShowParams showParams = new AlibcShowParams(); + showParams.setBackUrl("alisdk://"); + AlibcTrade.openByUrl(WebActivity.this, "", "http://www.izhim.com/comm/tb_callback.php?_ctrl=domain&domain_state=MTI2&domain_return_url=aHR0cDovLzE5Mi4xNjguMC4xMTM6NTAwMC9hcGkvdjEvdGFvYmFvL2F1dGgvY2FsbGJhY2s%2FdGltZT0xNjAyNDk4MjA3", + mainWeb, new MyBaichuanWebClient(), new MyWebChromeClient(), showParams, + new AlibcTaokeParams("", "", ""), exParams, new AlibcTradeCallback() { + @Override + public void onTradeSuccess(AlibcTradeResult alibcTradeResult) { + + } + + @Override + public void onFailure(int i, String s) { + + } + }); + } + + //用于百川授权的简化的WebClient + @SuppressLint("AddJavascriptInterface") + private class MyBaichuanWebClient extends WebViewClient { + @SuppressLint("AddJavascriptInterface") + @Override + public boolean shouldOverrideUrlLoading(WebView view, final String url) { + + Log.d("百川拦截", url); + //绑定会员关系时获取网页内容关闭网页 + if (url.contains("http://www.izhim.com/comm/tb_callback")&&!url.contains("redirect_uri")) { + Log.d("百川系时获取网页内容关闭网页", url); + mainWeb.addJavascriptInterface(new InJavaScriptLocalObj(), "java_obj"); + } + if (url.contains("oauth.taobao.com/authorize") || url.contains("oauth.m.taobao.com/authorize")) { + + //渠道授权改动测试 + Log.d("百川渠道授权改动测试", url); + Map exParams = new HashMap<>();//yhhpass参数 + AlibcShowParams showParams = new AlibcShowParams(); + showParams.setBackUrl("alisdk://"); + AlibcTrade.openByUrl(WebActivity.this, "", url, + mainWeb, new MyBaichuanWebClient(), new MyWebChromeClient(), showParams, + new AlibcTaokeParams("", "", ""), exParams, new AlibcTradeCallback() { + @Override + public void onTradeSuccess(AlibcTradeResult alibcTradeResult) { + Log.d("cg", alibcTradeResult.toString()); + } + + @Override + public void onFailure(int i, String s) { + Log.d("sb", s); + } + }); + } + return super.shouldOverrideUrlLoading(view, url); + } + + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + // WebLoad.setVisibility(View.GONE); + // mainWeb.setVisibility(View.GONE); + //开始加载设置为透明 + super.onPageStarted(view, url, favicon); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + super.onReceivedError(view, request, error); + } + + @Override + public void onPageFinished(WebView view, String url) { + // WebLoad.setVisibility(View.GONE); + mainWeb.setVisibility(View.VISIBLE); + // 获取页面内容 + view.loadUrl("javascript:window.java_obj.showSource(" + + "document.documentElement.innerText);"); + + // 获取解析 + view.loadUrl("javascript:window.java_obj.showDescription(" + + "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')" + + ");"); + // quanyikaText(); + super.onPageFinished(view, url); + } + + //处理 [Android]用WebView访问证书有问题的SSL网页 + //http://blog.sina.com.cn/s/blog_4cd978f90102vrxk.html + @Override + public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { + handler.proceed(); + } + + } + + /** + * 绑定渠道 + */ + private final class InJavaScriptLocalObj { + + @JavascriptInterface + public void showSource(final String html) { + //获取网页内容,用于判断是否成功绑定关系id + + try { + if (html.contains("成功")) {//成功 + Toast.makeText(WebActivity.this, "授权成功", Toast.LENGTH_SHORT).show(); + finish(); + } else {//失败 + mainWeb.setAlpha(0); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @JavascriptInterface + public void showDescription(String str) { + + + } + } + + + public class MyWebChromeClient extends WebChromeClient { + + private CustomViewCallback mCustomViewCallback; + // 横屏时,显示视频的view + private View mCustomView; + + // 点击全屏按钮时,调用的方法 + @Override + public void onShowCustomView(View view, CustomViewCallback callback) { + super.onShowCustomView(view, callback); + //isFullPlayVedio = true; + //如果view 已经存在,则隐藏 + if (mCustomView != null) { + callback.onCustomViewHidden(); + return; + } + + mCustomView = view; + mCustomView.setVisibility(View.VISIBLE); + mCustomViewCallback = callback; + + + } + + // 取消全屏调用的方法 + @Override + public void onHideCustomView() { + super.onHideCustomView(); + + if (mCustomView == null) { + return; + } + mCustomView.setVisibility(View.GONE); + + mCustomView = null; + + try { + mCustomViewCallback.onCustomViewHidden(); + } catch (Exception e) { + } +// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏 + + + } + + @Override + public void onProgressChanged(WebView view, int newProgress) { + + } + + @Override + public void onReceivedTitle(WebView view, String title) { + super.onReceivedTitle(view, title); +// Logger.wtf("我的url" + view.getUrl()); + String url = view.getUrl(); + if (Patterns.WEB_URL.matcher(title).matches()) { + //网址不显示为标题 + + } else { + + //不是网址 + if (!url.contains("api.ejiayou.com/pages/platform/soulList/index.html")) { + + } + } + } + + @Override + public void onGeolocationPermissionsShowPrompt(final String origin, final GeolocationPermissions.Callback callback) { + + + super.onGeolocationPermissionsShowPrompt(origin, callback); + } + + + // For Android 3.0+ + public void openFileChooser(ValueCallback uploadMsg, String acceptType) { + + + } + + // For Android < 3.0 + public void openFileChooser(ValueCallback uploadMsg) { + openFileChooser(uploadMsg, ""); + } + + // For Android > 4.1.1 + public void openFileChooser(ValueCallback uploadMsg, + String acceptType, String capture) { + + openFileChooser(uploadMsg, acceptType); + } + + // For Android > 5.0 + @Override + public boolean onShowFileChooser(WebView webView, + ValueCallback filePathCallback, + FileChooserParams fileChooserParams) { + + return true; + } + + + } + + @SuppressLint("AddJavascriptInterface") + private class MyWebClient extends WebViewClient { + + @SuppressLint("AddJavascriptInterface") + @Override + public boolean shouldOverrideUrlLoading(WebView view, final String url) { + + if (url.startsWith("tel:")) { + startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + return true; + } + if (url.startsWith("bdnetdisk:")) { + return true; + } + + + if (url.contains("tmast://")) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + startActivity(intent); + } catch (Exception e) { + + } + return true; + } + if (url.startsWith("http://ditu.amap.com") || + url.startsWith("https://ditu.amap.com")) { + return true; + } + if (url.contains("oauth.taobao.com/authorize") || url.contains("oauth.m.taobao.com/authorize")) { + +// mainWeb.addJavascriptInterface(new InJavaScriptLocadeUpgralObj(), "java_obj"); + Map exParams = new HashMap<>();//yhhpass参数 +// AlibcTaokeParams alibcTaokeParams = new AlibcTaokeParams("", "", ""); +// alibcTaokeParams.pid = SPUtils.getPrefString(mActivity, Pkey.pid, ""); +// alibcTaokeParams.adzoneid = SPUtils.getPrefString(mActivity, Pkey.APP_adzoneId, ""); +// alibcTaokeParams.extraParams = new HashMap<>(); +// alibcTaokeParams.extraParams.put("taokeAppkey", SPUtils.getPrefString(mActivity, Pkey.APP_alliance_appkey, "")); + AlibcShowParams showParams = new AlibcShowParams(); + showParams.setBackUrl("alisdk://"); + AlibcTrade.openByUrl(WebActivity.this, "", url, mainWeb, new MyBaichuanWebClient(), new MyWebChromeClient(), showParams, + new AlibcTaokeParams("", "", ""), exParams, new AlibcTradeCallback() { + @Override + public void onTradeSuccess(AlibcTradeResult alibcTradeResult) { + + } + + @Override + public void onFailure(int i, String s) { + + } + }); + } + + if (url.contains("tbopen://") || url.contains("tmall://") || url.contains("taobaotravel://")) { + return true; + } + + + if (url.contains("dianping://")) { + return true; + } + if (url.contains("aliim:")) { + return true; + } + if (url.contains("?mod=appapi&act=miandan_course&ctrl=close")) { + finish(); + return true; + } + if (url.contains("vipma.net/quickapp.html?")) { + return true; + } + + + // 如下方案可在非微信内部WebView的H5页面中调出微信支付 + if (url.startsWith("weixin://wap/pay?")) { + try { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + startActivity(intent); + return true; + } catch (Exception e) { + e.printStackTrace(); + + } + return true; + } + if (url.startsWith("weixin://")) { + try { + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setData(Uri.parse(url)); + startActivity(intent); + return true; + } catch (Exception e) { + e.printStackTrace(); + + } + return true; + } + if (url.endsWith("native://wechat")) { + Intent intent = new Intent(); + ComponentName cmp = new ComponentName("com.tencent.mm", "com.tencent.mm.ui.LauncherUI"); + intent.setAction(Intent.ACTION_MAIN); + intent.addCategory(Intent.CATEGORY_LAUNCHER); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.setComponent(cmp); + startActivity(intent); + return true; + } + if (url.contains("navite://save#")) { + + } + //不拦截的话绑定淘宝关系id的时候会因为下面login.m.taobao.com的拦截而唤醒手淘授权之后导致不能切换帐号 +// if (url.contains("client_id") && url.contains("login.m.taobao.com/logout.htm?")) { +// view.loadUrl(url); +// return true; +// } + if (url.contains("client_id")) { + view.loadUrl(url); + return true; + } +// if (url.contains("login.m.taobao.com")) { +// if (!AlibcLogin.getInstance().isLogin()) { +// AlibcLogin.getInstance().showLogin(new AlibcLoginCallback() { +//// @Override +//// public void onSuccess(int i) { +//// } +// +// @Override +// public void onSuccess(int i, String s, String s1) { +// +// } +// +// @Override +// public void onFailure(int i, String s) { +// } +// }); +// } +// return true; +// } + if (url.contains("maliprod.alipay.com") && !url.contains("confirmGoods.do")) { + AlibcLogin.getInstance().showLogin(new AlibcLoginCallback() { + @Override + public void onSuccess(int i, String s, String s1) { + + } + + @Override + public void onFailure(int i, String s) { + + } + }); + } + + if (url.contains("intent://go/ju/webview?")) { + return true; + } +// if (url.contains("s.click.taobao.com")) { +// Logger.wtf(SPUtils.getPrefString(WebActivity.this, Pkey.IS_OPEN_TAOBAO, "")); +// if (SPUtils.getPrefString(WebActivity.this, Pkey.IS_OPEN_TAOBAO, "").equals("shoutao")) { +// if (!Token.isLogin()) { +// if (isFirst2Login) { +// ActivityJump.toLogin(WebActivity.this); +// } +// isFirst2Login = false; +// finish(); +// } else { +// if (isInstallTaoBao(WebActivity.this)) { +// jump2TaoBao(url); +// finish(); +// } else { +// view.loadUrl(url); +// } +// } +// return true; +// } +// } + + +// if (url.contains("kingcard.dgunicom.com") && url.contains("newMsg") && url.contains("fill.html")) { +// getItf(url); +// } + + +// else { +// Logger.wtf("123"); +// mainWeb.loadUrl(url); +// } + return super.shouldOverrideUrlLoading(view, url); + } + + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + // WebLoad.setVisibility(View.GONE); + //开始加载设置为透明 + super.onPageStarted(view, url, favicon); + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + super.onReceivedError(view, request, error); + } + + @Override + public void onPageFinished(WebView view, String url) { + // WebLoad.setVisibility(View.GONE); +// // 获取页面内容 + view.loadUrl("javascript:window.java_obj.showSource(" + + "document.documentElement.innerText);"); + + // 获取解析 + view.loadUrl("javascript:window.java_obj.showDescription(" + + "document.querySelector('meta[name=\"share-description\"]').getAttribute('content')" + + ");"); + // quanyikaText(); + super.onPageFinished(view, url); + } + + //处理 [Android]用WebView访问证书有问题的SSL网页 + //http://blog.sina.com.cn/s/blog_4cd978f90102vrxk.html + @Override + public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { + handler.proceed(); + } + + } + +} + + diff --git a/android/src/main/java/com/wxwx/flutter_alibc/web/WebViewActivity.java b/android/src/main/java/com/wxwx/flutter_alibc/web/WebViewActivity.java new file mode 100644 index 0000000..ba7e930 --- /dev/null +++ b/android/src/main/java/com/wxwx/flutter_alibc/web/WebViewActivity.java @@ -0,0 +1,143 @@ +package com.wxwx.flutter_alibc.web; +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.util.Log; +import android.webkit.DownloadListener; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.Toast; + +import com.alibaba.baichuan.android.trade.AlibcTrade; +import com.alibaba.baichuan.android.trade.callback.AlibcTradeCallback; +import com.alibaba.baichuan.android.trade.model.AlibcShowParams; +import com.alibaba.baichuan.android.trade.model.OpenType; +import com.alibaba.baichuan.trade.biz.applink.adapter.AlibcFailModeType; +import com.alibaba.baichuan.trade.biz.context.AlibcTradeResult; +import com.alibaba.baichuan.trade.biz.core.taoke.AlibcTaokeParams; +import com.alibaba.baichuan.trade.common.utils.AlibcLogger; + +import java.util.HashMap; +import java.util.Map; +import static com.wxwx.flutter_alibc.PluginConstants.*; +import static com.wxwx.flutter_alibc.PluginUtil.*; +import com.wxwx.flutter_alibc.R; +import java.net.URLDecoder; + +public class WebViewActivity extends Activity { + + //这个回调最好是非静态的 多线程下会有问题 但是这样比较快 + private static CallBack callBack; + + public static void setCallBack(CallBack callBack){ + WebViewActivity.callBack = callBack; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.webview_activity); + Intent intent = getIntent(); + if (intent != null) { + final String url = intent.getStringExtra("url"); + HashMap arguments = (HashMap) intent.getSerializableExtra("arguments"); + WebView webView = findViewById(R.id.webview); + //启用支持JavaScript + webView.getSettings().setJavaScriptEnabled(true); + //启用支持DOM Storage + webView.getSettings().setDomStorageEnabled(true); + openByUrl(url, webView, arguments); + } + + } + + private String getAccessToken(String url) { + try { + int startIndex = url.indexOf("access_token"); + String subStr = url.substring(startIndex); + String tempUrl = URLDecoder.decode(subStr, "UTF-8"); + int endIndex = tempUrl.indexOf("&"); + subStr = tempUrl.substring(0, endIndex); + startIndex = subStr.indexOf("="); + subStr = subStr.substring(startIndex+1); + return subStr; + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + + private void openByUrl(String url, WebView webView, HashMap argument) { + + AlibcShowParams showParams = new AlibcShowParams(); + AlibcTaokeParams taokeParams = new AlibcTaokeParams("", "", ""); + showParams.setBackUrl(String.valueOf(argument.get(key_BackUrl))); + + if (argument.get(key_OpenType) != null){ + showParams.setOpenType(getOpenType(String.valueOf(argument.get(key_OpenType)))); + } + if (argument.get(key_ClientType) != null){ + showParams.setClientType(getClientType(String.valueOf(argument.get(key_ClientType)))); + } + if (argument.get("taokeParams") != null){ + taokeParams = getTaokeParams((HashMap)argument.get("taokeParams")); + } + if ("false".equals(argument.get("isNeedCustomNativeFailMode"))){ + showParams.setNativeOpenFailedMode(AlibcFailModeType.AlibcNativeFailModeNONE); + }else if (argument.get(key_NativeFailMode) != null){ + showParams.setNativeOpenFailedMode(getFailModeType(String.valueOf(argument.get(key_NativeFailMode)))); + } + + Map trackParams = new HashMap<>(); + + WebViewClient client = new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return false; + } + + @Override + public void onLoadResource(WebView view, String url) { + super.onLoadResource(view, url); + //如果包含 + if (url.contains("access_token")){ + String accessToken = getAccessToken(url); + if (callBack != null){ + callBack.success(accessToken); + callBack = null; + } + finish(); + } + } + }; + + AlibcTrade.openByUrl(WebViewActivity.this, "", url, webView, + client, new WebChromeClient(), + showParams, taokeParams, trackParams, new AlibcTradeCallback() { + @Override + public void onTradeSuccess(AlibcTradeResult tradeResult) {}//不会回调 + @Override + public void onFailure(int code, String msg) {}//不会回调 + }); + } + + @Override + protected void onDestroy() { + if (callBack != null){ + callBack.failed("授权失败"); + } + super.onDestroy(); + } + + + + public interface CallBack{ + void success(String accessToken); + + void failed(String errorMsg); + } + +} diff --git a/android/src/main/res/layout/activity_web_bc.xml b/android/src/main/res/layout/activity_web_bc.xml new file mode 100644 index 0000000..db1c55b --- /dev/null +++ b/android/src/main/res/layout/activity_web_bc.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/android/src/main/res/layout/webview_activity.xml b/android/src/main/res/layout/webview_activity.xml new file mode 100644 index 0000000..2ffd027 --- /dev/null +++ b/android/src/main/res/layout/webview_activity.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/example/.flutter-plugins-dependencies b/example/.flutter-plugins-dependencies new file mode 100644 index 0000000..1c2143d --- /dev/null +++ b/example/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"_info":"// This is a generated file; do not edit or check into version control.","dependencyGraph":[{"name":"flutter_alibc","dependencies":[]}]} \ No newline at end of file diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..ac4a906 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,72 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/example/.metadata b/example/.metadata new file mode 100644 index 0000000..b9689b4 --- /dev/null +++ b/example/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: e4ebcdf6f4facee5779c38a04d91d08dc58ea7a4 + channel: beta + +project_type: app diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..431503c --- /dev/null +++ b/example/README.md @@ -0,0 +1,16 @@ +# flutter_alibc_example + +Demonstrates how to use the flutter_alibc plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 0000000..543a2ad --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,77 @@ +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" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "wxwx.com.flutter_alibc_example" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + signingConfigs { + debug { + storeFile file("release.keystore") + storePassword 'cater123' + keyAlias 'release.keystore' + keyPassword 'cater123' + } + release { + storeFile file("release.keystore") + storePassword 'cater123' + keyAlias 'release.keystore' + keyPassword 'cater123' + } + } + + 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.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test:runner:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' + implementation 'com.android.support:support-v4:28.0.0' +} diff --git a/example/android/app/release.keystore b/example/android/app/release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..73433446e9d3aa99f9c19378b5ffc15411e68f4c GIT binary patch literal 2184 zcmb`H`8U*y8^`A}GbY9!#t<ECr5{c2VWv@HG+EAv@IYIAt*?N3qT13QWpWh0Uf9`00=?gRQT-u%JHXl zS!#>=XW7=91GdFSJ~X!=V?`d+;MQ!;;@4Qd9>Vh=!?`<3&C}|!eY1u^~Nv?ef!E$N$D0uZaUay9&hC{;u$^={`_8%>8{KAaVNS{t!_nMMP zdMI^~b1L0*!biB}BD|O7KKO3a*?2?lj`seE#vIyW{9Qh2Z8)doE2-sE)SrS`3Oo@( zRH8Gw{?4F{-EA+EXgQ3M-+N#;JvPRgoify6+8G3cE@~{rU`#81leV~ z?l~NzRC(%IVqr*6b2+*>)#_L<*WxcCC9ADoJ<)2OX4U}H@f;cVUs?I-2mmix-nzlA2K z{~-CE>1t_*guFi9_&IH;Y|H}FCMIU5@oLB*b?$Whyu4V6t*TlUYS_MGuqPGrelV>G z(XYh_H5%2g&u#&vJp1L6ilQT&Jde(KnVOlReQl@67>tftZk zu8#`zjRUhB4EW0vUY0+fqq+=7c!djJUcKJ?CWgD>-+rfaZruL4ukgX*d!4GU*+Gw* zesgOt)^KcAOu=TA3qQC;KfBUnFvGFuW634AKAeZ9EJ?Yq`*kWFtIwg2_}c@4l`C1P zME>JxxqaD*-k8mqLwy-d?od6Oz`AP;_FM>lWsaPn(sJ4(^Gp2iifC7-P6i>&Ry5;) zrk%*~GsndNg7{Q<-UZH!YIgV39Ej@c@q=&Fdf@IGj(aIxYV^i4<5Y>{EBTMLCaZO5 zr857wWfE^Jy7YUp zPhZW;mVyManW+0c0ZY-y8;nnoNDF(axz7XZOc!D^i{08ZJ~?x^cL2lAVC6PT#`&iJ zA`?IJxHs0R%Q5PXw9D$Oviei>L$KY-oz~$uW|L0Dl}Zj*+HJ~ptL82EYCB%K?Q40J zR+478r}~$-`~)SrC*L6YIfX#q@j_Fm034mfhFu`g&!vy{#0Bh;IhOXpTqa%He|%qchNxT0AeduY6aKzYe;un9fvg zi*-V?WLrgf@riRU1m_lazuqiT$pSxzceOpV>!)tMRWW;u(o%R{k!y3Jr$4=5be~v5 z?mE4k;WAdWT7FJ1lcow=;68QhD77rg{&_^8$SpQO>m^FHyE`->Ns?wrue}u-$&YIa z{>exocYPz!6as-6fm9e4q(T+)VNd`Hg)3*=hJ)e=5uJFu_;qmr5EX)ec331RjDVel zBV+)p|FiHm-m#65+gNlP!?qYyl^4gFf+jc<5C`InupVeh9QMBgi2tAPFV3O@YTFmt z%6S+Skc5C#012f60HlC7@`yvX*2ug=;52s)3;2$+PVMa0Vd9YrH8=)U>D{S|Tt2`e7G5eR`8CN@XVa>$ zUk|pzRH4TEiZ83o;q=3$LsPHjgQefPul?u?xQ@a9Kp4p{4cg?Hn(%m&lL>Zbsl4=4 zy1Dfe^Zq)>MS7%4pl0jEUR@&A{BQ@|nl;;1>)AExHtGs;{ExPw!K9iYw>txxrf3J*A#GR>QG zmEDmfJ4MKn(5Oq-pzab)1zZ8 zuQYdIJXV-mrZ>f@re^mdQZe|YGvT?EKkhU2Y?V_QI64>eEp8a!8$NlH8u#Jmvb-tt X%Z^=$*z8iuYV9VA@%!F`Jo*0si`c@h literal 0 HcmV?d00001 diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..a2dcf18 --- /dev/null +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..46874e7 --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/wxwx/com/flutter_alibc_example/MainActivity.java b/example/android/app/src/main/java/wxwx/com/flutter_alibc_example/MainActivity.java new file mode 100644 index 0000000..94ed98d --- /dev/null +++ b/example/android/app/src/main/java/wxwx/com/flutter_alibc_example/MainActivity.java @@ -0,0 +1,13 @@ +package wxwx.com.flutter_alibc_example; + +import android.os.Bundle; +import io.flutter.app.FlutterActivity; +import io.flutter.plugins.GeneratedPluginRegistrant; + +public class MainActivity extends FlutterActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + GeneratedPluginRegistrant.registerWith(this); + } +} 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/drawable/yw_1222_baichuan.jpg b/example/android/app/src/main/res/drawable/yw_1222_baichuan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0f830416f13510788331ef4fd39769b2b7eacc70 GIT binary patch literal 87936 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 WfU|VP5D~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/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..a2dcf18 --- /dev/null +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 0000000..bb8a303 --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + 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..70030c6 --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1,5 @@ +org.gradle.jvmargs=-Xmx1536M + +#android.useAndroidX=false +#android.enableJetifier=true +android.enableR8=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..296b146 --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip 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/Flutter/.last_build_id b/example/ios/Flutter/.last_build_id new file mode 100644 index 0000000..ae93b98 --- /dev/null +++ b/example/ios/Flutter/.last_build_id @@ -0,0 +1 @@ +23a60060d9e5b69a910da030e8709ee7 \ No newline at end of file diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..6b4c0f7 --- /dev/null +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + 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..5ca3041 --- /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! +# + +Pod::Spec.new do |s| + s.name = 'Flutter' + s.version = '1.0.0' + s.summary = 'High-performance, high-fidelity mobile apps.' + s.description = <<-DESC +Flutter provides an easy and productive way to build and deploy high-performance mobile apps for Android and iOS. + DESC + 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 = '8.0' + s.vendored_frameworks = 'Flutter.framework' +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/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..0fea49d --- /dev/null +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,10 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/fnuser02/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/fnuser02/Documents/fnuoProject/flutter_open/flutter_alibc/example" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build/ios" +export "FLUTTER_FRAMEWORK_DIR=/Users/fnuser02/flutter/bin/cache/artifacts/engine/ios" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" diff --git a/example/ios/Podfile b/example/ios/Podfile new file mode 100644 index 0000000..9dd00a4 --- /dev/null +++ b/example/ios/Podfile @@ -0,0 +1,73 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '9.0' +source 'https://cdn.cocoapods.org/' +source 'http://repo.baichuan-ios.taobao.com/baichuanSDK/AliBCSpecs.git' +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def parse_KV_file(file, separator='=') + file_abs_path = File.expand_path(file) + if !File.exists? file_abs_path + return []; + end + pods_ary = [] + skip_line_start_symbols = ["#", "/"] + File.foreach(file_abs_path) { |line| + next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } + plugin = line.split(pattern=separator) + if plugin.length == 2 + podname = plugin[0].strip() + path = plugin[1].strip() + podpath = File.expand_path("#{path}", file_abs_path) + pods_ary.push({:name => podname, :path => podpath}); + else + puts "Invalid plugin specification: #{line}" + end + } + return pods_ary +end + +target 'Runner' do + # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock + # referring to absolute paths on developers' machines. + system('rm -rf .symlinks') + system('mkdir -p .symlinks/plugins') + + # Flutter Pods + generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') + if generated_xcode_build_settings.empty? + puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first." + end + generated_xcode_build_settings.map { |p| + if p[:name] == 'FLUTTER_FRAMEWORK_DIR' + symlink = File.join('.symlinks', 'flutter') + File.symlink(File.dirname(p[:path]), symlink) + pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) + end + } + + # Plugin Pods + plugin_pods = parse_KV_file('../.flutter-plugins') + plugin_pods.map { |p| + symlink = File.join('.symlinks', 'plugins', p[:name]) + File.symlink(p[:path], symlink) + pod p[:name], :path => File.join(symlink, 'ios') + } +end + +# Prevent Cocoapods from embedding a second Flutter framework and causing an error with the new Xcode build system. +install! 'cocoapods', :disable_input_output_paths => true + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock new file mode 100644 index 0000000..6964737 --- /dev/null +++ b/example/ios/Podfile.lock @@ -0,0 +1,64 @@ +PODS: + - AliAuthSDK (1.1.0.41-bc) + - AlibcTradeSDK (4.0.1.6) + - AliLinkPartnerSDK (4.0.0.24) + - BCUserTrack (5.2.0.18-appkeys): + - UTDID + - Flutter (1.0.0) + - flutter_alibc (0.0.1): + - AliAuthSDK (= 1.1.0.41-bc) + - AlibcTradeSDK (= 4.0.1.6) + - AliLinkPartnerSDK (= 4.0.0.24) + - BCUserTrack (= 5.2.0.18-appkeys) + - Flutter + - mtopSDK (= 3.0.0.3-BC) + - securityGuard (= 5.4.191) + - UTDID (= 1.1.0.16) + - WindVane (= 8.5.0.46-bc11) + - mtopSDK (3.0.0.3-BC) + - securityGuard (5.4.191) + - UTDID (1.1.0.16) + - WindVane (8.5.0.46-bc11): + - WindVane/Basic (= 8.5.0.46-bc11) + - WindVane/Core (= 8.5.0.46-bc11) + - WindVane/WindVane (= 8.5.0.46-bc11) + - WindVane/Basic (8.5.0.46-bc11) + - WindVane/Core (8.5.0.46-bc11) + - WindVane/WindVane (8.5.0.46-bc11) + +DEPENDENCIES: + - Flutter (from `.symlinks/flutter/ios`) + - flutter_alibc (from `.symlinks/plugins/flutter_alibc/ios`) + +SPEC REPOS: + http://repo.baichuan-ios.taobao.com/baichuanSDK/AliBCSpecs.git: + - AliAuthSDK + - AlibcTradeSDK + - AliLinkPartnerSDK + - BCUserTrack + - mtopSDK + - securityGuard + - UTDID + - WindVane + +EXTERNAL SOURCES: + Flutter: + :path: ".symlinks/flutter/ios" + flutter_alibc: + :path: ".symlinks/plugins/flutter_alibc/ios" + +SPEC CHECKSUMS: + AliAuthSDK: 7018e8f3c8be3382e60f69d3b517c7de34c351e0 + AlibcTradeSDK: 9a3e7af6cd648dd1f85684e82694c213fe48dad2 + AliLinkPartnerSDK: c5778cdfdcee7bfe342238d39a77766184d36a46 + BCUserTrack: 49251c6fb7c65cbbc221a492bbd3f3e142f1fb0f + Flutter: 0e3d915762c693b495b44d77113d4970485de6ec + flutter_alibc: 0e2a29e7c1de759672d87a260051240d209964b9 + mtopSDK: d6fdf81730342a69be920b576541c7bb81a683d5 + securityGuard: 9c04c44a3b663f36e15064042abfc107fa07133c + UTDID: c28855683c5ea2e77e597cb14609328f7d470d6e + WindVane: 56e096abae757397ccd3accb66a959f3ffcbf949 + +PODFILE CHECKSUM: f65a7534e3030cd63dfdaf5ac173943dc695fbe8 + +COCOAPODS: 1.9.1 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..eab1d79 --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,643 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1024AFA423235967008B147B /* mtopsdk_configuration.plist in Resources */ = {isa = PBXBuildFile; fileRef = 1024AFA323235967008B147B /* mtopsdk_configuration.plist */; }; + 10AF2D312444309A000BBE1D /* yw_1222_baichuan.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 10AF2D302444309A000BBE1D /* yw_1222_baichuan.jpg */; }; + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 29D91E0DDA39BD518B58A83A /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 13B949E8DC4A5D995FB9E354 /* libPods-Runner.a */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 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 = ( + 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, + 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1024AF99232357F9008B147B /* CoreMotion.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMotion.framework; path = System/Library/Frameworks/CoreMotion.framework; sourceTree = SDKROOT; }; + 1024AF9B23235804008B147B /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; }; + 1024AF9D2323580E008B147B /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 1024AF9F23235865008B147B /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; + 1024AFA123235871008B147B /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 1024AFA323235967008B147B /* mtopsdk_configuration.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = mtopsdk_configuration.plist; sourceTree = ""; }; + 10AF2D302444309A000BBE1D /* yw_1222_baichuan.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = yw_1222_baichuan.jpg; sourceTree = SOURCE_ROOT; }; + 13B949E8DC4A5D995FB9E354 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; 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 = ""; }; + 82A4098269B3611D08C04506 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; 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 = ""; }; + 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; 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 = ""; }; + B764AB2E21DD52B43681DD59 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + C5A8E9F74491C83DA9777540 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, + 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, + 29D91E0DDA39BD518B58A83A /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 46E2167EE2EBBCA0A60F4CB6 /* Pods */ = { + isa = PBXGroup; + children = ( + C5A8E9F74491C83DA9777540 /* Pods-Runner.debug.xcconfig */, + 82A4098269B3611D08C04506 /* Pods-Runner.release.xcconfig */, + B764AB2E21DD52B43681DD59 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B80C3931E831B6300D905FE /* App.framework */, + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEBA1CF902C7004384FC /* Flutter.framework */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 46E2167EE2EBBCA0A60F4CB6 /* Pods */, + 9B3805AA678F1DA4B139770E /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 10AF2D302444309A000BBE1D /* yw_1222_baichuan.jpg */, + 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 */, + 1024AFA323235967008B147B /* mtopsdk_configuration.plist */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 9B3805AA678F1DA4B139770E /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1024AFA123235871008B147B /* libz.tbd */, + 1024AF9F23235865008B147B /* libc++.tbd */, + 1024AF9D2323580E008B147B /* libsqlite3.tbd */, + 1024AF9B23235804008B147B /* CoreTelephony.framework */, + 1024AF99232357F9008B147B /* CoreMotion.framework */, + 13B949E8DC4A5D995FB9E354 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 7518D7A0816C434208302B2B /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 0363A6C3197D5F1231140936 /* [CP] Embed Pods Frameworks */, + 2BA3A8E307EB2EEF52011C35 /* [CP] Copy Pods Resources */, + ); + 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 = 1020; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 68KMAT999T; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + 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 */, + 1024AFA423235967008B147B /* mtopsdk_configuration.plist in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 10AF2D312444309A000BBE1D /* yw_1222_baichuan.jpg 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 */ + 0363A6C3197D5F1231140936 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 2BA3A8E307EB2EEF52011C35 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 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\" thin"; + }; + 7518D7A0816C434208302B2B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-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 */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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 = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 68KMAT999T; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + Flutter, + "-lstdc++", + "-Objc", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.aliTradeSDK.demoxxxxx; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "com.csshotel.revenuereport-appstore"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + 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_DEPRECATED_OBJC_IMPLEMENTATIONS = 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_IMPLICIT_RETAIN_SELF = 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_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 68KMAT999T; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + Flutter, + "-lstdc++", + "-Objc", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.aliTradeSDK.demoxxxxx; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "com.csshotel.revenuereport-dev"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_STYLE = Manual; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = 68KMAT999T; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-framework", + Flutter, + "-lstdc++", + "-Objc", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.aliTradeSDK.demoxxxxx; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = "com.csshotel.revenuereport-adhoc"; + 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 */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + 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..a28140c --- /dev/null +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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..ed002fa --- /dev/null +++ b/example/ios/Runner/AppDelegate.m @@ -0,0 +1,30 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application +didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; +// 获取本身vc +// // Override point for customization after application launch. +// self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds]; +// // +// UINavigationController* root = [[UINavigationController alloc]initWithRootViewController:vc]; +// self.window.backgroundColor = [UIColor whiteColor]; +// self.window.rootViewController = root; +// [self.window makeKeyAndVisible]; +// + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + + +-(FlutterViewController *)getFlutterViewCtrl{ + UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; + if ([viewController isKindOfClass:[FlutterViewController class]]) { + return (FlutterViewController*)viewController; + } + return nil; +} +@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..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 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 zcmds$`#;kQ7{|XelZftyR5~xW7?MLxS4^|Hw3&P7^y)@A9Fj{Xm1~_CIV^XZ%SLBn zA;!r`GqGHg=7>xrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|j9P)^fDmF(5(5$|?Cx}DKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q z?YG}tx;sY@GzMmsY`7r$P+F_YLz)(e}% zyakqFB<6|x9R#TdoP{R$>o7y(-`$$p0NxJ6?2B8tH)4^yF(WhqGZlM3=9Ibs$%U1w zWzcss*_c0=v_+^bfb`kBFsI`d;ElwiU%frgRB%qBjn@!0U2zZehBn|{%uNIKBA7n= zzE`nnwTP85{g;8AkYxA68>#muXa!G>xH22D1I*SiD~7C?7Za+9y7j1SHiuSkKK*^O zsZ==KO(Ua#?YUpXl{ViynyT#Hzk=}5X$e04O@fsMQjb}EMuPWFO0e&8(2N(29$@Vd zn1h8Yd>6z(*p^E{c(L0Lg=wVdupg!z@WG;E0k|4a%s7Up5C0c)55XVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~tSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Y zu$JOl0b83zu$JMvy<#oH^Wl>aWL*?aDwnS0iEAwC?DK@aT)GHRLhnz2WCvf3Ba;o=aY7 z2{Asu5MEjGOY4O#Ggz@@J;q*0`kd2n8I3BeNuMmYZf{}pg=jTdTCrIIYuW~luKecn z+E-pHY%ohj@uS0%^ z&(OxwPFPD$+#~`H?fMvi9geVLci(`K?Kj|w{rZ9JgthFHV+=6vMbK~0)Ea<&WY-NC zy-PnZft_k2tfeQ*SuC=nUj4H%SQ&Y$gbH4#2sT0cU0SdFs=*W*4hKGpuR1{)mV;Qf5pw4? zfiQgy0w3fC*w&Bj#{&=7033qFR*<*61B4f9K%CQvxEn&bsWJ{&winp;FP!KBj=(P6 z4Z_n4L7cS;ao2)ax?Tm|I1pH|uLpDSRVghkA_UtFFuZ0b2#>!8;>-_0ELjQSD-DRd z4im;599VHDZYtnWZGAB25W-e(2VrzEh|etsv2YoP#VbIZ{aFkwPrzJ#JvCvA*mXS& z`}Q^v9(W4GiSs}#s7BaN!WA2bniM$0J(#;MR>uIJ^uvgD3GS^%*ikdW6-!VFUU?JV zZc2)4cMsX@j z5HQ^e3BUzOdm}yC-xA%SY``k$rbfk z;CHqifhU*jfGM@DkYCecD9vl*qr58l6x<8URB=&%{!Cu3RO*MrKZ4VO}V6R0a zZw3Eg^0iKWM1dcTYZ0>N899=r6?+adUiBKPciJw}L$=1f4cs^bio&cr9baLF>6#BM z(F}EXe-`F=f_@`A7+Q&|QaZ??Txp_dB#lg!NH=t3$G8&06MFhwR=Iu*Im0s_b2B@| znW>X}sy~m#EW)&6E&!*0%}8UAS)wjt+A(io#wGI@Z2S+Ms1Cxl%YVE800007ip7{`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-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 zcmVjJBgitF5mAp-i>4+KS_oR{|13AP->1TD4=w)g|)JHOx|a2Wk1Va z!k)vP$UcQ#mdj%wNQoaJ!w>jv_6&JPyutpQps?s5dmDQ>`%?Bvj>o<%kYG!YW6H-z zu`g$@mp`;qDR!51QaS}|ZToSuAGcJ7$2HF0z`ln4t!#Yg46>;vGG9N9{V@9z#}6v* zfP?}r6b{*-C*)(S>NECI_E~{QYzN5SXRmVnP<=gzP+_Sp(Aza_hKlZ{C1D&l*(7IKXxQC1Z9#6wx}YrGcn~g%;icdw>T0Rf^w0{ z$_wn1J+C0@!jCV<%Go5LA45e{5gY9PvZp8uM$=1}XDI+9m7!A95L>q>>oe0$nC->i zeexUIvq%Uk<-$>DiDb?!In)lAmtuMWxvWlk`2>4lNuhSsjAf2*2tjT`y;@d}($o)S zn(+W&hJ1p0xy@oxP%AM15->wPLp{H!k)BdBD$toBpJh+crWdsNV)qsHaqLg2_s|Ih z`8E9z{E3sA!}5aKu?T!#enD(wLw?IT?k-yWVHZ8Akz4k5(TZJN^zZgm&zM28sfTD2BYJ|Fde3Xzh;;S` z=GXTnY4Xc)8nYoz6&vF;P7{xRF-{|2Xs5>a5)@BrnQ}I(_x7Cgpx#5&Td^4Q9_FnQ zX5so*;#8-J8#c$OlA&JyPp$LKUhC~-e~Ij!L%uSMu!-VZG7Hx-L{m2DVR2i=GR(_% zCVD!4N`I)&Q5S`?P&fQZ=4#Dgt_v2-DzkT}K(9gF0L(owe-Id$Rc2qZVLqI_M_DyO z9@LC#U28_LU{;wGZ&))}0R2P4MhajKCd^K#D+JJ&JIXZ_p#@+7J9A&P<0kdRujtQ_ zOy>3=C$kgi6$0pW06KaLz!21oOryKM3ZUOWqppndxfH}QpgjEJ`j7Tzn5bk6K&@RA?vl##y z$?V~1E(!wB5rH`>3nc&@)|#<1dN2cMzzm=PGhQ|Yppne(C-Vlt450IXc`J4R0W@I7 zd1e5uW6juvO%ni(WX7BsKx3MLngO7rHO;^R5I~0^nE^9^E_eYLgiR9&KnJ)pBbfno zSVnW$0R+&6jOOsZ82}nJ126+c|%svPo;TeUku<2G7%?$oft zyaO;tVo}(W)VsTUhq^XmFi#2z%-W9a{7mXn{uzivYQ_d6b7VJG{77naW(vHt-uhnY zVN#d!JTqVh(7r-lhtXVU6o})aZbDt_;&wJVGl2FKYFBFpU-#9U)z#(A%=IVnqytR$SY-sO( z($oNE09{D^@OuYPz&w~?9>Fl5`g9u&ecFGhqX=^#fmR=we0CJw+5xna*@oHnkahk+ z9aWeE3v|An+O5%?4fA&$Fgu~H_YmqR!yIU!bFCk4!#pAj%(lI(A5n)n@Id#M)O9Yx zJU9oKy{sRAIV3=5>(s8n{8ryJ!;ho}%pn6hZKTKbqk=&m=f*UnK$zW3YQP*)pw$O* zIfLA^!-bmBl6%d_n$#tP8Zd_(XdA*z*WH|E_yILwjtI~;jK#v-6jMl^?<%Y%`gvpwv&cFb$||^v4D&V=aNy?NGo620jL3VZnA%s zH~I|qPzB~e(;p;b^gJr7Ure#7?8%F0m4vzzPy^^(q4q1OdthF}Fi*RmVZN1OwTsAP zn9CZP`FazX3^kG(KodIZ=Kty8DLTy--UKfa1$6XugS zk%6v$Kmxt6U!YMx0JQ)0qX*{CXwZZk$vEROidEc7=J-1;peNat!vS<3P-FT5po>iE z!l3R+<`#x|+_hw!HjQGV=8!q|76y8L7N8gP3$%0kfush|u0uU^?dKBaeRSBUpOZ0c z62;D&Mdn2}N}xHRFTRI?zRv=>=AjHgH}`2k4WK=#AHB)UFrR-J87GgX*x5fL^W2#d z=(%K8-oZfMO=i{aWRDg=FX}UubM4eotRDcn;OR#{3q=*?3mE3_oJ-~prjhxh%PgQT zyn)Qozaq0@o&|LEgS{Ind4Swsr;b`u185hZPOBLL<`d2%^Yp1?oL)=jnLi;Zo0ZDliTtQ^b5SmfIMe{T==zZkbvn$KTQGlbG8w}s@M3TZnde;1Am46P3juKb zl9GU&3F=q`>j!`?SyH#r@O59%@aMX^rx}Nxe<>NqpUp5=lX1ojGDIR*-D^SDuvCKF z?3$xG(gVUsBERef_YjPFl^rU9EtD{pt z0CXwpN7BN3!8>hajGaTVk-wl=9rxmfWtIhC{mheHgStLi^+Nz12a?4r(fz)?3A%at zMlvQmL<2-R)-@G1wJ0^zQK%mR=r4d{Y3fHp){nWXUL#|CqXl(+v+qDh>FkF9`eWrW zfr^D%LNfOcTNvtx0JXR35J0~Jpi2#P3Q&80w+nqNfc}&G0A~*)lGHKv=^FE+b(37|)zL;KLF>oiGfb(?&1 zV3XRu!Sw>@quKiab%g6jun#oZ%!>V#A%+lNc?q>6+VvyAn=kf_6z^(TZUa4Eelh{{ zqFX-#dY(EV@7l$NE&kv9u9BR8&Ojd#ZGJ6l8_BW}^r?DIS_rU2(XaGOK z225E@kH5Opf+CgD^{y29jD4gHbGf{1MD6ggQ&%>UG4WyPh5q_tb`{@_34B?xfSO*| zZv8!)q;^o-bz`MuxXk*G^}(6)ACb@=Lfs`Hxoh>`Y0NE8QRQ!*p|SH@{r8=%RKd4p z+#Ty^-0kb=-H-O`nAA3_6>2z(D=~Tbs(n8LHxD0`R0_ATFqp-SdY3(bZ3;VUM?J=O zKCNsxsgt@|&nKMC=*+ZqmLHhX1KHbAJs{nGVMs6~TiF%Q)P@>!koa$%oS zjXa=!5>P`vC-a}ln!uH1ooeI&v?=?v7?1n~P(wZ~0>xWxd_Aw;+}9#eULM7M8&E?Y zC-ZLhi3RoM92SXUb-5i-Lmt5_rfjE{6y^+24`y$1lywLyHO!)Boa7438K4#iLe?rh z2O~YGSgFUBH?og*6=r9rme=peP~ah`(8Zt7V)j5!V0KPFf_mebo3z95U8(up$-+EA^9dTRLq>Yl)YMBuch9%=e5B`Vnb>o zt03=kq;k2TgGe4|lGne&zJa~h(UGutjP_zr?a7~#b)@15XNA>Dj(m=gg2Q5V4-$)D|Q9}R#002ovPDHLkV1o7DH3k3x 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..0a0c76b --- /dev/null +++ b/example/ios/Runner/Info.plist @@ -0,0 +1,67 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + flutter_alibc_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLSchemes + + tbopen27827054 + tbopen27563108 + + + + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSApplicationQueriesSchemes + + tbopen + tmall + + LSRequiresIPhoneOS + + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + + 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/mtopsdk_configuration.plist b/example/ios/Runner/mtopsdk_configuration.plist new file mode 100644 index 0000000..c1bc501 --- /dev/null +++ b/example/ios/Runner/mtopsdk_configuration.plist @@ -0,0 +1,8 @@ + + + + + DefaultID + OPEN + + diff --git a/example/ios/yw_1222_baichuan.jpg b/example/ios/yw_1222_baichuan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce73d0cf31aa52845867fc21eac90912b016f6eb GIT binary patch literal 87768 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
(|Hb%E@@D%*4G*!8C`%2mXmw56Y6%Wr38Ww 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 +e9~#=6+T|bS7+~%>Z^UJ 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 J7zO|U001`hoZtWe literal 0 HcmV?d00001 diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..c9cc764 --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,161 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_alibc/alibc_const_key.dart'; +import 'package:flutter_alibc/flutter_alibc.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + String _platformVersion = 'Unknown'; + + @override + void initState() { + super.initState(); + // FlutterAlibc.responseFromShare.listen((data) { + // debugPrint(data); + // }); + initPlatformState(); + } + + // Platform messages are asynchronous, so we initialize in an async method. + Future initPlatformState() async { + String platformVersion; + // Platform messages may fail, so we use a try/catch PlatformException. + try { + platformVersion = await FlutterAlibc.platformVersion; + } on PlatformException { + platformVersion = 'Failed to get platform version.'; + } + + // 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(() { + _platformVersion = platformVersion; + }); + + /* try { + var initRes = await FlutterAlibc.initAlibc(); + } on Exception {}*/ + + try { + // var waite3s = await FlutterAlibc.openItemDetail(itemID: "12345"); + var result = await FlutterAlibc.initAlibc(); + print(result); + } on Exception {} + } + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar( + title: const Text('Plugin example app'), + ), + body: Center( + child: Column( + children: [ + FlatButton( + child: Text("初始化阿里百川"), + onPressed: () async { + try { + // var waite3s = await FlutterAlibc.openItemDetail(itemID: "12345"); + // 如果什么都不给 + var result = await FlutterAlibc.initAlibc(); + print(result); + } on Exception {} + }, + ), + FlatButton( + child: Text("登录淘宝"), + onPressed: () async { + var result = await FlutterAlibc.loginTaoBao(); + print( + "登录淘宝 ${result.data.nick} ${result.data.topAccessToken}"); + }, + ), + FlatButton( + child: Text("登出淘宝"), + onPressed: () { + FlutterAlibc.loginOut(); + }, + ), + FlatButton( + child: Text("淘客登录,二次授权"), + onPressed: () async { + var result = await FlutterAlibc.taoKeLogin( + url: + "https://oauth.taobao.com/authorize?response_type=token&client_id=27646673&state=1212&view=wap", + openType: AlibcOpenType.AlibcOpenTypeNative, + isNeedCustomNativeFailMode: true, + nativeFailMode: + AlibcNativeFailMode.AlibcNativeFailModeJumpH5); + print("access token ${result["accessToken"]}"); + }, + ), + FlatButton( + child: Text("唤起淘宝,openByUrl方式"), + onPressed: () async { + var result = await FlutterAlibc.openByUrl( + url: + "https://uland.taobao.com/coupon/edetail?e=0I2EBL%2BTWswGQASttHIRqRXxIesJCFV0jSsDEwaP11URqogtr65NL3IIxArmwXZQtYdj3OrQBBwJkllDQLUC%2B79fwBwwUiqlvyfAqbG%2BQWkG6QT52O7rmXYefz8NXcoYTJnbK5InWzlFfSAQOJJoy8NEaV3mm%2FQSzjZt5gElMznom9kMiklcP0KJ92VgfYGd&traceId=0b0d82cf15669814548736276e3d95&union_lens=lensId:0b0b6466_0c0d_16cd75f7c39_528f&xId=6MboRwsAi2s8Glbqt3lJLAwSlyrPyBLCZ01KOk6QzKCNhw8C6RjXgA1bNbZdKzp30gOqd1J5j1k7ei7HYId1QZ&ut_sk=1.utdid_null_1566981455011.TaoPassword-Outside.taoketop&sp_tk=77+lTU5nMllrdHRqSVLvv6U=", + //backUrl: "tbopen27822502:https://h5.m.taobao.com", + isNeedCustomNativeFailMode: true, + nativeFailMode: + AlibcNativeFailMode.AlibcNativeFailModeJumpH5); + print(result); + }, + ), + FlatButton( + child: Text("唤起淘宝,openItemDetail方式"), + onPressed: () async { + var result = await FlutterAlibc.openItemDetail( + itemID: "575688730394", + schemeType: AlibcSchemeType.AlibcSchemeTaoBao, + isNeedCustomNativeFailMode: true, + nativeFailMode: + AlibcNativeFailMode.AlibcNativeFailModeJumpH5); + print(result); + }, + ), + FlatButton( + child: Text("打开店铺,openShop方式"), + onPressed: () async { + var result = await FlutterAlibc.openShop(shopId: "71955116"); + print(result); + }, + ), + FlatButton( + child: Text("打开购物车,openCart方式"), + onPressed: () async { + var result = await FlutterAlibc.openCart(); + print(result); + }, + ), + FlatButton( + child: Text("允许打点"), + onPressed: () { + FlutterAlibc.syncForTaoke(true); + }, + ), + FlatButton( + child: Text("使用native Alipay"), + onPressed: () { + FlutterAlibc.useAlipayNative(true); + }, + ), + ], + )), + ), + ); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 0000000..a517f73 --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,202 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.11" + args: + dependency: transitive + description: + name: args + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.5.2" + async: + dependency: transitive + description: + name: async + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.5" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.3" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.1.2" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_alibc: + dependency: "direct dev" + description: + path: ".." + relative: true + source: path + version: "0.0.15" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.4" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.12.6" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.8" + path: + dependency: transitive + description: + name: path + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.6.4" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.8.0+1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.5" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.11" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.8" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.5.0" +sdks: + dart: ">=2.4.0 <3.0.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..28dbe07 --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,63 @@ +name: flutter_alibc_example +description: Demonstrates how to use the flutter_alibc plugin. +publish_to: 'none' + +environment: + sdk: ">=2.1.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: + flutter_test: + sdk: flutter + + flutter_alibc: + path: ../ + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/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.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/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.dev/custom-fonts/#from-packages diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart new file mode 100644 index 0000000..2c321b5 --- /dev/null +++ b/example/test/widget_test.dart @@ -0,0 +1,27 @@ +// 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:flutter_alibc_example/main.dart'; + +void main() { + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => widget is Text && + widget.data.startsWith('Running on:'), + ), + findsOneWidget, + ); + }); +} diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 0000000..710ec6c --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,36 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ +GeneratedPluginRegistrant.h +GeneratedPluginRegistrant.m + +.generated/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + +/Flutter/Generated.xcconfig diff --git a/ios/Assets/.gitkeep b/ios/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ios/Classes/FlutterAlibcConstKey/FlutterAlibcConstKey.h b/ios/Classes/FlutterAlibcConstKey/FlutterAlibcConstKey.h new file mode 100644 index 0000000..a262edb --- /dev/null +++ b/ios/Classes/FlutterAlibcConstKey/FlutterAlibcConstKey.h @@ -0,0 +1,14 @@ +// +// FlutterAlibcConstKey.h +// flutter_alibc +// +// Created by 吴兴 on 2019/9/4. +// + +#ifndef FlutterAlibcConstKey_h +#define FlutterAlibcConstKey_h + +static NSString *FlutterAlibcConstKey_ErrorCode = @"errorCode"; +static NSString *FlutterAlibcConstKey_ErrorMessage = @"errorMessage"; +static NSString *FlutterAlibcConstKey_Data = @"data"; +#endif /* FlutterAlibcConstKey_h */ diff --git a/ios/Classes/FlutterAlibcPlugin.h b/ios/Classes/FlutterAlibcPlugin.h new file mode 100644 index 0000000..807d6e7 --- /dev/null +++ b/ios/Classes/FlutterAlibcPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface FlutterAlibcPlugin : NSObject +@end diff --git a/ios/Classes/FlutterAlibcPlugin.m b/ios/Classes/FlutterAlibcPlugin.m new file mode 100644 index 0000000..dbf3cf5 --- /dev/null +++ b/ios/Classes/FlutterAlibcPlugin.m @@ -0,0 +1,86 @@ +#import "FlutterAlibcPlugin.h" +#import "FlutterAlibcHandle.h" +#import + +@interface FlutterAlibcPlugin() +//一个handle服务 +@property(nonatomic,strong)FlutterAlibcHandle *handler; +//一个service服务 +@end + +@implementation FlutterAlibcPlugin ++ (void)registerWithRegistrar:(NSObject*)registrar { + FlutterMethodChannel* channel = [FlutterMethodChannel + methodChannelWithName:@"flutter_alibc" + binaryMessenger:[registrar messenger]]; + FlutterAlibcPlugin* instance = [[FlutterAlibcPlugin alloc] initWithRegistrar:registrar methodChannel:channel]; + [registrar addMethodCallDelegate:instance channel:channel]; + [registrar addApplicationDelegate:instance]; +} + + +- (instancetype)initWithRegistrar:(NSObject *)registrar methodChannel:(FlutterMethodChannel *)flutterMethodChannel{ + self = [super init]; + + if (self) { + self.handler = [[FlutterAlibcHandle alloc]init]; + } + + return self; +} + +- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result { + if ([@"getPlatformVersion" isEqualToString:call.method]) { + result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]); + }else if ([@"initAlibc" isEqualToString:call.method]){ + [_handler initAlibc:call result:result]; + }else if([@"loginTaoBao" isEqualToString:call.method]){ + [_handler loginTaoBao:call result:result]; + }else if([@"taoKeLogin" isEqualToString:call.method]){ + [_handler taoKeLogin:call result:result]; + }else if([@"loginOut" isEqualToString:call.method]){ + [_handler loginOut]; + }else if([@"openByUrl" isEqualToString:call.method]){ + [_handler openByUrl:call result:result]; + }else if([@"openItemDetail" isEqualToString:call.method]){ + [_handler openItemDetail:call result:result]; + }else if([@"openShop" isEqualToString:call.method]){ + [_handler openShop:call result:result]; + }else if([@"openCart" isEqualToString:call.method]){ + [_handler openCart:call result:result]; + }else if([@"syncForTaoke" isEqualToString:call.method]){ + [_handler syncForTaoke:call result:result]; + }else if([@"useAlipayNative" isEqualToString:call.method]){ + [_handler useAlipayNative:call result:result]; + }else { + result(FlutterMethodNotImplemented); + } +} + + +#pragma mark -- 下面两个为百川处理应用跳转 +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{ + // 如果百川处理过会返回YES + if (![[AlibcTradeSDK sharedInstance] application:application openURL:url sourceApplication:sourceApplication annotation:annotation]) { + return YES; + } + return NO; +} + + +//IOS9.0 系统新的处理openURL 的API +- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options { + + + if (@available(iOS 9.0, *)) { + __unused BOOL isHandledByALBBSDK=[[AlibcTradeSDK sharedInstance] application:application openURL:url options:options]; + return isHandledByALBBSDK; + } else { + // Fallback on earlier versions + }//处理其他app跳转到自己的app,如果百川处理过会返回YES + + return NO; + + +} +@end diff --git a/ios/Classes/Handle/FlutterAlibcHandle.h b/ios/Classes/Handle/FlutterAlibcHandle.h new file mode 100644 index 0000000..433e3e0 --- /dev/null +++ b/ios/Classes/Handle/FlutterAlibcHandle.h @@ -0,0 +1,99 @@ +/* + * @Description: + * @Author: wuxing + * @Date: 2019-09-02 21:26:27 + * @LastEditors: wuxing + * @LastEditTime: 2019-09-02 22:12:43 + */ +// +// FlutterAlibcHandle.h +// flutter_alibc +// +// Created by 吴兴 on 2019/8/28. +// + +#import +#import +NS_ASSUME_NONNULL_BEGIN + +@interface FlutterAlibcHandle : NSObject +// 初始化 + +/** + 初始化 + + @param call {"version","appName"} + @param result {@"errorCode":"0",@"errorMessage":"success"} + */ +- (void)initAlibc:(FlutterMethodCall *)call result:(FlutterResult)result; + +/** + 登录淘宝 + + @param call <#call description#> + @param result <#result description#> + */ +- (void)loginTaoBao:(FlutterMethodCall *)call result:(FlutterResult)result; + + +/** + 退出淘宝登录 + */ +- (void)loginOut; + + +/// 淘客登录,二次授权 +/// @param call <#call description#> +/// @param result <#result description#> +- (void)taoKeLogin:(FlutterMethodCall *)call result:(FlutterResult)result; +/** + 通过url打开,包括h5,唤起手淘等 + + @param call <#call description#> + @param result <#result description#> + */ +- (void)openByUrl:(FlutterMethodCall *)call result:(FlutterResult)result; + + +/** + 打开商品详情 + + @param call <#call description#> + @param result <#result description#> + */ +- (void)openItemDetail:(FlutterMethodCall *)call result:(FlutterResult)result; + +/** + 打开店铺 + + @param call <#call description#> + @param result <#result description#> + */ +- (void)openShop:(FlutterMethodCall *)call result:(FlutterResult)result; + +/** + 打开购物车 + + @param call <#call description#> + @param result <#result description#> + */ +- (void)openCart:(FlutterMethodCall *)call result:(FlutterResult)result; + +/** + 是否淘宝打点 + + @param call <#call description#> + @param result <#result description#> + */ +- (void)syncForTaoke:(FlutterMethodCall *)call result:(FlutterResult)result; + +/** + 是否使用Native AliPay + + @param call <#call description#> + @param result <#result description#> + */ +- (void)useAlipayNative:(FlutterMethodCall *)call result:(FlutterResult)result; +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/Handle/FlutterAlibcHandle.m b/ios/Classes/Handle/FlutterAlibcHandle.m new file mode 100644 index 0000000..4f25645 --- /dev/null +++ b/ios/Classes/Handle/FlutterAlibcHandle.m @@ -0,0 +1,515 @@ +// +// FlutterAlibcHandle.m +// flutter_alibc +// +// Created by 吴兴 on 2019/8/28. +// + +#import "FlutterAlibcHandle.h" +#import "FlutterAlibcTools.h" +#import "FlutterAlibcConstKey.h" +#import +//#import +#import "ALiTradeWebViewController.h" +#import "FlutterWxViewCtrlViewController.h" +#import +#import +@implementation FlutterAlibcHandle +FlutterMethodChannel *_flutterAlibcChannel = nil; + + +- (instancetype)initWithRegistrar:(NSObject *)registrar methodChannel:(FlutterMethodChannel *)flutterMethodChannel { + self = [super init]; + if (self) { + _flutterAlibcChannel = flutterMethodChannel; + } + return self; +} + +#pragma mark- 对flutter暴露的方法 +#pragma mark -- 初始化阿里百川 +- (void)initAlibc:(FlutterMethodCall *)call result:(FlutterResult)result { + // 百川平台基础SDK初始化,加载并初始化各个业务能力插件 + NSString *version = call.arguments[@"version"]; + NSString *appName = call.arguments[@"appName"]; + // 判断是否为空 + if(![FlutterAlibcTools isNil:version]){ + [[AlibcTradeSDK sharedInstance] setIsvVersion:version]; //设置三方App版本,可用于标识App版本 + } + if(![FlutterAlibcTools isNil:appName]){ + [[AlibcTradeSDK sharedInstance] setIsvAppName:appName]; //设置三方App名称,可用于标识App + } + [[AlibcTradeSDK sharedInstance] setDebugLogOpen:YES];//开发阶段打开日志开关,方便排查错误信息 + [[AlibcTradeSDK sharedInstance] setEnv:AlibcEnvironmentRelease];//线上环境 + + + [[AlibcTradeSDK sharedInstance] asyncInitWithSuccess:^{ + // 告诉flutter,初始化完成 + result(@{FlutterAlibcConstKey_ErrorCode:@"0",FlutterAlibcConstKey_ErrorMessage:@"success"}); + } failure:^(NSError *error) { + NSLog(@"Init failed: %@", error.description); + result(@{FlutterAlibcConstKey_ErrorCode:[NSString stringWithFormat: @"%ld", (long)error.code],FlutterAlibcConstKey_ErrorMessage:error.description}); + }]; +} +#pragma mark --淘宝登录 +- (void)loginTaoBao:(FlutterMethodCall *)call result:(FlutterResult)result{ + if(![[ALBBCompatibleSession sharedInstance] isLogin]) { + UIViewController *rootViewController = + [UIApplication sharedApplication].delegate.window.rootViewController; + [[ALBBSDK sharedInstance] setH5Only:NO]; + [[ALBBSDK sharedInstance] auth:rootViewController successCallback:^{ + ALBBUser *userInfo =[[ALBBCompatibleSession sharedInstance] getUser]; + // 登录成功 + result(@{ + FlutterAlibcConstKey_ErrorCode:@"0", + FlutterAlibcConstKey_ErrorMessage:@"success", + FlutterAlibcConstKey_Data:@{ + // 昵称 + @"nick":userInfo.nick, + // 头像地址 + @"avatarUrl":userInfo.avatarUrl, + @"openId":userInfo.openId, + @"openSid":userInfo.openSid, + @"topAccessToken":userInfo.topAccessToken, + @"topAuthCode":userInfo.topAuthCode, + } + }); + } failureCallback:^(NSError *error) { + // 登录失败 + result(@{ + FlutterAlibcConstKey_ErrorCode:[NSString stringWithFormat: @"%ld", (long)error.code], + FlutterAlibcConstKey_ErrorMessage:error.localizedDescription, + FlutterAlibcConstKey_Data:@{} + }); + }]; + + } else { + ALBBUser *userInfo =[[ALBBCompatibleSession sharedInstance] getUser]; + // 登录成功 + result(@{ + FlutterAlibcConstKey_ErrorCode:@"0", + FlutterAlibcConstKey_ErrorMessage:@"success", + FlutterAlibcConstKey_Data:@{ + // 昵称 + @"nick":userInfo.nick, + // 头像地址 + @"avatarUrl":userInfo.avatarUrl, + @"openId":userInfo.openId, + @"openSid":userInfo.openSid, + @"topAccessToken":userInfo.topAccessToken, + @"topAuthCode":userInfo.topAuthCode, + } + }); + } +} +// +//else if([@"useAlipayNative" isEqualToString:call.method]){ +// [_handler useAlipayNative:call result:result]; +//} +#pragma mark --淘客登录 +-(void)taoKeLogin:(FlutterMethodCall *)call result:(FlutterResult)result{ + // 需要获取的数据 + NSNumber *type1 = call.arguments[@"openType"]; + AlibcOpenType openType = [self openType:[type1 intValue]]; + BOOL isNeedCustomNativeFailMode = [call.arguments[@"isNeedCustomNativeFailMode"] boolValue]; + // 不用push了,没有nav,默认都present + // BOOL isNeedPush = [call.arguments[@"isNeedPush"] boolValue]; + BOOL isNeedPush = YES; + NSNumber *failMode = call.arguments[@"nativeFailMode"]; + AlibcNativeFailMode nativeFailMode = [self NativeFailMode:[failMode intValue]]; + NSNumber *schemeType = call.arguments[@"schemeType"]; + NSString *linkKey = [self schemeType:[schemeType intValue]]; + NSString *url = call.arguments[@"url"]; + AlibcTradeTaokeParams *taokeParam = [self getTaokeParams:call]; + NSDictionary *trackParam = call.arguments[@"trackParam"]; + NSString *backUrl = [FlutterAlibcTools changeType:call.arguments[@"backUrl"]]; + // NSString *backUrl = [FlutterAlibcTools nullToNil:call.arguments[@"backUrl"]]; + + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + + AlibcTradeShowParams* showParam = [[AlibcTradeShowParams alloc] init]; + showParam.openType = openType; + showParam.isNeedCustomNativeFailMode = isNeedCustomNativeFailMode; + showParam.isNeedPush=isNeedPush; + showParam.nativeFailMode=nativeFailMode; + showParam.linkKey=linkKey; + showParam.backUrl= backUrl; + + ALiTradeWebViewController* webviewVC = [[ALiTradeWebViewController alloc] init]; + + NSInteger res = [[AlibcTradeSDK sharedInstance].tradeService + openByUrl:url + identity:@"trade" + webView:webviewVC.webView + parentController:rootViewController + showParams:showParam + taoKeParams:taokeParam + trackParam:trackParam tradeProcessSuccessCallback:^(AlibcTradeResult * _Nullable alibcTradeResult) { + // // 交易成功,判断是付款成功还是加入购物车 + // if(alibcTradeResult.result == AlibcTradeResultTypePaySuccess){ + // // 付款成功 + // result(@{ + // FlutterAlibcConstKey_ErrorCode:@"0", + // FlutterAlibcConstKey_ErrorMessage:@"付款成功", + // FlutterAlibcConstKey_Data:@{ + // @"type":@0, + // @"paySuccessOrders":[alibcTradeResult payResult].paySuccessOrders, + // @"payFailedOrders":[alibcTradeResult payResult].payFailedOrders, + // } + // }); + // }else if(alibcTradeResult.result== AlibcTradeResultTypeAddCard){ + // // 加入购物车 + // result(@{ + // FlutterAlibcConstKey_ErrorCode:@"0", + // FlutterAlibcConstKey_ErrorMessage:@"加入购物车成功", + // FlutterAlibcConstKey_Data:@{ + // @"type":@1, + // } + // }); + // } + } tradeProcessFailedCallback:^(NSError * _Nullable error) { + // result(@{ + // FlutterAlibcConstKey_ErrorCode:[NSString stringWithFormat: @"%ld", (long)error.code], + // FlutterAlibcConstKey_ErrorMessage:[error localizedDescription], + // }); + }]; + + if (res == 1) { + // 新建一个view + FlutterWxViewCtrlViewController *WxVC = [[FlutterWxViewCtrlViewController alloc] init]; + WxVC.vc = webviewVC; + WxVC.accessBlock = ^(NSString * accessToken){ + NSLog(@"accessToken = %@",accessToken); + if (accessToken) { + result(@{ + @"accessToken":accessToken + }); + }else{ + result(@{ + @"accessToken":@"" + }); + } + + }; + UINavigationController *root = [[UINavigationController alloc] initWithRootViewController:WxVC]; + [rootViewController presentViewController:root animated:NO completion:^{ + + }]; + } +} +#pragma mark --退出登录 +- (void)loginOut{ + [[ALBBSDK sharedInstance] logout]; +} +#pragma mark --通过url打开,包括h5,唤起手淘等 +- (void)openByUrl:(FlutterMethodCall *)call result:(FlutterResult)result{ + // 需要获取的数据 + NSNumber *type1 = call.arguments[@"openType"]; + AlibcOpenType openType = [self openType:[type1 intValue]]; + BOOL isNeedCustomNativeFailMode = [call.arguments[@"isNeedCustomNativeFailMode"] boolValue]; + // 不用push了,没有nav,默认都present + // BOOL isNeedPush = [call.arguments[@"isNeedPush"] boolValue]; + BOOL isNeedPush = NO; + NSNumber *failMode = call.arguments[@"nativeFailMode"]; + AlibcNativeFailMode nativeFailMode = [self NativeFailMode:[failMode intValue]]; + NSNumber *schemeType = call.arguments[@"schemeType"]; + NSString *linkKey = [self schemeType:[schemeType intValue]]; + NSString *url = call.arguments[@"url"]; + AlibcTradeTaokeParams *taokeParam = [self getTaokeParams:call]; + NSDictionary *trackParam = call.arguments[@"trackParam"]; + NSString *backUrl = [FlutterAlibcTools changeType:call.arguments[@"backUrl"]]; + // NSString *backUrl = [FlutterAlibcTools nullToNil:call.arguments[@"backUrl"]]; + + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + + AlibcTradeShowParams* showParam = [[AlibcTradeShowParams alloc] init]; + showParam.openType = openType; + showParam.isNeedCustomNativeFailMode = isNeedCustomNativeFailMode; + showParam.isNeedPush=isNeedPush; + showParam.nativeFailMode=nativeFailMode; + showParam.linkKey=linkKey; + showParam.backUrl= backUrl; + [[AlibcTradeSDK sharedInstance].tradeService openByUrl:url identity:@"trade" webView:nil parentController:rootViewController showParams:showParam taoKeParams:taokeParam trackParam:trackParam tradeProcessSuccessCallback:^(AlibcTradeResult * _Nullable alibcTradeResult) { + // 交易成功,判断是付款成功还是加入购物车 + if(alibcTradeResult.result == AlibcTradeResultTypePaySuccess){ + // 付款成功 + result(@{ + FlutterAlibcConstKey_ErrorCode:@"0", + FlutterAlibcConstKey_ErrorMessage:@"付款成功", + FlutterAlibcConstKey_Data:@{ + @"type":@0, + @"paySuccessOrders":[alibcTradeResult payResult].paySuccessOrders, + @"payFailedOrders":[alibcTradeResult payResult].payFailedOrders, + } + }); + }else if(alibcTradeResult.result== AlibcTradeResultTypeAddCard){ + // 加入购物车 + result(@{ + FlutterAlibcConstKey_ErrorCode:@"0", + FlutterAlibcConstKey_ErrorMessage:@"加入购物车成功", + FlutterAlibcConstKey_Data:@{ + @"type":@1, + } + }); + } + } tradeProcessFailedCallback:^(NSError * _Nullable error) { + result(@{ + FlutterAlibcConstKey_ErrorCode:[NSString stringWithFormat: @"%ld", (long)error.code], + FlutterAlibcConstKey_ErrorMessage:[error localizedDescription], + // android没有,直接去掉 + // FlutterAlibcConstKey_Data:@{ + // @"orderIdList":[[error userInfo] objectForKey:@"orderIdList"], + // } + }); + }]; +} +#pragma mark --打开商品详情 +- (void)openItemDetail:(FlutterMethodCall *)call result:(FlutterResult)result{ + NSString *itemID = call.arguments[@"itemID"]; + id page = [AlibcTradePageFactory itemDetailPage:itemID]; + [self OpenPageByNewWay:page BizCode:@"detail" Call:call callback:result]; +} +#pragma mark --打开店铺 +- (void)openShop:(FlutterMethodCall *)call result:(FlutterResult)result{ + NSString *shopId = call.arguments[@"shopId"]; + id page = [AlibcTradePageFactory shopPage:shopId]; + [self OpenPageByNewWay:page BizCode:@"shop" Call:call callback:result]; +} +#pragma mark --打开我的购物车 +- (void)openCart:(FlutterMethodCall *)call result:(FlutterResult)result{ + id page = [AlibcTradePageFactory myCartsPage]; + [self OpenPageByNewWay:page BizCode:@"cart" Call:call callback:result]; +} + +#pragma mark --淘客打点 +- (void)syncForTaoke:(FlutterMethodCall *)call result:(FlutterResult)result{ + BOOL isSync = [call.arguments[@"isSync"] boolValue]; + [[AlibcTradeSDK sharedInstance] setIsSyncForTaoke:isSync]; +} +#pragma mark --设置是否需要 Native AliPay 接口 +- (void)useAlipayNative:(FlutterMethodCall *)call result:(FlutterResult)result{ + BOOL isNeed = [call.arguments[@"isNeed"] boolValue]; + [[AlibcTradeSDK sharedInstance] setShouldUseAlizfNative:isNeed]; +} +#pragma mark - 不对flutter暴露 +#pragma mark --打开page +- (void)OpenPageByNewWay:(id)page BizCode:(NSString *)bizCode Call:(FlutterMethodCall *)call callback:(FlutterResult)callback{ + AlibcTradeShowParams* showParam = [[AlibcTradeShowParams alloc] init]; + NSNumber *type1 = call.arguments[@"openType"]; + AlibcOpenType openType = [self openType:[type1 intValue]]; + BOOL isNeedCustomNativeFailMode = [call.arguments[@"isNeedCustomNativeFailMode"] boolValue]; + // 不用push了,没有nav,默认都present + // BOOL isNeedPush = [call.arguments[@"isNeedPush"] boolValue]; + BOOL isNeedPush = NO; + // 不用绑定了,默认为没有,有的话flutter太难搞了 + // BOOL isBindWebview = [call.arguments[@"isBindWebview"] boolValue]; + NSNumber *failMode = call.arguments[@"nativeFailMode"]; + AlibcNativeFailMode nativeFailMode = [self NativeFailMode:[failMode intValue]]; + NSNumber *schemeType = call.arguments[@"schemeType"]; + NSString *linkKey = [self schemeType:[schemeType intValue]]; + AlibcTradeTaokeParams *taokeParam = [self getTaokeParams:call]; + NSDictionary *trackParam = [FlutterAlibcTools nullToNil:call.arguments[@"trackParam"]]; + + NSString *backUrl = [FlutterAlibcTools changeType:call.arguments[@"backUrl"]]; + // 判断 + + UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; + + showParam.openType = openType; + showParam.isNeedPush = isNeedPush; + showParam.nativeFailMode = nativeFailMode; + showParam.isNeedCustomNativeFailMode = isNeedCustomNativeFailMode; + showParam.linkKey = linkKey; + showParam.backUrl = backUrl; + + + // if (isBindWebview) { + // ALiTradeWebViewController *viewCtrl = [[ALiTradeWebViewController alloc]init]; + // NSInteger res = [[AlibcTradeSDK sharedInstance].tradeService openByBizCode:bizCode page:page webView:view.webView parentController:view showParams:showParam taoKeParams:[self taokeParam] trackParam:[self customParam] tradeProcessSuccessCallback:self.onTradeSuccess tradeProcessFaelseiledCallback:self.onTradeFailure]; + // }else{ + // if (isNeedPush) { + // [[AlibcTradeSDK sharedInstance].tradeService openByBizCode:bizCode page:page webView:nil parentController:rootViewController showParams:showParam taoKeParams:taokeParam trackParam:trackParam tradeProcessSuccessCallback:^(AlibcTradeResult * _Nullable result) { + //// 交易成功,判断是付款成功还是加入购物车 + // if(result.result == AlibcTradeResultTypePaySuccess){ + //// 付款成功 + // callback(@{ + // FlutterAlibcConstKey_ErrorCode:@"0", + // FlutterAlibcConstKey_ErrorMessage:@"付款成功", + // FlutterAlibcConstKey_Data:@{ + // @"type":@0, + // @"paySuccessOrders":[result payResult].paySuccessOrders, + // @"payFailedOrders":[result payResult].payFailedOrders, + // } + // }); + // }else if(result.result== AlibcTradeResultTypeAddCard){ + //// 加入购物车 + // callback(@{ + // FlutterAlibcConstKey_ErrorCode:@"0", + // FlutterAlibcConstKey_ErrorMessage:@"付款成功", + // FlutterAlibcConstKey_Data:@{ + // @"type":@1, + // } + // }); + // } + // } tradeProcessFailedCallback:^(NSError * _Nullable error) { + //// 退出交易流程 + // callback(@{ + // FlutterAlibcConstKey_ErrorCode:[NSString stringWithFormat: @"%ld", (long)error.code], + // FlutterAlibcConstKey_ErrorMessage:[error localizedDescription], + // FlutterAlibcConstKey_Data:@{ + // @"orderIdList":[[error userInfo] objectForKey:@"orderIdList"], + // } + // }); + // }]; + // }else{ + [[AlibcTradeSDK sharedInstance].tradeService openByBizCode:bizCode page:page webView:nil parentController:rootViewController showParams:showParam taoKeParams:taokeParam trackParam:trackParam tradeProcessSuccessCallback:^(AlibcTradeResult * _Nullable result) { + // 交易成功,判断是付款成功还是加入购物车 + if(result.result == AlibcTradeResultTypePaySuccess){ + // 付款成功 + callback(@{ + FlutterAlibcConstKey_ErrorCode:@"0", + FlutterAlibcConstKey_ErrorMessage:@"付款成功", + FlutterAlibcConstKey_Data:@{ + @"type":@0, + @"paySuccessOrders":[result payResult].paySuccessOrders, + @"payFailedOrders":[result payResult].payFailedOrders, + } + }); + }else if(result.result== AlibcTradeResultTypeAddCard){ + // 加入购物车 + callback(@{ + FlutterAlibcConstKey_ErrorCode:@"0", + FlutterAlibcConstKey_ErrorMessage:@"加入购物车成功", + FlutterAlibcConstKey_Data:@{ + @"type":@1, + } + }); + } + } tradeProcessFailedCallback:^(NSError * _Nullable error) { + // 退出交易流程 + callback(@{ + FlutterAlibcConstKey_ErrorCode:[NSString stringWithFormat: @"%ld", (long)error.code], + FlutterAlibcConstKey_ErrorMessage:[error localizedDescription], + // Android没有,所以去掉 + // FlutterAlibcConstKey_Data:@{ + // @"orderIdList":[[error userInfo] objectForKey:@"orderIdList"], + // } + }); + }]; + // } + //} +} +#pragma mark --设置淘客参数 +- (AlibcTradeTaokeParams *)getTaokeParams:(FlutterMethodCall *)call{ + AlibcTradeTaokeParams *taoke = [[AlibcTradeTaokeParams alloc] init]; + if (call.arguments[@"taoKeParams"] == nil || [call.arguments[@"taoKeParams"] isKindOfClass:[NSNull class]]) { + return nil; + } + NSDictionary *taoKeParams = call.arguments[@"taoKeParams"]; + taoke.adzoneId = (taoKeParams[@"adzoneId"] == (id) [NSNull null]) ? nil : taoKeParams[@"adzoneId"]; + taoke.pid = (taoKeParams[@"pid"] == (id) [NSNull null]) ? nil : taoKeParams[@"pid"]; + //有adzoneId则pid失效 + taoke.unionId = (taoKeParams[@"unionId"] == (id) [NSNull null]) ? nil : taoKeParams[@"unionId"]; + taoke.subPid = (taoKeParams[@"subPid"] == (id) [NSNull null]) ? nil : taoKeParams[@"subPid"]; + // 必须是dic + taoke.extParams = (taoKeParams[@"extParams"] == (id) [NSNull null]) ? nil : taoKeParams[@"extParams"]; + + // 判断这玩意是什么格式,dic就直接赋值,jsoÏn需要转dic + // if ([extParams isKindOfClass:[NSDictionary class]]) { + // taoke.extParams = extParams; + // }else{ + // 解析字符串 + // taoke.extParams = [FlutterAlibcTools dictionaryWithJsonString:extParams]; + // } + + return taoke; +} +#pragma mark - 转换 +#pragma mark --唤起端失败的策略转换 +-(AlibcNativeFailMode )NativeFailMode:(int)mode{ + AlibcNativeFailMode openType=AlibcNativeFailModeJumpH5; + switch (mode) { + case 0: + openType=AlibcNativeFailModeJumpH5; + break; + case 1: + openType=AlibcNativeFailModeJumpDownloadPage; + break; + case 2: + openType=AlibcNativeFailModeNone; + break; + default: + break; + } + return openType; + +} +//唤起类型 +- (AlibcOpenType)openType:(int)mode{ + + AlibcOpenType openType=AlibcOpenTypeAuto; + switch (mode) { + case 0: + openType=AlibcOpenTypeAuto; + break; + case 1: + openType=AlibcOpenTypeNative; + break; + default: + break; + } + return openType; +} + +//打开类型 +-(NSString*)schemeType:(int)mode{ + NSString *linkKey=@"tmall"; + switch (mode) { + case 0: + linkKey=@"tmall"; + break; + case 1: + linkKey=@"taobao"; + break; + default: + break; + } + return linkKey; +} + + + + + + + + + + + + +/** + 可设置的参数 + 1.是否同步淘客打点 + 2.是否使用Native支付宝 + 3.是否使用淘客参数(是,需要设置如下参数) + adzoneId + pid + //有adzoneId则pid失效 + unionId + subPid + extParams{ + sellerId + taokeAppkey + } + 4.页面打开方式 + 是否唤端 Auto/Native + 唤起目标应用 淘宝/天猫 + 是否以push的方式打开页面 + 是否绑定webview + 是否自定义唤端失败策略(若是:H5,DownLoad,None) + 5.跟踪参数 customParams自定义 + */ +@end diff --git a/ios/Classes/Tools/FlutterAlibcTools.h b/ios/Classes/Tools/FlutterAlibcTools.h new file mode 100644 index 0000000..a1193c4 --- /dev/null +++ b/ios/Classes/Tools/FlutterAlibcTools.h @@ -0,0 +1,23 @@ +// +// FlutterAlibcTools.h +// flutter_alibc +// +// Created by 吴兴 on 2019/8/29. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FlutterAlibcTools : NSObject +//判断String是否为空 ++ (BOOL)isNil:(NSString *)string; +//Json转Dic ++ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString; +//判断是不是null,是就转nil ++ (id)nullToNil:(id)obj; +//改变类型 ++(id)changeType:(id)myObj; +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/Tools/FlutterAlibcTools.m b/ios/Classes/Tools/FlutterAlibcTools.m new file mode 100644 index 0000000..ffe0557 --- /dev/null +++ b/ios/Classes/Tools/FlutterAlibcTools.m @@ -0,0 +1,116 @@ +// +// FlutterAlibcTools.m +// flutter_alibc +// +// Created by 吴兴 on 2019/8/29. +// + +#import "FlutterAlibcTools.h" + +@implementation FlutterAlibcTools + ++ (BOOL)isNil:(NSString *)string { + if (string == nil) { + return YES; + } + + if ([string isKindOfClass:[NSNull class]]) { + return YES; + } + return [[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0; +} + ++ (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString{ + if (jsonString == nil) { + return nil; + } + + NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; + NSError *err; + NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData + options:NSJSONReadingMutableContainers + error:&err]; + if(err) + { + NSLog(@"json解析失败:%@",err); + return nil; + } + return dic; +} + ++ (id)nullToNil:(id)obj{ + if ([obj isKindOfClass:[NSNull class]]) { + return nil; + } + return obj; +} + + +#pragma mark - 公有方法,直接使用 +//类型识别:将所有的NSNull类型转化成@"" ++(id)changeType:(id)myObj +{ + if ([myObj isKindOfClass:[NSDictionary class]]) + { + return [self nullDic:myObj]; + } + else if([myObj isKindOfClass:[NSArray class]]) + { + return [self nullArr:myObj]; + } + else if([myObj isKindOfClass:[NSString class]]) + { + return [self stringToString:myObj]; + } + else if([myObj isKindOfClass:[NSNull class]]) + { + return [self nullToString]; + } + else + { + return myObj; + } +} + +#pragma mark - 私有方法 +//将NSDictionary中的Null类型的项目转化成@"" ++(NSDictionary *)nullDic:(NSDictionary *)myDic +{ + NSArray *keyArr = [myDic allKeys]; + NSMutableDictionary *resDic = [[NSMutableDictionary alloc]init]; + for (int i = 0; i < keyArr.count; i ++) + { + id obj = [myDic objectForKey:keyArr[i]]; + obj = [self changeType:obj]; + [resDic setObject:obj forKey:keyArr[i]]; + } + return resDic; +} + +//将NSArray中的Null类型的项目转化成@"" ++(NSArray *)nullArr:(NSArray *)myArr +{ + NSMutableArray *resArr = [[NSMutableArray alloc] init]; + for (int i = 0; i < myArr.count; i ++) + { + id obj = myArr[i]; + obj = [self changeType:obj]; + [resArr addObject:obj]; + } + return resArr; +} + +//将NSString类型的原路返回 ++(NSString *)stringToString:(NSString *)string +{ + return string; +} + +//将Null类型的项目转化成@"" ++(NSString *)nullToString +{ +// return @""; + return @""; +} + +@end diff --git a/ios/Classes/WKWebView/ALiTradeWebViewController.h b/ios/Classes/WKWebView/ALiTradeWebViewController.h new file mode 100644 index 0000000..f05156d --- /dev/null +++ b/ios/Classes/WKWebView/ALiTradeWebViewController.h @@ -0,0 +1,23 @@ +// +// ALiTradeWantViewController.h +// ALiSDKAPIDemo +// +// Created by com.alibaba on 16/6/1. +// Copyright © 2016年 alibaba. All rights reserved. +// + +#ifndef ALiTradeWantViewController_h +#define ALiTradeWantViewController_h + +#import +#import + +@interface ALiTradeWebViewController : UIViewController +@property (nonatomic, copy) NSString *openUrl; +@property (strong, nonatomic) WKWebView *webView; + +-(WKWebView *)getWebView; + +@end + +#endif /* ALiTradeWantViewController_h */ diff --git a/ios/Classes/WKWebView/ALiTradeWebViewController.m b/ios/Classes/WKWebView/ALiTradeWebViewController.m new file mode 100644 index 0000000..902ec6c --- /dev/null +++ b/ios/Classes/WKWebView/ALiTradeWebViewController.m @@ -0,0 +1,89 @@ +// +// ALiTradeWantViewController.m +// ALiSDKAPIDemo +// +// Created by com.alibaba on 16/6/1. +// Copyright © 2016年 alibaba. All rights reserved. +// + +#import +#import "ALiTradeWebViewController.h" +#import + +//#import "ALiCartService.h" + +@interface ALiTradeWebViewController() + +@end + +@implementation ALiTradeWebViewController +- (instancetype)init +{ + self = [super init]; + if (self) { + _webView = [[WKWebView alloc]initWithFrame:self.view.bounds]; + _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + _webView.scrollView.scrollEnabled = YES; +// _webView.navigationDelegate = self; + _webView.navigationDelegate = self; + _webView.UIDelegate = self; + [_webView addObserver:self forKeyPath:@"URL" options:NSKeyValueObservingOptionNew context:nil]; + [self.view addSubview:_webView]; + } + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + self.title=@"淘你喜欢"; + + + [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -60) + forBarMetrics:UIBarMetricsDefault]; +} +-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context{ + + NSLog(@"url == %@",_webView.URL.absoluteString); + NSString *urlStr = _webView.URL.absoluteString; + NSRange range; + range = [urlStr rangeOfString:@"access_token"]; + if (range.location != NSNotFound) { + NSString *accessString = [urlStr substringFromIndex:range.location]; + // 截止到& + NSRange range2 = [accessString rangeOfString: @"&"]; + + NSString *access_token_string = [accessString substringWithRange:NSMakeRange(0,range2.location)]; + NSArray *array = [access_token_string componentsSeparatedByString:@"="]; + NSString *access_token = array[1]; + NSLog(@"%@",access_token); + // 跳转回去 + [[NSNotificationCenter defaultCenter] postNotificationName:@"getAccessToken" object:access_token]; + [self.navigationController popViewControllerAnimated:YES]; + }else{ + NSLog(@"Not Found"); + } +} + +-(void)dealloc +{ + NSLog(@"dealloc view"); + [_webView removeObserver:self forKeyPath:@"URL"]; + _webView = nil; + +} + +-(void)setOpenUrl:(NSString *)openUrl { + [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:openUrl]]]; +} + +-(WKWebView *)getWebView{ + return _webView; +} + +#pragma mark - WKNavigationDelegate +- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { +// 重定向 + decisionHandler(WKNavigationActionPolicyAllow); +} +@end diff --git a/ios/Classes/WKWebView/FlutterWxViewCtrlViewController.h b/ios/Classes/WKWebView/FlutterWxViewCtrlViewController.h new file mode 100644 index 0000000..9ee5aa8 --- /dev/null +++ b/ios/Classes/WKWebView/FlutterWxViewCtrlViewController.h @@ -0,0 +1,19 @@ +// +// FlutterWxViewCtrlViewController.h +// flutter_alibc +// +// Created by 吴兴 on 2019/10/22. +// + +#import +#import "ALiTradeWebViewController.h" +NS_ASSUME_NONNULL_BEGIN +typedef void (^AccessTokenBlock) (NSString *accessToken); +@interface FlutterWxViewCtrlViewController : UIViewController + +@property(nonatomic,strong)ALiTradeWebViewController *vc; +@property(nonatomic,copy) AccessTokenBlock accessBlock; +@property(nonatomic,copy) NSString *accessToken; +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/WKWebView/FlutterWxViewCtrlViewController.m b/ios/Classes/WKWebView/FlutterWxViewCtrlViewController.m new file mode 100644 index 0000000..1053b62 --- /dev/null +++ b/ios/Classes/WKWebView/FlutterWxViewCtrlViewController.m @@ -0,0 +1,61 @@ +// +// FlutterWxViewCtrlViewController.m +// flutter_alibc +// +// Created by 吴兴 on 2019/10/22. +// + +#import "FlutterWxViewCtrlViewController.h" + +@interface FlutterWxViewCtrlViewController () +@property(nonatomic,assign)int num; +@end + +@implementation FlutterWxViewCtrlViewController +- (instancetype)init +{ + self = [super init]; + if (self) { + self.num = 0; + } + return self; +} +- (void)viewDidLoad { + [super viewDidLoad]; + self.view.backgroundColor = [UIColor whiteColor]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getAccessToken:) name:@"getAccessToken" object:nil]; +// 跳转到别的页面 + [self.navigationController pushViewController:self.vc animated:YES]; + // Do any additional setup after loading the view. +} + +- (void)viewDidAppear:(BOOL)animated{ + self.num = self.num + 1; + if (self.num == 2) { + NSLog(@"该关闭了"); + [self.navigationController dismissViewControllerAnimated:YES completion:^{ + NSLog(@"执行dismiss回调"); + + }]; + } +} +- (void)getAccessToken:(NSNotification *) notification { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + NSLog(@"写入accessToken"); + self.accessToken = notification.object; +} +- (void)dealloc{ + NSLog(@"dealloc执行"); + self.accessBlock(self.accessToken); +} +/* +#pragma mark - Navigation + +// In a storyboard-based application, you will often want to do a little preparation before navigation +- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { + // Get the new view controller using [segue destinationViewController]. + // Pass the selected object to the new view controller. +} +*/ + +@end diff --git a/ios/flutter_alibc.podspec b/ios/flutter_alibc.podspec new file mode 100644 index 0000000..c3b0e98 --- /dev/null +++ b/ios/flutter_alibc.podspec @@ -0,0 +1,36 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'flutter_alibc' + s.version = '0.0.1' + s.summary = '阿里百川' + s.description = <<-DESC +阿里百川 + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + s.dependency 'AlibcTradeSDK','4.0.1.6' + s.dependency 'AliAuthSDK','1.1.0.41-bc' + s.dependency 'mtopSDK','3.0.0.3-BC' + s.dependency 'securityGuard','5.4.191' + s.dependency 'AliLinkPartnerSDK','4.0.0.24' + s.dependency 'BCUserTrack','5.2.0.18-appkeys' + s.dependency 'UTDID','1.1.0.16' + s.dependency 'WindVane','8.5.0.46-bc11' + + # s.vendored_frameworks ="AliBaichuan/Frameworks/*.framework" + # s.resource = "AliBaichuan/Resources/*.bundle" + + s.frameworks = "CoreTelephony","CoreMotion","UIKit","Foundation" + s.libraries = "z","c++","sqlite3.0" + + s.ios.deployment_target = '8.0' + s.static_framework = true +end + diff --git a/lib/albc_tools.dart b/lib/albc_tools.dart new file mode 100644 index 0000000..78554bf --- /dev/null +++ b/lib/albc_tools.dart @@ -0,0 +1,62 @@ +/// + /// @Description: 工具类 + /// @Author: wuxing + /// @Date: 2019-09-06 22:51:22 + /// @LastEditors: wuxing + /// @LastEditTime: 2019-09-06 22:52:48 + /// + +import 'alibc_const_key.dart'; +import 'alibc_model.dart'; + +class AlibcTools { + // -------------------------------------------// +// --------这里是工具类,不要从这获取-------------// +// -------------------------------------------// + + // 获取返回数据 + static TradeResult getTradeResult(Map result) { + // 如果失败 + if (result[AlibcConstKey.errorCode] != "0") { + return TradeResult( + result[AlibcConstKey.errorCode], + result[AlibcConstKey.errorMessage], + ); + } + + // 判断类型 + if (result[AlibcConstKey.data]["type"] == + TradeResultType.AlibcTradeResultTypePaySuccess) { + // 付款成功 + return TradeResult( + result[AlibcConstKey.errorCode], result[AlibcConstKey.errorMessage], + type: TradeResultType.AlibcTradeResultTypePaySuccess, + payResult: PayResult( + result[AlibcConstKey.data]["paySuccessOrders"], + result[AlibcConstKey.data]["payFailedOrders"], + )); + } else { + // 添加购物车成功 + return TradeResult( + result[AlibcConstKey.errorCode], + result[AlibcConstKey.errorMessage], + type: TradeResultType.AlibcTradeResultTypeAddCard, + ); + } + } + +// 设置淘宝客数据 + static Map getTaokeMap(TaokeParams taokeParams) { + Map taoKe; + if (taokeParams != null) { + taoKe = { + "adzoneId": taokeParams.adzoneId ?? "", + "pid": taokeParams.pid ?? "", + "unionId": taokeParams.unionId ?? "", + "subPid": taokeParams.subPid ?? "", + "extParams": taokeParams.extParams ?? {} + }; + } + return taoKe; + } +} diff --git a/lib/alibc_const_key.dart b/lib/alibc_const_key.dart new file mode 100644 index 0000000..c0f8a3d --- /dev/null +++ b/lib/alibc_const_key.dart @@ -0,0 +1,47 @@ + /// + /// @Author: 无星 + /// @Date: 2019-08-30 15:55:44 + /// @Last Modified by: 无星 + /// @Last Modified time: 2019-08-30 17:17:07 + /// + +import 'package:flutter/foundation.dart'; + +class AlibcConstKey { + // 错误码 + static String errorCode = "errorCode"; + // 错误信息 + static String errorMessage = "errorMessage"; + // 平台,iOS为iOS,Android为Android + static String platform = "platform"; + // result + static String data = "data"; + + static String platform_ios = "iOS"; + static String platform_andriod = "andriod"; +} + +/// 成功支付 +/// 成功添加到购物车 +enum TradeResultType { + AlibcTradeResultTypePaySuccess, + AlibcTradeResultTypeAddCard +} + +/// 智能判断 +/// 强制拉端(手淘/天猫) +enum AlibcOpenType { AlibcOpenTypeAuto, AlibcOpenTypeNative } + +// 拉起手淘失败后的处理策略 + +// - AlibcNativeFailModeJumpH5: 当拉起手淘/天猫失败, 则在 webview 中跳转对应 H5 页面; 默认选项 +// - AlibcNativeFailModeJumpDownloadPage: 当拉起手淘/天猫失败, 则跳转对应 App 下载页面 +// - AlibcNativeFailModeNone: 当拉起手淘/天猫失败, 不做额外操作 +enum AlibcNativeFailMode { + AlibcNativeFailModeJumpH5, + AlibcNativeFailModeJumpDownloadPage, + AlibcNativeFailModeNone +} +// 天猫 +// 淘宝 +enum AlibcSchemeType { AlibcSchemeTmall, AlibcSchemeTaoBao } diff --git a/lib/alibc_model.dart b/lib/alibc_model.dart new file mode 100644 index 0000000..b831a5e --- /dev/null +++ b/lib/alibc_model.dart @@ -0,0 +1,134 @@ +// 初始化阿里百川的model +import 'alibc_const_key.dart'; + +class InitModel { + // 错误码 + final String errorCode; + // 错误信息 + final String errorMessage; + + InitModel(this.errorCode, this.errorMessage); +} + +class LoginModel { + // 错误码 + final String errorCode; + // 错误信息 + final String errorMessage; + + UserModel data; + + LoginModel(this.errorCode, this.errorMessage, {this.data}); +} + +// 用户信息 +class UserModel { + // 用户昵称 + final String nick; + // 头像地址 + final String avatarUrl; + final String openId; + final String openSid; + final String topAccessToken; + final String topAuthCode; + UserModel(this.nick, this.avatarUrl, this.openId, this.openSid, + this.topAccessToken, this.topAuthCode); +} + +// 淘宝客的参数 +class TaokeParams { + //有adzoneId则pid失效 + String adzoneId; + String pid; + String unionId; + String subPid; + Map extParams; + TaokeParams( + {this.adzoneId, this.pid, this.unionId, this.subPid, this.extParams}); +} + +// url打开或者page打开等的数据 +class TradeResult { + // 错误码,0为成功,非0为失败 + final String errorCode; + // 错误信息 + final String errorMessage; + + TradeResultType type; + + PayResult payResult; + // AddCardResult addCardResult; + // Android没有,所以去掉 + // TradeFailResult tradeFailResult; + + TradeResult( + this.errorCode, + this.errorMessage, { + this.type, + this.payResult, + // this.tradeFailResult, + }); +} + +// 付款成功的result +class PayResult { + // 支付成功的订单 + final List paySuccessOrders; + // 支付失败的订单 + final List payFailedOrders; + + PayResult(this.paySuccessOrders, this.payFailedOrders); +} + +// 添加购物车成功的result +// 因为没什么好返回的,所以不写 +// class AddCardResult {} + +// 失败,Android没有,所以去掉 +// class TradeFailResult { +// // 失败的订单list +// final List orderIdList; + +// TradeFailResult(this.orderIdList); +// } + +// class TaoKeParams { +// // 淘客ID +// final String pid; +// // 不知道什么id +// final String subPid; +// // 不知道什么id +// final String unionId; + +// TaoKeParams(this.pid, this.subPid, this.unionId); +// } + +// class TradeResult { +// // 是否成功 +// final int openResultCode; +// // 平台 +// final String platform; +// // // 是否成功 +// // final bool isSuccessful; +// // errorCode +// final int errorCode; +// // 错误信息 +// final String errorMessage; +// // 打开配型 +// final TradeResultType tradeResultType; +// // 成功付款商品 +// final List paySuccessOrders; +// // 付款失败商品 +// final List payFailedOrders; + +// TradeResult({ +// this.openResultCode, +// this.platform, +// // this.isSuccessful, +// this.errorCode, +// this.errorMessage, +// this.tradeResultType, +// this.paySuccessOrders, +// this.payFailedOrders +// }); +// } diff --git a/lib/flutter_alibc.dart b/lib/flutter_alibc.dart new file mode 100644 index 0000000..e5ef406 --- /dev/null +++ b/lib/flutter_alibc.dart @@ -0,0 +1,264 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_alibc/albc_tools.dart'; +import 'package:flutter_alibc/alibc_const_key.dart'; +import 'package:flutter_alibc/alibc_model.dart'; + +class FlutterAlibc { + // static StreamController _responseTaoKeLoginController = new StreamController.broadcast(); + // static Stream get responseFromShare => + // _responseTaoKeLoginController.stream; + + // static Future _handler(MethodCall methodCall) { + // if ("taoKeLogin" == methodCall.method) { + // _responseTaoKeLoginController.sink.add(methodCall.arguments); + // } + // return Future.value(true); + // } + + // 通信的桥接类 + static final MethodChannel _channel = const MethodChannel("flutter_alibc"); + // ..setMethodCallHandler(_handler); + + static Future get platformVersion async { + final String version = await _channel.invokeMethod('getPlatformVersion'); + return version; + } + + ///初始化 + ///version:当前app版本 + ///appName:当前app名称 + ///result:{ + /// errorCode, //0为初始化成功,其他为失败 + /// errorMessage, //message + ///} + static Future initAlibc({String version, String appName}) async { + Map result = await _channel + .invokeMethod("initAlibc", {"version": version, "appName": appName}); + return InitModel( + result[AlibcConstKey.errorCode], result[AlibcConstKey.errorMessage]); + } + + /// + /// @description: 登录淘宝 + /// + /// @return: 成功则返回的data为用户信息,失败则没有data + /// + static Future loginTaoBao() async { + Map result = await _channel.invokeMethod("loginTaoBao"); + // 判断成功还是失败 + if (result[AlibcConstKey.errorCode] != "0") { + return LoginModel( + result[AlibcConstKey.errorCode], + result[AlibcConstKey.errorMessage], + ); + } + return LoginModel( + result[AlibcConstKey.errorCode], result[AlibcConstKey.errorMessage], + data: UserModel( + result[AlibcConstKey.data]["nick"], + result[AlibcConstKey.data]["avatarUrl"], + result[AlibcConstKey.data]["openId"], + result[AlibcConstKey.data]["openSid"], + result[AlibcConstKey.data]["topAccessToken"], + result[AlibcConstKey.data]["topAuthCode"])); + } + + /// + /// @description: 退出淘宝登录 + /// @param {type} + /// @return: + /// + static loginOut() { + _channel.invokeMethod("loginOut"); + } + + /// + /// @description: 渠道授权,获取access_token + /// @param {type} + /// @return: + /// Map + static Future> taoKeLogin({ + @required String url, + AlibcOpenType openType = AlibcOpenType.AlibcOpenTypeAuto, + bool isNeedCustomNativeFailMode = false, + AlibcNativeFailMode nativeFailMode = + AlibcNativeFailMode.AlibcNativeFailModeNone, + AlibcSchemeType schemeType = AlibcSchemeType.AlibcSchemeTaoBao, + TaokeParams taokeParams, + String backUrl, + }) async { + Map taoKe = AlibcTools.getTaokeMap(taokeParams); + Map result = await _channel.invokeMethod("taoKeLogin", { + "url": url, + "openType": openType.index, + "isNeedCustomNativeFailMode": isNeedCustomNativeFailMode, + "nativeFailMode": nativeFailMode.index, + "schemeType": schemeType.index, + "taokeParams": taoKe, + "backUrl": backUrl + }); + + return result; + } + + /// + /// @description: 通过url打开,包括h5,唤起手淘等 + /// @param + /// url:目标url + /// openType:打开类型 + /// isNeedCustomNativeFailMode:是否需要设置唤端失败策略 + /// nativeFailMode:唤端失败策略 + /// schemeType:唤起哪个端 + /// taokeParams:淘客数据 + /// backUrl: 跳转回来的url + /// @return: + /// + static Future openByUrl({ + @required String url, + AlibcOpenType openType = AlibcOpenType.AlibcOpenTypeAuto, + bool isNeedCustomNativeFailMode = false, + AlibcNativeFailMode nativeFailMode = + AlibcNativeFailMode.AlibcNativeFailModeNone, + AlibcSchemeType schemeType = AlibcSchemeType.AlibcSchemeTmall, + TaokeParams taokeParams, + String backUrl, + bool isAuth=false + }) async { + Map taoKe = AlibcTools.getTaokeMap(taokeParams); + Map result = await _channel.invokeMethod("openByUrl", { + "url": url, + "openType": openType.index, + "isNeedCustomNativeFailMode": isNeedCustomNativeFailMode, + "nativeFailMode": nativeFailMode.index, + "schemeType": schemeType.index, + "taokeParams": taoKe, + "backUrl": backUrl, + "auth":isAuth + }); + + TradeResult tradeResult = AlibcTools.getTradeResult(result); + return tradeResult; + } + + /// + /// @description: 打开商品详情 + /// @param + /// 同上 + /// itemID 商品id,可以是真实的也可以是混淆的 + /// isNeedPush iOS独占 + /// @return: + /// + static Future openItemDetail({ + @required String itemID, + // iOS独占 + // bool isNeedPush = false, + AlibcOpenType openType = AlibcOpenType.AlibcOpenTypeAuto, + bool isNeedCustomNativeFailMode = false, + AlibcNativeFailMode nativeFailMode = + AlibcNativeFailMode.AlibcNativeFailModeNone, + AlibcSchemeType schemeType = AlibcSchemeType.AlibcSchemeTmall, + TaokeParams taokeParams, + // 额外需要追踪的业务数据 + Map trackParam, + String backUrl, + }) async { + Map taoKe = AlibcTools.getTaokeMap(taokeParams); + Map result = await _channel.invokeMethod("openItemDetail", { + "itemID": itemID, + // "isNeedPush": isNeedPush, + "openType": openType.index, + "isNeedCustomNativeFailMode": isNeedCustomNativeFailMode, + "nativeFailMode": nativeFailMode.index, + "schemeType": schemeType.index, + "taokeParams": taoKe, + "trackParam": trackParam, + "backUrl": backUrl + }); + TradeResult tradeResult = AlibcTools.getTradeResult(result); + return tradeResult; + } + + /// + /// @description: 打开店铺 + /// @param {type} + /// shopId 店铺id + /// @return: + /// + static Future openShop({ + @required String shopId, + // iOS独占 + // bool isNeedPush = false, + AlibcOpenType openType = AlibcOpenType.AlibcOpenTypeAuto, + bool isNeedCustomNativeFailMode = false, + AlibcNativeFailMode nativeFailMode = + AlibcNativeFailMode.AlibcNativeFailModeNone, + AlibcSchemeType schemeType = AlibcSchemeType.AlibcSchemeTmall, + TaokeParams taokeParams, + // 额外需要追踪的业务数据 + Map trackParam, + String backUrl, + }) async { + Map taoKe = AlibcTools.getTaokeMap(taokeParams); + + Map result = await _channel.invokeMethod("openShop", { + "shopId": shopId, + // "isNeedPush": isNeedPush, + "openType": openType.index, + "isNeedCustomNativeFailMode": isNeedCustomNativeFailMode, + "nativeFailMode": nativeFailMode.index, + "schemeType": schemeType.index, + "taokeParams": taoKe, + "trackParam": trackParam, + "backUrl": backUrl + }); + TradeResult tradeResult = AlibcTools.getTradeResult(result); + return tradeResult; + } + + /// + /// @description: 打开购物车 + /// @param {type} + /// @return: + /// + static Future openCart({ + // iOS独占 + // bool isNeedPush = false, + AlibcOpenType openType = AlibcOpenType.AlibcOpenTypeAuto, + bool isNeedCustomNativeFailMode = false, + AlibcNativeFailMode nativeFailMode = + AlibcNativeFailMode.AlibcNativeFailModeNone, + AlibcSchemeType schemeType = AlibcSchemeType.AlibcSchemeTmall, + TaokeParams taokeParams, + // 额外需要追踪的业务数据 + Map trackParam, + String backUrl, + }) async { + Map taoKe = AlibcTools.getTaokeMap(taokeParams); + + Map result = await _channel.invokeMethod("openCart", { + // "isNeedPush": isNeedPush, + "openType": openType.index, + "isNeedCustomNativeFailMode": isNeedCustomNativeFailMode, + "nativeFailMode": nativeFailMode.index, + "schemeType": schemeType.index, + "taokeParams": taoKe, + "trackParam": trackParam, + "backUrl": backUrl + }); + TradeResult tradeResult = AlibcTools.getTradeResult(result); + return tradeResult; + } + + // 是否需要设置打点 + static syncForTaoke(bool isSync) { + _channel.invokeMethod("syncForTaoke", {"isSync": isSync}); + } + + // 是否需要 Native AliPay 接口 + static useAlipayNative(bool isNeed) { + _channel.invokeMethod("useAlipayNative", {"isNeed": isNeed}); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..c57bb09 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,188 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + archive: + dependency: transitive + description: + name: archive + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.11" + args: + dependency: transitive + description: + name: args + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.5.2" + async: + dependency: transitive + description: + name: async + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.5" + charcode: + dependency: transitive + description: + name: charcode + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.14.11" + convert: + dependency: transitive + description: + name: convert + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.1" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + image: + dependency: transitive + description: + name: image + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.1.4" + matcher: + dependency: transitive + description: + name: matcher + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.12.6" + meta: + dependency: transitive + description: + name: meta + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.8" + path: + dependency: transitive + description: + name: path + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.6.4" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.8.0+1" + petitparser: + dependency: transitive + description: + name: petitparser + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.4.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.5.5" + stack_trace: + dependency: transitive + description: + name: stack_trace + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.9.3" + stream_channel: + dependency: transitive + description: + name: stream_channel + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.0.5" + term_glyph: + dependency: transitive + description: + name: term_glyph + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.0" + test_api: + dependency: transitive + description: + name: test_api + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.2.11" + typed_data: + dependency: transitive + description: + name: typed_data + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.1.6" + vector_math: + dependency: transitive + description: + name: vector_math + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.8" + xml: + dependency: transitive + description: + name: xml + url: "https://pub.flutter-io.cn" + source: hosted + version: "3.5.0" +sdks: + dart: ">=2.4.0 <3.0.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..f5b58f8 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,58 @@ +name: flutter_alibc +description: flutter_alibc,flutter版本的阿里百川,android V4.0.0.8 ios V4.0.1。更新日期:2020-4-13 +version: 0.0.15 +author: wx +homepage: https://github.com/FlutterTaoBaoKe/flutter_alibc.git + +environment: + sdk: '>=2.1.0 <3.0.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. +flutter: + # This section identifies this Flutter project as a plugin project. + # The androidPackage and pluginClass identifiers should not ordinarily + # be modified. They are used by the tooling to maintain consistency when + # adding or updating assets for this project. + plugin: + androidPackage: com.wxwx.flutter_alibc + pluginClass: FlutterAlibcPlugin + # 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.dev/assets-and-images/#from-packages + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/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.dev/custom-fonts/#from-packages diff --git a/test/flutter_alibc_test.dart b/test/flutter_alibc_test.dart new file mode 100644 index 0000000..6c1c791 --- /dev/null +++ b/test/flutter_alibc_test.dart @@ -0,0 +1,21 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:flutter_alibc/flutter_alibc.dart'; + +void main() { + const MethodChannel channel = MethodChannel('flutter_alibc'); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { + expect(await FlutterAlibc.platformVersion, '42'); + }); +}