commit 9abac35b823b195f5a3a6c507c0d8e703165e3bf
Author: PH2 <1293456824@qq.com>
Date: Fri May 21 15:49:23 2021 +0800
1、初始化项目信息
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..41cc7d8
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 0.0.1
+
+* TODO: Describe initial release.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..ba75c69
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1 @@
+TODO: Add your license here.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5ed8d6e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,52 @@
+# 京东sdk的唤醒
+京东sdk在Flutter上的实现,通过它可以实现唤醒京东app打开京东任意的url,包括商品详情等功能。
+
+## 使用需知
+[京东官方接入文档](https://union.jd.com/helpcenter/13246-13248-46117),在android和ios分别加入安全图片。
+
+### ios
+ 在 Info.plist 文件中添加
+ ```dart
+ LSApplicationQueriesSchemes
+
+ openapp.jdmobile
+ jdlogin
+
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLSchemes
+
+ sdkback
+ 此处填入appkey
+
+
+
+ ```
+
+## 导入依赖
+```dart
+ import 'package:jdsdk/jdsdk.dart';
+```
+
+
+## 初始化
+```dart
+
+ Jdsdk.init(appKey: '', appSecret: '');
+```
+
+
+## 打开京东任意URL
+```dart
+ Jdsdk.openUrl( url: 'https://item.m.jd.com/product/100009963992.html');
+```
+
+
+
+
+
+
+
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..5496b0f
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,55 @@
+group 'com.jd.jdsdk'
+version '1.0'
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.5.0'
+ }
+}
+
+rootProject.allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+apply plugin: 'com.android.library'
+
+android {
+ compileSdkVersion 28
+
+ defaultConfig {
+ minSdkVersion 16
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+ lintOptions {
+ disable 'InvalidPackage'
+ }
+
+ sourceSets{
+ main{
+ jniLibs.srcDirs = ['src/libs']
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ dexOptions {
+ incremental true
+ }
+}
+
+dependencies{
+ //implementation files('src/libs/jdmasdk.jar')
+ compile fileTree(dir: 'libs', include: ['*.jar'])
+ implementation files('src/libs/JDSDK_h.jar')
+ implementation files('src/libs/cps_1.0.0.jar')
+}
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..7be3d8b
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,2 @@
+org.gradle.jvmargs=-Xmx1536M
+android.enableR8=true
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..01a286e
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+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/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..b8aeb88
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = 'jdsdk'
diff --git a/android/src/libs/JDSDK_h.jar b/android/src/libs/JDSDK_h.jar
new file mode 100755
index 0000000..dfeabc5
Binary files /dev/null and b/android/src/libs/JDSDK_h.jar differ
diff --git a/android/src/libs/arm64-v8a/libCPS.so b/android/src/libs/arm64-v8a/libCPS.so
new file mode 100755
index 0000000..ff07747
Binary files /dev/null and b/android/src/libs/arm64-v8a/libCPS.so differ
diff --git a/android/src/libs/armeabi-v7a/libCPS.so b/android/src/libs/armeabi-v7a/libCPS.so
new file mode 100755
index 0000000..37182ea
Binary files /dev/null and b/android/src/libs/armeabi-v7a/libCPS.so differ
diff --git a/android/src/libs/armeabi/libCPS.so b/android/src/libs/armeabi/libCPS.so
new file mode 100755
index 0000000..e567bec
Binary files /dev/null and b/android/src/libs/armeabi/libCPS.so differ
diff --git a/android/src/libs/cps_1.0.0.jar b/android/src/libs/cps_1.0.0.jar
new file mode 100755
index 0000000..72cf2bd
Binary files /dev/null and b/android/src/libs/cps_1.0.0.jar differ
diff --git a/android/src/libs/x86/libCPS.so b/android/src/libs/x86/libCPS.so
new file mode 100755
index 0000000..b70f831
Binary files /dev/null and b/android/src/libs/x86/libCPS.so differ
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..85e354b
--- /dev/null
+++ b/android/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/android/src/main/java/com/jd/jdsdk/JDHelper.java b/android/src/main/java/com/jd/jdsdk/JDHelper.java
new file mode 100644
index 0000000..cc07ffc
--- /dev/null
+++ b/android/src/main/java/com/jd/jdsdk/JDHelper.java
@@ -0,0 +1,180 @@
+package com.jd.jdsdk;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Handler;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.jd.kepler.res.ApkResources;
+import com.kepler.jd.Listener.AsyncInitListener;
+import com.kepler.jd.Listener.OpenAppAction;
+import com.kepler.jd.login.KeplerApiManager;
+import com.kepler.jd.sdk.bean.KelperTask;
+import com.kepler.jd.sdk.bean.KeplerAttachParameter;
+
+import org.json.JSONException;
+
+import java.lang.ref.WeakReference;
+import java.util.Map;
+
+import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.PluginRegistry;
+
+public class JDHelper {
+ private static JDHelper jdHelper;
+// private PluginRegistry.Registrar register;
+// private ActivityPluginBinding binding;
+ private WeakReference mActivity;
+ KelperTask mKelperTask;
+
+ Handler mHandler = new Handler();
+ KeplerAttachParameter mKeplerAttachParameter = new KeplerAttachParameter();//这个是即时性参数 可以设置
+ LoadingDialog dialog;
+
+
+ private Activity getActivity(){
+ return this.mActivity.get();
+// if(null != register){
+// return register.activity();
+// }else if(null != binding){
+// return binding.getActivity();
+// }
+// return null;
+ }
+
+ private void setActivity(final Activity activity) {
+ if (null != activity) {
+ this.mActivity = new WeakReference<>(activity);
+ }
+ }
+
+ OpenAppAction mOpenAppAction = new OpenAppAction() {
+
+ @Override
+ public void onStatus(final int status, final String url) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ if (status == OpenAppAction.OpenAppAction_start) {//开始状态未必一定执行,
+ dialogShow();
+ }else {
+ mKelperTask = null;
+ dialogDiss();
+ }
+ if(status == OpenAppAction.OpenAppAction_result_NoJDAPP) {
+ // Toast.makeText(getActivity(), "您未安装京东app,你可以手动打开以下链接地址:"+url+" ,code="+status, Toast.LENGTH_SHORT).show();
+ }else if(status == OpenAppAction.OpenAppAction_result_BlackUrl){
+ // Toast.makeText(getActivity(), "url不在白名单,你可以手动打开以下链接地址:"+url+" ,code="+status, Toast.LENGTH_SHORT).show();
+ }else if(status == OpenAppAction.OpenAppAction_result_ErrorScheme){
+ // Toast.makeText(getActivity(), "呼起协议异常"+" ,code="+status, Toast.LENGTH_SHORT).show();
+ }else if(status == OpenAppAction.OpenAppAction_result_APP){
+
+ }else if(status == OpenAppAction.OpenAppAction_result_NetError){
+ // Toast.makeText(getActivity(), ApkResources.getSingleton().getString("kepler_check_net")+" ,code="+status+" ,url="+url,Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+ }
+ };
+
+ private void dialogShow() {
+// if (dialog == null) {
+ if (getActivity() != null && !getActivity().isFinishing()) {
+ dialog = new LoadingDialog(getActivity());
+ dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ if (mKelperTask != null) {//取消
+ mKelperTask.setCancel(true);
+ }
+ }
+ });
+// }
+ dialog.show();
+ }
+ }
+
+ private void dialogDiss() {
+ if(dialog!=null)
+ dialog.dismiss();
+ }
+
+
+ //第一次调用getInstance register不能为空
+// public static JDHelper getInstance(final Context context){
+// if (jdHelper == null){
+// synchronized (JDHelper.class){
+// jdHelper = new JDHelper();
+// if (null != context) {
+// jdHelper.mContext = context;
+// }
+// }
+// }
+// return jdHelper;
+// }
+
+ //第一次调用getInstance register不能为空
+ public static JDHelper getInstance(ActivityPluginBinding binding){
+ if (jdHelper == null){
+ synchronized (JDHelper.class){
+ jdHelper = new JDHelper();
+ if(null != binding){
+ jdHelper.setActivity(binding.getActivity());
+ }
+ }
+ } else {
+ if (null != binding) jdHelper.setActivity(binding.getActivity());
+ }
+ return jdHelper;
+ }
+
+
+
+
+ /**
+ * 初始化开普勒
+ * @param call
+ * @param result
+ */
+ public void initKepler(MethodCall call, MethodChannel.Result result){
+ String appKey = call.argument("appKey");
+ String appSecret = call.argument("appSecret");
+ Log.d("flutter-taoke","initKepler"+getActivity());
+ KeplerApiManager.asyncInitSdk(getActivity().getApplication(), appKey, appSecret, new AsyncInitListener() {
+ @Override
+ public void onSuccess() {
+ result.success(PluginResponse.success(null).toMap());
+ }
+
+ @Override
+ public void onFailure() {
+ String errorCode = "-1";
+ String errorMsg = "初始化失败";
+ result.success(new PluginResponse(errorCode, errorMsg, null).toMap());
+ }
+ });
+ }
+
+
+ /**
+ * 通过URL方式打开
+ * @param call
+ * @param result
+ */
+ public void openUrl(MethodCall call, MethodChannel.Result result){
+ String url = call.argument("url");
+ if(TextUtils.isEmpty(url)){
+ return;
+ }
+ mKelperTask = KeplerApiManager.getWebViewService().openAppWebViewPage(getActivity(),
+ url,
+ mKeplerAttachParameter,
+ mOpenAppAction);
+ }
+
+}
diff --git a/android/src/main/java/com/jd/jdsdk/JdsdkPlugin.java b/android/src/main/java/com/jd/jdsdk/JdsdkPlugin.java
new file mode 100644
index 0000000..961d4cc
--- /dev/null
+++ b/android/src/main/java/com/jd/jdsdk/JdsdkPlugin.java
@@ -0,0 +1,65 @@
+package com.jd.jdsdk;
+
+import android.util.Log;
+
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.embedding.engine.plugins.activity.ActivityAware;
+import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
+import io.flutter.plugin.common.MethodChannel.Result;
+import io.flutter.plugin.common.PluginRegistry.Registrar;
+
+/** JdsdkPlugin */
+public class JdsdkPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware {
+ public static JDHelper mJDHelper;
+ private MethodChannel channel;
+ @Override
+ public void onAttachedToEngine( FlutterPluginBinding flutterPluginBinding) {
+// mJDHelper = JDHelper.getInstance(flutterPluginBinding.getApplicationContext());
+ channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "jdsdk");
+ channel.setMethodCallHandler(this);
+ }
+
+ @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("init")) {
+ mJDHelper.initKepler(call,result);
+ }else if (call.method.equals("openUrl")) {
+ Log.d("flutter-test","openUrl");
+ mJDHelper.openUrl(call,result);
+ }else {
+ result.notImplemented();
+ }
+ }
+
+ @Override
+ public void onDetachedFromEngine( FlutterPluginBinding binding) {
+ channel.setMethodCallHandler(null);
+ mJDHelper = null;
+ }
+
+ @Override
+ public void onAttachedToActivity( ActivityPluginBinding binding) {
+ Log.d("flutter-taoke","onAttachedToActivity"+binding);
+ mJDHelper = JDHelper.getInstance(binding);
+ }
+
+ @Override
+ public void onDetachedFromActivityForConfigChanges() {
+
+ }
+
+ @Override
+ public void onReattachedToActivityForConfigChanges( ActivityPluginBinding binding) {
+
+ }
+
+ @Override
+ public void onDetachedFromActivity() {
+
+ }
+}
diff --git a/android/src/main/java/com/jd/jdsdk/LoadingDialog.java b/android/src/main/java/com/jd/jdsdk/LoadingDialog.java
new file mode 100755
index 0000000..420debb
--- /dev/null
+++ b/android/src/main/java/com/jd/jdsdk/LoadingDialog.java
@@ -0,0 +1,28 @@
+package com.jd.jdsdk;
+
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Bundle;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+public class LoadingDialog extends Dialog {
+
+ private TextView tv;
+
+ public LoadingDialog(Context context) {
+ super(context, R.style.loadingDialogStyle);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.dialogloading);
+ tv = (TextView)findViewById(R.id.tv);
+ tv.setText("加载");
+ LinearLayout linearLayout = (LinearLayout)this.findViewById(R.id.LinearLayout);
+ linearLayout.getBackground().setAlpha(210);
+ }
+
+}
+
diff --git a/android/src/main/java/com/jd/jdsdk/PluginConstants.java b/android/src/main/java/com/jd/jdsdk/PluginConstants.java
new file mode 100755
index 0000000..77ac01f
--- /dev/null
+++ b/android/src/main/java/com/jd/jdsdk/PluginConstants.java
@@ -0,0 +1,12 @@
+package com.jd.jdsdk;
+
+
+public interface PluginConstants {
+
+ /**
+ * 超时时间设定
+ */
+ int TIMEOUT = 15;
+ String ERROR_CODE_EXCEPTION = "-99999";
+
+}
diff --git a/android/src/main/java/com/jd/jdsdk/PluginResponse.java b/android/src/main/java/com/jd/jdsdk/PluginResponse.java
new file mode 100755
index 0000000..ce00850
--- /dev/null
+++ b/android/src/main/java/com/jd/jdsdk/PluginResponse.java
@@ -0,0 +1,36 @@
+package com.jd.jdsdk;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.jd.jdsdk.PluginConstants.ERROR_CODE_EXCEPTION;
+
+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 static PluginResponse failed(Exception e){
+ return new PluginResponse(ERROR_CODE_EXCEPTION, "异常中止: " + e.getMessage(), null);
+ }
+
+ 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/res/drawable-xxhdpi/kepler_back_normal.png b/android/src/main/res/drawable-xxhdpi/kepler_back_normal.png
new file mode 100755
index 0000000..8ad35ee
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/kepler_back_normal.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/kepler_back_pressed.png b/android/src/main/res/drawable-xxhdpi/kepler_back_pressed.png
new file mode 100755
index 0000000..a2445e3
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/kepler_back_pressed.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/kepler_selcet_more_normal.png b/android/src/main/res/drawable-xxhdpi/kepler_selcet_more_normal.png
new file mode 100755
index 0000000..b338e95
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/kepler_selcet_more_normal.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/kepler_selcet_more_pressed.png b/android/src/main/res/drawable-xxhdpi/kepler_selcet_more_pressed.png
new file mode 100755
index 0000000..ca1de58
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/kepler_selcet_more_pressed.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/neterror.png b/android/src/main/res/drawable-xxhdpi/neterror.png
new file mode 100755
index 0000000..6177082
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/neterror.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/seclect_item_has_message.png b/android/src/main/res/drawable-xxhdpi/seclect_item_has_message.png
new file mode 100755
index 0000000..0764cb1
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/seclect_item_has_message.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/seclect_item_history.png b/android/src/main/res/drawable-xxhdpi/seclect_item_history.png
new file mode 100755
index 0000000..59f98d1
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/seclect_item_history.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/seclect_item_logout.png b/android/src/main/res/drawable-xxhdpi/seclect_item_logout.png
new file mode 100755
index 0000000..8621cc5
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/seclect_item_logout.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/seclect_item_no_has_message.png b/android/src/main/res/drawable-xxhdpi/seclect_item_no_has_message.png
new file mode 100755
index 0000000..22cab97
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/seclect_item_no_has_message.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/seclect_item_orderlist.png b/android/src/main/res/drawable-xxhdpi/seclect_item_orderlist.png
new file mode 100755
index 0000000..c8643bc
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/seclect_item_orderlist.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/seclect_item_serch.png b/android/src/main/res/drawable-xxhdpi/seclect_item_serch.png
new file mode 100755
index 0000000..99f97be
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/seclect_item_serch.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/select_bg.9.png b/android/src/main/res/drawable-xxhdpi/select_bg.9.png
new file mode 100755
index 0000000..13064b1
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/select_bg.9.png differ
diff --git a/android/src/main/res/drawable-xxhdpi/white.png b/android/src/main/res/drawable-xxhdpi/white.png
new file mode 100755
index 0000000..4dff046
Binary files /dev/null and b/android/src/main/res/drawable-xxhdpi/white.png differ
diff --git a/android/src/main/res/drawable/btn_reload.xml b/android/src/main/res/drawable/btn_reload.xml
new file mode 100755
index 0000000..1155166
--- /dev/null
+++ b/android/src/main/res/drawable/btn_reload.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/kepler_btn_back.xml b/android/src/main/res/drawable/kepler_btn_back.xml
new file mode 100755
index 0000000..063161c
--- /dev/null
+++ b/android/src/main/res/drawable/kepler_btn_back.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/kepler_btn_select_more.xml b/android/src/main/res/drawable/kepler_btn_select_more.xml
new file mode 100755
index 0000000..cc98efa
--- /dev/null
+++ b/android/src/main/res/drawable/kepler_btn_select_more.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/kepler_dialog_bk.xml b/android/src/main/res/drawable/kepler_dialog_bk.xml
new file mode 100755
index 0000000..b0cc3d5
--- /dev/null
+++ b/android/src/main/res/drawable/kepler_dialog_bk.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/kepler_dialog_button_ne.xml b/android/src/main/res/drawable/kepler_dialog_button_ne.xml
new file mode 100755
index 0000000..e8105ec
--- /dev/null
+++ b/android/src/main/res/drawable/kepler_dialog_button_ne.xml
@@ -0,0 +1,12 @@
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/kepler_dialog_button_po.xml b/android/src/main/res/drawable/kepler_dialog_button_po.xml
new file mode 100755
index 0000000..c515561
--- /dev/null
+++ b/android/src/main/res/drawable/kepler_dialog_button_po.xml
@@ -0,0 +1,21 @@
+
+
+
+ -
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/pressbar_color.xml b/android/src/main/res/drawable/pressbar_color.xml
new file mode 100755
index 0000000..9fb4502
--- /dev/null
+++ b/android/src/main/res/drawable/pressbar_color.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/drawable/sdk_title_bg_with_shadow.xml b/android/src/main/res/drawable/sdk_title_bg_with_shadow.xml
new file mode 100755
index 0000000..e2ce9cc
--- /dev/null
+++ b/android/src/main/res/drawable/sdk_title_bg_with_shadow.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/android/src/main/res/drawable/yuanjiao.xml b/android/src/main/res/drawable/yuanjiao.xml
new file mode 100755
index 0000000..28bb28e
--- /dev/null
+++ b/android/src/main/res/drawable/yuanjiao.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/dialogloading.xml b/android/src/main/res/layout/dialogloading.xml
new file mode 100755
index 0000000..a4d83ad
--- /dev/null
+++ b/android/src/main/res/layout/dialogloading.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/src/main/res/layout/item_tab_layout.xml b/android/src/main/res/layout/item_tab_layout.xml
new file mode 100755
index 0000000..579409a
--- /dev/null
+++ b/android/src/main/res/layout/item_tab_layout.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/kepler_mid_lin.xml b/android/src/main/res/layout/kepler_mid_lin.xml
new file mode 100755
index 0000000..66df9d0
--- /dev/null
+++ b/android/src/main/res/layout/kepler_mid_lin.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/kepler_simple_dialog_lay.xml b/android/src/main/res/layout/kepler_simple_dialog_lay.xml
new file mode 100755
index 0000000..7d869d5
--- /dev/null
+++ b/android/src/main/res/layout/kepler_simple_dialog_lay.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/more_select_item.xml b/android/src/main/res/layout/more_select_item.xml
new file mode 100755
index 0000000..1470530
--- /dev/null
+++ b/android/src/main/res/layout/more_select_item.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/neterror_layout.xml b/android/src/main/res/layout/neterror_layout.xml
new file mode 100755
index 0000000..05da19f
--- /dev/null
+++ b/android/src/main/res/layout/neterror_layout.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/sdk_title_layout.xml b/android/src/main/res/layout/sdk_title_layout.xml
new file mode 100755
index 0000000..151d35e
--- /dev/null
+++ b/android/src/main/res/layout/sdk_title_layout.xml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/layout/web_bottom_layout.xml b/android/src/main/res/layout/web_bottom_layout.xml
new file mode 100755
index 0000000..9842764
--- /dev/null
+++ b/android/src/main/res/layout/web_bottom_layout.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/res/raw/safe.jpg b/android/src/main/res/raw/safe.jpg
new file mode 100755
index 0000000..dd93252
Binary files /dev/null and b/android/src/main/res/raw/safe.jpg differ
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
new file mode 100755
index 0000000..91bd98c
--- /dev/null
+++ b/android/src/main/res/values/strings.xml
@@ -0,0 +1,45 @@
+
+
+ sdk
+ Illegal application ,check init !
+ 请检查您的网络环境
+ 订单中心
+ 最近浏览
+ 搜索
+ 消息
+ 退出登录
+ "下单后24小时内未支付成功,订单将被取消,请尽快完成支付。"
+ 确定要离开收银台
+ 继续支付
+ 确认离开
+ 注销成功
+ 未登录
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/src/main/res/values/styles.xml b/android/src/main/res/values/styles.xml
new file mode 100755
index 0000000..ae75bb6
--- /dev/null
+++ b/android/src/main/res/values/styles.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/example/.dart_tool/package_config.json b/example/.dart_tool/package_config.json
new file mode 100644
index 0000000..66ac825
--- /dev/null
+++ b/example/.dart_tool/package_config.json
@@ -0,0 +1,152 @@
+{
+ "configVersion": 2,
+ "packages": [
+ {
+ "name": "async",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/async-2.5.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "boolean_selector",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/boolean_selector-2.1.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "characters",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/characters-1.1.0-nullsafety.3",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "charcode",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/charcode-1.2.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "clock",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/clock-1.1.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "collection",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/collection-1.15.0-nullsafety.3",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "cupertino_icons",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/cupertino_icons-0.1.3",
+ "packageUri": "lib/",
+ "languageVersion": "2.0"
+ },
+ {
+ "name": "fake_async",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/fake_async-1.2.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "flutter",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/packages/flutter",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "flutter_test",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/packages/flutter_test",
+ "packageUri": "lib/",
+ "languageVersion": "2.2"
+ },
+ {
+ "name": "jdsdk",
+ "rootUri": "../../",
+ "packageUri": "lib/",
+ "languageVersion": "2.1"
+ },
+ {
+ "name": "matcher",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/matcher-0.12.10-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "meta",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/meta-1.3.0-nullsafety.3",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "path",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/path-1.8.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "sky_engine",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/bin/cache/pkg/sky_engine",
+ "packageUri": "lib/",
+ "languageVersion": "1.11"
+ },
+ {
+ "name": "source_span",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/source_span-1.8.0-nullsafety.2",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "stack_trace",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/stack_trace-1.10.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "stream_channel",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/stream_channel-2.1.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "string_scanner",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/string_scanner-1.1.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "term_glyph",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/term_glyph-1.2.0-nullsafety.1",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "test_api",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/test_api-0.2.19-nullsafety.2",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "typed_data",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/typed_data-1.3.0-nullsafety.3",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "vector_math",
+ "rootUri": "file:///Users/fnuoos/development/flutter/flutter/.pub-cache/hosted/pub.flutter-io.cn/vector_math-2.1.0-nullsafety.3",
+ "packageUri": "lib/",
+ "languageVersion": "2.10"
+ },
+ {
+ "name": "jdsdk_example",
+ "rootUri": "../",
+ "packageUri": "lib/",
+ "languageVersion": "2.1"
+ }
+ ],
+ "generated": "2021-05-21T07:44:13.030851Z",
+ "generator": "pub",
+ "generatorVersion": "2.10.0"
+}
diff --git a/example/README.md b/example/README.md
new file mode 100644
index 0000000..5e81647
--- /dev/null
+++ b/example/README.md
@@ -0,0 +1,16 @@
+# jdsdk_example
+
+Demonstrates how to use the jdsdk 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..6a34731
--- /dev/null
+++ b/example/android/app/build.gradle
@@ -0,0 +1,83 @@
+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 "com.youliapp"
+ minSdkVersion 16
+ targetSdkVersion 28
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+ }
+
+ signingConfigs {
+ debug {
+ storeFile file("youli.jks")
+ storePassword "youli123456"
+ keyAlias "youli"
+ keyPassword "youli123456"
+ }
+ release {
+ storeFile file("youli.jks")
+ storePassword "youli123456"
+ keyAlias "youli"
+ keyPassword "youli123456"
+ }
+ }
+
+ buildTypes {
+ debug {
+
+ signingConfig signingConfigs.debug
+ }
+ release {
+ ndk{ // 必须加入这部分,否则可能导致编译成功的release包在真机中会闪退
+ abiFilters 'armeabi-v7a'
+ }
+
+
+ signingConfig signingConfigs.release
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'com.android.support.test:runner:1.0.2'
+ androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+}
diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000..b4f7367
--- /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..d40ef41
--- /dev/null
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/example/android/app/src/main/java/com/jd/jdsdk_example/MainActivity.java b/example/android/app/src/main/java/com/jd/jdsdk_example/MainActivity.java
new file mode 100644
index 0000000..227b279
--- /dev/null
+++ b/example/android/app/src/main/java/com/jd/jdsdk_example/MainActivity.java
@@ -0,0 +1,13 @@
+package com.jd.jdsdk_example;
+
+import android.support.annotation.NonNull;
+import io.flutter.embedding.android.FlutterActivity;
+import io.flutter.embedding.engine.FlutterEngine;
+import io.flutter.plugins.GeneratedPluginRegistrant;
+
+public class MainActivity extends FlutterActivity {
+ @Override
+ public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
+ GeneratedPluginRegistrant.registerWith(flutterEngine);
+ }
+}
diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 0000000..304732f
--- /dev/null
+++ b/example/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..db77bb4
Binary files /dev/null and b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
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 0000000..17987b7
Binary files /dev/null and b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..09d4391
Binary files /dev/null and b/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
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 0000000..d5f1c8d
Binary files /dev/null and b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
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 0000000..4d6372e
Binary files /dev/null and b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/example/android/app/src/main/res/raw/safe.jpg b/example/android/app/src/main/res/raw/safe.jpg
new file mode 100755
index 0000000..dd93252
Binary files /dev/null and b/example/android/app/src/main/res/raw/safe.jpg differ
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..b4f7367
--- /dev/null
+++ b/example/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/example/android/app/youli.jks b/example/android/app/youli.jks
new file mode 100755
index 0000000..e9b90f3
Binary files /dev/null and b/example/android/app/youli.jks differ
diff --git a/example/android/build.gradle b/example/android/build.gradle
new file mode 100644
index 0000000..e0d7ae2
--- /dev/null
+++ b/example/android/build.gradle
@@ -0,0 +1,29 @@
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.5.0'
+ }
+}
+
+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..7be3d8b
--- /dev/null
+++ b/example/android/gradle.properties
@@ -0,0 +1,2 @@
+org.gradle.jvmargs=-Xmx1536M
+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/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/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/Podfile b/example/ios/Podfile
new file mode 100644
index 0000000..18252c1
--- /dev/null
+++ b/example/ios/Podfile
@@ -0,0 +1,88 @@
+source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
+# Uncomment this line to define a global platform for your project
+# platform :ios, '9.0'
+
+# 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
+ generated_key_values = {}
+ skip_line_start_symbols = ["#", "/"]
+ File.foreach(file_abs_path) do |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)
+ generated_key_values[podname] = podpath
+ else
+ puts "Invalid plugin specification: #{line}"
+ end
+ end
+ generated_key_values
+end
+
+target 'Runner' do
+ # Flutter Pod
+
+ copied_flutter_dir = File.join(__dir__, 'Flutter')
+ copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
+ copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
+ unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
+ # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
+ # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
+ # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.
+
+ generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+ generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
+ cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];
+
+ unless File.exist?(copied_framework_path)
+ FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
+ end
+ unless File.exist?(copied_podspec_path)
+ FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
+ end
+ end
+
+ # Keep pod path relative so it can be checked into Podfile.lock.
+ pod 'Flutter', :path => 'Flutter'
+
+ # Plugin Pods
+
+ # 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')
+ plugin_pods = parse_KV_file('../.flutter-plugins')
+ plugin_pods.each do |name, path|
+ symlink = File.join('.symlinks', 'plugins', name)
+ File.symlink(path, symlink)
+ pod name, :path => File.join(symlink, 'ios')
+ end
+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/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..a42ec42
--- /dev/null
+++ b/example/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,607 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 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, ); }; };
+ 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 */; };
+ A31FE98324950D9E00FEDE87 /* JDSDK.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A31FE98224950D9E00FEDE87 /* JDSDK.bundle */; };
+ A31FE98D2495146800FEDE87 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A31FE98C2495146800FEDE87 /* libz.tbd */; };
+ A31FE98F2495148000FEDE87 /* libsqlite3.0.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A31FE98E2495148000FEDE87 /* libsqlite3.0.tbd */; };
+ A31FE9912495149300FEDE87 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A31FE9902495149200FEDE87 /* UIKit.framework */; };
+ A31FE993249514A800FEDE87 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A31FE992249514A800FEDE87 /* Foundation.framework */; };
+ A31FE995249514BD00FEDE87 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A31FE994249514BD00FEDE87 /* SystemConfiguration.framework */; };
+ A31FE997249514D100FEDE87 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A31FE996249514D100FEDE87 /* libc++.tbd */; };
+ FDB4D935BBFBFD2B2A89CD19 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F827864C7F706BED6CF0EF52 /* libPods-Runner.a */; };
+/* 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 */
+ 0A4D668FFA3C1915E59740BF /* 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 = ""; };
+ 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 = ""; };
+ 6D9FEBBE040E60612181279B /* 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 = ""; };
+ 6EE548F39D08AC87D8ABAFA7 /* 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 = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
+ 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 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 = ""; };
+ A31FE98224950D9E00FEDE87 /* JDSDK.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = JDSDK.bundle; sourceTree = ""; };
+ A31FE98C2495146800FEDE87 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
+ A31FE98E2495148000FEDE87 /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; };
+ A31FE9902495149200FEDE87 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
+ A31FE992249514A800FEDE87 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+ A31FE994249514BD00FEDE87 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+ A31FE996249514D100FEDE87 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
+ F827864C7F706BED6CF0EF52 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A31FE997249514D100FEDE87 /* libc++.tbd in Frameworks */,
+ A31FE995249514BD00FEDE87 /* SystemConfiguration.framework in Frameworks */,
+ A31FE993249514A800FEDE87 /* Foundation.framework in Frameworks */,
+ A31FE9912495149300FEDE87 /* UIKit.framework in Frameworks */,
+ A31FE98F2495148000FEDE87 /* libsqlite3.0.tbd in Frameworks */,
+ A31FE98D2495146800FEDE87 /* libz.tbd in Frameworks */,
+ 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
+ 3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
+ FDB4D935BBFBFD2B2A89CD19 /* libPods-Runner.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 7304590FFB147EB9EADBE523 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 0A4D668FFA3C1915E59740BF /* Pods-Runner.debug.xcconfig */,
+ 6EE548F39D08AC87D8ABAFA7 /* Pods-Runner.release.xcconfig */,
+ 6D9FEBBE040E60612181279B /* 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 */,
+ 7304590FFB147EB9EADBE523 /* Pods */,
+ EA55A1BE55302243B2C60E74 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ A31FE98224950D9E00FEDE87 /* JDSDK.bundle */,
+ 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
+ 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 97C146F11CF9000F007C117D /* Supporting Files */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+ 97C146F11CF9000F007C117D /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146F21CF9000F007C117D /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "";
+ };
+ EA55A1BE55302243B2C60E74 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ A31FE996249514D100FEDE87 /* libc++.tbd */,
+ A31FE994249514BD00FEDE87 /* SystemConfiguration.framework */,
+ A31FE992249514A800FEDE87 /* Foundation.framework */,
+ A31FE9902495149200FEDE87 /* UIKit.framework */,
+ A31FE98E2495148000FEDE87 /* libsqlite3.0.tbd */,
+ A31FE98C2495146800FEDE87 /* libz.tbd */,
+ F827864C7F706BED6CF0EF52 /* 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 = (
+ A84EC66439E8C249947ADAE0 /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ 1CFC39450337D914C9168AA8 /* [CP] Embed Pods Frameworks */,
+ );
+ 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 = ZMCJ78285X;
+ };
+ };
+ };
+ 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 */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ A31FE98324950D9E00FEDE87 /* JDSDK.bundle in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 1CFC39450337D914C9168AA8 /* [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;
+ };
+ 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";
+ };
+ 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";
+ };
+ A84EC66439E8C249947ADAE0 /* [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;
+ };
+/* 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;
+ SUPPORTED_PLATFORMS = 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;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = ZMCJ78285X;
+ 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",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.youliapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ 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;
+ SUPPORTED_PLATFORMS = 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;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = ZMCJ78285X;
+ 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",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.youliapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = ZMCJ78285X;
+ 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",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.youliapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ 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..70e8393
--- /dev/null
+++ b/example/ios/Runner/AppDelegate.m
@@ -0,0 +1,13 @@
+#import "AppDelegate.h"
+#import "GeneratedPluginRegistrant.h"
+
+@implementation AppDelegate
+
+- (BOOL)application:(UIApplication *)application
+ didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ [GeneratedPluginRegistrant registerWithRegistry:self];
+ // Override point for customization after application launch.
+ return [super application:application didFinishLaunchingWithOptions:launchOptions];
+}
+
+@end
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..d36b1fa
--- /dev/null
+++ b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 0000000..dc9ada4
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 0000000..28c6bf0
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
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 0000000..f091b6b
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 0000000..4cde121
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
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 0000000..d0ef06e
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 0000000..dcdc230
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 0000000..2ccbfd9
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
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 0000000..c8f9ed8
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
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 0000000..a6d6b86
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
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 0000000..a6d6b86
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
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 0000000..75b2d16
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
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 0000000..c4df70d
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 0000000..6a84f41
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 0000000..d0e1f58
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 0000000..0bedcf2
--- /dev/null
+++ b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 0000000..9da19ea
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
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 0000000..9da19ea
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
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 0000000..9da19ea
Binary files /dev/null and b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
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..9e326c8
--- /dev/null
+++ b/example/ios/Runner/Info.plist
@@ -0,0 +1,62 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ jdsdk_example
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleURLTypes
+
+
+ CFBundleTypeRole
+ Editor
+ CFBundleURLSchemes
+
+ sdkback
+ 此处填入appkey
+
+
+
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSApplicationQueriesSchemes
+
+ openapp.jdmobile
+ jdlogin
+
+ LSRequiresIPhoneOS
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/example/ios/Runner/JDSDK.bundle/safe.jpg b/example/ios/Runner/JDSDK.bundle/safe.jpg
new file mode 100755
index 0000000..0d53589
--- /dev/null
+++ b/example/ios/Runner/JDSDK.bundle/safe.jpg
@@ -0,0 +1 @@
+ցJv.+
\ No newline at end of file
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/lib/main.dart b/example/lib/main.dart
new file mode 100644
index 0000000..ca63b5b
--- /dev/null
+++ b/example/lib/main.dart
@@ -0,0 +1,85 @@
+import 'package:flutter/material.dart';
+import 'dart:async';
+
+import 'package:flutter/services.dart';
+import 'package:jdsdk/jdsdk.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();
+ 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 Jdsdk.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;
+ });
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ home: Scaffold(
+ appBar: AppBar(
+ title: const Text('Plugin example app'),
+ ),
+ body: Column(
+ children: [
+ InkWell(
+ onTap: ()async{
+ //android
+ var result= await Jdsdk.init(appKey: '', appSecret: '');
+ print(result);
+ },
+ child: Center(
+ child: Text(
+ '测试初迟化'
+ ),
+ ),
+ ),
+ SizedBox(
+ height: 100,
+ ),
+
+ InkWell(
+ onTap: ()async{
+ var result = await Jdsdk.openUrl( url: 'https://item.m.jd.com/product/100009963992.html?wxa_abtest=o&utm_user=plusmember&ad_od=share&utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&utm_term=CopyURL');
+ print(result);
+ },
+ child: Center(
+ child: Text(
+ '测试打开京东'
+ ),
+ ),
+ ),
+
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/example/pubspec.yaml b/example/pubspec.yaml
new file mode 100644
index 0000000..3fca0a3
--- /dev/null
+++ b/example/pubspec.yaml
@@ -0,0 +1,63 @@
+name: jdsdk_example
+description: Demonstrates how to use the jdsdk 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
+
+ jdsdk:
+ 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..6bcdbb1
--- /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:jdsdk_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/Assets/.gitkeep b/ios/Assets/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/ios/Classes/Handler/FlutterKeplerHandler.h b/ios/Classes/Handler/FlutterKeplerHandler.h
new file mode 100644
index 0000000..6f60446
--- /dev/null
+++ b/ios/Classes/Handler/FlutterKeplerHandler.h
@@ -0,0 +1,18 @@
+
+
+#import
+#import
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FlutterKeplerHandler : NSObject
+//初始化
+- (void)initKepler:(FlutterMethodCall *)call result:(FlutterResult)result;
+// * 通过URL打开任意商品页面
+- (void)keplerPageWithURL:(FlutterMethodCall *)call result:(FlutterResult)result;
+
+//设置进度条颜色
+- (void)setKeplerProgressBarColor:(FlutterMethodCall *)call result:(FlutterResult)result;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/ios/Classes/Handler/FlutterKeplerHandler.m b/ios/Classes/Handler/FlutterKeplerHandler.m
new file mode 100644
index 0000000..d765674
--- /dev/null
+++ b/ios/Classes/Handler/FlutterKeplerHandler.m
@@ -0,0 +1,43 @@
+
+
+#import "FlutterKeplerHandler.h"
+#import
+@implementation FlutterKeplerHandler
+//初始化开普勒
+- (void)initKepler:(FlutterMethodCall *)call result:(FlutterResult)result {
+ NSString *appKey = call.arguments[@"appKey"];
+ NSString *appSecret = call.arguments[@"appSecret"];
+ NSLog (@"appKey is :%@", appKey);
+ NSLog (@"appSecret is :%@", appSecret);
+ [[KeplerApiManager sharedKPService]asyncInitSdk:appKey secretKey:appSecret sucessCallback:^(){
+ NSLog (@"success");
+ result(@"{status:1}");
+ }failedCallback:^(NSError *error){
+ NSLog (@"fail");
+ result(@"{status:0}");
+ }];
+}
+
+- (void)keplerPageWithURL:(FlutterMethodCall *)call result:(FlutterResult)result {
+ NSString *url = call.arguments[@"url"];
+ // NSInteger jumpType = [call.arguments[@"jumpType"] integerValue];
+ NSInteger jumpType = [[NSNumber numberWithInt:1] integerValue];
+// NSDictionary *userInfo = [FlutterKeplerTools nullToNil:call.arguments[@"userInfo"]];
+ UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
+
+
+ if ([[UIApplication sharedApplication]canOpenURL:[NSURL URLWithString:[NSString stringWithFormat:@"openapp.jdmobile://"]]]) {//判断是否安装京东app
+ [ [KeplerApiManager sharedKPService]openKeplerPageWithURL:url userInfo:nil successCallback:^{
+ NSLog (@"success");
+ result(@"{status:1}");
+ } failedCallback:^(NSInteger code, NSString * _Nonnull url) {
+ NSLog (@"fail");
+ result(@"{status:0}");
+ }];
+ }else{
+ result(@"{status:0}");
+ }
+
+}
+
+@end
diff --git a/ios/Classes/JdsdkPlugin.h b/ios/Classes/JdsdkPlugin.h
new file mode 100644
index 0000000..d3615a1
--- /dev/null
+++ b/ios/Classes/JdsdkPlugin.h
@@ -0,0 +1,4 @@
+#import
+
+@interface JdsdkPlugin : NSObject
+@end
diff --git a/ios/Classes/JdsdkPlugin.m b/ios/Classes/JdsdkPlugin.m
new file mode 100644
index 0000000..218459c
--- /dev/null
+++ b/ios/Classes/JdsdkPlugin.m
@@ -0,0 +1,47 @@
+#import "JdsdkPlugin.h"
+#import
+#import "FlutterKeplerHandler.h"
+
+@interface JdsdkPlugin()
+@property(nonatomic,strong) FlutterKeplerHandler *keplerHandler;
+@end
+
+
+@implementation JdsdkPlugin
++ (void)registerWithRegistrar:(NSObject*)registrar {
+ NSLog(@"registerWithRegistrar");
+ FlutterMethodChannel* channel = [FlutterMethodChannel
+ methodChannelWithName:@"jdsdk"
+ binaryMessenger:[registrar messenger]];
+ // JdsdkPlugin* instance = [[JdsdkPlugin alloc] init];
+ //将 JdsdkPlugin 的无参 init 函数调整为 initWithRegistrar
+ JdsdkPlugin* instance = [[JdsdkPlugin alloc] initWithRegistrar:registrar];
+ [registrar addMethodCallDelegate:instance channel:channel];
+}
+
+- (instancetype)initWithRegistrar:(NSObject *)registrar {
+ NSLog(@"initWithRegistrar");
+ self = [super init];
+
+ if (self) {
+ self.keplerHandler = [[FlutterKeplerHandler alloc]init];
+ }
+
+ return self;
+}
+
+
+- (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
+ if ([@"getPlatformVersion" isEqualToString:call.method]) {
+ result([@"iOS " stringByAppendingString:[[UIDevice currentDevice] systemVersion]]);
+ } else if ([@"init" isEqualToString:call.method]) {
+ NSLog(@"init flutter");
+ [_keplerHandler initKepler:call result:result];
+ }else if ([@"openUrl" isEqualToString:call.method]) {
+ [_keplerHandler keplerPageWithURL:call result:result];
+ }else {
+ result(FlutterMethodNotImplemented);
+ }
+}
+
+@end
diff --git a/ios/Framework/JDSDK.framework/Headers/JDKeplerSDK.h b/ios/Framework/JDSDK.framework/Headers/JDKeplerSDK.h
new file mode 100755
index 0000000..a42aa65
--- /dev/null
+++ b/ios/Framework/JDSDK.framework/Headers/JDKeplerSDK.h
@@ -0,0 +1,20 @@
+//
+// JDKeplerSDK.h
+// JDKeplerSDK
+//
+// Created by JD.K on 16/3/15.
+// Copyright © 2016年 JD.K. All rights reserved.
+//
+
+#import
+
+//! Project version number for JDKeplerSDK.
+FOUNDATION_EXPORT double JDKeplerSDKVersionNumber;
+
+//! Project version string for JDKeplerSDK.
+FOUNDATION_EXPORT const unsigned char JDKeplerSDKVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import
+#import
+
+
diff --git a/ios/Framework/JDSDK.framework/Headers/KeplerApiManager.h b/ios/Framework/JDSDK.framework/Headers/KeplerApiManager.h
new file mode 100755
index 0000000..89824a9
--- /dev/null
+++ b/ios/Framework/JDSDK.framework/Headers/KeplerApiManager.h
@@ -0,0 +1,111 @@
+//
+// KeplerApiManager.h
+// KeplerApp
+// 提供Kepler服务
+// Created by JD.K on 16/6/20.
+// Copyright © 2016年 JD.K. All rights reserved.
+// version 3.0.1
+
+#import
+#import
+
+/** 初始化成功回调 */
+typedef void (^initSuccessCallback)();
+/** 初始化失败回调 */
+typedef void (^initFailedCallback)(NSError * _Nonnull error);
+/**
+ 打开成功回调
+ */
+typedef void(^OpenSuccessBlock)();
+
+/**
+ * 响应失败的错误回调,返回一个错误的链接或信息
+ */
+typedef void(^OpenFailedBlock)(NSInteger code, NSString * _Nonnull url);
+
+typedef enum {
+ KeplerErrorCodeUnInstalled = 422, //未安装京东app
+ KeplerErrorCodeWhited, //本地url不在白名单中
+ KeplerErrorCodeResponsed, //本地呼起open协议失败
+ KeplerErrorCodeNoSid, //sid为空
+ KeplerErrorCodeInValidApp //应用不合法
+} KeplerErrorCode;
+
+
+@interface KeplerApiManager : NSObject
+
+/**
+ 分佣的 AppKey2
+ */
+@property (nonatomic, copy) NSString *secondAppKey;
+//********************************* 通过京东APP打开链接相关参数 ************************************
+
+/**
+ 当isOpenByH5为 NO 时,准备跳转到JD APP时会调用这些代码。可以把开启 Loading动画的代码放到这里
+ 为避免造成混乱,在关闭Kepler界面时,会置为nil。因此需要在每次打开Kepler之前单独设置。
+ */
+@property (nonatomic, copy) void(^startOpenJDAppBlock)();
+
+/**
+ 当isOpenByH5为 NO 时,跳转JD APP准备工作完成时会调用这些代码,success为YES表示成功,可以打开JD APP,为NO时表示打开失败。
+ 为避免造成混乱,在关闭Kepler界面时,会置为nil。因此需要在每次打开Kepler之前单独设置。
+
+ update: success为NO且错误码等于-1005时,安全id为空
+ */
+@property (nonatomic, copy) void(^finishOpenJDAppBlock)(BOOL success,NSError *error);
+
+/**
+ * 京东达人内容ID 关闭kepler界面时会清除 如果需要此值 再次打开需要再次设置
+ **/
+@property (nonatomic, copy) NSString *actId;
+
+/**
+ * 京东达人 内容渠道扩展字段 关闭kepler界面时会清除 如果需要此值 再次打开需要再次设置
+ **/
+@property (nonatomic, copy) NSString *ext;
+
+/**
+ * 是否走服务端的渠道,默认走本地渠道
+ */
+@property (nonatomic, assign) BOOL isServerChannel;
+
+/**
+ 打开京东超时时间设置 关闭 Kepler 界面时不会重置 默认为60
+ */
+@property (nonatomic, assign) NSTimeInterval openJDTimeout;
+
+
+//*******************************************************************************************************
+
+/**
+ * KeplerApiManager 单例
+ *
+ * @return KeplerApiManager 单例
+ */
++ (KeplerApiManager *)sharedKPService;
+
+/**
+ * 注册Kepler 服务
+ *
+ * @param appKey 注册的appKey
+ * @param appSecret 注册的secretKey
+ */
+- (void)asyncInitSdk:(NSString *)appKey
+ secretKey:(NSString *)appSecret
+ sucessCallback:(initSuccessCallback)sucessCallback
+ failedCallback:(initFailedCallback)failedCallback;
+
+/**
+ 跳转京东app
+
+ @param url 调用方传入的URl参数
+ @param userInfo 调用sdk时传入的kepler自定义参数
+ @param failedCallback code 表示错误编码, url 引起调用失败的url
+ */
+- (void)openKeplerPageWithURL:(NSString *)url
+ userInfo:(NSDictionary *)userInfo
+ successCallback:(OpenSuccessBlock _Nullable)success
+ failedCallback:(OpenFailedBlock _Nonnull)failure;
+
+@end
+
diff --git a/ios/Framework/JDSDK.framework/Info.plist b/ios/Framework/JDSDK.framework/Info.plist
new file mode 100755
index 0000000..b90090a
Binary files /dev/null and b/ios/Framework/JDSDK.framework/Info.plist differ
diff --git a/ios/Framework/JDSDK.framework/JDSDK b/ios/Framework/JDSDK.framework/JDSDK
new file mode 100755
index 0000000..7dffc92
Binary files /dev/null and b/ios/Framework/JDSDK.framework/JDSDK differ
diff --git a/ios/Framework/JDSDK.framework/Modules/module.modulemap b/ios/Framework/JDSDK.framework/Modules/module.modulemap
new file mode 100755
index 0000000..c248781
--- /dev/null
+++ b/ios/Framework/JDSDK.framework/Modules/module.modulemap
@@ -0,0 +1,6 @@
+framework module JDKeplerSDK {
+ umbrella header "JDKeplerSDK.h"
+
+ export *
+ module * { export * }
+}
diff --git a/ios/jdsdk.podspec b/ios/jdsdk.podspec
new file mode 100644
index 0000000..e6750ed
--- /dev/null
+++ b/ios/jdsdk.podspec
@@ -0,0 +1,28 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html.
+# Run `pod lib lint jdsdk.podspec' to validate before publishing.
+#
+Pod::Spec.new do |s|
+ s.name = 'jdsdk'
+ s.version = '0.0.1'
+ s.summary = 'A new Flutter plugin.'
+ s.description = <<-DESC
+A new Flutter plugin.
+ 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.vendored_frameworks = 'Framework/*.framework'
+ # s.resource = ''
+
+ s.platform = :ios, '8.0'
+
+ # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
+end
diff --git a/lib/jdsdk.dart b/lib/jdsdk.dart
new file mode 100644
index 0000000..4089065
--- /dev/null
+++ b/lib/jdsdk.dart
@@ -0,0 +1,25 @@
+import 'dart:async';
+
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+
+class Jdsdk {
+ static const MethodChannel _channel = const MethodChannel('jdsdk');
+
+ static Future get platformVersion async {
+ final String version = await _channel.invokeMethod('getPlatformVersion');
+ return version;
+ }
+
+ ///初始化sdk
+ static Future init({@required String appKey, @required String appSecret}) async {
+ var result = await _channel.invokeMethod('init',{"appKey": appKey, "appSecret": appSecret});
+ return result?.toString();
+ }
+
+ ///打开京东任意url
+ static Future openUrl({@required String url}) async {
+ final String version = await _channel.invokeMethod('openUrl',{"url": url});
+ return version?.toString();
+ }
+}
diff --git a/pubspec.yaml b/pubspec.yaml
new file mode 100644
index 0000000..e97fa56
--- /dev/null
+++ b/pubspec.yaml
@@ -0,0 +1,60 @@
+name: jdsdk
+description: The implementation of Jingdong SDK on Flutter, through which you can realize the wake-up Jingdong app to open any URL of Jingdong, including product details and other functions.
+version: 0.0.1
+author: wuchaowen
+homepage: https://github.com/selfimgr/flutter_jdsdk.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.jd.jdsdk
+ pluginClass: JdsdkPlugin
+
+ # 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/jdsdk_test.dart b/test/jdsdk_test.dart
new file mode 100644
index 0000000..b6c1b65
--- /dev/null
+++ b/test/jdsdk_test.dart
@@ -0,0 +1,23 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:jdsdk/jdsdk.dart';
+
+void main() {
+ const MethodChannel channel = MethodChannel('jdsdk');
+
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ setUp(() {
+ channel.setMockMethodCallHandler((MethodCall methodCall) async {
+ return '42';
+ });
+ });
+
+ tearDown(() {
+ channel.setMockMethodCallHandler(null);
+ });
+
+ test('getPlatformVersion', () async {
+ expect(await Jdsdk.platformVersion, '42');
+ });
+}