diff --git a/platforms/android/android.json b/platforms/android/android.json
index 8d319b4..105b5f2 100644
--- a/platforms/android/android.json
+++ b/platforms/android/android.json
@@ -67,6 +67,46 @@
             {
               "xml": "<feature name=\"screenshotName\"><param name=\"android-package\" value=\"com.coffice.ScreenshotBlocker\" /><param name=\"onload\" value=\"true\" /></feature>",
               "count": 1
+            },
+            {
+              "xml": "<feature name=\"QQSDK\"><param name=\"android-package\" value=\"me.vanpan.qqsdk.QQSDKPlugin\" /></feature>",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"https://openmobile.qq.com/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://qzonestyle.gtimg.cn/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://pub.idqqimg.com/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://qzs.qq.com/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://m.qzone.com/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://*.ptlogin2.qq.com/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://*.qq.com/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<access origin=\"http://q2.qlogo.cn/*\" />",
+              "count": 1
+            },
+            {
+              "xml": "<preference name=\"QQ_APP_ID\" value=\"101885581\" />",
+              "count": 1
             }
           ]
         }
@@ -266,6 +306,34 @@
             }
           ]
         }
+      },
+      "app/src/main/AndroidManifest.xml": {
+        "parents": {
+          "/manifest": [
+            {
+              "xml": "<uses-permission android:name=\"android.permission.INTERNET\" />",
+              "count": 1
+            },
+            {
+              "xml": "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />",
+              "count": 1
+            },
+            {
+              "xml": "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
+              "count": 1
+            }
+          ],
+          "/manifest/application": [
+            {
+              "xml": "<activity android:launchMode=\"singleTask\" android:name=\"com.tencent.tauth.AuthActivity\" android:noHistory=\"true\"><intent-filter><action android:name=\"android.intent.action.VIEW\" /><category android:name=\"android.intent.category.DEFAULT\" /><category android:name=\"android.intent.category.BROWSABLE\" /><data android:scheme=\"tencent101885581\" /></intent-filter></activity>",
+              "count": 1
+            },
+            {
+              "xml": "<activity android:configChanges=\"orientation|keyboardHidden\" android:name=\"com.tencent.connect.common.AssistActivity\" android:screenOrientation=\"portrait\" android:theme=\"@android:style/Theme.Translucent.NoTitleBar\"></activity>",
+              "count": 1
+            }
+          ]
+        }
       }
     }
   },
@@ -329,6 +397,10 @@
     },
     "cordova-plugin-prevent-screenshot-coffice": {
       "PACKAGE_NAME": "com.dalipolice.app"
+    },
+    "cordova-plugin-qqsdk": {
+      "QQ_APP_ID": "101885581",
+      "PACKAGE_NAME": "com.dalipolice.app"
     }
   },
   "dependent_plugins": {},
@@ -684,6 +756,14 @@
       "clobbers": [
         "window.plugins.preventscreenshot"
       ]
+    },
+    {
+      "id": "cordova-plugin-qqsdk.QQSDK",
+      "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+      "pluginId": "cordova-plugin-qqsdk",
+      "clobbers": [
+        "QQSDK"
+      ]
     }
   ],
   "plugin_metadata": {
@@ -705,6 +785,7 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
   }
 }
diff --git a/platforms/android/app/libs/mta-sdk-1.6.2.jar b/platforms/android/app/libs/mta-sdk-1.6.2.jar
new file mode 100644
index 0000000..49b7787
--- /dev/null
+++ b/platforms/android/app/libs/mta-sdk-1.6.2.jar
Binary files differ
diff --git a/platforms/android/app/libs/open_sdk_r5793.jar b/platforms/android/app/libs/open_sdk_r5793.jar
new file mode 100644
index 0000000..eae0e84
--- /dev/null
+++ b/platforms/android/app/libs/open_sdk_r5793.jar
Binary files differ
diff --git a/platforms/android/app/src/main/AndroidManifest.xml b/platforms/android/app/src/main/AndroidManifest.xml
index b7ece77..4b6fab6 100644
--- a/platforms/android/app/src/main/AndroidManifest.xml
+++ b/platforms/android/app/src/main/AndroidManifest.xml
@@ -81,6 +81,15 @@
         <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default" />
         <meta-data android:name="JPUSH_APPKEY" android:value="1fc62c8c6204ec4b0ae65ee2" />
         <activity android:exported="true" android:name="de.niklasmerz.cordova.biometric.BiometricActivity" android:theme="@style/TransparentTheme" />
+        <activity android:launchMode="singleTask" android:name="com.tencent.tauth.AuthActivity" android:noHistory="true">
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.BROWSABLE" />
+                <data android:scheme="tencent101885581" />
+            </intent-filter>
+        </activity>
+        <activity android:configChanges="orientation|keyboardHidden" android:name="com.tencent.connect.common.AssistActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
     </application>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
     <uses-permission android:name="android.permission.CAMERA" android:required="false" />
diff --git a/platforms/android/app/src/main/assets/www/cordova_plugins.js b/platforms/android/app/src/main/assets/www/cordova_plugins.js
index a989701..08297e5 100644
--- a/platforms/android/app/src/main/assets/www/cordova_plugins.js
+++ b/platforms/android/app/src/main/assets/www/cordova_plugins.js
@@ -351,6 +351,14 @@
       "clobbers": [
         "window.plugins.preventscreenshot"
       ]
+    },
+    {
+      "id": "cordova-plugin-qqsdk.QQSDK",
+      "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+      "pluginId": "cordova-plugin-qqsdk",
+      "clobbers": [
+        "QQSDK"
+      ]
     }
   ];
   module.exports.metadata = {
@@ -372,6 +380,7 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
   };
 });
\ No newline at end of file
diff --git a/platforms/android/app/src/main/java/me/vanpan/qqsdk/QQSDKPlugin.java b/platforms/android/app/src/main/java/me/vanpan/qqsdk/QQSDKPlugin.java
new file mode 100644
index 0000000..0d8f2bc
--- /dev/null
+++ b/platforms/android/app/src/main/java/me/vanpan/qqsdk/QQSDKPlugin.java
@@ -0,0 +1,687 @@
+package me.vanpan.qqsdk;
+
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.util.Log;
+import android.webkit.URLUtil;
+import com.tencent.connect.common.Constants;
+import com.tencent.connect.share.QQShare;
+import com.tencent.connect.share.QzonePublish;
+import com.tencent.connect.share.QzoneShare;
+import com.tencent.open.GameAppOperation;
+import com.tencent.tauth.IUiListener;
+import com.tencent.tauth.Tencent;
+import com.tencent.tauth.UiError;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import org.apache.cordova.CallbackContext;
+import org.apache.cordova.CordovaArgs;
+import org.apache.cordova.CordovaPlugin;
+import org.apache.cordova.PluginResult;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import static org.apache.cordova.CordovaActivity.TAG;
+
+/**
+ * Project: QQSDKPlugin
+ * Created by Van on 2016/12/16.
+ */
+
+class ShareScene {
+  public static final int QQ = 0;
+  public static final int QQZone = 1;
+  public static final int Favorite = 2;
+}
+
+public class QQSDKPlugin extends CordovaPlugin {
+  private static Tencent mTencent;
+  private CallbackContext currentCallbackContext;
+  private String APP_ID;
+  private static final String QQ_APP_ID = "qq_app_id";
+  private static final String QQ_CANCEL_BY_USER = "cancelled by user";
+  private static final String QQ_RESPONSE_ERROR = "QQ response is error";
+  private static final String QZONE_SHARE_CANCEL = "QZone share is cancelled";
+  private static final String QQFAVORITES_CANCEL = "QQ Favorites is cancelled";
+  private static final String QQ_Client_NOT_INSYALLED_ERROR = "QQ client is not installed";
+  private static final String QQ_PARAM_ERROR = "param incorrect";
+
+  @Override protected void pluginInitialize() {
+    super.pluginInitialize();
+    APP_ID = webView.getPreferences().getString(QQ_APP_ID, "");
+    mTencent = Tencent.createInstance(APP_ID, this.cordova.getActivity().getApplicationContext());
+  }
+
+  @Override
+  public boolean execute(String action, final CordovaArgs args, final CallbackContext callbackContext)
+      throws JSONException {
+    if (action.equalsIgnoreCase("checkClientInstalled")) {
+      return checkClientInstalled(callbackContext);
+    }
+    if (action.equals("ssoLogin")) {
+      return ssoLogin(callbackContext);
+    }
+    if (action.equals("logout")) {
+      return logout(callbackContext);
+    }
+    if (action.equals("shareText")) {
+      return shareText(args,callbackContext);
+    }
+    if (action.equals("shareImage")) {
+      return shareImage(args,callbackContext);
+    }
+    if (action.equals("shareNews")) {
+      return shareNews(args,callbackContext);
+    }
+    if (action.equals("shareAudio")) {
+      return shareAudio(args,callbackContext);
+    }
+    return super.execute(action, args, callbackContext);
+  }
+
+  /**
+   * 检查手机QQ客户端是否安装
+   */
+  private boolean checkClientInstalled(CallbackContext callbackContext) {
+    Boolean installed = mTencent.isSupportSSOLogin(QQSDKPlugin.this.cordova.getActivity());
+    if (installed) {
+      callbackContext.success();
+    } else {
+      callbackContext.error(QQ_Client_NOT_INSYALLED_ERROR);
+    }
+    return true;
+  }
+
+  /**
+   * QQ 单点登录
+   */
+  private boolean ssoLogin(CallbackContext callbackContext) {
+    currentCallbackContext = callbackContext;
+      Runnable runnable = new Runnable() {
+        @Override public void run() {
+          mTencent.login(QQSDKPlugin.this.cordova.getActivity(), "all", loginListener);
+        }
+      };
+      this.cordova.getActivity().runOnUiThread(runnable);
+      this.cordova.setActivityResultCallback(this);
+      return true;
+  }
+
+  /**
+   * QQ 登出
+   */
+  private boolean logout(CallbackContext callbackContext) {
+    mTencent.logout(this.cordova.getActivity());
+    callbackContext.success();
+    return true;
+  }
+
+  public boolean shareText(CordovaArgs args, CallbackContext callbackContext) {
+    final Bundle params = new Bundle();
+    currentCallbackContext = callbackContext;
+    final JSONObject data;
+    try {
+      data = args.getJSONObject(0);
+      String text = data.has("text")?  data.getString("text"): "";
+      int shareScene = data.has("scene")? data.getInt("scene"): 0;
+      switch (shareScene) {
+        case ShareScene.QQ:
+          callbackContext.error("Android 不支持分享文字到 QQ");
+          break;
+        case ShareScene.Favorite:
+          params.putInt(GameAppOperation.QQFAV_DATALINE_REQTYPE,
+              GameAppOperation.QQFAV_DATALINE_TYPE_TEXT);
+          params.putString(GameAppOperation.QQFAV_DATALINE_TITLE, getAppName());
+          params.putString(GameAppOperation.QQFAV_DATALINE_DESCRIPTION, text);
+          params.putString(GameAppOperation.QQFAV_DATALINE_APPNAME, getAppName());
+          Runnable favoritesRunnable = new Runnable() {
+            @Override public void run() {
+              mTencent.addToQQFavorites(QQSDKPlugin.this.cordova.getActivity(), params,
+                  addToQQFavoritesListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(favoritesRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.QQZone:
+          params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,
+              QzonePublish.PUBLISH_TO_QZONE_TYPE_PUBLISHMOOD);
+          params.putString(QzoneShare.SHARE_TO_QQ_TITLE, text);
+          Runnable zoneRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.publishToQzone(QQSDKPlugin.this.cordova.getActivity(), params,
+                  qZoneShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(zoneRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        default:
+          break;
+      }
+    } catch (JSONException e) {
+      callbackContext.error(QQ_PARAM_ERROR);
+      return true;
+    }
+    return true;
+  }
+
+  public boolean shareImage(CordovaArgs args, CallbackContext callbackContext) {
+    currentCallbackContext = callbackContext;
+    final JSONObject data;
+    try {
+      data = args.getJSONObject(0);
+      String title = data.has("title")?  data.getString("title"): "";
+      String description = data.has("description")?  data.getString("description"): "";
+      String image = data.has("image")?  data.getString("image"): "";
+      int shareScene = data.has("scene")? data.getInt("scene"): 0;
+      image = processImage(image);
+      final Bundle params = new Bundle();
+      switch (shareScene) {
+        case ShareScene.QQ:
+          params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
+          params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, image);
+          params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
+          params.putString(QQShare.SHARE_TO_QQ_SUMMARY, description);
+          Runnable qqRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.shareToQQ(QQSDKPlugin.this.cordova.getActivity(), params, qqShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(qqRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.Favorite:
+          ArrayList<String> imageUrls = new ArrayList<String>();
+          imageUrls.add(image);
+          params.putInt(GameAppOperation.QQFAV_DATALINE_REQTYPE,
+              GameAppOperation.QQFAV_DATALINE_TYPE_IMAGE_TEXT);
+          params.putString(GameAppOperation.QQFAV_DATALINE_TITLE, title);
+          params.putString(GameAppOperation.QQFAV_DATALINE_DESCRIPTION, description);
+          params.putString(GameAppOperation.QQFAV_DATALINE_IMAGEURL, image);
+          params.putString(GameAppOperation.QQFAV_DATALINE_APPNAME, getAppName());
+          params.putStringArrayList(GameAppOperation.QQFAV_DATALINE_FILEDATA, imageUrls);
+          Runnable favoritesRunnable = new Runnable() {
+            @Override public void run() {
+              mTencent.addToQQFavorites(QQSDKPlugin.this.cordova.getActivity(), params,
+                  addToQQFavoritesListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(favoritesRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.QQZone:
+          params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_IMAGE);
+          params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL, image);
+          params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
+          params.putString(QQShare.SHARE_TO_QQ_SUMMARY, description);
+          params.putInt(QQShare.SHARE_TO_QQ_EXT_INT, QQShare.SHARE_TO_QQ_FLAG_QZONE_AUTO_OPEN);
+          Runnable zoneRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.shareToQQ(QQSDKPlugin.this.cordova.getActivity(), params, qqShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(zoneRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        default:
+          break;
+      }
+    } catch (JSONException e) {
+      callbackContext.error(QQ_PARAM_ERROR);
+      return true;
+    }
+    return true;
+  }
+
+  public boolean shareNews(CordovaArgs args, CallbackContext callbackContext) {
+    currentCallbackContext = callbackContext;
+    final JSONObject data;
+    try {
+      data = args.getJSONObject(0);
+      String title = data.has("title")?  data.getString("title"): "";
+      String description = data.has("description")?  data.getString("description"): "";
+      String image = data.has("image")?  data.getString("image"): "";
+      String url = data.has("url")?  data.getString("url"): "";
+      int shareScene = data.has("scene")? data.getInt("scene"): 0;
+      final Bundle params = new Bundle();
+      switch (shareScene) {
+        case ShareScene.QQ:
+          params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
+          if(URLUtil.isHttpUrl(image) || URLUtil.isHttpsUrl(image)) {
+            params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,image);
+          } else {
+            params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL,processImage(image));
+          }
+          params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
+          params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url);
+          params.putString(QQShare.SHARE_TO_QQ_SUMMARY, description);
+          Runnable qqRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.shareToQQ(QQSDKPlugin.this.cordova.getActivity(), params, qqShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(qqRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.Favorite:
+          image = processImage(image);
+          params.putInt(GameAppOperation.QQFAV_DATALINE_REQTYPE,
+              GameAppOperation.QQFAV_DATALINE_TYPE_DEFAULT);
+          params.putString(GameAppOperation.QQFAV_DATALINE_TITLE, title);
+          params.putString(GameAppOperation.QQFAV_DATALINE_DESCRIPTION, description);
+          params.putString(GameAppOperation.QQFAV_DATALINE_IMAGEURL, image);
+          params.putString(GameAppOperation.QQFAV_DATALINE_URL, url);
+          params.putString(GameAppOperation.QQFAV_DATALINE_APPNAME, getAppName());
+          Runnable favoritesRunnable = new Runnable() {
+            @Override public void run() {
+              mTencent.addToQQFavorites(QQSDKPlugin.this.cordova.getActivity(), params,
+                  addToQQFavoritesListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(favoritesRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.QQZone:
+          image = processImage(image);
+          ArrayList<String> imageUrls = new ArrayList<String>();
+          imageUrls.add(image);
+          params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,
+              QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
+          params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title);
+          params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, description);
+          params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, url);
+          params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
+          Runnable zoneRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.shareToQzone(QQSDKPlugin.this.cordova.getActivity(), params,
+                  qZoneShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(zoneRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        default:
+          break;
+      }
+    } catch (JSONException e) {
+      callbackContext.error(QQ_PARAM_ERROR);
+      return true;
+    }
+    return true;
+  }
+
+  public boolean shareAudio(CordovaArgs args, CallbackContext callbackContext) {
+    currentCallbackContext = callbackContext;
+    final JSONObject data;
+    try {
+      data = args.getJSONObject(0);
+      String title = data.has("title")?  data.getString("title"): "";
+      String description = data.has("description")?  data.getString("description"): "";
+      String image = data.has("image")?  data.getString("image"): "";
+      String url = data.has("url")?  data.getString("url"): "";
+      String flashUrl = data.has("flashUrl")?  data.getString("flashUrl"): "";
+      int shareScene = data.has("scene")? data.getInt("scene"): 0;
+      final Bundle params = new Bundle();
+      switch (shareScene) {
+        case ShareScene.QQ:
+          params.putInt(QQShare.SHARE_TO_QQ_KEY_TYPE, QQShare.SHARE_TO_QQ_TYPE_DEFAULT);
+          if(URLUtil.isHttpUrl(image) || URLUtil.isHttpsUrl(image)) {
+            params.putString(QQShare.SHARE_TO_QQ_IMAGE_URL,image);
+          } else {
+            params.putString(QQShare.SHARE_TO_QQ_IMAGE_LOCAL_URL,processImage(image));
+          }
+          params.putString(QQShare.SHARE_TO_QQ_AUDIO_URL, flashUrl);
+          params.putString(QQShare.SHARE_TO_QQ_TITLE, title);
+          params.putString(QQShare.SHARE_TO_QQ_TARGET_URL, url);
+          params.putString(QQShare.SHARE_TO_QQ_SUMMARY, description);
+          Runnable qqRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.shareToQQ(QQSDKPlugin.this.cordova.getActivity(), params, qqShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(qqRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.Favorite:
+          image = processImage(image);
+          params.putInt(GameAppOperation.QQFAV_DATALINE_REQTYPE,
+              GameAppOperation.QQFAV_DATALINE_TYPE_DEFAULT);
+          params.putString(GameAppOperation.QQFAV_DATALINE_TITLE, title);
+          params.putString(GameAppOperation.QQFAV_DATALINE_DESCRIPTION, description);
+          params.putString(GameAppOperation.QQFAV_DATALINE_IMAGEURL, image);
+          params.putString(GameAppOperation.QQFAV_DATALINE_URL, url);
+          params.putString(GameAppOperation.QQFAV_DATALINE_APPNAME, getAppName());
+          params.putString(GameAppOperation.QQFAV_DATALINE_AUDIOURL, flashUrl);
+          Runnable favoritesRunnable = new Runnable() {
+            @Override public void run() {
+              mTencent.addToQQFavorites(QQSDKPlugin.this.cordova.getActivity(), params,
+                  addToQQFavoritesListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(favoritesRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        case ShareScene.QQZone:
+          image = processImage(image);
+          ArrayList<String> imageUrls = new ArrayList<String>();
+          imageUrls.add(image);
+          params.putInt(QzoneShare.SHARE_TO_QZONE_KEY_TYPE,
+              QzoneShare.SHARE_TO_QZONE_TYPE_IMAGE_TEXT);
+          params.putString(QzoneShare.SHARE_TO_QQ_TITLE, title);
+          params.putString(QzoneShare.SHARE_TO_QQ_SUMMARY, description);
+          params.putString(QzoneShare.SHARE_TO_QQ_TARGET_URL, url);
+          params.putString(QzoneShare.SHARE_TO_QQ_AUDIO_URL, flashUrl);
+          params.putStringArrayList(QzoneShare.SHARE_TO_QQ_IMAGE_URL, imageUrls);
+          Runnable zoneRunnable = new Runnable() {
+
+            @Override public void run() {
+              mTencent.shareToQzone(QQSDKPlugin.this.cordova.getActivity(), params,
+                  qZoneShareListener);
+            }
+          };
+          this.cordova.getActivity().runOnUiThread(zoneRunnable);
+          this.cordova.setActivityResultCallback(this);
+          break;
+        default:
+          break;
+      }
+    } catch (JSONException e) {
+      callbackContext.error(QQ_PARAM_ERROR);
+      return true;
+    }
+    return true;
+  }
+
+  /**
+   * 保存token 和 openid
+   */
+  public static void initOpenidAndToken(JSONObject jsonObject) {
+    try {
+      String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
+      String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
+      String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
+      if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId)) {
+        mTencent.setAccessToken(token, expires);
+        mTencent.setOpenId(openId);
+      }
+    } catch (Exception e) {
+    }
+  }
+
+  /**
+   * 获取应用的名称
+   */
+  private String getAppName() {
+    PackageManager packageManager = this.cordova.getActivity().getPackageManager();
+    ApplicationInfo applicationInfo = null;
+    try {
+      applicationInfo =
+          packageManager.getApplicationInfo(this.cordova.getActivity().getPackageName(), 0);
+    } catch (final PackageManager.NameNotFoundException e) {
+    }
+    final String AppName =
+        (String) ((applicationInfo != null) ? packageManager.getApplicationLabel(applicationInfo)
+            : "AppName");
+    return AppName;
+  }
+
+  /**
+   * 处理图片
+   * @param image
+   * @return
+   */
+  private String processImage(String image) {
+    if(URLUtil.isHttpUrl(image) || URLUtil.isHttpsUrl(image)) {
+      return saveBitmapToFile(getBitmapFromURL(image));
+    } else if (isBase64(image)) {
+      return saveBitmapToFile(decodeBase64ToBitmap(image));
+    } else if (image.startsWith("/") ){
+      File file = new File(image);
+      return file.getAbsolutePath();
+    } else {
+      return null;
+    }
+  }
+
+  /**
+   * 检查图片字符串是不是Base64
+   * @param image
+   * @return
+   */
+  private boolean isBase64(String image) {
+    try {
+      byte[] decodedString = Base64.decode(image, Base64.DEFAULT);
+      Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
+      if (bitmap == null) {
+        return false;
+      }
+      return true;
+    } catch (Exception e) {
+      return false;
+    }
+  }
+
+
+  public static Bitmap getBitmapFromURL(String src) {
+    try {
+      URL url = new URL(src);
+      HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+      connection.setDoInput(true);
+      connection.connect();
+      InputStream input = connection.getInputStream();
+      Bitmap bitmap = BitmapFactory.decodeStream(input);
+      return bitmap;
+    } catch (IOException e) {
+      return null;
+    }
+  }
+
+  /**
+   * 将Base64解码成Bitmap
+   */
+
+  private Bitmap decodeBase64ToBitmap(String Base64String) {
+    byte[] decode = Base64.decode(Base64String, Base64.DEFAULT);
+    Bitmap bitmap = BitmapFactory.decodeByteArray(decode, 0, decode.length);
+    return bitmap;
+  }
+
+  /**
+   * 将bitmap 保存成文件
+   */
+  private String saveBitmapToFile(Bitmap bitmap) {
+    File pictureFile = getOutputMediaFile();
+    if (pictureFile == null) {
+      return null;
+    }
+    try {
+      FileOutputStream fos = new FileOutputStream(pictureFile);
+      bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);
+      fos.close();
+    } catch (FileNotFoundException e) {
+      Log.d(TAG, "File not found: " + e.getMessage());
+    } catch (IOException e) {
+      Log.d(TAG, "Error accessing file: " + e.getMessage());
+    }
+    return pictureFile.getAbsolutePath();
+  }
+
+  /**
+   * 生成文件用来存储图片
+   */
+  private File getOutputMediaFile() {
+    File mediaStorageDir = this.cordova.getActivity().getExternalCacheDir();
+    if (!mediaStorageDir.exists()) {
+      if (!mediaStorageDir.mkdirs()) {
+        return null;
+      }
+    }
+    String timeStamp = new SimpleDateFormat("ddMMyyyy_HHmm").format(new Date());
+    File mediaFile;
+    String mImageName = "Cordova_" + timeStamp + ".jpg";
+    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
+    return mediaFile;
+  }
+
+  /**
+   * 登录监听
+   */
+  IUiListener loginListener = new IUiListener() {
+    @Override public void onComplete(Object response) {
+      if (null == response) {
+        QQSDKPlugin.this.webView.sendPluginResult(
+            new PluginResult(PluginResult.Status.ERROR, QQ_RESPONSE_ERROR),
+            currentCallbackContext.getCallbackId());
+        return;
+      }
+      JSONObject jsonResponse = (JSONObject) response;
+      if (null != jsonResponse && jsonResponse.length() == 0) {
+        QQSDKPlugin.this.webView.sendPluginResult(
+            new PluginResult(PluginResult.Status.ERROR, QQ_RESPONSE_ERROR),
+            currentCallbackContext.getCallbackId());
+        return;
+      }
+      initOpenidAndToken(jsonResponse);
+      JSONObject jo =
+          makeJson(mTencent.getAccessToken(), mTencent.getOpenId(), mTencent.getExpiresIn());
+      QQSDKPlugin.this.webView.sendPluginResult(new PluginResult(PluginResult.Status.OK, jo),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onError(UiError e) {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, e.errorMessage),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onCancel() {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, QQ_CANCEL_BY_USER),
+          currentCallbackContext.getCallbackId());
+    }
+  };
+  /**
+   * QQ分享监听
+   */
+  IUiListener qqShareListener = new IUiListener() {
+    @Override public void onCancel() {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, QQ_CANCEL_BY_USER),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onComplete(Object response) {
+      QQSDKPlugin.this.webView.sendPluginResult(new PluginResult(PluginResult.Status.OK),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onError(UiError e) {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, e.errorMessage),
+          currentCallbackContext.getCallbackId());
+    }
+  };
+  /**
+   * QQZONE 分享监听
+   */
+  IUiListener qZoneShareListener = new IUiListener() {
+
+    @Override public void onCancel() {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, QZONE_SHARE_CANCEL),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onError(UiError e) {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, e.errorMessage),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onComplete(Object response) {
+      QQSDKPlugin.this.webView.sendPluginResult(new PluginResult(PluginResult.Status.OK),
+          currentCallbackContext.getCallbackId());
+    }
+  };
+  /**
+   * 添加到QQ收藏监听
+   */
+  IUiListener addToQQFavoritesListener = new IUiListener() {
+    @Override public void onCancel() {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, QQFAVORITES_CANCEL),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onComplete(Object response) {
+      QQSDKPlugin.this.webView.sendPluginResult(new PluginResult(PluginResult.Status.OK),
+          currentCallbackContext.getCallbackId());
+    }
+
+    @Override public void onError(UiError e) {
+      QQSDKPlugin.this.webView.sendPluginResult(
+          new PluginResult(PluginResult.Status.ERROR, e.errorMessage),
+          currentCallbackContext.getCallbackId());
+    }
+  };
+
+  /**
+   * 组装JSON
+   */
+  private JSONObject makeJson(String access_token, String userid, long expires_time) {
+    String json = "{\"access_token\": \"" + access_token + "\", " +
+        " \"userid\": \"" + userid + "\", " +
+        " \"expires_time\": \"" + String.valueOf(expires_time) + "\"" +
+        "}";
+    JSONObject jo = null;
+    try {
+      jo = new JSONObject(json);
+    } catch (JSONException e) {
+      e.printStackTrace();
+    }
+    return jo;
+  }
+
+  @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+    if (resultCode == Constants.ACTIVITY_OK) {
+      if (requestCode == Constants.REQUEST_LOGIN) {
+        Tencent.onActivityResultData(requestCode, resultCode, intent, loginListener);
+      }
+      if (requestCode == Constants.REQUEST_QQ_SHARE) {
+        Tencent.onActivityResultData(requestCode, resultCode, intent, qqShareListener);
+      }
+      if (requestCode == Constants.REQUEST_QQ_FAVORITES) {
+        Tencent.onActivityResultData(requestCode, resultCode, intent, addToQQFavoritesListener);
+      }
+    }
+    super.onActivityResult(requestCode, resultCode, intent);
+  }
+
+  @Override public void onDestroy() {
+    super.onDestroy();
+    if (mTencent != null) {
+      mTencent.releaseResource();
+    }
+  }
+}
diff --git a/platforms/android/app/src/main/res/xml/config.xml b/platforms/android/app/src/main/res/xml/config.xml
index 019dfb6..e85c38a 100644
--- a/platforms/android/app/src/main/res/xml/config.xml
+++ b/platforms/android/app/src/main/res/xml/config.xml
@@ -47,6 +47,17 @@
         <param name="android-package" value="com.coffice.ScreenshotBlocker" />
         <param name="onload" value="true" />
     </feature>
+    <feature name="QQSDK">
+        <param name="android-package" value="me.vanpan.qqsdk.QQSDKPlugin" />
+    </feature>
+    <access origin="https://openmobile.qq.com/*" />
+    <access origin="http://qzonestyle.gtimg.cn/*" />
+    <access origin="http://pub.idqqimg.com/*" />
+    <access origin="http://qzs.qq.com/*" />
+    <access origin="http://m.qzone.com/*" />
+    <access origin="http://*.ptlogin2.qq.com/*" />
+    <access origin="http://*.qq.com/*" />
+    <access origin="http://q2.qlogo.cn/*" />
     <name short="大理智警">dlapp</name>
     <description>
         A sample Apache Cordova application that responds to the deviceready event.
@@ -74,6 +85,7 @@
     </edit-config>
     <allow-intent href="market:*" />
     <preference name="loglevel" value="DEBUG" />
+    <preference name="QQ_APP_ID" value="101885581" />
     <preference name="AutoHideSplashScreen" value="true" />
     <preference name="SplashScreenDelay" value="0" />
     <preference name="SplashShowOnlyFirstTime" value="true" />
diff --git a/platforms/android/platform_www/cordova_plugins.js b/platforms/android/platform_www/cordova_plugins.js
index a989701..08297e5 100644
--- a/platforms/android/platform_www/cordova_plugins.js
+++ b/platforms/android/platform_www/cordova_plugins.js
@@ -351,6 +351,14 @@
       "clobbers": [
         "window.plugins.preventscreenshot"
       ]
+    },
+    {
+      "id": "cordova-plugin-qqsdk.QQSDK",
+      "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+      "pluginId": "cordova-plugin-qqsdk",
+      "clobbers": [
+        "QQSDK"
+      ]
     }
   ];
   module.exports.metadata = {
@@ -372,6 +380,7 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
   };
 });
\ No newline at end of file
diff --git a/platforms/android/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js b/platforms/android/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js
new file mode 100644
index 0000000..cedb4c0
--- /dev/null
+++ b/platforms/android/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js
@@ -0,0 +1,43 @@
+cordova.define("cordova-plugin-qqsdk.QQSDK", function(require, exports, module) {
+
+var cordova = require('cordova');
+module.exports = {
+	Scene: {
+        QQ:  0, // QQ 好友
+        QQZone: 1, // QQ 空间
+        Favorite: 2  // 收藏
+    },
+    ClientType: {
+        QQ:  0, // QQ 手机客户端
+        TIM: 1 // TIM 客户端
+    },
+	ssoLogin:function(successCallback, errorCallback, args){
+		if(args === undefined) {
+            args = {}
+        }
+		cordova.exec(successCallback, errorCallback, "QQSDK", "ssoLogin",[args]);
+	},
+	logout:function(successCallback, errorCallback){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "logout", []);
+	},
+	checkClientInstalled:function(successCallback, errorCallback, args){
+		if(args === undefined) {
+            args = {}
+        }
+		cordova.exec(successCallback, errorCallback, "QQSDK", "checkClientInstalled", [args]);
+	},
+	shareText:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareText", [args]);
+	},
+	shareImage:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareImage", [args]);
+	},
+	shareNews:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareNews", [args]);
+	},
+	shareAudio:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareAudio", [args]);
+	},
+};
+
+});
diff --git a/platforms/android/project.properties b/platforms/android/project.properties
index a2f953f..0a6f4b6 100644
--- a/platforms/android/project.properties
+++ b/platforms/android/project.properties
@@ -14,4 +14,5 @@
 cordova.system.library.1=com.squareup.okhttp3:okhttp-urlconnection:3.10.0
 cordova.gradle.include.1=cordova-plugin-qrscanner/dlapp-qrscanner.gradle
 cordova.system.library.2=com.android.support:support-v4:24.1.1+
-cordova.gradle.include.2=cordova-plugin-fingerprint-aio/app-build.gradle
\ No newline at end of file
+cordova.gradle.include.2=cordova-plugin-fingerprint-aio/app-build.gradle
+cordova.system.library.3=com.android.support:support-v4:24.1.1+
\ No newline at end of file
diff --git a/platforms/browser/browser.json b/platforms/browser/browser.json
index 0661c52..72d20b5 100644
--- a/platforms/browser/browser.json
+++ b/platforms/browser/browser.json
@@ -108,6 +108,10 @@
     },
     "cordova-plugin-prevent-screenshot-coffice": {
       "PACKAGE_NAME": "com.dalipolice.app"
+    },
+    "cordova-plugin-qqsdk": {
+      "QQ_APP_ID": "101885581",
+      "PACKAGE_NAME": "com.dalipolice.app"
     }
   },
   "dependent_plugins": {},
@@ -489,6 +493,14 @@
       "clobbers": [
         "window.plugins.preventscreenshot"
       ]
+    },
+    {
+      "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+      "id": "cordova-plugin-qqsdk.QQSDK",
+      "pluginId": "cordova-plugin-qqsdk",
+      "clobbers": [
+        "QQSDK"
+      ]
     }
   ],
   "plugin_metadata": {
@@ -510,6 +522,7 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
   }
 }
