看这个,最起码需要熟悉eclipse的操作。phonegap初级开发经验(包括插件的开发),
熟悉andriod的相关配置和简单的运行原理。穷人用不起ios,等适当的时候再去琢磨xcode的实现。不过baidupush是统一的方式。这个好说
开发语言需要java,js,xml
百度开发官方链接
注册和基本的操作
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/guide
客户端demo下载
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/clientsdk
需要注意的是:
AndroidManifest.xml
权限,对应的接受类和处理类的声明
appk的配置
<meta-data android:name="api_key" android:value="GpcU7jAxPdItPlfYwFnZSiDV" />
主类的运行模式为
android:launchMode=”singleTask”
因为接收和绑定的过程中。会通过调用来传递相关参数和激活应用。如果不进行设置,会造成死循环.特殊情况请自行处理
电脑编译出apk进行安装后,提示”Bind Success”后,在控制台那边简单发送个消息客户端会进行提示。
接下来是pg的集成.
创建 pg 测试项目 (自己解决…)
将push demo代码 相关文件进行复制。
整合配置文件到pg里。
主类的启动换成pg.
不过baidupush是不推荐将绑定的操作在启动过程实现的。不过我放到了
super.loadUrl("file:///android_asset/www/index.html");
因为只是完成绑定操作,可以通过多线程进行操作。
接下来是主类的代码
package org.apache.cordova.test.actions; import java.util.ArrayList; import java.util.List; import org.apache.cordova.DroidGap; import org.json.JSONException; import org.json.JSONObject; import android.app.AlertDialog; import android.app.Dialog; import android.app.Notification; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.content.res.Resources; import android.os.Bundle; import android.preference.PreferenceManager; import android.widget.TextView; import android.widget.Toast; import com.baidu.android.common.logging.Log; import com.baidu.android.pushservice.CustomPushNotificationBuilder; import com.baidu.android.pushservice.PushConstants; import com.baidu.android.pushservice.PushManager; import com.phonegap.plugin.baidupush.Utils; public class test extends DroidGap { public static int initialCnt = 0; private boolean isLogin = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.init(); android.webkit.WebSettings settings = super.appView.getSettings(); // String appCachePath = this.getCacheDir().getAbsolutePath(); // settings.setAppCachePath(appCachePath); // settings.setAllowFileAccess(true); super.appView.addJavascriptInterface(new IGDMOBILE(this, appView), "IGD_WH"); settings.setAppCacheEnabled(false); super.loadUrl("file:///android_asset/www/index.html"); // baidu push start Resources resource = this.getResources(); String pkgName = this.getPackageName(); PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_API_KEY, Utils.getMetaValue(test.this, "api_key")); CustomPushNotificationBuilder cBuilder = new CustomPushNotificationBuilder( resource.getIdentifier("notification_custom_builder", "layout", pkgName), resource.getIdentifier("notification_icon", "id", pkgName), resource.getIdentifier( "notification_title", "id", pkgName), resource.getIdentifier("notification_text", "id", pkgName)); cBuilder.setNotificationFlags(Notification.FLAG_AUTO_CANCEL); cBuilder.setNotificationDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE); cBuilder.setStatusbarIcon(this.getApplicationInfo().icon); cBuilder.setLayoutDrawable(resource.getIdentifier( "simple_notification_icon", "drawable", pkgName)); PushManager.setNotificationBuilder(this, 1, cBuilder); // baidu push end // Set by <content src="index.html" /> in config.xml // super.loadUrl("http://192.168.1.114:8080/test/phonegap/");//Config.getStartUrl() // super.setIntegerProperty("splashscreen", R.drawable.splash); // super.loadUrl("file:///android_asset/www/index.html", 3000); } @Override public void onStart() { super.onStart(); Log.i("gddebug", "gddebug test.onStart:"); PushManager.activityStarted(this); } @Override public void onResume() { super.onResume(); showChannelIds(); } @Override protected void onNewIntent(Intent intent) { // 如果要统计Push引起的用户使用应用情况,请实现本方法,且加上这一个语�? super.onNewIntent(intent); setIntent(intent); handleIntent(intent); } @Override public void onStop() { super.onStop(); PushManager.activityStoped(this); } /** * 处理Intent * * @param intent * intent */ private void handleIntent(Intent intent) { String action = intent.getAction(); if (Utils.ACTION_RESPONSE.equals(action)) { String method = intent.getStringExtra(Utils.RESPONSE_METHOD); if (PushConstants.METHOD_BIND.equals(method)) { String toastStr = ""; int errorCode = intent.getIntExtra(Utils.RESPONSE_ERRCODE, 0); if (errorCode == 0) { String content = intent .getStringExtra(Utils.RESPONSE_CONTENT); String appid = ""; String channelid = ""; String userid = ""; try { JSONObject jsonContent = new JSONObject(content); JSONObject params = jsonContent .getJSONObject("response_params"); appid = params.getString("appid"); channelid = params.getString("channel_id"); userid = params.getString("user_id"); } catch (JSONException e) { Log.e(Utils.TAG, "Parse bind json infos error: " + e); } SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(this); Editor editor = sp.edit(); editor.putString("appid", appid); editor.putString("channel_id", channelid); editor.putString("user_id", userid); editor.commit(); showChannelIds(); toastStr = "Bind Success"; } else { toastStr = "Bind Fail, Error Code: " + errorCode; if (errorCode == 30607) { Log.d("Bind Fail", "update channel token-----!"); } } Toast.makeText(this, toastStr, Toast.LENGTH_LONG).show(); } } else if (Utils.ACTION_LOGIN.equals(action)) { String accessToken = intent .getStringExtra(Utils.EXTRA_ACCESS_TOKEN); PushManager.startWork(getApplicationContext(), PushConstants.LOGIN_TYPE_ACCESS_TOKEN, accessToken); isLogin = true; // initButton.setText("更换百度账号初始化Channel"); } else if (Utils.ACTION_MESSAGE.equals(action)) { String message = intent.getStringExtra(Utils.EXTRA_MESSAGE); String summary = "Receive message from server:nt"; Log.e(Utils.TAG, summary + message); JSONObject contentJson = null; String contentStr = message; try { contentJson = new JSONObject(message); contentStr = contentJson.toString(4); } catch (JSONException e) { Log.d(Utils.TAG, "Parse message json exception."); } summary += contentStr; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage(summary); builder.setCancelable(true); Dialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(true); dialog.show(); } else { Log.i(Utils.TAG, "Activity normally start!"); } } private void showChannelIds() { String appId = null; String channelId = null; String clientId = null; SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(this); appId = sp.getString("appid", ""); channelId = sp.getString("channel_id", ""); clientId = sp.getString("user_id", ""); Resources resource = this.getResources(); String pkgName = this.getPackageName(); // infoText = (TextView) findViewById(resource.getIdentifier("text", "id", pkgName)); // // String content = "tApp ID: " + appId + "ntChannel ID: " + channelId // + "ntUser ID: " + clientId + "nt"; // if (infoText != null) { // infoText.setText(content); // infoText.invalidate(); // } } private List<String> getTagsList(String originalText) { List<String> tags = new ArrayList<String>(); int indexOfComma = originalText.indexOf(','); String tag; while (indexOfComma != -1) { tag = originalText.substring(0, indexOfComma); tags.add(tag); originalText = originalText.substring(indexOfComma + 1); indexOfComma = originalText.indexOf(','); } tags.add(originalText); return tags; } }
需要注意的是
PushMessageReceiver.java
清楚原控件的相关代码。
启动的时候完成绑定操作,然后再测试推送,ok,成功过。
关于绑定操作,这时候需要自己写插件啦。
代码如下
package com.phonegap.plugin.baidupush; import org.apache.cordova.api.Plugin; import org.apache.cordova.api.PluginResult; import org.apache.cordova.test.R; import org.apache.cordova.test.actions.test; import org.json.JSONArray; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Log; import com.baidu.android.pushservice.PushConstants; import com.baidu.android.pushservice.PushManager; public class BaiduPush extends Plugin { public static final String PLUGIN_NAME = "BaiduPush"; PendingIntent contentIntent; @Override public PluginResult execute(String action, JSONArray args, String callbackId) { Log.d(PLUGIN_NAME, "Plugin execute called with action: " + action); boolean result = false; String appId = null; String channelId = null; String clientId = null; SharedPreferences sp = PreferenceManager .getDefaultSharedPreferences(this.cordova.getActivity().getApplicationContext()); appId = sp.getString("appid", ""); channelId = sp.getString("channel_id", ""); clientId = sp.getString("user_id", ""); //通过js将这几个值传出去与用户做绑定,漂亮代码我就不写了。可以参考别人的操作把代码写漂亮些。 Log.i("gddebug","gddebug com.phonegap.plugin.baidupush.BaiduPush execute:appId="+appId); Log.i("gddebug","gddebug com.phonegap.plugin.baidupush.BaiduPush execute:channelId="+channelId); Log.i("gddebug","gddebug com.phonegap.plugin.baidupush.BaiduPush execute:clientId="+clientId); return new PluginResult(result ? PluginResult.Status.OK : PluginResult.Status.ERROR); } }
服务器端的东西比较容易解决。这边以php为例.
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/sdk/serversdk
下载好后,自己看下吧。Oauth2.0的一般模式呵呵。
主要需要注意的。暂时有
推送消息的具体内容。
基础参数看
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list#push_msg
关于messages的内容分析。。这是我最想骂人的地方。。
上代码:
// 通知类型的内容必须按指定内容发送,示例如下: $message = json_encode ( array ( 'title' => 'test_push2', //对应的分组。这样应用里就可以分组进行推送了。yd.通过服务器端进行绑定就可以了。哈 'tag'=>'caihaibin', 'description' => 'openurl2', //必须 为0,basic_style才有效 'notification_builder_id' => 0, //这个需要强烈注意,文档根本没有说明 //具体的合并参数是 4 铃声 2震动 1可清除 分别累加 'notification_basic_style' => 7, //这个启动当前应用 'open_type' => 2, 'custom_content' => array ( 'type_code' => '1', 'type_content' => '7448969' ) )
好了,基本的东西就到这了。
偶然发现在faq里有简单的说明:唉。。
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/faq
搜索 notification_basic_style 相关
注:
1.有时会有延时。这个可以无视。毕竟处理方面在百度。反正误差估计就1分钟,还算合理。
2.测试分组和两app时的提示是否有冲突。暂时没有发现
转发请注明出处http://blog.martoo.cn
如有漏缺,请联系我 QQ 243008827
thank you share!
^_^