开发插件

编写 Android 原生代码

下载 openinstall SDK 并将 jar 包拷贝到项目的 libs 目录。创建一个 package,如 com.wenkiwu.hbuilder.openinstall;在包中新建一个类继承自 StandardFeature,然后对应openinstall的接口定义相应的功能方法。完整代码如下:

package com.wenkiwu.hbuilder.openinstall;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log; import com.fm.openinstall.OpenInstall;
import com.fm.openinstall.listener.AppInstallAdapter;
import com.fm.openinstall.listener.AppWakeUpAdapter;
import com.fm.openinstall.model.AppData; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import io.dcloud.common.DHInterface.ISysEventListener;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.StandardFeature;
import io.dcloud.common.util.JSUtil; public class OpenInstallApiManager extends StandardFeature { private static final String TAG = "OpenInstallApiManager";
private IWebview webview = null;
private String wakeupCallBackID = null; @Override
public void onStart(Context context, Bundle bundle, String[] strings) {
super.onStart(context, bundle, strings);
Log.d(TAG, "init");
OpenInstall.init(context);
} public void registerWakeUpHandler(final IWebview pWebview, JSONArray array) {
Log.d(TAG, "registerWakeUpHandler");
String callBackID = array.optString(0); webview = pWebview;
wakeupCallBackID = callBackID;
// 自己注册监听并处理 onNewIntent 事件
pWebview.obtainApp().registerSysEventListener(new ISysEventListener() {
@Override
public boolean onExecute(SysEventType sysEventType, Object o) {
if (sysEventType == SysEventType.onNewIntent) {
String dataString = (String) o;
Intent intent = new Intent();
intent.setData(Uri.parse(dataString));
if (webview != null && wakeupCallBackID != null) {
getWakeUp(intent, webview, wakeupCallBackID);
}
}
return false;
}
}, SysEventType.onNewIntent); Intent intent = pWebview.getActivity().getIntent();
if (intent == null || TextUtils.isEmpty(intent.getDataString())) {
return;
}
getWakeUp(intent, pWebview, callBackID);
} @Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
// 5+sdk 的 bug 导致 onNewIntent 未被回调
// if (webview != null && wakeupCallBackID != null) {
// getWakeUp(intent, webview, wakeupCallBackID);
// }
} private void getWakeUp(Intent intent, final IWebview pWebview, final String callBackID) {
OpenInstall.getWakeUp(intent, new AppWakeUpAdapter() {
@Override
public void onWakeUp(AppData appData) {
JSONObject dataJson = new JSONObject();
try {
dataJson.put("channelCode", appData.getChannel());
dataJson.put("bindData", appData.getData());
} catch (JSONException e) {
e.printStackTrace();
}
JSUtil.execCallback(pWebview, callBackID, dataJson, JSUtil.OK, false);
}
});
} public void getInstall(final IWebview pWebview, JSONArray array) {
Log.d(TAG, "getInstall");
final String callBackID = array.optString(0);
int timeout = -1;
if (array.isNull(1)) {
timeout = array.optInt(1);
}
OpenInstall.getInstall(new AppInstallAdapter() {
@Override
public void onInstall(AppData appData) {
JSONObject dataJson = new JSONObject();
try {
dataJson.put("channelCode", appData.getChannel());
dataJson.put("bindData", appData.getData());
} catch (JSONException e) {
e.printStackTrace();
}
JSUtil.execCallback(pWebview, callBackID, dataJson, JSUtil.OK, false);
}
}, timeout * 1000);
} public void reportRegister(IWebview pWebview, JSONArray array) {
Log.d(TAG, "reportRegister");
OpenInstall.reportRegister();
} public void reportEffectPoint(IWebview pWebview, JSONArray array) {
Log.d(TAG, "reportEffectPoint");
String pointId = array.optString(0);
long pointValue = array.optLong(1);
OpenInstall.reportEffectPoint(pointId, pointValue);
} }

封装插件的 JS

在前端代码的 js 文件夹中,新建 openinstall.js,编写代码,通过 plus.bridge 调用 Native 层的方法

document.addEventListener( "plusready",  function(){
var _BARCODE = 'openinstall',
B = window.plus.bridge;
var openinstall = {
//注册拉起回调
registerWakeUpHandler: function (successCallback) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
callbackID = B.callbackId(success, null);
return B.exec(_BARCODE, "registerWakeUpHandler", [callbackID]);
},
// 获取安装来源数据
getInstall : function (successCallback, timeout) {
var success = typeof successCallback !== 'function' ? null : function(args) {
successCallback(args);
},
callbackID = B.callbackId(success, null);
return B.exec(_BARCODE, "getInstall", [callbackID, timeout]);
},
// 注册上报
reportRegister : function () {
return B.exec(_BARCODE, "reportRegister", []);
},
// 上报渠道效果
reportEffectPoint : function (pointId, pointValue) {
return B.exec(_BARCODE, "reportEffectPoint", [pointId, pointValue]);
}
};
window.plus.openinstall = openinstall;
}, true );

集成插件