diff --git a/platforms/browser/platform_www/cordova_plugins.js b/platforms/browser/platform_www/cordova_plugins.js
index aca6ac1..2743983 100644
--- a/platforms/browser/platform_www/cordova_plugins.js
+++ b/platforms/browser/platform_www/cordova_plugins.js
@@ -377,6 +377,14 @@
         "clobbers": [
             "window.plugins.preventscreenshot"
         ]
+    },
+    {
+        "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+        "id": "cordova-plugin-qqsdk.QQSDK",
+        "pluginId": "cordova-plugin-qqsdk",
+        "clobbers": [
+            "QQSDK"
+        ]
     }
 ];
 module.exports.metadata = 
@@ -400,7 +408,8 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
 }
 // BOTTOM OF METADATA
 });
\ No newline at end of file
diff --git a/platforms/browser/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js b/platforms/browser/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js
new file mode 100644
index 0000000..6462ba4
--- /dev/null
+++ b/platforms/browser/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js
@@ -0,0 +1,42 @@
+cordova.define("cordova-plugin-qqsdk.QQSDK", function(require, exports, module) { 
+var cordova = require('cordova');
+module.exports = {
+	Scene: {
+        QQ:  0, // QQ 好友
+        QQZone: 1, // QQ 空间
+        Favorite: 2  // 收藏
+    },
+    ClientType: {
+        QQ:  0, // QQ 手机客户端
+        TIM: 1 // TIM 客户端
+    },
+	ssoLogin:function(successCallback, errorCallback, args){
+		if(args === undefined) {
+            args = {}
+        }
+		cordova.exec(successCallback, errorCallback, "QQSDK", "ssoLogin",[args]);
+	},
+	logout:function(successCallback, errorCallback){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "logout", []);
+	},
+	checkClientInstalled:function(successCallback, errorCallback, args){
+		if(args === undefined) {
+            args = {}
+        }
+		cordova.exec(successCallback, errorCallback, "QQSDK", "checkClientInstalled", [args]);
+	},
+	shareText:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareText", [args]);
+	},
+	shareImage:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareImage", [args]);
+	},
+	shareNews:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareNews", [args]);
+	},
+	shareAudio:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareAudio", [args]);
+	},
+};
+
+});
diff --git a/platforms/ios/dlapp.xcodeproj/project.pbxproj b/platforms/ios/dlapp.xcodeproj/project.pbxproj
index 361fbf5..0693b93 100644
--- a/platforms/ios/dlapp.xcodeproj/project.pbxproj
+++ b/platforms/ios/dlapp.xcodeproj/project.pbxproj
@@ -67,6 +67,12 @@
 		81B8C05354704A02AE1560A0 /* Fingerprint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39BDB5993A0D495C9E97E995 /* Fingerprint.swift */; };
 		F70AC332CD71455D9E103429 /* ScreenshotBlocker.m in Sources */ = {isa = PBXBuildFile; fileRef = 8BD5959A12D340C3AB8685C0 /* ScreenshotBlocker.m */; };
 		1ED02270B4D74F8BB970350D /* ScreenRecordingDetector.m in Sources */ = {isa = PBXBuildFile; fileRef = E806644FDDDD4DB9B0A7D6E4 /* ScreenRecordingDetector.m */; };
+		EF44EC2E45A745DAA3A1FB50 /* CDVQQSDK.m in Sources */ = {isa = PBXBuildFile; fileRef = 29DE4F0A316B400B959056A3 /* CDVQQSDK.m */; };
+		ACA1B32B06DC41AF930E894E /* TencentOpenApi_IOS_Bundle.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 2EB7D53C82F7469F9B0712DC /* TencentOpenApi_IOS_Bundle.bundle */; };
+		F5F3E5C64CF0404D803BDCFB /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 5EF554FF7A544AD9932C524C /* libiconv.tbd */; };
+		EDCB3A04AD4D4B289E64F99E /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D29239646664D05B61A0517 /* libsqlite3.tbd */; };
+		988F095294ED444C9ACB1281 /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F5208F54124408BAA42D80E /* libstdc++.tbd */; };
+		1CA6AE2CB7C4454E96B08442 /* TencentOpenAPI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B8DABF1D129444628738EB6A /* TencentOpenAPI.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -204,6 +210,13 @@
 		E806644FDDDD4DB9B0A7D6E4 /* ScreenRecordingDetector.m */ = {isa = PBXFileReference; name = "ScreenRecordingDetector.m"; path = "cordova-plugin-prevent-screenshot-coffice/ScreenRecordingDetector.m"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; explicitFileType = undefined; includeInIndex = 0; };
 		5FA4467FDA284333A275FA08 /* ScreenshotBlocker.h */ = {isa = PBXFileReference; name = "ScreenshotBlocker.h"; path = "cordova-plugin-prevent-screenshot-coffice/ScreenshotBlocker.h"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; explicitFileType = undefined; includeInIndex = 0; };
 		6C8C62629761432796084184 /* ScreenRecordingDetector.h */ = {isa = PBXFileReference; name = "ScreenRecordingDetector.h"; path = "cordova-plugin-prevent-screenshot-coffice/ScreenRecordingDetector.h"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; explicitFileType = undefined; includeInIndex = 0; };
+		29DE4F0A316B400B959056A3 /* CDVQQSDK.m */ = {isa = PBXFileReference; name = "CDVQQSDK.m"; path = "cordova-plugin-qqsdk/CDVQQSDK.m"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; explicitFileType = undefined; includeInIndex = 0; };
+		E381D08A673C42D780B0EAA7 /* CDVQQSDK.h */ = {isa = PBXFileReference; name = "CDVQQSDK.h"; path = "cordova-plugin-qqsdk/CDVQQSDK.h"; sourceTree = "<group>"; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; explicitFileType = undefined; includeInIndex = 0; };
+		2EB7D53C82F7469F9B0712DC /* TencentOpenApi_IOS_Bundle.bundle */ = {isa = PBXFileReference; name = "TencentOpenApi_IOS_Bundle.bundle"; path = "TencentOpenApi_IOS_Bundle.bundle"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.plug-in; explicitFileType = undefined; includeInIndex = 0; };
+		5EF554FF7A544AD9932C524C /* libiconv.tbd */ = {isa = PBXFileReference; name = "libiconv.tbd"; path = "usr/lib/libiconv.tbd"; sourceTree = SDKROOT; fileEncoding = undefined; lastKnownFileType = sourcecode.text-based-dylib-definition; explicitFileType = undefined; includeInIndex = 0; };
+		9D29239646664D05B61A0517 /* libsqlite3.tbd */ = {isa = PBXFileReference; name = "libsqlite3.tbd"; path = "usr/lib/libsqlite3.tbd"; sourceTree = SDKROOT; fileEncoding = undefined; lastKnownFileType = sourcecode.text-based-dylib-definition; explicitFileType = undefined; includeInIndex = 0; };
+		1F5208F54124408BAA42D80E /* libstdc++.tbd */ = {isa = PBXFileReference; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; fileEncoding = undefined; lastKnownFileType = sourcecode.text-based-dylib-definition; explicitFileType = undefined; includeInIndex = 0; };
+		B8DABF1D129444628738EB6A /* TencentOpenAPI.framework */ = {isa = PBXFileReference; name = "TencentOpenAPI.framework"; path = "dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.framework; explicitFileType = undefined; includeInIndex = 0; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -232,6 +245,10 @@
 				77CDF61132F44B81B0064744 /* UserNotifications.framework in Frameworks */,
 				3C00FC06B74E49CFBABD0CFF /* libresolv.tbd in Frameworks */,
 				8C09122A89C14C5FB0C28636 /* WebKit.framework in Frameworks */,
+				F5F3E5C64CF0404D803BDCFB /* libiconv.tbd in Frameworks */,
+				EDCB3A04AD4D4B289E64F99E /* libsqlite3.tbd in Frameworks */,
+				988F095294ED444C9ACB1281 /* libstdc++.tbd in Frameworks */,
+				1CA6AE2CB7C4454E96B08442 /* TencentOpenAPI.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -295,6 +312,7 @@
 				3047A50E1AB8057F00498E2A /* config */,
 				8D1107310486CEB800E47090 /* dlapp-Info.plist */,
 				E9D260B7FB6C49A3AE6CD0DB /* JPushConfig.plist */,
+				2EB7D53C82F7469F9B0712DC /* TencentOpenApi_IOS_Bundle.bundle */,
 			);
 			name = Resources;
 			path = dlapp/Resources;
@@ -323,6 +341,10 @@
 				59D1F618C1ED464283B7B2E6 /* UserNotifications.framework */,
 				CBD6EA74C612474DA862E146 /* libresolv.tbd */,
 				FE0B455916A4481681D59FE0 /* WebKit.framework */,
+				5EF554FF7A544AD9932C524C /* libiconv.tbd */,
+				9D29239646664D05B61A0517 /* libsqlite3.tbd */,
+				1F5208F54124408BAA42D80E /* libstdc++.tbd */,
+				B8DABF1D129444628738EB6A /* TencentOpenAPI.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -419,6 +441,8 @@
 				E806644FDDDD4DB9B0A7D6E4 /* ScreenRecordingDetector.m */,
 				5FA4467FDA284333A275FA08 /* ScreenshotBlocker.h */,
 				6C8C62629761432796084184 /* ScreenRecordingDetector.h */,
+				29DE4F0A316B400B959056A3 /* CDVQQSDK.m */,
+				E381D08A673C42D780B0EAA7 /* CDVQQSDK.h */,
 			);
 			name = Plugins;
 			path = dlapp/Plugins;
@@ -531,6 +555,7 @@
 				302D95F214D2391D003F00A1 /* MainViewController.xib in Resources */,
 				0207DA581B56EA530066E2B4 /* Images.xcassets in Resources */,
 				3BE6767AAFDC4926A08E6690 /* JPushConfig.plist in Resources */,
+				ACA1B32B06DC41AF930E894E /* TencentOpenApi_IOS_Bundle.bundle in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -614,6 +639,7 @@
 				81B8C05354704A02AE1560A0 /* Fingerprint.swift in Sources */,
 				F70AC332CD71455D9E103429 /* ScreenshotBlocker.m in Sources */,
 				1ED02270B4D74F8BB970350D /* ScreenRecordingDetector.m in Sources */,
