在手机应用中,推送是一个非常重要的功能。相对来说ios应用的推送功能很容易做,因为它统一都是用苹果的APNS服务实现的。但安卓这边就比较混乱了,虽然谷歌也推出了类似苹果的官方推送服务,但由于谷歌的服务器在国内经常被墙,所以用谷歌官方提供的推送服务在国内是不可行的,所以安卓的应用就只能自己实现推送服务了。但如果完全由自己实现推送功能,那成本是非常大的。所以一般我们会选择一些第三方推送服务,比如极光推送就是一个非常不错的选择。

首先,下载极光推送的安卓sdk,解压,找到打开libs文件夹,里面有两个东西

把armeabi这里文件夹复制到你的Titanium安卓模块项目根目录的libs文件夹里面,如果没有这个文件夹可以创建。模块项目的libs文件夹是用来放第三方动态链接库文件的地方,也就是后缀名为.so的文件。然后把 jpush-sdk-release1.5.5.jar 这个文件复制到模块项目根目录的 lib 文件夹里面。这样我们就可以在模块中使用极光推送的api了。

由于极光推送的api比较简单,所以我们只需要在模块的主文件中把极光推送提供的api与我们能在titanium项目中使用的js方法进行绑定就行了。

模块主文件名为JpushModule.java,其源码如下:

/**
* This file was auto-generated by the Titanium Module SDK helper for Android
* Appcelerator Titanium Mobile
* Copyright (c) 2009-2013 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*
*/
package com.yeshcp.jpush; import java.util.Set;
import java.util.HashSet;
import java.util.HashMap; import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.KrollFunction;
import org.appcelerator.titanium.TiApplication;
import org.appcelerator.kroll.common.Log;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.TagAliasCallback; @Kroll.module(name="Jpush", id="com.yeshcp.jpush")
public class JpushModule extends KrollModule
{ // Standard Debugging variables
private static final String TAG = "JpushModule"; // You can define constants with @Kroll.constant, for example:
// @Kroll.constant public static final String EXTERNAL_NAME = value; public JpushModule()
{
super();
} @Kroll.onAppCreate
public static void onAppCreate(TiApplication app)
{
Log.d(TAG, "inside onAppCreate");
JPushInterface.setDebugMode(true);
JPushInterface.init(app); //init jpush
}
@Kroll.method
public void stopPush(){ //stop push
JPushInterface.stopPush(TiApplication.getInstance());
} @Kroll.method
public void resumePush(){ //resume push
JPushInterface.resumePush(TiApplication.getInstance());
} @Kroll.method
public void setAliasAndTags(String alias, Object[] tags,final KrollFunction callback){//设置标签与别名,callback参数必须设置final
Set set=new HashSet();
for(Object n : tags){ //把object数组转化为set,因为jpush需要传入一个set类型
set.add(n.toString());
}
JPushInterface.setAliasAndTags(TiApplication.getInstance(),alias,set,new TagAliasCallback(){//使用匿名内部类作为回调类
@Override
public void gotResult(int arg0, String arg1,Set<String> arg2) {
Log.d("JPush", "Jpush setAliasAndTags status: " + arg0);//状态
if(callback != null){
KrollDict map = new KrollDict(); //回调函数的参数
map.put("code", arg0);
callback.callAsync(getKrollObject(),map); //执行回调
}
}
});
} @Kroll.method
public void setAlias(String alias,final KrollFunction callback){
JPushInterface.setAlias(TiApplication.getInstance(),alias,new TagAliasCallback(){
@Override
public void gotResult(int arg0, String arg1,Set<String> arg2) {
Log.d("JPush", "Jpush setAlias status: " + arg0);//状态
if(callback != null){
KrollDict map = new KrollDict();
map.put("code", arg0);
callback.callAsync(getKrollObject(),map);
}
}
});
} @Kroll.method
public void setTags(Object[] tags,final KrollFunction callback){
Set set=new HashSet();
for(Object n : tags){
set.add(n.toString());
}
JPushInterface.setTags(TiApplication.getInstance(),set,new TagAliasCallback(){
@Override
public void gotResult(int arg0, String arg1,Set<String> arg2) {
Log.d("JPush", "Jpush setTags status: " + arg0);//状态
if(callback != null){
KrollDict map = new KrollDict();
map.put("code", arg0);
callback.callAsync(getKrollObject(),map);
}
}
});
}
}

OK,之后就是编译模块了,编译成功后把得到的模块文件(位于dist文件夹里的一个zip压缩文件)放到你的Titanium项目的根目录,然后运行你的项目,模块就会自动安装了,之后你还要在你项目的tiapp.xml文件里引入你刚安装的模块。

之后我们还可以测试一下是不是有用:

var push = require('com.yeshcp.jpush');
//push.resumePush();
push.setAliasAndTags('chelsea',['grade1','grade2'],function(e){
alert('setAliasAndTags' + JSON.stringify(e));
}); setTimeout(function(){
push.setAlias('',function(e){
alert('setAlias' + JSON.stringify(e));
});
},5000); setTimeout(function(){
push.setTags([],function(e){
alert('setTags' + JSON.stringify(e));
});
},10000);

注意:极光推送需要配置AndroidManifest.xml文件,具体怎么配置可以去看极光推送的文档。

最后附上我已经编译好的模块文件:com.yeshcp.jpush-android-1.1.zip