关联 JS 插件名和 Android 原生类

修改项目的 src/main/assets/data/ 目录下的 dcloud_properties.xml文件,指定 JS 对象名称和 Android 的类名对应关系,以便 H5+ SDK 根据对应的 JS 名查找并生成相应的 Native 对象执行对应的逻辑

<properties>
<features>
<!-- more feature --> <!-- openinstall plugin -->
<feature name="openinstall" value="com.wenkiwu.hbuilder.openinstall.OpenInstallApiManager"/>
</features> <services>
<!-- openinstall需要在程序启动时初始化 -->
<service name="openinstall" value="com.wenkiwu.hbuilder.openinstall.OpenInstallApiManager"/>
<!-- more service -->
</services>
</properties>

在应用的 manifest.json 文件中还需要添加扩展插件的应用使用权限

{
"@platforms": [
"android",
"iPhone",
"iPad"
],
"id": "H5E1BA598",
"name": "OpenInstallPlugin",
// ...
"permissions": {
"Console": {
"description": "跟踪调试输出日志"
},
"Events": {
"description": "应用扩展事件"
},
// openinstall plugin
"openinstall": {
"description": "openinstall插件"
}
},
// ...
}

openinstall 的配置

根据openinstall官方文档,在 AndroidManifest.xml 中做以下配置

声明权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

配置 AppKey 和 scheme

<application
android:allowBackup="false"
android:allowClearUserData="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true">
<!-- openinstall appkey 配置 -->
<meta-data
android:name="com.openinstall.APP_KEY"
android:value="OPENINSTALL_APPKEY"/> <activity
android:name="io.dcloud.PandoraEntry"
android:configChanges="orientation|keyboardHidden|screenSize|mcc|mnc|fontScale"
android:hardwareAccelerated="true"
android:screenOrientation="user"
android:theme="@style/TranslucentTheme"
android:launchMode="singleTask"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- opeinstall scheme 配置 -->
<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="OPENINSTALL_SCHEME"/>
</intent-filter>
</activity>
</application>

网页中 JS 调用示例

引入 JS 文件
<script type="text/javascript" src="./js/openinstall.js"></script>
获取 scheme 唤醒数据

在应用启动时,注册唤醒回调。这样当 App 被唤醒时,会回调传入的方法,并在回调中获取唤醒数据

document.addEventListener('plusready',function(){
plus.openinstall.registerWakeUpHandler(function(data){
console.log("wakeup : channelCode= "
+ data.channelCode + ", bindData=" + data.bindData);
alert("wakeup : channelCode= " + data.channelCode + ", bindData=" + data.bindData);
}); },false);
获取安装来源数据

在需要获取安装来源数据时,调用以下代码,在回调中获取参数

function getInstall(){
plus.openinstall.getInstall(function(data){
console.log("getInstall : channelCode= "
+ data.channelCode + ", bindData=" + data.bindData);
}, 8);
}
其他统计代码

用户注册成功后,调用以下代码,上报注册统计

function reportRegister(){
plus.openinstall.reportRegister();
}

统计终端用户对某些特殊业务的使用效果,如充值金额,分享次数等等,调用以下代码

function reportEffectPoint(){
plus.openinstall.reportEffectPoint("effect_test", 1);
}

**openinstall 官方已提供 hbuilder 集成插件 [openinstall-hbuilder-sdk](https://github.com/OpenInstall/openinstall-hbuilder-sdk),包含了iOS和Android两个平台**

最新文章

  1. Unity 依赖注入之二
  2. Hammer.js分析(一)——基础结构
  3. win32程序通过LPCREATESTRUCT中的lpCreateParams传递参数给窗口过程函数
  4. 多条查询sql语句返回多表数据集
  5. 教你怎么安装RabbitMQ
  6. 搭建turnserver
  7. CentOS下yum安装mysql,jdk以及tomcat
  8. javascript中常用的DOM事件
  9. 利用Excel批量高速发送电子邮件
  10. DirectX 开发环境配置
  11. ftk学习记录(IME文章)
  12. Freemarker的使用方法
  13. 【转】Windows自动连接、断开无线网络
  14. Windows Server 安装后无法使用无线与音频
  15. nodejs搭建web项目
  16. js 随机生成颜色值
  17. Python学习笔记——发邮件
  18. 强大的拖拽组件:React DnD 的使用
  19. PythonStudy——列表的常用操作 List of common operations
  20. 微信小程序动态更改样式

热门文章

  1. &quot;《算法导论》之‘线性表’&quot;:基于数组实现的单链表
  2. win7 64位系统,vs2010下配置OpenGL开发环境
  3. Mina源码阅读笔记(七)—Mina的拦截器FilterChain
  4. javascript语言扩展:可迭代对象(2)
  5. C# 操作Excel数据透视表
  6. https证书链不完整
  7. MySql foreach属性
  8. Spring security在MS-SQL下的初始化脚本
  9. django1.8升级1.9的几个问题
  10. currval of sequence &quot;follow_id_seq&quot; is not yet defined in this session