+				EF44EC2E45A745DAA3A1FB50 /* CDVQQSDK.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -663,6 +689,10 @@
 				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 				SWIFT_VERSION = 4.0;
 				TARGETED_DEVICE_FAMILY = 1;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"dlapp/Plugins/cordova-plugin-qqsdk\"",
+				);
 			};
 			name = Debug;
 		};
@@ -698,6 +728,10 @@
 				SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/$(PROJECT_NAME)/Bridging-Header.h";
 				SWIFT_VERSION = 4.0;
 				TARGETED_DEVICE_FAMILY = 1;
+				FRAMEWORK_SEARCH_PATHS = (
+					"$(inherited)",
+					"\"dlapp/Plugins/cordova-plugin-qqsdk\"",
+				);
 			};
 			name = Release;
 		};
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/CDVQQSDK.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/CDVQQSDK.h
new file mode 100644
index 0000000..75c3613
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/CDVQQSDK.h
@@ -0,0 +1,52 @@
+//
+//  CDVQQSDK.h
+//  QQ
+//
+//  Created by Van on 2016/12/16.
+//
+//
+#import <Cordova/CDVPlugin.h>
+#import <Cordova/CDVPluginResult.h>
+#import <TencentOpenAPI/TencentOAuth.h>
+#import <TencentOpenAPI/QQApiInterface.h>
+
+typedef NS_ENUM(NSInteger, QQShareScene) {
+    QQ,
+    QQZone,
+    Favorite,
+};
+
+typedef NS_ENUM(NSInteger, QQShareType) {
+    TextMessage,
+    ImageMesssage,
+    NewsMessageWithNetworkImage,
+    NewsMessageWithLocalImage,
+    AudioMessage,
+    VideoMessage,
+};
+
+@interface CDVQQSDK : CDVPlugin <TencentSessionDelegate, QQApiInterfaceDelegate>
+
+@property (nonatomic, copy) NSString *callback;
+
+- (void)checkClientInstalled:(CDVInvokedUrlCommand *)command;
+
+- (void)ssoLogin:(CDVInvokedUrlCommand *)command;
+
+- (void)logout:(CDVInvokedUrlCommand *)command;
+
+- (void)shareText:(CDVInvokedUrlCommand *)command;
+
+- (void)shareImage:(CDVInvokedUrlCommand *)command;
+
+- (void)shareNews:(CDVInvokedUrlCommand *)command;
+
+//- (void)shareAudio:(NSString *)previewUrl flashUrl:(NSString *)flashUrl
+//             image:(NSString *)image
+//         withTitle:(NSString *)title
+//       description:(NSString *)description
+//        shareScene:(QQShareScene)scene
+//           command:(CDVInvokedUrlCommand
+//                        *)command;
+
+@end
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/CDVQQSDK.m b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/CDVQQSDK.m
new file mode 100644
index 0000000..4a22a53
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/CDVQQSDK.m
@@ -0,0 +1,660 @@
+//
+//  CDVQQSDK.m
+//  QQ
+//
+//  Created by Van on 2016/12/16.
+//
+//
+
+#import "CDVQQSDK.h"
+
+NSString *QQ_NOT_INSTALLED = @"QQ Client is not installed";
+NSString *QQ_PARAM_NOT_FOUND = @"param is not found";
+NSString *QQ_IMAGE_PARAM_INCORRECT = @"image param is incorrect";
+NSString *QQ_LOGIN_ERROR = @"QQ login error";
+NSString *QQ_LOGIN_CANCEL = @"QQ login cancelled";
+NSString *QQ_LOGIN_NETWORK_ERROR = @"QQ login network error";
+NSString *QQ_SHARE_CANCEL = @"QQ share cancelled by user";
+NSString *appId = @"";
+
+@implementation CDVQQSDK {
+    TencentOAuth *tencentOAuth;
+}
+/**
+ *  插件初始化，主要用户appkey注册
+ */
+- (void)pluginInitialize {
+    appId = [[self.commandDelegate settings] objectForKey:@"qq_app_id"];
+    if (nil == tencentOAuth) {
+        tencentOAuth = [[TencentOAuth alloc] initWithAppId:appId andDelegate:self];
+    }
+}
+/**
+ *  处理URL
+ *
+ *  @param notification cordova 传递进来的消息
+ */
+- (void)handleOpenURL:(NSNotification *)notification {
+    NSURL *url = [notification object];
+    NSString *schemaPrefix = [@"tencent" stringByAppendingString:appId];
+    if ([url isKindOfClass:[NSURL class]] && [[url absoluteString] hasPrefix:[schemaPrefix stringByAppendingString:@"://response_from_qq"]]) {
+        [QQApiInterface handleOpenURL:url delegate:self];
+    } else {
+        [TencentOAuth HandleOpenURL:url];
+    }
+}
+
+/**
+ *  检查QQ官方客户端是否安装
+ *
+ *  @param command CDVInvokedUrlCommand
+ */
+- (void)checkClientInstalled:(CDVInvokedUrlCommand *)command {
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    int type = [[args valueForKey:@"client"] intValue];
+    if(type == 0) {
+        [tencentOAuth setAuthShareType:AuthShareType_QQ];
+        [self checkQQInstalled:command];
+    } else if (type == 1) {
+        [self checkTIMInstalled:command];
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+/**
+ *  检查QQ官方客户端是否安装
+ *
+ *  @param command CDVInvokedUrlCommand
+ */
+- (void)checkQQInstalled:(CDVInvokedUrlCommand *)command {
+    if ([TencentOAuth iphoneQQInstalled] && [TencentOAuth iphoneQQSupportSSOLogin]) {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+
+/**
+ *  检查TIM客户端是否安装
+ *
+ *  @param command CDVInvokedUrlCommand
+ */
+- (void)checkTIMInstalled:(CDVInvokedUrlCommand *)command {
+    if ([TencentOAuth iphoneTIMInstalled] && [TencentOAuth iphoneTIMSupportSSOLogin]) {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+/**
+ *  QQ 登出
+ *
+ *  @param command CDVInvokedUrlCommand
+ */
+- (void)logout:(CDVInvokedUrlCommand *)command {
+    self.callback = command.callbackId;
+    [tencentOAuth logout:self];
+}
+
+/**
+ *  QQ 登录
+ *
+ *  @param command CDVInvokedUrlCommand
+ */
+- (void)ssoLogin:(CDVInvokedUrlCommand *)command {
+    if (nil == tencentOAuth) {
+        tencentOAuth = [[TencentOAuth alloc] initWithAppId:appId andDelegate:self];
+    }
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    self.callback = command.callbackId;
+    NSArray *permissions = [NSArray arrayWithObjects:
+                                        kOPEN_PERMISSION_GET_USER_INFO,
+                                        kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
+                                        kOPEN_PERMISSION_ADD_ALBUM,
+                                        kOPEN_PERMISSION_ADD_ONE_BLOG,
+                                        kOPEN_PERMISSION_ADD_SHARE,
+                                        kOPEN_PERMISSION_ADD_TOPIC,
+                                        kOPEN_PERMISSION_CHECK_PAGE_FANS,
+                                        kOPEN_PERMISSION_GET_INFO,
+                                        kOPEN_PERMISSION_GET_OTHER_INFO,
+                                        kOPEN_PERMISSION_LIST_ALBUM,
+                                        kOPEN_PERMISSION_UPLOAD_PIC,
+                                        kOPEN_PERMISSION_GET_VIP_INFO,
+                                        kOPEN_PERMISSION_GET_VIP_RICH_INFO,
+                                        nil];
+    int type = [[args valueForKey:@"client"] intValue];
+    if (type == 0) {
+        [tencentOAuth setAuthShareType:AuthShareType_QQ];
+    } else if (type == 1) {
+        [tencentOAuth setAuthShareType:AuthShareType_TIM];
+    }
+    [tencentOAuth authorize:permissions];
+
+}
+
+/**
+ 分享文本
+ 
+ @param command cordova参数
+ */
+- (void)shareText:(CDVInvokedUrlCommand *)command {
+    self.callback = command.callbackId;
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    if ([args objectForKey:@"text"]) {
+        NSString *text = [args objectForKey:@"text"];
+        int scene = [[args valueForKey:@"scene"] intValue];
+        int type = [[args valueForKey:@"client"] intValue];
+        [self shareObjectWithData:@{ @"text" : text } Type:TextMessage Scene:scene ClientType:type];
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_PARAM_NOT_FOUND];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+
+/**
+ 分享图片
+ 
+ @param command Cordova参数
+ */
+- (void)shareImage:(CDVInvokedUrlCommand *)command {
+    self.callback = command.callbackId;
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    if (args) {
+        NSString *title = [self check:@"title" in:args];
+        NSString *image = [self check:@"image" in:args];
+        NSString *description = [self check:@"description" in:args];
+        int scene = [[args valueForKey:@"scene"] intValue];
+        int type = [[args valueForKey:@"client"] intValue];
+        NSData *imageData = [self processImage:image];
+        if(!imageData) {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_IMAGE_PARAM_INCORRECT];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+        } else {
+            [self shareObjectWithData:@{ @"image" : imageData,
+                                         @"title" : title,
+                                         @"description" : description }
+                                 Type:ImageMesssage
+                                Scene:scene
+                           ClientType:type];
+        }
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_PARAM_NOT_FOUND];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+
+/**
+ 分享新闻链接
+ 
+ @param command Cordova参数
+ */
+- (void)shareNews:(CDVInvokedUrlCommand *)command {
+    self.callback = command.callbackId;
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    if (args) {
+        NSString *title = [self check:@"title" in:args];
+        NSString *image = [self check:@"image" in:args];
+        NSString *description = [self check:@"description" in:args];
+        NSString *url = [self check:@"url" in:args];
+        int scene = [[args valueForKey:@"scene"] intValue];
+        int type = [[args valueForKey:@"client"] intValue];
+        NSData *imageData = [self processImage:image];
+        if(!imageData) {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_IMAGE_PARAM_INCORRECT];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+        } else {
+            [self shareObjectWithData:@{ @"url" : url,
+                                         @"image" : imageData,
+                                         @"title" : title,
+                                         @"description" : description }
+                                 Type:NewsMessageWithLocalImage
+                                Scene:scene
+                                ClientType:type];
+
+        }
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_PARAM_NOT_FOUND];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+
+/**
+ 分享音乐链接
+ 
+ @param command Cordova参数
+ */
+- (void)shareAudio:(CDVInvokedUrlCommand *)command {
+    self.callback = command.callbackId;
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    if (args) {
+        NSString *title = [self check:@"title" in:args];
+        NSString *image = [self check:@"image" in:args];
+        NSString *description = [self check:@"description" in:args];
+        NSString *url = [self check:@"url" in:args];
+        NSString *flashUrl = [self check:@"flashUrl" in:args];
+        int scene = [[args valueForKey:@"scene"] intValue];
+        int type = [[args valueForKey:@"client"] intValue];
+        NSData *imageData = [self processImage:image];
+        if(!imageData) {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_IMAGE_PARAM_INCORRECT];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+        } else {
+            [self shareObjectWithData:@{ @"url" : url,
+                                         @"image" : imageData,
+                                         @"flashUrl" : flashUrl,
+                                         @"title" : title,
+                                         @"description" : description }
+                                 Type:AudioMessage
+                                Scene:scene
+                                ClientType:type];
+        }
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_PARAM_NOT_FOUND];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+
+/**
+ 分享视频链接
+ 
+ @param command Cordova参数
+ */
+- (void)shareVideo:(CDVInvokedUrlCommand *)command {
+    self.callback = command.callbackId;
+    NSDictionary *args = [command.arguments objectAtIndex:0];
+    if (args) {
+        NSString *title = [self check:@"title" in:args];
+        NSString *image = [self check:@"image" in:args];
+        NSString *description = [self check:@"description" in:args];
+        NSString *url = [self check:@"url" in:args];
+        NSString *flashUrl = [self check:@"flashUrl" in:args];
+        int scene = [[args valueForKey:@"scene"] intValue];
+        int type = [[args valueForKey:@"client"] intValue];
+        NSData *imageData = [self processImage:image];
+        if(!imageData) {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_IMAGE_PARAM_INCORRECT];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+        } else {
+            [self shareObjectWithData:@{ @"url" : url,
+                                         @"image" : imageData,
+                                         @"flashUrl" : flashUrl,
+                                         @"title" : title,
+                                         @"description" : description }
+                                 Type:VideoMessage
+                                Scene:scene
+                           ClientType:type];
+        }
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_PARAM_NOT_FOUND];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
+    }
+}
+
+/**
+ 分享文本到QQ空间
+ 
+ @param text 分享文本
+ */
+- (void)shareTextToQQZone:(NSString *)text Client:(int) client {
+    QQApiImageArrayForQZoneObject *txtObj = [QQApiImageArrayForQZoneObject objectWithimageDataArray:nil title:text extMap:nil];    if (client == 1) {
+        txtObj.shareDestType = AuthShareType_TIM;
+    } else {
+        txtObj.shareDestType = AuthShareType_QQ;
+    }
+    SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:txtObj];
+    QQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];
+    [self handleSendResult:sent];
+}
+
+/**
+ 分享方法
+ 
+ @param shareData 分享数据
+ @param type 分享的类型
+ @param scene 分享的场景
+ */
+- (void)shareObjectWithData:(NSDictionary *)shareData Type:(QQShareType)type Scene:(QQShareScene)scene ClientType:(int) client {
+    switch (type) {
+        case TextMessage: {
+            NSString *msg = [shareData objectForKey:@"text"];
+            QQApiTextObject *txtObj = [QQApiTextObject objectWithText:msg];
+            [txtObj setCflag:kQQAPICtrlFlagQZoneShareOnStart];
+            switch (scene) {
+                case QQZone:
+                    [self shareTextToQQZone:msg Client:client];
+                    return;
+                case Favorite:
+                    [txtObj setCflag:kQQAPICtrlFlagQQShareFavorites];
+                    break;
+                default:
+                    [txtObj setCflag:kQQAPICtrlFlagQQShare];
+                    break;
+            }
+            if (client == 1) {
+                txtObj.shareDestType = AuthShareType_TIM;
+            } else {
+                txtObj.shareDestType = AuthShareType_QQ;
+            }
+            SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:txtObj];
+            QQApiSendResultCode sent = [QQApiInterface sendReq:req];
+            [self handleSendResult:sent];
+        } break;
+        case ImageMesssage: {
+            NSData *data = [shareData objectForKey:@"image"];
+            NSString *title = [shareData objectForKey:@"title"];
+            NSString *description = [shareData objectForKey:@"description"];
+            QQApiImageObject *imgObj = [QQApiImageObject objectWithData:data
+                                                       previewImageData:nil
+                                                                  title:title
+                                                            description:description];
+            switch (scene) {
+                case QQZone:
+                    [imgObj setCflag:kQQAPICtrlFlagQZoneShareOnStart];
+                    break;
+                case Favorite:
+                    [imgObj setCflag:kQQAPICtrlFlagQQShareFavorites];
+                    break;
+                default:
+                    [imgObj setCflag:kQQAPICtrlFlagQQShare];
+                    break;
+            }
+            if (client == 1) {
+                imgObj.shareDestType = AuthShareType_TIM;
+            } else {
+                imgObj.shareDestType = AuthShareType_QQ;
+            }
+            SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:imgObj];
+            QQApiSendResultCode sent = [QQApiInterface sendReq:req];
+            [self handleSendResult:sent];
+        } break;
+        case NewsMessageWithLocalImage: {
+            NSData *data = [shareData objectForKey:@"image"];
+            NSURL *url = [NSURL URLWithString:[shareData objectForKey:@"url"]];
+            NSString *title = [shareData objectForKey:@"title"];
+            NSString *description = [shareData objectForKey:@"description"];
+            QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:url
+                                                                title:title
+                                                          description:description
+                                                     previewImageData:data];
+            switch (scene) {
+                case QQZone:
+                    [newsObj setCflag:kQQAPICtrlFlagQZoneShareOnStart];
+                    break;
+                case Favorite:
+                    [newsObj setCflag:kQQAPICtrlFlagQQShareFavorites];
+                    break;
+                default:
+                    [newsObj setCflag:kQQAPICtrlFlagQQShare];
+                    break;
+            }
+            if (client == 1) {
+                newsObj.shareDestType = AuthShareType_TIM;
+            } else {
+                newsObj.shareDestType = AuthShareType_QQ;
+            }
+            SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];
+            QQApiSendResultCode sent = [QQApiInterface sendReq:req];
+            [self handleSendResult:sent];
+        } break;
+        case AudioMessage: {
+            NSData *data = [shareData objectForKey:@"image"];
+            NSURL *url = [NSURL URLWithString:[shareData objectForKey:@"url"]];
+            NSString *title = [shareData objectForKey:@"title"];
+            NSString *description = [shareData objectForKey:@"description"];
+            NSURL *flashUrl = [NSURL URLWithString:[shareData objectForKey:@"url"]];
+            QQApiAudioObject *audioObj = [QQApiAudioObject objectWithURL:url
+                                                                   title:title
+                                                             description:description
+                                                        previewImageData:data];
+            [audioObj setFlashURL:flashUrl];
+            switch (scene) {
+                case QQZone:
+                    [audioObj setCflag:kQQAPICtrlFlagQZoneShareOnStart];
+                    break;
+                case Favorite:
+                    [audioObj setCflag:kQQAPICtrlFlagQQShareFavorites];
+                    break;
+                default:
+                    [audioObj setCflag:kQQAPICtrlFlagQQShare];
+                    break;
+            }
+            if (client == 1) {
+                audioObj.shareDestType = AuthShareType_TIM;
+            } else {
+                audioObj.shareDestType = AuthShareType_QQ;
+            }
+            SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:audioObj];
+            QQApiSendResultCode sent = [QQApiInterface sendReq:req];
+            [self handleSendResult:sent];
+        } break;
+        case VideoMessage: {
+            NSData *data = [shareData objectForKey:@"image"];
+            NSURL *url = [NSURL URLWithString:[shareData objectForKey:@"url"]];
+            NSString *title = [shareData objectForKey:@"title"];
+            NSString *description = [shareData objectForKey:@"description"];
+            NSURL *flashUrl = [NSURL URLWithString:[shareData objectForKey:@"url"]];
+            QQApiVideoObject *videoObj = [QQApiVideoObject objectWithURL:url
+                                                                   title:title
+                                                             description:description
+                                                        previewImageData:data];
+            [videoObj setFlashURL:flashUrl];
+            switch (scene) {
+                case QQZone:
+                    [videoObj setCflag:kQQAPICtrlFlagQZoneShareOnStart];
+                    break;
+                case Favorite:
+                    [videoObj setCflag:kQQAPICtrlFlagQQShareFavorites];
+                    break;
+                default:
+                    [videoObj setCflag:kQQAPICtrlFlagQQShare];
+                    break;
+            }
+            if (client == 1) {
+                videoObj.shareDestType = AuthShareType_TIM;
+            } else {
+                videoObj.shareDestType = AuthShareType_QQ;
+            }
+            SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:videoObj];
+            QQApiSendResultCode sent = [QQApiInterface sendReq:req];
+            [self handleSendResult:sent];
+        }
+        default:
+            break;
+    }
+}
+
+/**
+ 分析那个结果处理
+ 
+ @param sendResult 分享结果
+ */
+- (void)handleSendResult:(QQApiSendResultCode)sendResult {
+    switch (sendResult) {
+        case EQQAPISENDSUCESS:
+            break;
+        case EQQAPIAPPSHAREASYNC:
+            break;
+        case EQQAPIAPPNOTREGISTED: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"App 未注册"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPIMESSAGECONTENTINVALID:
+        case EQQAPIMESSAGECONTENTNULL:
+        case EQQAPIMESSAGETYPEINVALID: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"发送参数错误"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPITIMNOTINSTALLED: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"没有安装 TIM"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPIQQNOTINSTALLED: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"没有安装手机 QQ"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPITIMNOTSUPPORTAPI:
+        case EQQAPIQQNOTSUPPORTAPI: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"API 接口不支持"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPISENDFAILD: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"发送失败"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPIVERSIONNEEDUPDATE: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"当前 QQ 版本太低"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case ETIMAPIVERSIONNEEDUPDATE: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"当前 TIM 版本太低"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPIQZONENOTSUPPORTTEXT: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"QQZone 不支持 QQApiTextObject 分享"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPIQZONENOTSUPPORTIMAGE: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"QQZone 不支持 QQApiImageObject 分享"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case EQQAPISHAREDESTUNKNOWN: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"未指定分享到 QQ 或 TIM"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        default: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"发生其他错误"];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+    }
+}
+
+#pragma mark - QQApiInterfaceDelegate
+- (void)onReq:(QQBaseReq *)req {
+}
+
+- (void)onResp:(QQBaseResp *)resp {
+    switch ([resp.result integerValue]) {
+        case 0: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        case -4: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_SHARE_CANCEL];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+        default: {
+            CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
+            [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+            break;
+        }
+    }
+}
+
+- (void)isOnlineResponse:(NSDictionary *)response {
+}
+
+#pragma mark - TencentSessionDelegate
+- (void)tencentDidLogin {
+    if (tencentOAuth.accessToken && 0 != [tencentOAuth.accessToken length]) {
+        NSMutableDictionary *Dic = [NSMutableDictionary dictionaryWithCapacity:2];
+        [Dic setObject:tencentOAuth.openId forKey:@"userid"];
+        [Dic setObject:tencentOAuth.accessToken forKey:@"access_token"];
+        [Dic setObject:[NSString stringWithFormat:@"%f", [tencentOAuth.expirationDate timeIntervalSince1970] * 1000] forKey:@"expires_time"];
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:Dic];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_LOGIN_ERROR];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+    }
+}
+
+- (void)tencentDidLogout {
+    tencentOAuth = nil;
+    CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
+    [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+}
+
+- (void)tencentDidNotLogin:(BOOL)cancelled {
+    if (cancelled) {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_LOGIN_CANCEL];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+    } else {
+        CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_LOGIN_ERROR];
+        [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+    }
+}
+
+- (void)tencentDidNotNetWork {
+    CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:QQ_LOGIN_NETWORK_ERROR];
+    [self.commandDelegate sendPluginResult:pluginResult callbackId:self.callback];
+}
+
+/**
+ 图片处理
+ 
+ @param image 图片数据
+ @return 图片NSdata数据
+ */
+- (NSData *)processImage:(NSString *)image {
+    if ([self isBase64Data:image]) {
+        return [[NSData alloc] initWithBase64EncodedString:image options:0];
+    } else if ([image hasPrefix:@"http://"] || [image hasPrefix:@"https://"]) {
+        NSURL *url = [NSURL URLWithString:image];
+        return [NSData dataWithContentsOfURL:url];
+    } else {
+        return [NSData dataWithContentsOfFile:image];
+    }
+}
+
+/**
+ 检查图片是不是Base64
+ 
+ @param data 图片数据
+ @return 结果true or false
+ */
+- (BOOL)isBase64Data:(NSString *)data {
+    data = [[data componentsSeparatedByCharactersInSet:
+             [NSCharacterSet whitespaceAndNewlineCharacterSet]]
+            componentsJoinedByString:@""];
+    if ([data length] % 4 == 0) {
+        static NSCharacterSet *invertedBase64CharacterSet = nil;
+        if (invertedBase64CharacterSet == nil) {
+            invertedBase64CharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="] invertedSet];
+        }
+        return [data rangeOfCharacterFromSet:invertedBase64CharacterSet options:NSLiteralSearch].location == NSNotFound;
+    }
+    return NO;
+}
+
+/**
+ 检查参数是否存在
+ 
+ @param param 要检查的参数
+ @param args 参数字典
+ @return 参数
+ */
+- (NSString *)check:(NSString *)param in:(NSDictionary *)args {
+    NSString *data = [args objectForKey:param];
+    return data?data:@"";
+}
+
+@end
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/QQApiInterface.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/QQApiInterface.h
new file mode 100644
index 0000000..7354c81
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/QQApiInterface.h
@@ -0,0 +1,134 @@
+///
+/// \file QQApiInterface.h
+/// \brief QQApi接口简化封装
+///
+/// Created by Tencent on 12-5-15.
+/// Copyright (c) 2012年 Tencent. All rights reserved.
+///
+
+#import <Foundation/Foundation.h>
+#import "QQApiInterfaceObject.h"
+
+/**
+ \brief 处理来至QQ的请求及响应的回调协议
+ */
+@protocol QQApiInterfaceDelegate <NSObject>
+
+/**
+ 处理来至QQ的请求
+ */
+- (void)onReq:(QQBaseReq *)req;
+
+/**
+ 处理来至QQ的响应
+ */
+- (void)onResp:(QQBaseResp *)resp;
+
+/**
+ 处理QQ在线状态的回调
+ */
+- (void)isOnlineResponse:(NSDictionary *)response;
+
+@end
+
+/**
+ \brief 对QQApi的简单封装类
+ */
+@interface QQApiInterface : NSObject
+
+/**
+ 处理由手Q唤起的跳转请求
+ \param url 待处理的url跳转请求
+ \param delegate 第三方应用用于处理来至QQ请求及响应的委托对象
+ \return 跳转请求处理结果，YES表示成功处理，NO表示不支持的请求协议或处理失败
+ */
++ (BOOL)handleOpenURL:(NSURL *)url delegate:(id<QQApiInterfaceDelegate>)delegate;
+
+/**
+ 向手Q发起分享请求
+ \param req 分享内容的请求
+ \return 请求发送结果码
+ */
++ (QQApiSendResultCode)sendReq:(QQBaseReq *)req;
+
+/**
+ 向手Q QZone结合版发起分享请求
+ \note H5分享只支持单张网络图片的传递
+ \param req 分享内容的请求
+ \return 请求发送结果码
+ */
++ (QQApiSendResultCode)SendReqToQZone:(QQBaseReq *)req;
+
+/**
+ 向手Q 群部落发起分享请求
+ \note H5分享只支持单张网络图片的传递
+ \param req 分享内容的请求
+ \return 请求发送结果码
+ */
++ (QQApiSendResultCode)SendReqToQQGroupTribe:(QQBaseReq *)req;
+
+/**
+ 向手Q发送应答消息
+ \param resp 应答消息
+ \return 应答发送结果码
+ */
++ (QQApiSendResultCode)sendResp:(QQBaseResp *)resp;
+
+/**
+ 检测是否已安装QQ
+ \return 如果QQ已安装则返回YES，否则返回NO
+ */
++ (BOOL)isQQInstalled;
+
+/**
+ 检测是否已安装TIM
+ \return 如果TIM已安装则返回YES，否则返回NO
+ */
++ (BOOL)isTIMInstalled;
+
+/**
+ 批量检测QQ号码是否在线
+ */
++ (void)getQQUinOnlineStatues:(NSArray *)QQUins delegate:(id<QQApiInterfaceDelegate>)delegate;
+
+/**
+ 检测QQ是否支持API调用
+ \return 如果当前安装QQ版本支持API调用则返回YES，否则返回NO
+ */  
++ (BOOL)isQQSupportApi;
+
+/**
+ 检测TIM是否支持API调用
+ \return 如果当前安装TIM版本支持API调用则返回YES，否则返回NO
+ */
++ (BOOL)isTIMSupportApi;
+
+/**
+ 启动QQ
+ \return 成功返回YES，否则返回NO
+ */
++ (BOOL)openQQ;
+
+/**
+ 启动TIM
+ \return 成功返回YES，否则返回NO
+ */
++ (BOOL)openTIM;
+
+/**
+ 获取QQ下载地址
+ 
+ 如果App通过<code>QQApiInterface#isQQInstalled</code>和<code>QQApiInterface#isQQSupportApi</code>检测发现QQ没安装或当前版本QQ不支持API调用，可引导用户通过打开此链接下载最新版QQ。
+ \return iPhoneQQ下载地址
+ */
++ (NSString *)getQQInstallUrl;
+
+/**
+ 获取TIM下载地址
+ 
+ 如果App通过<code>QQApiInterface#isTIMInstalled</code>和<code>QQApiInterface#isTIMSupportApi</code>检测发现TIM没安装或当前版本TIM不支持API调用，可引导用户通过打开此链接下载最新版TIM。
+ \return iPhoneTIM下载地址
+ */
++ (NSString *)getTIMInstallUrl;
+
+@end
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h
new file mode 100644
index 0000000..318b799
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/QQApiInterfaceObject.h
@@ -0,0 +1,632 @@
+///
+/// \file QQApiInterfaceObject.h
+/// \brief QQApiInterface所依赖的请求及应答消息对象封装帮助类
+///
+/// Created by Tencent on 12-5-15.
+/// Copyright (c) 2012年 Tencent. All rights reserved.
+///
+
+#ifndef QQApiInterface_QQAPIOBJECT_h
+#define QQApiInterface_QQAPIOBJECT_h
+
+#import <Foundation/Foundation.h>
+
+
+typedef enum
+{
+    EQQAPISENDSUCESS = 0,
+    EQQAPIQQNOTINSTALLED = 1,
+    EQQAPIQQNOTSUPPORTAPI = 2,
+    EQQAPIMESSAGETYPEINVALID = 3,
+    EQQAPIMESSAGECONTENTNULL = 4,
+    EQQAPIMESSAGECONTENTINVALID = 5,
+    EQQAPIAPPNOTREGISTED = 6,
+    EQQAPIAPPSHAREASYNC = 7,
+    EQQAPIQQNOTSUPPORTAPI_WITH_ERRORSHOW = 8,
+    EQQAPISENDFAILD = -1,
+    EQQAPISHAREDESTUNKNOWN = -2, //未指定分享到QQ或TIM
+    
+    EQQAPITIMNOTINSTALLED = 11, //TIM未安装
+    EQQAPITIMNOTSUPPORTAPI = 12, // TIM api不支持
+    //qzone分享不支持text类型分享
+    EQQAPIQZONENOTSUPPORTTEXT = 10000,
+    //qzone分享不支持image类型分享
+    EQQAPIQZONENOTSUPPORTIMAGE = 10001,
+    //当前QQ版本太低，需要更新至新版本才可以支持
+    EQQAPIVERSIONNEEDUPDATE = 10002,
+    ETIMAPIVERSIONNEEDUPDATE = 10004,
+} QQApiSendResultCode;
+
+#pragma mark - QQApiObject(分享对象类型)
+
+// QQApiObject control flags
+enum
+{
+    kQQAPICtrlFlagQZoneShareOnStart = 0x01,
+    kQQAPICtrlFlagQZoneShareForbid = 0x02,
+    kQQAPICtrlFlagQQShare = 0x04,
+    kQQAPICtrlFlagQQShareFavorites = 0x08, //收藏
+    kQQAPICtrlFlagQQShareDataline = 0x10,  //数据线
+};
+
+// 分享到QQ或TIM
+typedef enum ShareDestType {
+    ShareDestTypeQQ,
+    ShareDestTypeTIM,
+}ShareDestType;
+
+// QQApiObject
+/** \brief 所有在QQ及插件间发送的数据对象的根类。
+ */
+__attribute__((visibility("default"))) @interface QQApiObject : NSObject
+@property(nonatomic,retain) NSString* title; ///< 标题，最长128个字符
+@property(nonatomic,retain) NSString* description; ///<简要描述，最长512个字符
+
+@property (nonatomic, assign) uint64_t cflag;
+@property (nonatomic, assign) ShareDestType shareDestType; //分享到QQ或TIM，必须指定
+@end
+
+// QQApiResultObject
+/** \brief 用于请求回应的数据类型。
+ <h3>可能错误码及描述如下:</h3>
+ <TABLE>
+ <TR><TD>error</TD><TD>errorDescription</TD><TD>注释</TD></TR>
+ <TR><TD>0</TD><TD>nil</TD><TD>成功</TD></TR>
+ <TR><TD>-1</TD><TD>param error</TD><TD>参数错误</TD></TR>
+ <TR><TD>-2</TD><TD>group code is invalid</TD><TD>该群不在自己的群列表里面</TD></TR>
+ <TR><TD>-3</TD><TD>upload photo failed</TD><TD>上传图片失败</TD></TR>
+ <TR><TD>-4</TD><TD>user give up the current operation</TD><TD>用户放弃当前操作</TD></TR>
+ <TR><TD>-5</TD><TD>client internal error</TD><TD>客户端内部处理错误</TD></TR>
+ </TABLE>
+ */
+__attribute__((visibility("default"))) @interface QQApiResultObject : QQApiObject
+@property(nonatomic,retain) NSString* error; ///<错误
+@property(nonatomic,retain) NSString* errorDescription; ///<错误描述
+@property(nonatomic,retain) NSString* extendInfo; ///<扩展信息
+@end
+
+// QQApiTextObject
+/** \brief 文本对象
+ */
+@interface QQApiTextObject : QQApiObject
+@property(nonatomic,retain)NSString* text; ///<文本内容，必填，最长1536个字符
+
+-(id)initWithText:(NSString*)text; ///<初始化方法
++(id)objectWithText:(NSString*)text;///<工厂方法，获取一个QQApiTextObject对象.
+@end
+
+// QQApiURLObject
+typedef enum QQApiURLTargetType{
+    QQApiURLTargetTypeNotSpecified = 0x00,
+    QQApiURLTargetTypeAudio   = 0x01,
+    QQApiURLTargetTypeVideo   = 0x02,
+    QQApiURLTargetTypeNews    = 0x03
+}QQApiURLTargetType;
+
+/** @brief URL对象类型。
+ 
+ 包括URL地址，URL地址所指向的目标类型及预览图像。
+ */
+__attribute__((visibility("default"))) @interface QQApiURLObject : QQApiObject
+/**
+ URL地址所指向的目标类型.
+ @note 参见QQApi.h 中的 QQApiURLTargetType 定义.
+ */
+@property(nonatomic)QQApiURLTargetType targetContentType;
+
+@property(nonatomic,retain)NSURL* url; ///<URL地址,必填，最长512个字符
+@property(nonatomic,retain)NSData* previewImageData;///<预览图像数据，最大1M字节
+@property(nonatomic, retain) NSURL *previewImageURL;    ///<预览图像URL **预览图像数据与预览图像URL可二选一
+
+/**
+ 初始化方法
+ */
+-(id)initWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data targetContentType:(QQApiURLTargetType)targetContentType;
+-(id)initWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
+/**
+ 工厂方法,获取一个QQApiURLObject对象
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data targetContentType:(QQApiURLTargetType)targetContentType;
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL targetContentType:(QQApiURLTargetType)targetContentType;
+@end
+
+// QQApiExtendObject
+/** @brief 扩展数据类型
+ */
+@interface QQApiExtendObject : QQApiObject
+@property(nonatomic,retain) NSData* data;///<具体数据内容，必填，最大5M字节
+@property(nonatomic,retain) NSData* previewImageData;///<预览图像，最大1M字节
+@property(nonatomic,retain) NSArray* imageDataArray;///图片数组(多图暂只支持分享到手机QQ收藏功能)
+
+/**
+ 初始化方法
+ @param data 数据内容
+ @param previewImageData 用于预览的图片
+ @param title 标题
+ @param description 此对象，分享的描述
+ */
+- (id)initWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description;
+
+/**
+ 初始化方法
+ @param data 数据内容
+ @param title 标题
+ @param description 此对象，分享的描述
+ @param imageDataArray 发送的多张图片队列
+ */
+- (id)initWithData:(NSData *)data previewImageData:(NSData*)previewImageData title:(NSString *)title description:(NSString *)description imageDataArray:(NSArray *)imageDataArray;
+
+/**
+ helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
+ @param data 数据内容
+ @param previewImageData 用于预览的图片
+ @param title 标题
+ @param description 此对象，分享的描述
+ @return
+ 一个自动释放的<code>QQApiExtendObject</code>实例
+ */
++ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description;
+
+/**
+ helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
+ @param data 数据内容
+ @param previewImageData 用于预览的图片
+ @param title 标题
+ @param description 此对象，分享的描述
+ @param imageDataArray 发送的多张图片队列
+ @return
+ 一个自动释放的<code>QQApiExtendObject</code>实例
+ */
++ (id)objectWithData:(NSData*)data previewImageData:(NSData*)previewImageData title:(NSString*)title description:(NSString*)description imageDataArray:(NSArray*)imageDataArray;
+
+@end
+
+// QQApiImageObject
+/** @brief 图片对象
+ 用于分享图片内容的对象，是一个指定为图片类型的<code>QQApiExtendObject</code>
+ */
+@interface QQApiImageObject : QQApiExtendObject
+@end
+
+// QQApiImageArrayForQZoneObject
+/** @brief 图片对象
+ 用于分享图片到空间，走写说说路径，是一个指定为图片类型的，当图片数组为空时，默认走文本写说说<code>QQApiObject</code>
+ */
+@interface QQApiImageArrayForQZoneObject : QQApiObject
+
+@property(nonatomic,retain) NSArray* imageDataArray;///图片数组
+@property(nonatomic,retain) NSDictionary* extMap; // 扩展字段
+
+/**
+ 初始化方法
+ @param imageDataArray 图片数组
+ @param title 写说说的内容，可以为空
+ @param extMap 扩展字段
+ */
+- (id)initWithImageArrayData:(NSArray*)imageDataArray title:(NSString*)title extMap:(NSDictionary *)extMap;
+
+/**
+ helper方法获取一个autorelease的<code>QQApiExtendObject</code>对象
+ @param title 写说说的内容，可以为空
+ @param imageDataArray 发送的多张图片队列
+ @param extMap 扩展字段
+ @return
+ 一个自动释放的<code>QQApiExtendObject</code>实例
+ */
++ (id)objectWithimageDataArray:(NSArray*)imageDataArray title:(NSString*)title extMap:(NSDictionary *)extMap;
+
+@end
+
+// QQApiVideoForQZoneObject
+/** @brief 视频对象
+ 用于分享视频到空间，走写说说路径<code>QQApiObject</code>
+ assetURL可传ALAsset的ALAssetPropertyAssetURL，或者PHAsset的localIdentifier
+  @param extMap 扩展字段
+ */
+@interface QQApiVideoForQZoneObject : QQApiObject
+
+@property(nonatomic, retain) NSString *assetURL;
+@property(nonatomic,retain) NSDictionary* extMap; // 扩展字段
+
+- (id)initWithAssetURL:(NSString*)assetURL title:(NSString*)title extMap:(NSDictionary *)extMap;
+
++ (id)objectWithAssetURL:(NSString*)assetURL title:(NSString*)title extMap:(NSDictionary *)extMap;
+
+@end
+
+// QQApiWebImageObject
+/** @brief 图片对象
+ 用于分享网络图片内容的对象，是一个指定网络图片url的: 该类型只在2.9.0的h5分享中才支持，
+ 原有的手q分享是不支持该类型的。
+ */
+@interface QQApiWebImageObject : QQApiObject
+
+@property(nonatomic, retain) NSURL *previewImageURL;    ///<预览图像URL
+
+/**
+ 初始化方法
+ @param previewImageURL 用于预览的图片
+ @param title 标题
+ @param description 此对象，分享的描述
+ */
+- (id)initWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description;
+
+/**
+ helper方法获取一个autorelease的<code>QQApiWebImageObject</code>对象
+ @param previewImageURL 用于预览的图片
+ @param title 标题
+ @param description 此对象，分享的描述
+ */
++ (id)objectWithPreviewImageURL:(NSURL*)previewImageURL title:(NSString*)title description:(NSString*)description;
+
+@end
+
+// QQApiGroupTribeImageObject
+/** @brief 群部落图片对象
+ 用于分享图片内容的对象，是一个指定为图片类型的 可以指定一些其他的附加数据<code>QQApiExtendObject</code>
+ */
+@interface QQApiGroupTribeImageObject : QQApiImageObject
+{
+    NSString *_bid;
+    NSString *_bname;
+}
+// 群部落id
+@property (nonatomic, retain)NSString* bid;
+
+// 群部落名称
+@property (nonatomic, retain)NSString* bname;
+
+@end
+
+
+//QQApiFileObject
+/** @brief 本地文件对象(暂只支持分享到手机QQ数据线功能)
+ 用于分享文件内容的对象，是一个指定为文件类型的<code>QQApiExtendObject</code>
+ */
+@interface QQApiFileObject : QQApiExtendObject
+{
+    NSString* _fileName;
+}
+@property(nonatomic, retain)NSString* fileName;
+@end
+
+// QQApiAudioObject
+/** @brief 音频URL对象
+ 用于分享目标内容为音频的URL的对象
+ */
+@interface QQApiAudioObject : QQApiURLObject
+
+@property (nonatomic, retain) NSURL *flashURL;      ///<音频URL地址，最长512个字符
+
+/**
+ 获取一个autorelease的<code>QQApiAudioObject</code>
+ @param url 音频内容的目标URL
+ @param title 分享内容的标题
+ @param description 分享内容的描述
+ @param data 分享内容的预览图像
+ @note 如果url为空，调用<code>QQApi#sendMessage:</code>时将返回FALSE
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data;
+
+/**
+ 获取一个autorelease的<code>QQApiAudioObject</code>
+ @param url 音频内容的目标URL
+ @param title 分享内容的标题
+ @param description 分享内容的描述
+ @param previewURL 分享内容的预览图像URL
+ @note 如果url为空，调用<code>QQApi#sendMessage:</code>时将返回FALSE
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL;
+
+@end
+
+// QQApiVideoObject
+/** @brief 视频URL对象
+ 用于分享目标内容为视频的URL的对象
+ 
+ QQApiVideoObject类型的分享，目前在Android和PC QQ上接收消息时，展现有待完善，待手机QQ版本以后更新支持
+ 目前如果要分享视频，推荐使用 QQApiNewsObject 类型
+ */
+@interface QQApiVideoObject : QQApiURLObject
+
+@property (nonatomic, retain) NSURL *flashURL;      ///<视频URL地址，最长512个字符
+
+/**
+ 获取一个autorelease的<code>QQApiVideoObject</code>
+ @param url 视频内容的目标URL
+ @param title 分享内容的标题
+ @param description 分享内容的描述
+ @param data 分享内容的预览图像
+ @note 如果url为空，调用<code>QQApi#sendMessage:</code>时将返回FALSE
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data;
+
+/**
+ 获取一个autorelease的<code>QQApiVideoObject</code>
+ @param url 视频内容的目标URL
+ @param title 分享内容的标题
+ @param description 分享内容的描述
+ @param previewURL 分享内容的预览图像URL
+ @note 如果url为空，调用<code>QQApi#sendMessage:</code>时将返回FALSE
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL;
+
+@end
+
+// QQApiNewsObject
+/** @brief 新闻URL对象
+ 用于分享目标内容为新闻的URL的对象
+ */
+@interface QQApiNewsObject : QQApiURLObject
+/**
+ 获取一个autorelease的<code>QQApiNewsObject</code>
+ @param url 视频内容的目标URL
+ @param title 分享内容的标题
+ @param description 分享内容的描述
+ @param data 分享内容的预览图像
+ @note 如果url为空，调用<code>QQApi#sendMessage:</code>时将返回FALSE
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageData:(NSData*)data;
+
+/**
+ 获取一个autorelease的<code>QQApiNewsObject</code>
+ @param url 视频内容的目标URL
+ @param title 分享内容的标题
+ @param description 分享内容的描述
+ @param previewURL 分享内容的预览图像URL
+ @note 如果url为空，调用<code>QQApi#sendMessage:</code>时将返回FALSE
+ */
++(id)objectWithURL:(NSURL*)url title:(NSString*)title description:(NSString*)description previewImageURL:(NSURL*)previewURL;
+
+@end
+
+// QQApiPayObject
+/** \brief 支付对象
+ */
+@interface QQApiPayObject : QQApiObject
+@property(nonatomic,retain)NSString* OrderNo; ///<支付订单号，必填
+@property(nonatomic,retain)NSString* AppInfo; ///<支付来源信息，必填
+
+-(id)initWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo; ///<初始化方法
++(id)objectWithOrderNo:(NSString*)OrderNo AppInfo:(NSString*)AppInfo;///<工厂方法，获取一个QQApiPayObject对象.
+@end
+
+// QQApiCommonContentObject;
+/** @brief 通用模板类型对象
+ 用于分享一个固定显示模板的图文混排对象
+ @note 图片列表和文本列表不能同时为空
+ */
+@interface QQApiCommonContentObject : QQApiObject
+/**
+ 预定义的界面布局类型
+ */
+@property(nonatomic,assign) unsigned int layoutType;
+@property(nonatomic,assign) NSData* previewImageData;///<预览图
+@property(nonatomic,retain) NSArray* textArray;///<文本列表
+@property(nonatomic,retain) NSArray* pictureDataArray;///<图片列表
++(id)objectWithLayoutType:(int)layoutType textArray:(NSArray*)textArray pictureArray:(NSArray*)pictureArray previewImageData:(NSData*)data;
+/**
+ 将一个NSDictionary对象转化为QQApiCommomContentObject，如果无法转换，则返回空
+ */
++(id)objectWithDictionary:(NSDictionary*)dic;
+-(NSDictionary*)toDictionary;
+@end
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// Ad item object definition
+////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/** @brief 广告数据对象
+ */
+@interface QQApiAdItem : NSObject
+@property(nonatomic,retain) NSString* title; ///<名称
+@property(nonatomic,retain) NSString* description;///<描述
+@property(nonatomic,retain) NSData* imageData;///<广告图片
+@property(nonatomic,retain) NSURL* target;///<广告目标链接
+@end
+
+// QQApiWPAObject
+/** \brief 发起WPA对象
+ */
+@interface QQApiWPAObject : QQApiObject
+@property(nonatomic,retain)NSString* uin; ///<想要对话的QQ号
+
+-(id)initWithUin:(NSString*)uin; ///<初始化方法
++(id)objectWithUin:(NSString*)uin;///<工厂方法，获取一个QQApiWPAObject对象.
+@end
+
+// QQApiAddFriendObject
+/** \brief 添加好友
+ */
+@interface QQApiAddFriendObject : QQApiObject
+@property (nonatomic,retain)NSString* openID;
+@property (nonatomic,retain)NSString* subID;
+@property (nonatomic,retain)NSString* remark;
+
+-(id)initWithOpenID:(NSString*)openID; ///<初始化方法
++(id)objecWithOpenID:(NSString*)openID; ///<工厂方法，获取一个QQApiAddFriendObject对象.
+
+@end
+
+// QQApiGameConsortiumBindingGroupObject
+/** \brief 游戏公会绑定群
+ */
+@interface QQApiGameConsortiumBindingGroupObject : QQApiObject
+@property (nonatomic,retain)NSString* signature;
+@property (nonatomic,retain)NSString* unionid;
+@property (nonatomic,retain)NSString* zoneID;
+@property (nonatomic,retain)NSString* appDisplayName;
+
+-(id)initWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<初始化方法
++(id)objectWithGameConsortium:(NSString*)signature unionid:(NSString*)unionid zoneID:(NSString*)zoneID appDisplayName:(NSString*)appDisplayName; ///<工厂方法，获取一个QQApiAddFriendObject对象.
+
+@end
+
+// QQApiGameConsortiumBindingGroupObject
+/** \brief 加入群
+ */
+@interface QQApiJoinGroupObject : QQApiObject
+@property (nonatomic,retain)NSString* groupUin;
+@property (nonatomic,retain)NSString* groupKey;
+
+- (id)initWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<初始化方法
++ (id)objectWithGroupInfo:(NSString*)groupUin key:(NSString*)groupKey; ///<同时提供群号和群KEY 工厂方法，获取一个QQApiAddFriendObject对象.
++ (id)objectWithGroupKey:(NSString*)groupKey; ///<只需要群的KEY 工厂方法，获取一个QQApiAddFriendObject对象.
+
+@end
+
+// QQApiGroupChatObject
+/** \brief 发起群会话对象
+ */
+@interface QQApiGroupChatObject : QQApiObject
+@property(nonatomic,retain)NSString* groupID; ///<想要对话的群号
+
+-(id)initWithGroup:(NSString*)groupID; ///<初始化方法
++(id)objectWithGroup:(NSString*)groupID;///<工厂方法，获取一个QQApiGroupChatObject对象.
+@end
+
+#pragma mark - QQApi请求消息类型
+
+/**
+ QQApi请求消息类型
+ */
+enum QQApiInterfaceReqType
+{
+    EGETMESSAGEFROMQQREQTYPE = 0,   ///< 手Q -> 第三方应用，请求第三方应用向手Q发送消息
+    ESENDMESSAGETOQQREQTYPE = 1,    ///< 第三方应用 -> 手Q，第三方应用向手Q分享消息
+    ESHOWMESSAGEFROMQQREQTYPE = 2   ///< 手Q -> 第三方应用，请求第三方应用展现消息中的数据
+};
+
+/**
+ QQApi应答消息类型
+ */
+enum QQApiInterfaceRespType
+{
+    ESHOWMESSAGEFROMQQRESPTYPE = 0, ///< 第三方应用 -> 手Q，第三方应用应答消息展现结果
+    EGETMESSAGEFROMQQRESPTYPE = 1,  ///< 第三方应用 -> 手Q，第三方应用回应发往手Q的消息
+    ESENDMESSAGETOQQRESPTYPE = 2    ///< 手Q -> 第三方应用，手Q应答处理分享消息的结果
+};
+
+/**
+ QQApi请求消息基类
+ */
+@interface QQBaseReq : NSObject
+
+/** 请求消息类型，参见\ref QQApiInterfaceReqType */
+@property (nonatomic, assign) int type;
+
+@end
+
+/**
+ QQApi应答消息基类
+ */
+@interface QQBaseResp : NSObject
+
+/** 请求处理结果 */
+@property (nonatomic, copy) NSString* result;
+
+/** 具体错误描述信息 */
+@property (nonatomic, copy) NSString* errorDescription;
+
+/** 应答消息类型，参见\ref QQApiInterfaceRespType */
+@property (nonatomic, assign) int type;
+
+/** 扩展信息 */
+@property (nonatomic, assign) NSString* extendInfo;
+
+@end
+
+/**
+ GetMessageFromQQReq请求帮助类
+ */
+@interface GetMessageFromQQReq : QQBaseReq
+
+/**
+ 创建一个GetMessageFromQQReq请求实例
+ */
++ (GetMessageFromQQReq *)req;
+
+@end
+
+/**
+ GetMessageFromQQResp应答帮助类
+ */
+@interface GetMessageFromQQResp : QQBaseResp
+
+/**
+ 创建一个GetMessageFromQQResp应答实例
+ \param message 具体分享消息实例
+ \return 新创建的GetMessageFromQQResp应答实例
+ */
++ (GetMessageFromQQResp *)respWithContent:(QQApiObject *)message;
+
+/** 具体分享消息 */
+@property (nonatomic, retain) QQApiObject *message;
+
+@end
+
+/**
+ SendMessageToQQReq请求帮助类
+ */
+@interface SendMessageToQQReq : QQBaseReq
+
+/**
+ 创建一个SendMessageToQQReq请求实例
+ \param message 具体分享消息实例
+ \return 新创建的SendMessageToQQReq请求实例
+ */
++ (SendMessageToQQReq *)reqWithContent:(QQApiObject *)message;
+
+/** 具体分享消息 */
+@property (nonatomic, retain) QQApiObject *message;
+
+@end
+
+/**
+ SendMessageToQQResp应答帮助类
+ */
+@interface SendMessageToQQResp : QQBaseResp
+
+/**
+ 创建一个SendMessageToQQResp应答实例
+ \param result 请求处理结果
+ \param errDesp 具体错误描述信息
+ \param extendInfo 扩展信息
+ \return 新创建的SendMessageToQQResp应答实例
+ */
++ (SendMessageToQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp extendInfo:(NSString*)extendInfo;
+
+@end
+
+/**
+ ShowMessageFromQQReq请求帮助类
+ */
+@interface ShowMessageFromQQReq : QQBaseReq
+
+/**
+ 创建一个ShowMessageFromQQReq请求实例
+ \param message 具体待展现消息实例
+ \return 新创建的ShowMessageFromQQReq请求实例
+ */
++ (ShowMessageFromQQReq *)reqWithContent:(QQApiObject *)message;
+
+/** 具体待展现消息 */
+@property (nonatomic, retain) QQApiObject *message;
+
+@end
+
+/**
+ ShowMessageFromQQResp应答帮助类
+ */
+@interface ShowMessageFromQQResp : QQBaseResp
+
+/**
+ 创建一个ShowMessageFromQQResp应答实例
+ \param result 展现消息结果
+ \param errDesp 具体错误描述信息
+ \return 新创建的ShowMessageFromQQResp应答实例
+ */
++ (ShowMessageFromQQResp *)respWithResult:(NSString *)result errorDescription:(NSString *)errDesp;
+
+@end
+
+#endif
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentApiInterface.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentApiInterface.h
new file mode 100644
index 0000000..958226c
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentApiInterface.h
@@ -0,0 +1,104 @@
+//
+//  TencentMessage.h
+//  TencentOpenApi_IOS
+//
+//  Created by qqconnect on 13-5-29.
+//  Copyright (c) 2013年 Tencent. All rights reserved.
+//
+
+#ifndef QQ_OPEN_SDK_LITE
+
+#import <Foundation/Foundation.h>
+#import "TencentMessageObject.h"
+
+typedef enum
+{
+    kIphoneQQ,
+    kIphoneQZONE,
+    kIphoneTIM,
+    kThirdApp,
+}
+TecnentPlatformType;
+
+typedef enum
+{
+    kTencentApiSuccess,
+    kTencentApiPlatformUninstall,
+    kTencentApiPlatformNotSupport,
+    kTencentApiParamsError,
+    kTencentApiFail,
+}
+TencentApiRetCode;
+
+@class TencentApiReq;
+@class TencentApiResp;
+
+/**
+ * \brief TencentApiInterface的回调
+ *
+ * TencentApiInterface的回调接口 
+ * \note v1.0版本只支持腾讯业务拉起第三方请求内容
+ */
+@protocol TencentApiInterfaceDelegate <NSObject>
+
+@optional
+/**
+ * 请求获得内容 当前版本只支持第三方相应腾讯业务请求
+ */
+- (BOOL)onTencentReq:(TencentApiReq *)req;
+
+/**
+ * 响应请求答复 当前版本只支持腾讯业务相应第三方的请求答复
+ */
+- (BOOL)onTencentResp:(TencentApiResp *)resp;
+
+@end
+
+/**
+ * \brief TencentApiInterface的回调
+ *
+ * TencentApiInterface的调用接口 
+ * \note v1.0版本只支持第三方答复内容
+ */
+@interface TencentApiInterface : NSObject
+
+/**
+ * 发送答复返回腾讯业务
+ * \param resp 答复内容
+ * \return 返回码
+ */
++ (TencentApiRetCode)sendRespMessageToTencentApp:(TencentApiResp *)resp;
+
+/**
+ * 是否可以处理拉起协议
+ * \param url
+ * \param delegate 指定的回调
+ * \return 是否是腾讯API认识的消息类型
+ */
++ (BOOL)canOpenURL:(NSURL *)url delegate:(id<TencentApiInterfaceDelegate>)delegate;
+
+/**
+ * 处理应用拉起协议
+ * \param url
+ * \param delegate 指定的回调
+ * \return 是否是腾讯API认识的消息类型
+ */
++ (BOOL)handleOpenURL:(NSURL *)url delegate:(id<TencentApiInterfaceDelegate>)delegate;
+
+/**
+ * 用户设备是否安装腾讯APP
+ * \param platform 指定的腾讯业务
+ * \return YES:安装 NO:未安装
+ */
++ (BOOL)isTencentAppInstall:(TecnentPlatformType)platform;
+
+/**
+ * 用户设备是否支持调用SDK
+ * \param platform 指定的腾讯业务
+ * \return YES:支持 NO:不支持
+ */
++ (BOOL)isTencentAppSupportTencentApi:(TecnentPlatformType)platform;
+
+@end
+
+#endif
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentMessageObject.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentMessageObject.h
new file mode 100644
index 0000000..f89ff90
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentMessageObject.h
@@ -0,0 +1,412 @@
+//
+//  TencentMessageObject.h
+//  TencentOpenApi_IOS
+//
+//  Created by qqconnect on 13-5-27.
+//  Copyright (c) 2013年 Tencent. All rights reserved.
+//
+
+#ifndef QQ_OPEN_SDK_LITE
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+#import "sdkdef.h"
+
+#define kTextLimit (1024 * 1024)
+#define kDataLimit (1024 * 1024 * 10)
+#define kPreviewDataLimit (1024 * 1024)
+
+@class TencentApiReq;
+@class TencentApiResp;
+
+/**
+ * 必填的NSArray型参数
+ */
+typedef NSArray *TCRequiredArray;
+
+/**
+ * 必填的NSDictionary型参数
+ */
+typedef NSDictionary *TCRequiredDictionary;
+
+/**
+ * 必填的TencentApiReq型参数
+ */
+typedef TencentApiReq *TCRequiredReq;
+
+/**
+ * 可选的UIImage类型参数
+ */
+typedef NSData *TCOptionalData;
+
+
+/**
+ * 可选的NSArray型参数
+ */
+typedef NSArray *TCOptionalArray;
+
+/**
+ * 可选的TencentApiReq型参数
+ */
+typedef TencentApiReq *TCOptionalReq;
+
+/** 
+ * TencentReqMessageType 请求类型枚举参数
+ */
+typedef enum
+{
+    /** TX APP请求内容填充（需要第三方开发者填充完成内容后需要主动调用sendRespMessageToTencentApp）*/
+    ReqFromTencentAppQueryContent,
+    /** TX APP请求展现内容 (不用调用答复) */
+    ReqFromTencentAppShowContent,
+    /** 第三方 APP 请求内容 */
+    ReqFromThirdAppQueryContent,
+    /** 第三方 APP 请求展现内容（类似分享）*/
+    ReqFromThirdAppShowContent,
+}
+TencentReqMessageType;
+
+typedef enum
+{
+    RespFromTencentAppQueryContent,
+    RespFromTencentAppShowContent,
+    RespFromThirdAppQueryContent,
+    RespFromThirdAppShowContent,
+}
+TencentRespMessageType;
+
+/** 
+ * TencentObjVersion 腾讯API消息类型枚举
+ */
+typedef enum
+{
+    /** 文本类型 */
+    TencentTextObj,
+    /** 图片类型 */
+    TencentImageObj,
+    /** 音频类型 */
+    TencentAudioObj,
+    /** 视频类型 */
+    TencentVideoObj,
+    /** 图片视频类 */
+    TencentImageAndVideoObj,
+}
+TencentObjVersion;
+
+/**
+ * \brief 请求包
+ *
+ * TencentApiReq用来向其他业务发送请求包
+ */
+@interface TencentApiReq  : NSObject<NSCoding>
+
+/**
+ * 根据序列号生成一个请求包 
+ * \param apiSeq 请求序列号
+ * \param type   请求类型
+ * \return tencentApiReq实例
+ */
++ (TencentApiReq *)reqFromSeq:(NSInteger)apiSeq type:(TencentReqMessageType)type;
+
+/** 请求类型 */
+@property (readonly, assign, nonatomic)TCRequiredInt nMessageType;
+
+/** 请求平台 */
+@property (readonly, assign, nonatomic)NSInteger nPlatform;
+
+/** 请求的SDK版本号 */
+@property (readonly, assign, nonatomic)NSInteger nSdkVersion;
+
+/** 请求序列号 */
+@property (readonly, assign, nonatomic)TCRequiredInt nSeq;
+
+/** 第三方的APPID */
+@property (nonatomic, retain)TCRequiredStr sAppID;
+
+/** 请求内容 TencentBaseMessageObj对象数组 */
+@property (nonatomic, retain)TCOptionalArray arrMessage;
+
+/** 请求的描述 可以用于告诉对方这个请求的特定场景 */
+@property (nonatomic, retain)TCOptionalStr sDescription;
+
+@end
+
+/**
+ * \brief 答复包
+ *
+ * TencentApiResp用来向其他业务发送答复包
+ */
+@interface TencentApiResp : NSObject<NSCoding>
+
+/**
+ * 根据序列号生成一个答复包
+ * \param req 答复对应的请求包（如果req不是TencentApiReq或者他的子类，会抛出异常）
+ * \return 答复包体
+ */
++ (TencentApiResp *)respFromReq:(TencentApiReq *)req;
+
+/** 返回码 */
+@property (nonatomic, assign)TCOptionalInt  nRetCode;
+
+/** 返回消息 */
+@property (nonatomic, retain)TCOptionalStr  sRetMsg;
+
+/** 答复对应的请求包 */
+@property (nonatomic, retain)TCOptionalReq  objReq;
+
+@end
+
+/**
+ * \brief 消息体
+ *
+ * TencentBaseMessageObj 应用之间传递消息体
+ */
+@interface TencentBaseMessageObj : NSObject<NSCoding>
+
+/** 消息类型 */
+@property (nonatomic, assign)NSInteger nVersion;
+
+/** 消息描述 */
+@property (nonatomic, retain)NSString  *sName;
+
+/** 消息的扩展信息 主要是可以用来进行一些请求消息体的描述 譬如图片要求的width height 文字的关键字什么的, 也可以不用填写*/
+@property (nonatomic, retain)NSDictionary *dictExpandInfo;
+
+/** 
+ * 消息是否有效 
+ */
+- (BOOL)isVaild;
+
+@end
+
+#pragma mark TencentTextMessage
+/**
+ * \brief 文本的消息体
+ *
+ * TencentTextMessageObjV1 应用之间传递的文本消息体
+ */
+@interface TencentTextMessageObjV1 : TencentBaseMessageObj
+
+/** 
+ * 文本
+ * \note 文本长度不能超过4096个字
+ */
+@property (nonatomic, retain)  NSString   *sText;
+
+
+/**
+ * 初始化文本消息
+ * \param text 文本
+ * \return 初始化返回的文本消息
+ */
+- (id)initWithText:(NSString *)text;
+
+@end
+
+
+#pragma mark TecentImageMessage
+
+/**
+ * TencentApiImageSourceType 图片数据类型（请求方对数据类型可能会有限制）
+ */
+typedef enum
+{
+    /** 图片数据是url或二进制数据 */
+    AllImage,
+    /** 图片数据是url */
+    UrlImage,
+    /** 图片数据是二进制数据 */
+    DataImage,
+}TencentApiImageSourceType;
+
+/**
+ * \brief 图片的消息体
+ *
+ * TencentImageMessageObjV1 应用之间传递的图片消息体
+ */
+@interface TencentImageMessageObjV1 : TencentBaseMessageObj
+
+/** 
+ * 图片数据
+ * \note 图片不能大于10M
+ */
+@property (nonatomic, retain)  NSData *dataImage;
+
+/** 
+ * 缩略图的数据
+ * \note 图片不能大于1M 
+ */
+@property (nonatomic, retain)  NSData *dataThumbImage;
+
+/** 图片URL */
+@property (nonatomic, retain)  NSString   *sUrl;
+
+/** 图片的描述 */
+@property (nonatomic, retain)  NSString   *sDescription;
+
+/** 图片的size */
+@property (nonatomic, assign)  CGSize   szImage;
+
+/** 
+ * 图片来源
+ * \note TencentApiImageSourceType对应的类型
+ */
+@property (readonly, assign)  NSInteger  nType;
+
+/**
+ * 初始化图片消息
+ * \param dataImage 图片类型
+ * \return 初始化返回的图片消息
+ */
+- (id)initWithImageData:(NSData *)dataImage;
+
+/**
+ * 初始化图片消息
+ * \param url 图片url
+ * \return 初始化返回的图片消息
+ */
+- (id)initWithImageUrl:(NSString *)url;
+
+/**
+ * 初始化图片消息
+ * \param type 图片类型
+ * \return 初始化返回的图片消息
+ */
+- (id)initWithType:(TencentApiImageSourceType)type;
+@end
+
+
+#pragma mark TencentAudioMessage
+/**
+ * \brief 音频的消息体
+ *
+ * TencentAudioMessageObjV1 应用之间传递的音频消息体
+ */
+@interface TencentAudioMessageObjV1 : TencentBaseMessageObj
+
+/** 音频URL */
+@property (nonatomic, retain)  NSString   *sUrl;
+
+/** 
+ * 音频的预览图
+ * \note图片不能大于1M 
+ */
+@property (nonatomic, retain)  NSData     *dataImagePreview;
+
+/** 音频的预览图URL */
+@property (nonatomic, retain)  NSString   *sImagePreviewUrl;
+
+/** 音频的描述 */
+@property (nonatomic, retain)  NSString   *sDescription;
+
+/**
+ * 初始化图片消息
+ * \param url 音频URL
+ * \return 初始化返回的音频消息
+ */
+- (id)initWithAudioUrl:(NSString *)url;
+
+@end
+
+
+#pragma mark TencentVideoMessage
+
+/**
+ * TencentApiVideoSourceType 视频数据类型（请求方对数据类型可能会有限制）
+ */
+
+typedef enum
+{
+    /** 视频来源于本地或网络 */
+    AllVideo,
+    /** 视频来源于本地 */
+    LocalVideo,
+    /** 视频来源于网络 */
+    NetVideo,
+}TencentApiVideoSourceType;
+
+/**
+ * \brief 视频的消息体
+ *
+ * TencentVideoMessageV1 应用之间传递的视频消息体
+ */
+@interface TencentVideoMessageV1 : TencentBaseMessageObj
+
+/** 
+ * 视频URL 
+ * \note 不能超过1024
+ */
+@property (nonatomic, retain)  NSString   *sUrl;
+
+/** 
+ * 视频来源 主要是用来让发起方指定视频的来源
+ * \note TencentApiVideoSourceType 对应的类型 只读参数
+ */
+@property (readonly, assign, nonatomic)  NSInteger nType;
+
+/** 
+ * 视频的预览图 
+ * \note 图片不能大于1M 
+ */
+@property (nonatomic, retain)  NSData     *dataImagePreview;
+
+/** 视频的预览图URL */
+@property (nonatomic, retain)  NSString   *sImagePreviewUrl;
+
+/** 视频的描述 */
+@property (nonatomic, retain)  NSString   *sDescription;
+
+/**
+ * 初始化视频消息
+ * \param url  视频URL
+ * \param type 视频来源类型
+ * \return 初始化返回的视频消息
+ */
+- (id)initWithVideoUrl:(NSString *)url type:(TencentApiVideoSourceType)type;
+
+
+/**
+ * 初始化视频消息
+ * \param type 视频来源类型
+ * \return 初始化返回的视频消息
+ */
+- (id)initWithType:(TencentApiVideoSourceType)type;
+@end
+
+#pragma mark TencentImageMessageObj
+/**
+ * \brief 视频图片消息体
+ *
+ * TencentVideoMessageV1 这是一个扩展的类 是一个图片视频类 
+ * \note 图片视频可以任选一个内容填充 但是注意只能填一个 当有一种类型被填充后 另外一个种类型就无法填充了
+ */
+@interface TencentImageAndVideoMessageObjV1 : TencentBaseMessageObj
+
+/** 图片消息 */
+@property (nonatomic, retain) TencentImageMessageObjV1 *objImageMessage;
+
+/** 视频消息 */
+@property (nonatomic, retain) TencentVideoMessageV1 *objVideoMessage;
+
+/**
+ * 初始化图片消息
+ * \param dataImage 图片数据
+ * \param url       视频url
+ * \return 初始化返回的图片视频消息
+ */
+- (id)initWithMessage:(NSData *)dataImage videoUrl:(NSString *)url;
+
+/** 
+ * 设置图片
+ * \param dataImage 图片数据
+ */
+- (void)setDataImage:(NSData *)dataImage;
+
+/**
+ * 设置视频
+ * \param videoUrl 视频URL
+ */
+- (void)setVideoUrl:(NSString *)videoUrl;
+@end
+
+#endif
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentOAuth.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentOAuth.h
new file mode 100644
index 0000000..ed60e07
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentOAuth.h
@@ -0,0 +1,676 @@
+///
+/// \file TencentOAuth.h
+/// \brief QQ互联开放平台授权登录及相关开放接口实现类
+///
+/// Created by Tencent on 12-12-21.
+/// Copyright (c) 2012年 Tencent. All rights reserved.
+///
+
+#import <UIKit/UIKit.h>
+#import "sdkdef.h"
+#import "TencentOAuthObject.h"
+#import "TencentApiInterface.h"
+
+@protocol TencentSessionDelegate;
+@protocol TencentLoginDelegate;
+@protocol TencentApiInterfaceDelegate;
+@protocol TencentWebViewDelegate;
+
+@class TencentApiReq;
+@class TencentApiResp;
+
+typedef enum
+{
+    kTencentNotAuthorizeState,
+    kTencentSSOAuthorizeState,
+    kTencentWebviewAuthorzieState,
+} TencentAuthorizeState;
+
+typedef enum
+{
+    kAuthModeClientSideToken,
+    kAuthModeServerSideCode,
+} TencentAuthMode;
+
+#pragma mark - TencentOAuth(授权登录及相关开放接口调用)
+
+/**
+ * \brief TencentOpenAPI授权登录及相关开放接口调用
+ *
+ * TencentOAuth实现授权登录逻辑以及相关开放接口的请求调用
+ */
+@interface TencentOAuth : NSObject
+{
+    NSMutableDictionary* _apiRequests;
+	NSString* _accessToken;
+	NSDate* _expirationDate;
+	id<TencentSessionDelegate> _sessionDelegate;
+	NSString* _localAppId;
+	NSString* _openId;
+	NSString* _redirectURI;
+	NSArray* _permissions;
+}
+
+/** Access Token凭证，用于后续访问各开放接口 */
+@property(nonatomic, copy) NSString* accessToken;
+
+/** Access Token的失效期 */
+@property(nonatomic, copy) NSDate* expirationDate;
+
+/** 已实现的开放接口的回调委托对象 */
+@property(nonatomic, assign) id<TencentSessionDelegate> sessionDelegate;
+
+/** 第三方应用在开发过程中设置的URLSchema，用于浏览器登录后后跳到第三方应用 */
+@property(nonatomic, copy) NSString* localAppId;
+
+/** 用户授权登录后对该用户的唯一标识 */
+@property(nonatomic, copy) NSString* openId;
+
+/** 用户登录成功过后的跳转页面地址 */
+@property(nonatomic, copy) NSString* redirectURI;
+
+/** 第三方应用在互联开放平台申请的appID */
+@property(nonatomic, retain) NSString* appId;
+
+/** 主要是互娱的游戏设置uin */
+@property(nonatomic, retain) NSString* uin;
+
+/** 主要是互娱的游戏设置鉴定票据 */
+@property(nonatomic, retain) NSString* skey;
+
+/** 登陆透传的数据 */
+@property(nonatomic, copy) NSDictionary* passData;
+
+/** 授权方式(Client Side Token或者Server Side Code) */
+@property(nonatomic, assign) TencentAuthMode authMode;
+
+/** union id */
+@property(nonatomic, retain) NSString* unionid;
+
+/** 第三方在授权登录/分享 时选择 QQ，还是TIM 。在授权前一定要指定其中一个类型*/
+@property(nonatomic, assign) TencentAuthShareType authShareType;
+
+/**
+ * 用来获得当前sdk的版本号
+ * \return 返回sdk版本号
+ **/
+
++ (NSString*)sdkVersion;
+
+/**
+ * 用来获得当前sdk的小版本号
+ * \return 返回sdk小版本号
+ **/
+
++ (NSString*)sdkSubVersion;
+
+/**
+ * 用来获得当前sdk的是否精简版
+ * \return 返回YES表示精简版
+ **/
+
++ (BOOL)isLiteSDK;
+
+/** 
+ * 主要是用来帮助判断是否有登陆被发起，但是还没有过返回结果 
+ * \return 
+ *          kTencentNotAuthorizeState:无授权 
+ *          kTencentSSOAuthorizeState:有人发起了sso授权但无返回
+ *          kTencentWebviewAuthorzieState:有人发起了webview授权还未返回
+ **/
+
++ (TencentAuthorizeState *)authorizeState;
+
+/**
+ * 用来获得当前手机qq的版本号
+ * \return 返回手机qq版本号
+ **/
++ (QQVersion)iphoneQQVersion;
+
+
+/**
+ * 用来获得当前手机TIM的版本号
+ * \return 返回手机qq版本号
+ **/
++ (QQVersion)iphoneTIMVersion;
+
+/**
+ * 初始化TencentOAuth对象
+ * \param appId 第三方应用在互联开放平台申请的唯一标识
+ * \param delegate 第三方应用用于接收请求返回结果的委托对象
+ * \return 初始化后的授权登录对象
+ */
+- (id)initWithAppId:(NSString *)appId
+        andDelegate:(id<TencentSessionDelegate>)delegate;
+
+
+/**
+ * 判断用户手机上是否安装手机QQ
+ * \return YES:安装 NO:没安装
+ */
++ (BOOL)iphoneQQInstalled;
+
+/**
+ * 判断用户手机上是否安装手机TIM
+ * \return YES:安装 NO:没安装
+ */
++ (BOOL)iphoneTIMInstalled;
+ 
+/**
+ * 判断用户手机上的手机QQ是否支持SSO登录
+ * \return YES:支持 NO:不支持
+ */
++ (BOOL)iphoneQQSupportSSOLogin;
+
+/**
+ * 判断用户手机上的手机TIM是否支持SSO登录
+ * \return YES:支持 NO:不支持
+ */
++ (BOOL)iphoneTIMSupportSSOLogin;
+
+/**
+ * 判断用户手机上是否安装手机QZone
+ * \return YES:安装 NO:没安装
+ */
++ (BOOL)iphoneQZoneInstalled;
+
+/**
+ * 判断用户手机上的手机QZone是否支持SSO登录
+ * \return YES:支持 NO:不支持
+ */
++ (BOOL)iphoneQZoneSupportSSOLogin;
+
+/**
+ * 登录授权
+ *
+ * \param permissions 授权信息列
+ */
+- (BOOL)authorize:(NSArray *)permissions;
+
+/**
+ * 登录授权
+ * \param permissions 授权信息列表
+ * \param bInSafari 是否使用safari进行登录.<b>IOS SDK 1.3版本开始此参数废除</b>
+ */
+- (BOOL)authorize:(NSArray *)permissions
+		 inSafari:(BOOL)bInSafari;
+
+/**
+ * 登录授权
+ * \param permissions 授权信息列表
+ * \param localAppId 应用APPID
+ * \param bInSafari 是否使用safari进行登录.<b>IOS SDK 1.3版本开始此参数废除</b>
+ */
+- (BOOL)authorize:(NSArray *)permissions
+       localAppId:(NSString *)localAppId
+		 inSafari:(BOOL)bInSafari;
+
+/**
+ * 增量授权，因用户没有授予相应接口调用的权限，需要用户确认是否授权
+ * \param permissions 需增量授权的信息列表
+ * \return 增量授权调用是否成功
+ */
+- (BOOL)incrAuthWithPermissions:(NSArray *)permissions;
+
+/**
+ * 重新授权，因token废除或失效导致接口调用失败，需用户重新授权
+ * \param permissions 授权信息列表，同登录授权
+ * \return 授权调用是否成功
+ */
+- (BOOL)reauthorizeWithPermissions:(NSArray *)permissions;
+
+/**
+ * 获取UnindID,可以根据UnindID的比较来确定OpenID是否属于同一个用户
+ * \return NO未登录，信息不足；YES条件满足，发送请求成功，请等待回调
+ */
+- (BOOL)RequestUnionId;
+
+/**
+ * (静态方法)处理应用拉起协议
+ * \param url 处理被其他应用呼起时的逻辑
+ * \return 处理结果，YES表示成功，NO表示失败
+ */
++ (BOOL)HandleOpenURL:(NSURL *)url;
+
+/**
+ * (静态方法)sdk是否可以处理应用拉起协议
+ * \param url 处理被其他应用呼起时的逻辑
+ * \return 处理结果，YES表示可以 NO表示不行
+ */
++ (BOOL)CanHandleOpenURL:(NSURL *)url;
+
+/**
+ * (静态方法)获取TencentOAuth调用的上一次错误信息
+ */
++ (NSString *)getLastErrorMsg;
+
+/**
+ * 以Server Side Code模式授权登录时，通过此接口获取返回的code值;
+ * 以Client Side Token模式授权登录时，忽略此接口。
+ */
+- (NSString *)getServerSideCode;
+
+/**
+ * 退出登录(退出登录后，TecentOAuth失效，需要重新初始化)
+ * \param delegate 第三方应用用于接收请求返回结果的委托对象
+ */
+- (void)logout:(id<TencentSessionDelegate>)delegate;
+
+/**
+ * 判断登录态是否有效
+ * \return 处理结果，YES表示有效，NO表示无效，请用户重新登录授权
+ */
+- (BOOL)isSessionValid;
+
+/**
+ * 获取用户个人信息
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)getUserInfo;
+
+/**
+ * SDK内置webview实现定向分享时，第三方应用可以根据应用是否在白名单里来开启该配置开关，默认为关闭；
+ * 在白名单里的应用调用该接口后，即打开sdk内置webview的二级白名单开关（相对与sdk后台的白名单），
+ * 那么在sdk后台白名单校验请求失败的情况下，会继续先尝试采用内置webview进行分享。
+ */
+- (void)openSDKWebViewQQShareEnable;
+
+
+/**
+ * 获取用户QZone相册列表
+ * \attention 需\ref apply_perm
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)getListAlbum;
+
+/**
+ * 获取用户QZone相片列表
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCListPhotoDic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)getListPhotoWithParams:(NSMutableDictionary *)params;
+
+
+/**
+ * 分享到QZone
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddShareDic 
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)addShareWithParams:(NSMutableDictionary *)params;
+
+
+/**
+ * 上传照片到QZone指定相册
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCUploadPicDic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)uploadPicWithParams:(NSMutableDictionary *)params;
+
+/**
+ * 在QZone相册中创建一个新的相册
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddAlbumDic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)addAlbumWithParams:(NSMutableDictionary *)params;
+
+/**
+ * 检查是否是QZone某个用户的粉丝
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCCheckPageFansDic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)checkPageFansWithParams:(NSMutableDictionary *)params;
+
+/**
+ * 在QZone中发表一篇日志
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddOneBlogDic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)addOneBlogWithParams:(NSMutableDictionary *)params;
+
+/**
+ * 在QZone中发表一条说说
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCAddTopicDic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)addTopicWithParams:(NSMutableDictionary *)params;
+
+/**
+ * 设置QQ头像 使用默认的效果处理设置头像的界面
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)setUserHeadpic:(NSMutableDictionary *)params;
+
+
+/**
+ * 设置QQ头像 会返回设置头像由第三方自己处理界面的弹出方式
+ * \attention 需\ref apply_perm
+ * \param params 参数字典,字典的关键字参见TencentOAuthObject.h中的\ref TCSetUserHeadpic
+ * \param viewController 设置头像的界面
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)setUserHeadpic:(NSMutableDictionary *)params andViewController:(UIViewController **)viewController;
+
+/**
+ * 获取QQ会员信息(仅包括是否为QQ会员,是否为年费QQ会员)
+ * \attention 需\ref apply_perm
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)getVipInfo;
+
+/**
+ * 获取QQ会员详细信息
+ * \attention 需\ref apply_perm
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)getVipRichInfo;
+
+/**
+ * QZone定向分享，可以@到具体好友，完成后将触发responseDidReceived:forMessage:回调，message：“SendStory”
+ * \param params 参数字典
+ * \param fopenIdArray 第三方应用预传人好友列表，好友以openid标识
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)sendStory:(NSMutableDictionary *)params friendList:(NSArray *)fopenIdArray;
+
+/**
+ * 发送应用邀请，完成后将触发responseDidReceived:forMessage:回调，message：“AppInvitation”
+ * \param desc 应用的描述文字，不超过35字符，如果为nil或@“”则显示默认描述
+ * \param imageUrl 应用的图标，如果为nil或者@“”则显示默认图标
+ * \param source 透传参数，由开发者自定义该参数内容
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)sendAppInvitationWithDescription:(NSString *)desc imageURL:(NSString *)imageUrl source:(NSString *)source;
+
+/**
+ * 发起PK或者发送炫耀，完成后将触发responseDidReceived:forMessage:回调，message：“AppChallenge”
+ * \param receiver 必须指定一位进行PK或者炫耀的好友，填写其OpenID，填写多个OpenID将截取第一个
+ * \param type 类型，"pk"或者“brag”
+ * \param imageUrl 炫耀/挑战场景图的URL
+ * \param message 炫耀/挑战中的内容描述，不超过50个字符，超过限制则自动截断
+ * \param source 透传参数，由开发者自定义该参数内容
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)sendChallenge:(NSString *)receiver type:(NSString *)type imageURL:(NSString *)imageUrl message:(NSString *)message source:(NSString *)source;
+
+/**
+ * 赠送或者请求礼物，完成后将触发responseDidReceived:forMessage:回调，message：“AppGiftRequest”
+ * \param receiver 赠送或者请求礼物的好友的OpenID，支持填写多个，OpenID之用","分隔，为nil时将由用户通过好友选择器选择好友
+ * \param exclude 用户通过好友选择器选择好友场景下，希望排除的好友（不显示在好友选择器）
+ * \param specified 用户通过好友选择器选择好友场景下，希望出现的指定好友
+ * \param only 是否只显示specified指定的好友
+ * \param type 类型，"request"或者“freegift”
+ * \param title 免费礼物或请求名称，不超过6个字符
+ * \param message 礼物或请求的默认赠言，控制在35个汉字以内，超过限制自动截断
+ * \param imageUrl 请求或礼物配图的URL，如果不传，则默认在弹框中显示应用的icon
+ * \param source 透传参数，由开发者自定义该参数内容
+ * \return 处理结果，YES表示API调用成功，NO表示API调用失败，登录态失败，重新登录
+ */
+- (BOOL)sendGiftRequest:(NSString *)receiver exclude:(NSString *)exclude specified:(NSString *)specified only:(BOOL)only type:(NSString *)type title:(NSString *)title message:(NSString *)message imageURL:(NSString *)imageUrl source:(NSString *)source;
+
+
+/**
+ * 退出指定API调用
+ * \param userData 用户调用某条API的时候传入的保留参数
+ * \return 处理结果，YES表示成功 NO表示失败
+ */
+- (BOOL)cancel:(id)userData;
+
+/**
+ * CGI类任务创建接口
+ * \param apiURL CGI请求的URL地址
+ * \param method CGI请求方式："GET"，"POST"
+ * \param params CGI请求参数字典
+ * \param callback CGI请求结果的回调接口对象
+ * \return CGI请求任务实例，用于取消任务，返回nil代表任务创建失败
+ */
+- (TCAPIRequest *)cgiRequestWithURL:(NSURL *)apiURL method:(NSString *)method params:(NSDictionary *)params callback:(id<TCAPIRequestDelegate>)callback;
+
+/**
+ * TencentOpenApi发送任务统一接口
+ * \param request 请求发送的任务
+ * \param callback 任务发送后的回调地址
+ */
+- (BOOL)sendAPIRequest:(TCAPIRequest *)request callback:(id<TCAPIRequestDelegate>)callback;
+
+- (NSString *)getUserOpenID;
+
+@end
+
+#pragma mark - TencentLoginDelegate(授权登录回调协议)
+
+/**
+ * \brief TencentLoginDelegate iOS Open SDK 1.3 API回调协议
+ *
+ * 第三方应用实现登录的回调协议
+ */
+@protocol TencentLoginDelegate <NSObject>
+
+@required
+
+/**
+ * 登录成功后的回调
+ */
+- (void)tencentDidLogin;
+
+/**
+ * 登录失败后的回调
+ * \param cancelled 代表用户是否主动退出登录
+ */
+- (void)tencentDidNotLogin:(BOOL)cancelled;
+
+/**
+ * 登录时网络有问题的回调
+ */
+- (void)tencentDidNotNetWork;
+
+@optional
+/**
+ * 登录时权限信息的获得
+ */
+- (NSArray *)getAuthorizedPermissions:(NSArray *)permissions withExtraParams:(NSDictionary *)extraParams;
+
+/**
+ * unionID获得
+ */
+- (void)didGetUnionID;
+
+@end
+
+#pragma mark - TencentSessionDelegate(开放接口回调协议)
+
+/**
+ * \brief TencentSessionDelegate iOS Open SDK 1.3 API回调协议
+ *
+ * 第三方应用需要实现每条需要调用的API的回调协议
+ */
+@protocol TencentSessionDelegate<NSObject, TencentLoginDelegate,
+                                TencentApiInterfaceDelegate,
+                                TencentWebViewDelegate>
+
+@optional
+
+/**
+ * 退出登录的回调
+ */
+- (void)tencentDidLogout;
+
+/**
+ * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时，如果服务器返回操作未被授权，则触发该回调协议接口，由第三方决定是否跳转到增量授权页面，让用户重新授权。
+ * \param tencentOAuth 登录授权对象。
+ * \param permissions 需增量授权的权限列表。
+ * \return 是否仍然回调返回原始的api请求结果。
+ * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意：增量授权时用户可能会修改登录的帐号
+ */
+- (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions;
+
+/**
+ * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时，如果服务器返回token失效，则触发该回调协议接口，由第三方决定是否跳转到登录授权页面，让用户重新授权。
+ * \param tencentOAuth 登录授权对象。
+ * \return 是否仍然回调返回原始的api请求结果。
+ * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意：重新登录授权时用户可能会修改登录的帐号
+ */
+- (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth;
+
+/**
+ * 用户通过增量授权流程重新授权登录，token及有效期限等信息已被更新。
+ * \param tencentOAuth token及有效期限等信息更新后的授权实例对象
+ * \note 第三方应用需更新已保存的token及有效期限等信息。
+ */
+- (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth;
+
+/**
+ * 用户增量授权过程中因取消或网络问题导致授权失败
+ * \param reason 授权失败原因，具体失败原因参见sdkdef.h文件中\ref UpdateFailType
+ */
+- (void)tencentFailedUpdate:(UpdateFailType)reason;
+
+/**
+ * 获取用户个人信息回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success
+ *          错误返回示例: \snippet example/getUserInfoResponse.exp fail
+ */
+- (void)getUserInfoResponse:(APIResponse*) response;
+
+
+/**
+ * 获取用户QZone相册列表回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/getListAlbumResponse.exp success
+ *          错误返回示例: \snippet example/getListAlbumResponse.exp fail
+ */
+- (void)getListAlbumResponse:(APIResponse*) response;
+
+/**
+ * 获取用户QZone相片列表
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/getListPhotoResponse.exp success
+ *          错误返回示例: \snippet example/getListPhotoResponse.exp fail
+ */
+- (void)getListPhotoResponse:(APIResponse*) response;
+
+/**
+ * 检查是否是QZone某个用户的粉丝回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/checkPageFansResponse.exp success
+ *          错误返回示例: \snippet example/checkPageFansResponse.exp fail
+ */
+- (void)checkPageFansResponse:(APIResponse*) response;
+ 
+/**
+ * 分享到QZone回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/addShareResponse.exp success
+ *          错误返回示例: \snippet example/addShareResponse.exp fail
+ */
+- (void)addShareResponse:(APIResponse*) response;
+
+/**
+ * 在QZone相册中创建一个新的相册回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/addAlbumResponse.exp success
+ *          错误返回示例: \snippet example/addAlbumResponse.exp fail
+ */
+- (void)addAlbumResponse:(APIResponse*) response;
+
+/**
+ * 上传照片到QZone指定相册回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/uploadPicResponse.exp success
+ *          错误返回示例: \snippet example/uploadPicResponse.exp fail
+ */
+- (void)uploadPicResponse:(APIResponse*) response;
+
+
+/**
+ * 在QZone中发表一篇日志回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/addOneBlogResponse.exp success
+ *          错误返回示例: \snippet example/addOneBlogResponse.exp fail
+ */
+- (void)addOneBlogResponse:(APIResponse*) response;
+
+/**
+ * 在QZone中发表一条说说回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/addTopicResponse.exp success
+ *          错误返回示例: \snippet example/addTopicResponse.exp fail
+ */
+- (void)addTopicResponse:(APIResponse*) response;
+
+/**
+ * 设置QQ头像回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/setUserHeadpicResponse.exp success
+ *          错误返回示例: \snippet example/setUserHeadpicResponse.exp fail
+ */
+- (void)setUserHeadpicResponse:(APIResponse*) response;
+
+/**
+ * 获取QQ会员信息回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \remarks 正确返回示例: \snippet example/getVipInfoResponse.exp success
+ *          错误返回示例: \snippet example/getVipInfoResponse.exp fail
+ */
+- (void)getVipInfoResponse:(APIResponse*) response;
+
+/**
+ * 获取QQ会员详细信息回调
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ */
+- (void)getVipRichInfoResponse:(APIResponse*) response;
+
+/**
+ * sendStory分享的回调（已废弃，使用responseDidReceived:forMessage:）
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ */
+- (void)sendStoryResponse:(APIResponse*) response;
+
+
+/**
+ * 社交API统一回调接口
+ * \param response API返回结果，具体定义参见sdkdef.h文件中\ref APIResponse
+ * \param message 响应的消息，目前支持‘SendStory’,‘AppInvitation’，‘AppChallenge’，‘AppGiftRequest’
+ */
+- (void)responseDidReceived:(APIResponse*)response forMessage:(NSString *)message;
+
+/**
+ * post请求的上传进度
+ * \param tencentOAuth 返回回调的tencentOAuth对象
+ * \param bytesWritten 本次回调上传的数据字节数
+ * \param totalBytesWritten 总共已经上传的字节数
+ * \param totalBytesExpectedToWrite 总共需要上传的字节数
+ * \param userData 用户自定义数据
+ */
+- (void)tencentOAuth:(TencentOAuth *)tencentOAuth didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite userData:(id)userData;
+
+
+/**
+ * 通知第三方界面需要被关闭
+ * \param tencentOAuth 返回回调的tencentOAuth对象
+ * \param viewController 需要关闭的viewController
+ */
+- (void)tencentOAuth:(TencentOAuth *)tencentOAuth doCloseViewController:(UIViewController *)viewController;
+
+@end
+
+#pragma mark - TencentWebViewDelegate(H5登录webview旋转方向回调)
+
+/**
+ * \brief TencentWebViewDelegate: H5登录webview旋转方向回调协议
+ *
+ * 第三方应用可以根据自己APP的旋转方向限制，通过此协议设置
+ */
+@protocol TencentWebViewDelegate <NSObject>
+@optional
+- (BOOL) tencentWebViewShouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;
+- (NSUInteger) tencentWebViewSupportedInterfaceOrientationsWithWebkit;
+- (BOOL) tencentWebViewShouldAutorotateWithWebkit;
+@end
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentOAuthObject.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentOAuthObject.h
new file mode 100644
index 0000000..2fc3a65
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/TencentOAuthObject.h
@@ -0,0 +1,452 @@
+///
+/// \file TencentOAuthObject.h
+/// 对开放接口的调用提供参数字典封装的辅助类
+///
+/// Created by Tencent on 12-12-28.
+/// Copyright (c) 2012年 Tencent. All rights reserved.
+///
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+#import "sdkdef.h"
+
+
+#pragma mark -
+#pragma mark TCAddTopicDic
+
+/** 
+ * \brief 发表说说的参数字典定义
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCAddTopicDic : TCAPIRequest
+
+/** 
+ * 返回一个对象用来进行API参数的填充
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCAddTopicDic *) dictionary;
+
+/** 
+ * 发布心情时引用的信息的类型。
+ * \note 1表示图片； 2表示网页； 3表示视频
+ */
+@property (nonatomic, retain) TCOptionalStr paramRichtype;
+
+/**
+ * 发布心情时引用的信息的值。有richtype时必须有richval
+ *
+ * \note
+ *       -# 当richtype为图片（即richtype为1，应用场景为发布心情时引用某张图片）时，\n
+ *          richval需要传入该图片的相关参数。引用的图片来源分为两种：一种为网站图片，\n
+ *          一种为QQ空间相册中的某张图片。
+ *             - 当引用的图片来自网站，richval包含下列参数的值：\n
+ *               | 参数名称 | 是否必须 | 类型    | 描述              |
+ *               | ------ | ------- | ------ | ----------------- |
+ *               | url    | 必须     | string | 网站图片的URL      |
+ *               | height | 必须     | string | 图片高度，单位： px |
+ *               | width  | 必须     | string | 图片宽度，单位： px |
+ *               \n
+ *               输入时每个值中间用“&”分隔，如下所示：\n
+ *               “url=http://qq.com/logo.png&width=25&height=21”
+ *
+ *             - 当引用的图片来自QQ空间相册，richval包含下列参数的值。\n
+ *               这些值都需要通过调用相册OpenAPI来获得。参数意义如下：\n
+ *               | 参数名称   | 是否必须 | 类型    | 描述                               |
+ *               | --------- | ------ | ------ | ---------------------------------- |
+ *               | albumid   | 必须    | string | 图片所属空间相册的ID                  |
+ *               | pictureid | 必须    | string | 图片ID                              |
+ *               | sloc      | 必须    | string | 小图ID                              |
+ *               | pictype   |        | string | 图片类型（JPG = 1；GIF = 2；PNG = 3） |
+ *               | picheight |        | string | 图片高度，单位： px                   |
+ *               | picwidth  |        | string | 图片宽度，单位： px                   |
+ *               输入时每个值中间用逗号分隔，如下所示 ：\n
+ *               “albumid,pictureid,sloc,pictype,picheight,picwidth”
+ *       -# 当richtype为网页（即richtype为2，应用场景为针对某网页发表评论）时，\n
+ *          richval需要传入该网页的URL，发表为feeds时，后台会自动将该URL转换为短URL。
+ *       -# 当richtype为视频（即richtype为3，应用场景为针对某视频发表评论）时，\n
+ *          richval需要传入该视频的URL，发表为feeds时，后台会对该URL进行解析，\n
+ *          在feeds上显示播放器，视频源及缩略图。
+ */
+@property (nonatomic, retain) TCOptionalStr paramRichval;
+
+/** 
+ * 发布的心情的内容。
+ */
+@property (nonatomic, retain) TCRequiredStr paramCon;
+
+/** 
+ * 地址文。例如：广东省深圳市南山区高新科技园腾讯大厦。lbs_nm，lbs_x，lbs_y通常一起使用，来明确标识一个地址。
+ */
+@property (nonatomic, retain) TCOptionalStr paramLbs_nm;
+
+/** 
+ * 经度。-180.0到+180.0，+表示东经。lbs_nm，lbs_x，lbs_y通常一起使用，来明确标识一个地址。
+ */
+@property (nonatomic, retain) TCOptionalStr paramLbs_x;
+
+/** 
+ * 纬度。-90.0到+90.0，+表示北纬。lbs_nm，lbs_x，lbs_y通常一起使用，来明确标识一个地址。
+ */
+@property (nonatomic, retain) TCOptionalStr paramLbs_y;
+
+/** 
+ * 第三方应用的平台类型。
+ * \note 1表示QQ空间； 2表示腾讯朋友； 3表示腾讯微博平台； 4表示腾讯Q+平台。
+ */
+@property (nonatomic, retain) TCOptionalStr paramThirdSource;
+@end
+
+
+#pragma mark -
+#pragma mark TCAddOneBlogDic
+/**
+ * \brief 发表日志的参数字典定义
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCAddOneBlogDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCAddOneBlogDic *) dictionary;
+
+/** 
+ * 日志标题（纯文本，最大长度128个字节，utf-8编码）。
+ */
+@property (nonatomic, retain) TCRequiredStr paramTitle;
+
+/** 
+ * content 文章内容（html数据，最大长度100*1024个字节，utf-8编码）
+ */
+@property (nonatomic, retain) TCRequiredStr paramContent;
+@end
+
+#pragma mark -
+#pragma mark TCAddAlbumDic
+/** 
+ * \brief 创建空间相册的参数字典定义
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCAddAlbumDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ *
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCAddAlbumDic *) dictionary;
+
+/** 
+ * albumname 必须 string 相册名 不能超过30个字符。
+ */
+@property (nonatomic, retain) TCRequiredStr paramAlbumname;
+
+
+/**
+ * albumdesc string 相册描述，不能超过200个字符。
+ */
+@property (nonatomic, retain) TCOptionalStr paramAlbumdesc;
+
+/** 
+ * priv string	相册权限
+ *
+ * \note 其取值含义为： 1=公开；3=只主人可见； 4=QQ好友可见； 5=问答加密。\n
+ *       不传则相册默认为公开权限。\n
+ *       如果priv取值为5，即相册是问答加密的，则必须包含问题和答案两个参数：\n
+ *       - question: 问题，不能超过30个字符。
+ *       - answer: 答案，不能超过30个字符。
+ */
+@property (nonatomic, retain) TCOptionalStr paramPriv;
+
+/**
+ * question 问题，不能超过30个字符。
+ * \note 如果priv取值为5，必须包含这个参数：
+ **/
+@property (nonatomic, retain) TCOptionalStr paramQuestion;
+
+/**
+ * answer 答案，不能超过30个字符。
+ * \note 如果priv取值为5，必须包含这个参数：
+ **/
+@property (nonatomic, retain) TCOptionalStr paramAnswer;
+
+@end
+
+#pragma mark -
+#pragma mark TCUploadPicDic
+/**
+ * \brief 上传一张照片到QQ空间相册的参数字典定义
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCUploadPicDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCUploadPicDic *) dictionary;
+
+/** 
+ * photodesc string 照片描述，注意照片描述不能超过200个字符。
+ */
+@property (nonatomic, retain) TCOptionalStr paramPhotodesc;
+/**	
+ * string 照片的命名，必须以.jpg, .gif, .png, .jpeg, .bmp此类后缀结尾。
+ */
+@property (nonatomic, retain) TCOptionalStr paramTitle;
+
+/**	
+ * string 相册id。可不填，不填时则根据“mobile”标识选择默认上传的相册。
+ */
+@property (nonatomic, retain) TCOptionalStr paramAlbumid;
+
+/** 
+ * 标志位
+ *
+ * \note 0表示PC，1表示手机。用于当不传相册id时（即albumid为空时）控制是否传到手机相册。\n
+ *       -# 如果传1，则当albumid为空时，图片会上传到手机相册；
+ *       -# 如果不传或传0，则当albumid为空时，图片会上传到贴图相册；
+ */
+@property (nonatomic, assign) TCOptionalStr paramMobile;
+
+/** 
+ * x string 照片拍摄时的地理位置的经度。请使用原始数据（纯经纬度，0-360）。
+ */
+@property (nonatomic, retain) TCOptionalStr paramX;
+
+/** 
+ * y string 照片拍摄时的地理位置的纬度。请使用原始数据（纯经纬度，0-360）。
+ */
+@property (nonatomic, retain) TCOptionalStr paramY;
+
+/**
+ * picture 必须 string 上传照片的文件名以及图片的内容（在发送请求时，图片内容以二进制数据流的形式发送，见下面的请求示例），注意照片名称不能超过30个字符。
+ */
+@property (nonatomic, retain) TCRequiredImage paramPicture;
+
+/** 
+ * needfeed int	 标识上传照片时是否要发feed
+ * \note（0：不发feed； 1：发feed）。如果不填则默认为发feed。
+ */
+@property (nonatomic, assign)TCOptionalStr paramNeedfeed;
+
+/** 
+ * successnum int 批量上传照片时，已成功上传的张数，指明上传完成情况。
+ * \note 单张上传时可以不填，不填则默认为0。
+ */
+@property (nonatomic, assign)TCOptionalStr paramSuccessnum;
+
+/** 
+ * picnum int 批量上传照片的总张数，如果不填则默认为1。
+ * \note
+ *       - 如果picnum=1，为单张上传，发送单张上传feed；
+ *       - 如果picnum>1，为批量上传，发送批量上传feed。
+ *       批量上传方式：picnum为一次上传照片的张数，successnum初始值为0，每调用一次照片上传接口后递增其值。
+ *       信息中心中的feed表现形式：批量上传时最新的7张在feed中展示。其中最新上传的一张图片展示为大图，剩下的
+ *       六张按从新到旧的顺序展示为小图，其他图片不在feed中展示。
+ */
+@property (nonatomic, assign)TCOptionalStr paramPicnum;
+
+@end
+
+#pragma mark -
+#pragma mark TCAddShareDic
+/**
+ * \brief 同步分享到QQ空间,腾讯微博的参数字典定义
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCAddShareDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ *
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCAddShareDic *) dictionary;
+
+/** 
+ * title 必须 string	 feeds的标题 最长36个中文字，超出部分会被截断。
+ */
+@property (nonatomic, retain) TCRequiredStr paramTitle;
+
+
+/**
+ * url 必须 string 分享所在网页资源的链接，点击后跳转至第三方网页，对应上文接口说明中2的超链接。请以http://开头。
+ */
+@property (nonatomic, retain) TCRequiredStr paramUrl;
+
+
+/**
+ * comment string 用户评论内容，也叫发表分享时的分享理由 禁止使用系统生产的语句进行代替。
+ * 最长40个中文字，超出部分会被截断。
+ */
+@property (nonatomic, retain) TCOptionalStr paramComment;
+
+
+/** 
+ * summary string 所分享的网页资源的摘要内容，或者是网页的概要描述 最长80个中文字，超出部分会被截断。
+ */
+@property (nonatomic, retain) TCOptionalStr paramSummary;
+
+/** 
+ * images string 所分享的网页资源的代表性图片链接"，请以http://开头，长度限制255字符。多张图片以竖线（|）分隔，目前只有第一张图片有效，图片规格100*100为佳。
+ */
+@property (nonatomic, retain) TCOptionalStr paramImages;
+
+/** 
+ * type string 分享内容的类型。
+ *
+ * \note 4表示网页；5表示视频（type=5时，必须传入playurl）
+ */
+@property (nonatomic, retain) TCOptionalStr paramType;
+
+/** 
+ * playurl string 长度限制为256字节。仅在type=5的时候有效，表示视频的swf播放地址。
+ */
+@property (nonatomic, retain) TCOptionalStr paramPlayurl;
+
+/** 
+ * site 必须 string 分享的来源网站名称，请填写网站申请接入时注册的网站名称
+ */
+@property (nonatomic, retain) TCRequiredStr paramSite;
+
+/** 
+ * fromurl 必须 string 分享的来源网站对应的网站地址url 请以http://开头。
+ */
+@property (nonatomic, retain) TCRequiredStr paramFromurl;
+
+/**
+ * nswb string	值为1时，表示分享不默认同步到微博，其他值或者不传此参数表示默认同步到微博。
+ */
+@property (nonatomic, retain) TCOptionalStr paramNswb;
+
+@end
+
+#pragma mark -
+#pragma mark TCCheckPageFansDic
+/**
+ * \brief 验证是否认证空间粉丝tttyttyyyu的参数字典定义
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCCheckPageFansDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ *
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCCheckPageFansDic *) dictionary;
+
+/** 
+ * 表示认证空间的QQ号码
+ */
+@property (nonatomic, retain) TCRequiredStr paramPage_id;
+@end
+
+#pragma mark -
+#pragma mark TCSetUserHeadpic
+/**
+ * \brief 设置用户头像
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCSetUserHeadpic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCSetUserHeadpic *) dictionary;
+
+/** 
+ * 设置用户头像的图片
+ */
+@property (nonatomic, retain) TCRequiredImage paramImage;
+
+/** 
+ * 图片的文件名
+ */
+@property (nonatomic, retain) TCOptionalStr paramFileName;
+@end
+
+#pragma mark -
+#pragma mark TCListPhotoDic
+
+/**
+ * \brief 获取用户QQ空间相册中的照片列表
+ *
+ * 可以直接填写相应参数后将对象当作参数传入API中
+ */
+@interface TCListPhotoDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ *
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCListPhotoDic *) dictionary;
+
+/**
+ * 表示要获取的照片列表所在的相册ID
+ */
+@property (nonatomic, retain) TCRequiredStr paramAlbumid;
+
+@end
+
+#pragma mark -
+#pragma mark TCSendStoryDic
+/**
+ * \brief QQ空间定向分享的参数字典定义
+ *
+ * 该分享支持@到指定好友，最多支持10个好友。
+ * 其中第三方应用可预传最多5个指定好友的openid，其余好友由用户自行选择。
+ * 该分享形式仅提供跳QZone分享和本地Html5分享两种形式。
+ * sendStroy不支持userData参数
+ */
+@interface TCSendStoryDic : TCAPIRequest
+
+/**
+ * 返回一个对象用来进行API参数的填充
+ *
+ * \note 不用释放，返回的对象是自动释放的
+ */
++ (TCSendStoryDic *) dictionary;
+
+/**
+ * 分享的标题
+ */
+@property (nonatomic, retain) TCRequiredStr paramTitle;
+
+/**
+ * 故事摘要，最多不超过50个汉字，可以为空
+ */
+@property (nonatomic, retain) TCOptionalStr paramSummary;
+
+/**
+ * 默认展示在输入框里的分享理由，最多120个汉字，可以为空
+ */
+@property (nonatomic, retain) TCOptionalStr paramDescription;
+
+/**
+ * 图片url
+ */
+@property (nonatomic, retain) TCOptionalStr paramPics;
+
+/**
+ * 如果不填，则默认为"进入应用"
+ */
+@property (nonatomic, retain) TCRequiredStr paramAct;
+
+/**
+ * 点击分享的Url
+ */
+@property (nonatomic, retain) TCOptionalStr paramShareUrl;
+
+@end
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/sdkdef.h b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/sdkdef.h
new file mode 100644
index 0000000..0eefc78
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Headers/sdkdef.h
@@ -0,0 +1,444 @@
+///
+/// \file sdkdef.h
+/// \brief SDK中相关常量定义
+///
+/// Created by Tencent on 12-12-25.
+/// Copyright (c) 2012年 Tencent. All rights reserved.
+///
+
+#import <Foundation/Foundation.h>
+#import <UIKit/UIKit.h>
+
+/**
+ * \brief 设置sdk的log等级
+ */
+typedef enum {
+    TCOLogLevel_Disabled = -1,   // 关闭所有log
+    TCOLogLevel_Error = 0,
+    TCOLogLevel_Warning,
+    TCOLogLevel_Info,
+    TCOLogLevel_Debug,
+} TCOLogLevel;
+
+/**
+ * \brief 手机qq的当前版本
+ */
+typedef enum QQVersion
+{
+    kQQUninstall,
+    kQQVersion3_0,
+    kQQVersion4_0,      //支持sso登陆
+    kQQVersion4_2_1,    //ios7兼容
+    kQQVersion4_5,      //4.5版本，wpa会话
+    kQQVersion4_6,      //4.6版本，sso登陆信令通道切换
+    kQQVersion4_7,      //4.7版本 不确定新支持了什么样的属性
+} QQVersion;
+
+
+/**
+ * \breif TIM的当前版本
+ */
+typedef enum TIMVersion {
+    kTIMUinstall,
+    kTIMVersion1_1,
+}TIMVersion;
+
+/**
+ * \breif 授权/分享 方式
+ */
+typedef enum TencentAuthShareType {
+    AuthShareType_QQ,
+    AuthShareType_TIM,
+}TencentAuthShareType;
+
+/**
+ * \brief APIResponse.retCode可能的枚举常量
+ */
+typedef enum
+{
+	URLREQUEST_SUCCEED = 0, /**< 网络请求成功发送至服务器，并且服务器返回数据格式正确
+                             * \note 这里包括所请求业务操作失败的情况，例如没有授权等原因导致
+                             */
+    
+	URLREQUEST_FAILED = 1,  /**< 网络异常，或服务器返回的数据格式不正确导致无法解析 */
+} REPONSE_RESULT;
+
+/**
+ * \brief 增量授权失败原因
+ *
+ * \note 增量授权失败不影响原token的有效性（原token已失效的情况除外）
+ */
+typedef enum
+{
+    kUpdateFailUnknown = 1,  ///< 未知原因
+    kUpdateFailUserCancel,   ///< 用户取消
+    kUpdateFailNetwork,      ///< 网络问题
+} UpdateFailType;
+
+/**
+ * \brief 封装服务器返回的结果
+ *
+ * APIResponse用于封装所有请求的返回结果，包括错误码、错误信息、原始返回数据以及返回数据的json格式字典
+ */
+@interface APIResponse : NSObject<NSCoding> {
+    int      _detailRetCode;
+	int		 _retCode;
+	int		 _seq;
+	NSString *_errorMsg;
+	NSDictionary *_jsonResponse;
+	NSString *_message;
+    id       _userData;
+}
+
+/**
+ * 新增的详细错误码\n
+ * detailRetCode主要用于区分不同的错误情况，参见\ref OpenSDKError
+ */
+@property (nonatomic, assign) int detailRetCode;
+
+/**
+ * 网络请求是否成功送达服务器，以及服务器返回的数据格式是否正确\n
+ * retCode具体取值可参考\ref REPONSE_RESULT
+ */
+@property (nonatomic, assign) int retCode;
+
+/**
+ * 网络请求对应的递增序列号，方便内部管理
+ */
+@property (nonatomic, assign) int seq;
+
+/**
+ * 错误提示语
+ */
+@property (nonatomic, retain) NSString *errorMsg;
+
+/**
+ * 服务器返回数据的json格式字典\n
+ * 字典内具体参数的命名和含义请参考\ref api_spec
+ */
+@property (nonatomic, retain) NSDictionary *jsonResponse;
+
+/**
+ * 服务器返回的原始数据字符串
+ */
+@property (nonatomic, retain) NSString *message;
+
+/**
+ * 用户保留数据
+ */
+@property (nonatomic, retain) id userData;
+
+@end
+
+
+/**
+ * 用户自定义的保留字段
+ */
+FOUNDATION_EXTERN NSString * const PARAM_USER_DATA;
+
+/**
+ * \name 应用邀请参数字段定义
+ */
+///@{
+
+/** 应用邀请展示图片url的key */
+FOUNDATION_EXTERN NSString * const PARAM_APP_ICON;
+
+/** 应用邀请描述文本的key */
+FOUNDATION_EXTERN NSString * const PARAM_APP_DESC;
+
+/** 应用邀请好友列表的key */
+FOUNDATION_EXTERN NSString * const PARAM_APP_INVITED_OPENIDS;
+
+///@}
+
+/**
+ * \name sendStory新分享参数字段定义
+ */
+///@{
+
+/** 预填入接受人列表的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_RECEIVER;
+
+/** 分享feeds标题的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_TITLE;
+
+/** 分享feeds评论内容的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_COMMENT;
+
+/** 分享feeds摘要的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_SUMMARY;
+
+/** 分享feeds展示图片url的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_IMAGE;
+
+/** 分享feeds跳转链接url的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_URL;
+
+/** 分享feeds点击操作默认行为的key */
+FOUNDATION_EXTERN NSString * const PARAM_SENDSTORY_ACT;
+
+///@}
+
+/**
+ * \name 设置头像参数字段定义
+ */
+///@{
+
+/** 头像图片数据的key */
+FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_PIC;
+
+/** 头像图片文件名的key */
+FOUNDATION_EXTERN NSString * const PARAM_SETUSERHEAD_FILENAME;
+
+///@}
+
+/**
+ * \name 服务器返回数据的参数字段定义
+ */
+///@{
+
+/** 服务器返回码的key */
+FOUNDATION_EXTERN NSString * const PARAM_RETCODE;
+
+/** 服务器返回错误信息的key */
+FOUNDATION_EXTERN NSString * const PARAM_MESSAGE;
+
+/** 服务器返回额外数据的key */
+FOUNDATION_EXTERN NSString * const PARAM_DATA;
+
+///@}
+
+/**
+ * \name 错误信息相关常量定义
+ */
+///@{
+
+/** 详细错误信息字典中额外信息的key */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyExtraInfo;
+
+/** 详细错误信息字典中返回码的key */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyRetCode;
+
+/** 详细错误信息字典中错误语句的key */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorKeyMsg;
+
+/** 不支持的接口 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnsupportedAPI;
+
+/** 操作成功 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSuccess;
+
+/** 未知错误 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUnknown;
+
+/** 用户取消 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserCancel;
+
+/** 请重新登录 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgReLogin;
+
+/** 应用没有操作权限 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgOperationDeny;
+
+/** 网络异常或没有网络 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgNetwork;
+
+/** URL格式或协议错误 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgURL;
+
+/** 解析数据出错 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgDataParse;
+
+/** 传入参数有误 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgParam;
+
+/** 连接超时 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgTimeout;
+
+/** 安全问题 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgSecurity;
+
+/** 文件读写错误 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgIO;
+
+/** 服务器端错误 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgServer;
+
+/** 页面错误 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgWebPage;
+
+/** 设置头像图片过大 */
+FOUNDATION_EXTERN NSString * const TCOpenSDKErrorMsgUserHeadPicLarge;
+
+///@}
+
+/**
+ * \brief SDK新增详细错误常量
+ */
+typedef enum
+{
+    kOpenSDKInvalid = -1,                       ///< 无效的错误码
+    kOpenSDKErrorUnsupportedAPI = -2,                ///< 不支持的接口
+    
+    /**
+     * \name CommonErrorCode
+     * 公共错误码
+     */
+    ///@{
+    kOpenSDKErrorSuccess = 0,                   ///< 成功
+    kOpenSDKErrorUnknown,                       ///< 未知错误
+    kOpenSDKErrorUserCancel,                    ///< 用户取消
+    kOpenSDKErrorReLogin,                       ///< token无效或用户未授权相应权限需要重新登录
+    kOpenSDKErrorOperationDeny,                 ///< 第三方应用没有该api操作的权限
+    ///@}
+    
+    /**
+     * \name NetworkRelatedErrorCode
+     * 网络相关错误码
+     */
+    ///@{
+    kOpenSDKErrorNetwork,                       ///< 网络错误，网络不通或连接不到服务器
+    kOpenSDKErrorURL,                           ///< URL格式或协议错误
+    kOpenSDKErrorDataParse,                     ///< 数据解析错误，服务器返回的数据解析出错
+    kOpenSDKErrorParam,                         ///< 传入参数错误
+    kOpenSDKErrorConnTimeout,                   ///< http连接超时
+    kOpenSDKErrorSecurity,                      ///< 安全问题
+    kOpenSDKErrorIO,                            ///< 下载和文件IO错误
+    kOpenSDKErrorServer,                        ///< 服务器端错误
+    ///@}
+    
+    /**
+     * \name WebViewRelatedError
+     * webview特有错误
+     */
+    ///@{
+    kOpenSDKErrorWebPage,                       ///< 页面错误
+    ///@}
+    
+    /**
+     * \name SetUserHeadRelatedErrorCode
+     * 设置头像自定义错误码段
+     */
+    ///@{
+    kOpenSDKErrorUserHeadPicLarge = 0x010000,   ///< 图片过大 设置头像自定义错误码
+    ///@}
+} OpenSDKError;
+
+/**
+ * \name SDK版本(v1.3)支持的授权列表常量
+ */
+///@{
+
+/** 发表一条说说到QQ空间(<b>需要申请权限</b>) */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;
+
+/** 发表一篇日志到QQ空间(<b>需要申请权限</b>) */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG;
+
+/** 创建一个QQ空间相册(<b>需要申请权限</b>) */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;
+
+/** 上传一张照片到QQ空间相册(<b>需要申请权限</b>) */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;
+
+/** 获取用户QQ空间相册列表(<b>需要申请权限</b>) */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;
+
+/** 同步分享到QQ空间、腾讯微博 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE;
+
+/** 验证是否认证空间粉丝 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;
+
+/** 获取登录用户自己的详细信息 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;
+
+/** 获取其他用户的详细信息 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;
+
+/** 获取会员用户基本信息 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;
+
+/** 获取会员用户详细信息 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;
+
+/** 获取用户信息 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;
+
+/** 移动端获取用户信息 */
+FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;
+///@}
+
+
+/**
+ * \name CGI接口相关参数类型定义
+ */
+///@{
+
+/** 必填的字符串类型参数 */
+typedef NSString *TCRequiredStr;
+
+/** 必填的UIImage类型参数 */
+typedef UIImage *TCRequiredImage;
+
+/** 必填的整型参数 */
+typedef NSInteger TCRequiredInt;
+
+/** 必填的数字类型 */
+typedef NSNumber *TCRequiredNumber;
+
+/** 必填的NSData参数 */
+typedef NSData *TCRequiredData;
+
+/** 可选的字符串类型参数 */
+typedef NSString *TCOptionalStr;
+
+/** 可选的UIImage类型参数 */
+typedef UIImage *TCOptionalImage;
+
+/** 可选的整型参数 */
+typedef NSInteger TCOptionalInt;
+
+/** 可选的数字类型 */
+typedef NSNumber *TCOptionalNumber;
+
+/** 可选的不定类型参数 */
+typedef id TCRequiredId;
+///@}
+
+
+/**
+ * \brief CGI请求的参数字典封装辅助基类
+ *
+ * 将相应属性的值以key-value的形式保存到参数字典中
+ */
+@interface TCAPIRequest : NSMutableDictionary
+
+/** CGI请求的URL地址 */
+@property (nonatomic, readonly) NSURL *apiURL;
+
+/** CGI请求方式："GET"，"POST" */
+@property (nonatomic, readonly) NSString *method;
+
+/**
+ * API参数中的保留字段，可以塞入任意字典支持的类型，再调用完成后会带回给调用方
+ */
+@property (nonatomic, retain) TCRequiredId paramUserData;
+
+/**
+ * APIResponse,API的返回结果
+ */
+@property (nonatomic, readonly) APIResponse *response;
+
+/** 取消相应的CGI请求任务 */
+- (void)cancel;
+
+@end
+
+@protocol TCAPIRequestDelegate <NSObject>
+@optional
+- (void)cgiRequest:(TCAPIRequest *)request didResponse:(APIResponse *)response;
+
+@end
+
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Resources/ios_open_sdk_3.2.3.501_iphone_release b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Resources/ios_open_sdk_3.2.3.501_iphone_release
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/Resources/ios_open_sdk_3.2.3.501_iphone_release
diff --git a/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/TencentOpenAPI b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/TencentOpenAPI
new file mode 100644
index 0000000..0b9753f
--- /dev/null
+++ b/platforms/ios/dlapp/Plugins/cordova-plugin-qqsdk/TencentOpenAPI.framework/TencentOpenAPI
Binary files differ
diff --git a/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/Info.plist b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/Info.plist
new file mode 100644
index 0000000..893a59c
--- /dev/null
+++ b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/Info.plist
Binary files differ
diff --git a/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/error.png b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/error.png
new file mode 100644
index 0000000..b0ce461
--- /dev/null
+++ b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/error.png
Binary files differ
diff --git a/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/local.html b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/local.html
new file mode 100644
index 0000000..4a1cf42
--- /dev/null
+++ b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/local.html
@@ -0,0 +1,73 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta http-equiv="X-UA-Compatible" content="IE=Edge">
+<meta charset="UTF-8">
+<title>社交渠道</title>
+<meta name="viewport" content="width=device-width,initial-scale=1.0, maximum-scale = 1.0,user-scalable=no" />
+<meta name="format-detection" content="telephone=no" />
+<meta name="apple-mobile-web-app-capable" content="yes" />
+<style>
+*{margin:0;padding:0}
+.header{text-align:center;height:44px;background:-webkit-gradient(linear,0 0,0 100%,from(#4c4c4c),to(#313131));border-top:#5b5b5b 1px solid;position:relative;line-height:44px}
+.header h1{color:#fff;font-weight:bold;font-size:20px}
+.header a{width:49px;height:29px;background-size:49px 29px;position:absolute;top:7px;display:block;text-indent:-999em;cursor:pointer}
+.header .back{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEkAAAAsCAYAAAApSpU1AAAFgElEQVR42u2bSWgsRRjH40XEg3rwIujBg6KCp4CH7AnZ933f9z0hK7kk8RCEhCwEMTmID81C8JIVQRJEfGQ5PEwOnpKDh+T0nomCGngolvUrpsaeYWbSnel5ODOv4Jfp/mrpqv9UffV1TyciwqYUGRn5keRjydeS7yWPgogfJOuSVsnrEXYn2ei7ku+Sk5NFZWWlaG1tFd3d3aK/vz9o6OnpES0tLaKoqEjIsfwu6bNToDzJbU1NjRgbGxPDw8NiYGAgqATSDA4OitHRUXXsEGvJDoEqJX8zcxCG2dPR0SHa2tqCkvb2dtHZ2Sl6e3vFyMiIKCwsRKgufwTKlTxFIKYqF2G6Njc3Bz2MA7EQTY7xRvLafQR6X/JHY2OjaoxGm5qaQgrEYlXk5OQgVJtVgV6W/FRRUaEEorFQE8goVFlZGSI9sCrS5wUFBaKrq0s1wmwKZZgMcsz7VgQqyszMVA4apRsaGkKe8vJyRHpoVqA3JL/U1dUpH4TKz0VyFegFybfEDuxmVK6vrw8LHD7JlEjdubm5aktEIGZTuFBaWnq3SLLAB0TUennV1taGFSUlJb5FkpkvcvNHQRw1lbj9CCfMiPQJy4ytngrV1dXPDEKMxcVFsbe390yv605xcbF3kWRGDPdlCMQMqqqq8gsCz5ubG7G7u+tiRwhscHJyIi4uLlQ5nW5vb8XU1JTXOlagntV+O250H3oS6BXJz3h2nBeFeQTiL4hA4lPb6DxCIA6Qh21jY0OJ46kd8km6jhm4BvWs9tlxk+tRpAcsMxw1BYk67eL4+Fh1Wp/TceO5GbRIVupwDepZ7a9HkaShOC0tTTlqBCKYshtCCX28s7Mjrq6uxMLCgld4bGGsTx2SlWsiEvWs9pVbMBeRHFH1NQqyxFhugUYP2FeijKc6+hwBPCXsxjLu7ZghPz//P5F0VJ2Xl6d2MgoQSNnF0NCQmJ+fd6LteiYZ8zQHBwdqsMbyug5Jn5+fn6tlbKzLOXZjGepZ7Td6GEXqycrKUo4agYgP7GR7e9vlW3a3M4i5uTmnnftDnC12b23pc8pgcy9jrOupjBmcIsk/bxFVs8RYh3YLdNcAr6+v1Sfp6OhICXR2dqZEYgb+X0RiqW2mpKSoDAKoQKEHqM8RCBvH6+vrShidODfThhbAvQx2X2XMwC5vXG6vSs5TU1NVABUo9AA5np2dVceTk5POfGaSTswmdllfbQACaBE02mYsg91qfx2Pb112tw8lf+KbiA8CwdbWlhogx3qpcYxQl5eXKm9tbU3BrMJGnrc2YH9/3ymKEey6DOfUs9rf7Oxsj3FSdVxcnIoPAoEeIMd0fHV11WlDsImJCWdZjhEKu7c2zKJFstpfJoy3iPvThIQEFSPYDd8uaXx83GnTQhHhu5fnh8Ll5WUXmxbJynW1SFb760skHpEcJSUlKe9uB319feL09FQNTn+ylDY3N50g1szMjEeor9ui7H0S9az2m2f6vp4CvCl5zI6Hh/eXpaUl1dGVlRV1Pj09LQ4PD112M1+J8rotLRI2s+gvxGq/MzIy7nyelMTjEtTEy/sLnfWV5wv3sgzYyrX5cnxd3xvp6emmHt+OxsbGKi8fjpgVSQWa7Hg4sXCDJyJmfy1RgWZiYqJyZOEEwbWVHydVoMmLWjizcIGNy7RIDqGqoqOjn4tkQqjPYmJilEMLB1g5ll6YcIj0kuRHHDlOLdTBD8vxfnGfl7jekfzGrUuoi8SqkWNtue/rgASaT1GaHSAU4bZMjvEJP7H5895kueSv+Ph45eBCjaioKERqsuMN3HTeeyYqDxVxmEEOgebtfJf7bcmu5B9CBJw6syvYoN8OcX7lPwMiApFkw+9JhiRfSb5h6wwyvpQ0evJB/wIFDhaTvqlwnwAAAABJRU5ErkJggg==);left:5px}
+</style>
+</head>
+<body>
+<div class="container" id="container">
+	<div class="header">
+		<h1 id="title"></h1>
+		<a href="javascript:void(0)" class="back" id="cancel">返回</a>
+		<a href="javascript:void(0)" style="display:none" id="confirm"></a>
+	</div>
+	<div id="main"></div>
+</div>
+<script>
+(function () {
+	try {
+		document.domain = "qq.com";
+	} catch (_) {
+		alert("invalid domain");
+	}
+	function getParam(name) {
+		var re = new RegExp("(?:\\?|#|&)" + name + "=([^&]*)(?:$|&|#)", "i"), m = re.exec(window.location.href);
+		var ret = m ? m[1] : "";
+		ret = ret.replace(/[+]/ig, "%20");
+		return ret;
+	}
+	var iface = getParam("iface");
+	switch (iface) {
+	case "AppChallenge":
+	case "AppInvitation":
+	case "AppGiftRequest":
+	case "SendStory": {
+		var appid = getParam("oauth_consumer_key"), type = getParam("type");
+		var url = "tencent" + appid + "://" + iface + "/cancel";
+		document.getElementById("cancel").addEventListener("click", function () {
+			setTimeout(function () {
+				window.open(url, "_self");
+			}, 0);
+		}, false);
+		document.getElementById("title").innerHTML = {
+			AppChallenge : type == "pk" ? "发送挑战" : "发送炫耀",
+			AppInvitation : "发送应用邀请",
+			AppGiftRequest : type == "request" ? "发送应用请求" : "发送免费礼物",
+			SendStory : "发送分享"
+		}[iface];
+		document.write('<script type="text/javascript" src="https://qzonestyle.gtimg.cn/open/mobile/' + {
+			AppChallenge : "brag_ios/js/sdk_brag.js",
+			AppInvitation : "invite_ios/js/sdk_invite.js",
+			AppGiftRequest : "request_ios/js/sdk_request.js",
+			SendStory : "story_ios/js/sdk_story.js"
+		}[iface] + '"><\/script>');
+		break;
+	}
+	default:
+		return;
+	}
+})();
+</script>
+</body>
+</html>
diff --git a/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/qqicon.png b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/qqicon.png
new file mode 100644
index 0000000..65c743c
--- /dev/null
+++ b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/qqicon.png
Binary files differ
diff --git a/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/success.png b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/success.png
new file mode 100644
index 0000000..df3899d
--- /dev/null
+++ b/platforms/ios/dlapp/Resources/TencentOpenApi_IOS_Bundle.bundle/success.png
Binary files differ
diff --git a/platforms/ios/dlapp/config.xml b/platforms/ios/dlapp/config.xml
index 8fb53bc..66cd47a 100755
--- a/platforms/ios/dlapp/config.xml
+++ b/platforms/ios/dlapp/config.xml
@@ -71,6 +71,9 @@
         <param name="ios-package" value="ScreenshotBlocker" />
         <param name="onload" value="true" />
     </feature>
+    <feature name="QQSDK">
+        <param name="ios-package" value="CDVQQSDK" />
+    </feature>
     <name short="大理智警">dlapp</name>
     <description>
         A sample Apache Cordova application that responds to the deviceready event.
@@ -114,6 +117,7 @@
     <preference name="StatusBarOverlaysWebView" value="true" />
     <preference name="StatusBarStyle" value="lightcontent" />
     <preference name="CameraUsesGeolocation" value="false" />
+    <preference name="QQ_APP_ID" value="101885581" />
     <preference name="AutoHideSplashScreen" value="true" />
     <preference name="SplashScreenDelay" value="0" />
     <preference name="SplashShowOnlyFirstTime" value="true" />
diff --git a/platforms/ios/dlapp/dlapp-Info.plist b/platforms/ios/dlapp/dlapp-Info.plist
index de17430..07026c3 100644
--- a/platforms/ios/dlapp/dlapp-Info.plist
+++ b/platforms/ios/dlapp/dlapp-Info.plist
@@ -65,6 +65,61 @@
 		<string>UIInterfaceOrientationPortrait</string>
 		<string>UIInterfaceOrientationPortraitUpsideDown</string>
 	</array>
+	<key>CFBundleURLTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeRole</key>
+			<string>Editor</string>
+			<key>CFBundleURLName</key>
+			<string>tencentopenapi</string>
+			<key>CFBundleURLSchemes</key>
+			<array>
+				<string>tencent101885581</string>
+			</array>
+		</dict>
+	</array>
+	<key>LSApplicationQueriesSchemes</key>
+	<array>
+		<string>mqqapi</string>
+		<string>mqq</string>
+		<string>mqqOpensdkSSoLogin</string>
+		<string>mqqconnect</string>
+		<string>mqqopensdkdataline</string>
+		<string>mqqopensdkgrouptribeshare</string>
+		<string>mqqopensdkfriend</string>
+		<string>mqqopensdkapi</string>
+		<string>mqqopensdkapiV2</string>
+		<string>mqqopensdkapiV3</string>
+		<string>mqqopensdkapiV4</string>
+		<string>mqzoneopensdk</string>
+		<string>wtloginmqq</string>
+		<string>wtloginmqq2</string>
+		<string>mqqwpa</string>
+		<string>mqzone</string>
+		<string>mqzonev2</string>
+		<string>mqzoneshare</string>
+		<string>wtloginqzone</string>
+		<string>mqzonewx</string>
+		<string>mqzoneopensdkapiV2</string>
+		<string>mqzoneopensdkapi19</string>
+		<string>mqzoneopensdkapi</string>
+		<string>mqqgamebindinggroup</string>
+		<string>tencentapi.qq.reqContent</string>
+		<string>tencentapi.qzone.reqContent</string>
+		<string>tim</string>
+		<string>timapi</string>
+		<string>timopensdkfriend</string>
+		<string>timwpa</string>
+		<string>timgamebindinggroup</string>
+		<string>timapiwallet</string>
+		<string>timOpensdkSSoLogin</string>
+		<string>wtlogintim</string>
+		<string>timopensdkgrouptribeshare</string>
+		<string>timopensdkapiV4</string>
+		<string>timopensdkdataline</string>
+		<string>wtlogintimV1</string>
+		<string>timapiV1</string>
+	</array>
 	<key>NSCameraUsageDescription</key>
 	<string>APP需要使用您的相机权限，没有该权限将无法完成扫一扫功能</string>
 	<key>NSPhotoLibraryUsageDescription</key>
diff --git a/platforms/ios/frameworks.json b/platforms/ios/frameworks.json
index 71928cb..d516bf0 100644
--- a/platforms/ios/frameworks.json
+++ b/platforms/ios/frameworks.json
@@ -1,18 +1,21 @@
 {
-    "Security.framework": 3,
-    "SystemConfiguration.framework": 2,
+    "Security.framework": 4,
+    "SystemConfiguration.framework": 3,
     "LocalAuthentication.framework": 1,
     "ImageIO.framework": 1,
     "CoreLocation.framework": 1,
     "AVFoundation.framework": 1,
     "CFNetwork.framework": 1,
     "CoreFoundation.framework": 1,
-    "CoreTelephony.framework": 1,
+    "CoreTelephony.framework": 2,
     "Foundation.framework": 1,
     "UIKit.framework": 2,
-    "libz.tbd": 1,
+    "libz.tbd": 2,
     "AdSupport.framework": 1,
     "UserNotifications.framework": 1,
     "libresolv.tbd": 1,
-    "WebKit.framework": 1
+    "WebKit.framework": 1,
+    "libiconv.tbd": 1,
+    "libsqlite3.tbd": 1,
+    "libstdc++.tbd": 1
 }
\ No newline at end of file
diff --git a/platforms/ios/ios.json b/platforms/ios/ios.json
index 2cc797d..543eb31 100644
--- a/platforms/ios/ios.json
+++ b/platforms/ios/ios.json
@@ -87,6 +87,14 @@
             {
               "xml": "<feature name=\"screenshotName\"><param name=\"ios-package\" value=\"ScreenshotBlocker\" /><param name=\"onload\" value=\"true\" /></feature>",
               "count": 1
+            },
+            {
+              "xml": "<feature name=\"QQSDK\"><param name=\"ios-package\" value=\"CDVQQSDK\" /></feature>",
+              "count": 1
+            },
+            {
+              "xml": "<preference name=\"QQ_APP_ID\" value=\"101885581\" />",
+              "count": 1
             }
           ]
         }
@@ -120,6 +128,18 @@
               "mode": "merge",
               "id": "config.xml"
             }
+          ],
+          "CFBundleURLTypes": [
+            {
+              "xml": "<array><dict><key>CFBundleTypeRole</key><string>Editor</string><key>CFBundleURLName</key><string>tencentopenapi</string><key>CFBundleURLSchemes</key><array><string>tencent101885581</string></array></dict></array>",
+              "count": 1
+            }
+          ],
+          "LSApplicationQueriesSchemes": [
+            {
+              "xml": "<array><string>mqqapi</string><string>mqq</string><string>mqqOpensdkSSoLogin</string><string>mqqconnect</string><string>mqqopensdkdataline</string><string>mqqopensdkgrouptribeshare</string><string>mqqopensdkfriend</string><string>mqqopensdkapi</string><string>mqqopensdkapiV2</string><string>mqqopensdkapiV3</string><string>mqqopensdkapiV4</string><string>mqzoneopensdk</string><string>wtloginmqq</string><string>wtloginmqq2</string><string>mqqwpa</string><string>mqzone</string><string>mqzonev2</string><string>mqzoneshare</string><string>wtloginqzone</string><string>mqzonewx</string><string>mqzoneopensdkapiV2</string><string>mqzoneopensdkapi19</string><string>mqzoneopensdkapi</string><string>mqzoneopensdk</string><string>mqqgamebindinggroup</string><string>tencentapi.qq.reqContent</string><string>tencentapi.qzone.reqContent</string><string>tim</string><string>timapi</string><string>timopensdkfriend</string><string>timwpa</string><string>timgamebindinggroup</string><string>timapiwallet</string><string>timOpensdkSSoLogin</string><string>wtlogintim</string><string>timopensdkgrouptribeshare</string><string>timopensdkapiV4</string><string>timgamebindinggroup</string><string>timopensdkdataline</string><string>wtlogintimV1</string><string>timapiV1</string></array>",
+              "count": 1
+            }
           ]
         }
       },
@@ -216,6 +236,10 @@
     },
     "cordova-plugin-prevent-screenshot-coffice": {
       "PACKAGE_NAME": "$(PRODUCT_BUNDLE_IDENTIFIER)"
+    },
+    "cordova-plugin-qqsdk": {
+      "QQ_APP_ID": "101885581",
+      "PACKAGE_NAME": "$(PRODUCT_BUNDLE_IDENTIFIER)"
     }
   },
   "dependent_plugins": {},