为Titanium创建自己的安卓推送模块的更多相关文章

  1. 个推安卓推送SDK集成步骤详解

    以下是一位开发者在集成个推安卓推送SDK时候的亲身经历: 作者:吃饱了想睡. 概述 公司准备采用个推作为第三方推送平台,我作为客户端的头号小鸟,掐指一算已经毕业 0.1 年了,Leader 准备把这个 ...

  2. Jpush推送模块

      此文章已于 14:17:10 2015/3/24 重新发布到 鲸歌 Jpush推送模块     或以上版本的手机系统. SDK集成步骤 .导入 SDK 开发包到你自己的应用程序项目 •    解压 ...

  3. phonegap创建的ios项目推送消息出现闪退现象

    使用phonegap创建的ios项目,推送消息时,当程序在前台运行或者在后台运行状态下,推送消息过来,可以解析并且跳转: 但是在程序从后台退出的状态下,当消息推送过来的时候,点击通知栏,打开程序,程序 ...

  4. git创建本地分支以及推送本地分之至远程分支

    Git分支策略 实际开发中,应当按照以下几个基本原则进行管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能再上边干活. 那在哪干活呢?干活都在dev分支上,也就是说,de ...

  5. Git:创建远程仓库并推送内容到远程库

    1.添加远程仓库 1.1点击该按钮创建一个新仓库 2.推送到远程仓库 2.1根据GitHub的提示,在本地的learngit仓库下运行命令git remote add origin https://g ...

  6. Git创建本地仓库并推送至远程仓库

    作为一名测试同学,日常工作经常需要checkout研发代码进行code review.自己极少有机会创建仓库,一度以为这是一个非常复杂过程.操作一遍后,发现也不过六个步骤,so,让我们一起揭开这神秘面 ...

  7. 使用Google Cloud Messaging (GCM),PHP 开发Android Push Notifications (安卓推送通知)

    什么是GCM? Google Cloud  Messaging (GCM) 是Google提供的一个服务,用来从服务端向安卓设备发送推送通知. GCM分为客户端和服务端开发. 这里我们只介绍服务端开发 ...

  8. docker 创建镜像,并推送到私有仓库

    创建镜像 创建  Dockerfile 镜像命名规则:registyr_url / namespace / depart / name : version 用这个规则创建的镜像,可直接推送到私有仓库 ...

  9. git创建远程分支并推送

    1.查看所有分支(-a=>'查看全部的分支') git branch -a 2.创建本地test分支 git branch test 2.2切换test分支 git checkout test ...

随机推荐

  1. poj 3321 Apple Trie

    /* poj 3321 Apple Trie 这道题的关键是如何将一个树建成一个一维数组利用树状数组来解题! 可以利用dfs()来搞定,我们在对一个节点深搜后,所经过的节点的数目就是该节点的子树的数目 ...

  2. PHP的学习--图解PHP引用

    在一篇文章中看到关于PHP引用的图解,对于加深对PHP引用的理解很有帮助,在这里备份一下. 如果你对PHP的引用一点也不了解,可以先看我之前的博客:PHP的学习--PHP的引用

  3. 【大数据】Linux下Storm(0.9版本以上)的环境配置和小Demo

    一.引言: 在storm发布到0.9.x以后,配置storm将会变得简单很多,也就是只需要配置zookeeper和storm即可,而不再需要配置zeromq和jzmq,由于网上面的storm配置绝大部 ...

  4. 别用symbolicatecrash来解析crash Log了

    今天突然发现了一个解析iOS crash log的好方法,忍不住来分享一下. 相信每个做iOS开发的TX都应该不会对symbolicatecrash陌生,我们第一次遇到真机上产生的崩溃日志时,在网上搜 ...

  5. 【JDK源码分析】浅谈HashMap的原理

    这篇文章给出了这样的一道面试题: 在 HashMap 中存放的一系列键值对,其中键为某个我们自定义的类型.放入 HashMap 后,我们在外部把某一个 key 的属性进行更改,然后我们再用这个 key ...

  6. 使用laravel一分钟搭建CURD后台页面

    配置即一切 一切皆于需求,后台从0开始搭建,但是写了一两个页面后发现太多的是对单表的增删改查操作,于是就想到了,能不能做一个快速搭建的后台.想到一句话,配置即一切.如果一个CURD后台能只进行配置就自 ...

  7. CP/IP,SPDY,WebSocket 三者之间的关系

    按照OSI网络分层模型,IP是网络层协议,TCP是传输层协议,而HTTP是应用层的协议.在这三者之间,SPDY和WebSocket都是与HTTP相关的协议,而TCP是HTTP底层的协议.一.HTTP的 ...

  8. 解决The file “FWLifeApp” couldn’t be opened because you don’t have permission to view it.问题

    The file “FWLifeApp” couldn’t be opened because you don’t have permission to view it问题是因为项目文件中的Bundl ...

  9. C#项目””是针对”.NETFramework,Version=v4.5.2”但此计算机没有,需要修改为v4.5.1.

    每次下载别人的代码都会出现这样的问题,以为是没有安装.NETFramework,就下载安装了,但是每次安装都会出现已安装高版本的4.6(Win10自带),无需下次安装,但是每次VS中都会显示有问题,而 ...

  10. 一对多关系domain Model中设置使用AutoMapper时出错

    在使用AutoMapper时,把数据从VO-PO时显示如下错误,错误提示说在一对多关系中已将集合设置为EntityCollection,那么这个是为什么呢. 看下action中的代码,我们可以发现这是 ...