@@ -587,6 +611,14 @@
       "clobbers": [
         "window.plugins.preventscreenshot"
       ]
+    },
+    {
+      "id": "cordova-plugin-qqsdk.QQSDK",
+      "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+      "pluginId": "cordova-plugin-qqsdk",
+      "clobbers": [
+        "QQSDK"
+      ]
     }
   ],
   "plugin_metadata": {
@@ -608,6 +640,7 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
   }
 }
diff --git a/platforms/ios/platform_www/cordova_plugins.js b/platforms/ios/platform_www/cordova_plugins.js
index b4d865e..3e450c8 100644
--- a/platforms/ios/platform_www/cordova_plugins.js
+++ b/platforms/ios/platform_www/cordova_plugins.js
@@ -367,6 +367,14 @@
       "clobbers": [
         "window.plugins.preventscreenshot"
       ]
+    },
+    {
+      "id": "cordova-plugin-qqsdk.QQSDK",
+      "file": "plugins/cordova-plugin-qqsdk/www/qq.js",
+      "pluginId": "cordova-plugin-qqsdk",
+      "clobbers": [
+        "QQSDK"
+      ]
     }
   ];
   module.exports.metadata = {
@@ -388,6 +396,7 @@
     "cordova-plugin-wkwebview-engine": "1.2.1",
     "cordova-plugin-brightness": "0.1.5",
     "cordova-plugin-fingerprint-aio": "3.0.1",
-    "cordova-plugin-prevent-screenshot-coffice": "1.0.1"
+    "cordova-plugin-prevent-screenshot-coffice": "1.0.1",
+    "cordova-plugin-qqsdk": "0.9.7"
   };
 });
\ No newline at end of file
diff --git a/platforms/ios/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js b/platforms/ios/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js
new file mode 100644
index 0000000..cedb4c0
--- /dev/null
+++ b/platforms/ios/platform_www/plugins/cordova-plugin-qqsdk/www/qq.js
@@ -0,0 +1,43 @@
+cordova.define("cordova-plugin-qqsdk.QQSDK", function(require, exports, module) {
+
+var cordova = require('cordova');
+module.exports = {
+	Scene: {
+        QQ:  0, // QQ 好友
+        QQZone: 1, // QQ 空间
+        Favorite: 2  // 收藏
+    },
+    ClientType: {
+        QQ:  0, // QQ 手机客户端
+        TIM: 1 // TIM 客户端
+    },
+	ssoLogin:function(successCallback, errorCallback, args){
+		if(args === undefined) {
+            args = {}
+        }
+		cordova.exec(successCallback, errorCallback, "QQSDK", "ssoLogin",[args]);
+	},
+	logout:function(successCallback, errorCallback){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "logout", []);
+	},
+	checkClientInstalled:function(successCallback, errorCallback, args){
+		if(args === undefined) {
+            args = {}
+        }
+		cordova.exec(successCallback, errorCallback, "QQSDK", "checkClientInstalled", [args]);
+	},
+	shareText:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareText", [args]);
+	},
+	shareImage:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareImage", [args]);
+	},
+	shareNews:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareNews", [args]);
+	},
+	shareAudio:function(successCallback, errorCallback, args){
+		cordova.exec(successCallback, errorCallback, "QQSDK", "shareAudio", [args]);
+	},
+};
+
+});
