JPush接入指南for Android

JPush接入指南for Android

更加详尽接入指南参考极光文档http://docs.jiguang.cn/jpush/guideline/intro/

一. 接入须知:(JPush基本概念)

1. 消息形式

JPush提供四种消息形式:通知,自定义消息,富媒体和本地通知。

a. 通知

或者说 Push Notification,即指在手机的通知栏(状态栏)上会显示的一条通知信息。
通知主要用于提示用户的目的,应用于新闻内容、促销活动、产品信息、版本更新提醒、订单状态提醒等多种场景
开发者参考文档:Push API v3 notification

b. 自定义消息

自定义消息不是通知,所以不会被SDK展示到通知栏上。其内容完全由开发者自己定义。
自定义消息主要用于应用的内部业务逻辑。一条自定义消息推送过来,有可能没有任何界面显示。
开发者参考文档:Push API v3 message

c. 富媒体

JPush支持开发者发送图文并茂的通知,从而更好的传达信息,带来更丰富的用户互动。
JPush提供了5种模板,开发者可以通过填充模板的内容,发送landing page、弹窗、信息流形式的富媒体通知。
开发者还可以直接通过URL发送预先编辑好的页面。
富媒体当前支持Android平台,为更好的使用富媒体的功能,建议更新当前SDK版本至v2.1.8及以上。
暂时只能通过极光推送的控制台发送,不支持API形式。
Android 开发者参考文档:Rich Push开发指南

d. 本地通知

本地通知API不依赖于网络,无网条件下依旧可以触发;本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。
本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。
本地通知适用于在特定时间发出的通知,如一些Todo和闹钟类的应用,在每周、每月固定时间提醒用户回到应用查看任务。
Android 开发者参考文档:Android 本地通知
iOS 开发者参考文档:iOS 本地通知

2. 推送目标

通过使用标签,别名,Registration ID 和用户分群,开发者可以向特定的一个或多个用户推送消息。

a. 标签

为安装了应用程序的用户打上标签,其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
举例: game, old_page, women

b. 别名

每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
Android 开发者参考文档:Android 标签和别名
iOS 开发者参考文档:iOS 标签和别名
使用别名和标签推送请参考文档:Push API v3 Audience
c. 用户分群
用户分群的筛选条件有:标签、地理位置、系统版本、注册时间、活跃用户和在线用户。
比如,开发者可以设置这样的用户分群:位于北京、上海、广州和深圳,并且最近7天在线的用户。
开发者可以通过在控制台设置好用户分群之后,在控制台推送时指定该分群的名称或使用API调用该分群的id发送。
用户分群控制台使用指南:用户分群

二. 创建应用

1. 创建应用步骤:

创建应用 :

点击[创建应用]按钮即可;
这里写图片描述

配置应用信息:

Step1: 基本信息:输入应用名称 (必填), 上传一个图标;
配置android平台信息:填写应用包名, JPush 系统会在后台根据你输入的包名生成的推送的 Android 应用 Demo, 该 Demo 包含了该配置的信息;
Step2: 配置iOS平台信息:上传相关环境的推送证书,并填写和证书配套的密码;
Step3: 配置WinPhone平台信息:选择是否开启即可;
这里写图片描述


Step4: 信息配置完成后,查看应用信息如下:
这里写图片描述

三. 应用管理

点击[home]回到首页,可浏览所有应用的信息,点击应用名称或设置可查看应用详情,点击推送可去到发送通知页,编辑并推送通知,点击统计,可查看该应用的所有统计数据;
这里写图片描述
应用详情如下
这里写图片描述
应用设置如下
这里写图片描述

四. 发送通知

路径:选择应用->推送->发送通知
填写推送内容后点击页面最下方的[立即发送]按钮即可;
这里写图片描述
Web界面会弹出对话框, 提示是否发送, 选[发送吧]即可;
这里写图片描述
推送成果后,弹出对话框,点击[去看看]即可查看推送结果;
这里写图片描述

五. JPush Android SDK基本介绍

1. JPush Android

这里写图片描述

开发者集成 JPush Android SDK 到其应用里,JPush Android SDK 创建到 JPush Cloud 的长连接,为 App 提供永远在线的能力。
当开发者想要及时地推送消息到达 App 时,只需要调用 JPush API 推送,或者使用其他方便的智能推送工具,即可轻松与用户交流。
图中红色部分,是 JPush 与 App 开发者的接触点。手机客户端侧,App 需要集成 JPush SDK;服务器端部分,开发者调用 JPush REST API 来进行推送。

2. Android SDK 服务

JPush Android SDK 是作为 Android Service 长期运行在后台的,从而创建并保持长连接,保持永远在线的能力。
多平台支持
JPush Android SDK 除了 jar 包,还有一个 .so 文件。.so 文件的存在 CPU 平台适配的问题。需要支持哪个平台的 CPU,就需要包含这个平台相应的 .so 编译文件。
除支持默认的 ARM CPU 平台之外,JPush SDK 还提供 x86 与 MIPs 平台的 CPU 版本 SDK。请单独到 资源下载 页下载。
电量与流量
JPush Android SDK 由于使用自定义协议,协议体做得极致地小,流量消耗非常地小。
电量方面,JPush Android SDK 经过持续地优化,尽可能减少不必要的代码执行;并且,长期的版本升级迭代,不断地调优,在保证一定的网络连接稳定性的要求小,减少电量消耗。
压缩包说明
供下载的 JPush Android SDK 压缩包,一般包含以下几个部分:
• .jar 文件
• .so 文件
• AndroidManifest.xml 配置示例
其中 .jar, .so 文件有版本号后缀,需要互相匹配。请升级时一定记得检查版本号,并删除旧版本。
AndroidManifest.xml 配置示例可能在版本升级时,会有变更。请留意版本发布说明。

六. Android SDK 集成步奏

1. jpush-android-release-2.x.y.zip 集成压缩包内容

• AndroidManifest_androidstudio_example.xml / AndroidManifest_eclipse_example.xml
o 客户端嵌入SDK参考的配置文件
• libs/jpush-android-2.x.y.jar
o SDK Java 开发包
• libs/(cpu-type)/libjpush2xy.so
o 各种CPU类型的native开发包
• res
o 集成SDK必须添加的资源文件
• example
o 是一个完整的 Android 项目,通过这个演示了 JPush SDK 的基本用法,可以用来做参考。

2. Android SDK 版本

目前SDK只支持Android 2.3或以上版本的手机系统。富媒体信息流功能则需Android3.0或以上版本的系统。

3. jcenter 自动集成步骤

说明 : 使用jcenter自动集成的开发者,不需要在项目中添加jar和so,jcenter会自动完成依赖;在AndroidManifest.xml中不需要添加任何JPush SDK 相关的配置,jcenter会自动导入, 如果手动添加则是以开发者添加的为准覆盖掉默认配置。
• 确认android studio的 Project 根目录的主 gradle 中配置了jcenter支持。(新建project默认配置就支持)

buildscript {
•       repositories {
•           jcenter()
•       }
•       ......
•   }
•   
•   allprojets {
•       repositories {
•           jcenter()
•       }
•   }
•   //在 module 的 gradle 中添加依赖和AndroidManifest的替换变量。
•   android {
•       ......
•       defaultConfig {
•           applicationId "com.xxx.xxx" //JPush上注册的包名.......
•   
•           ndk {
•               //选择要添加的对应cpu类型的.so库。 
•               abiFilters 'armeabi', 'armeabi-v7a', 'armeabi-v8a'// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
•           }
•   
•           manifestPlaceholders = [
•               JPUSH_PKGNAME : applicationId,
•               JPUSH_APPKEY : "你的appkey", //JPush上注册的包名对应的appkey.
•               JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.]
•           ......
•       }
•       ......
•   }
•   
•   dependencis {
•       ......
•   
•       compile 'cn.jiguang:jpush:2.1.8'  // 此处以SDK 2.1.8版本为例
•   
•       ......
•   }

注 : 如果在添加以上 abiFilter 配置之后android Studio出现以下提示:
NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin.
则在 Project 根目录的gradle.properties文件中添加:
android.useDeprecatedNdk=true。

4. 手动集成步骤

• 解压缩 jpush-android-release-2.x.y.zip 集成压缩包。
• 复制 libs/jpush-sdk-2.x.y.jar 到工程 libs/ 目录下。
• 复制 libs/(cpu-type)/libjpush2xy.so 到你的工程中存放对应cpu类型的目录下。
• 复制 res/ 中drawable-hdpi, layout, values文件夹中的资源文件到你的工程中 res/ 对应的目录下。
说明 1:若没有res/drawable-xxxx/jpush_notification_icon这个资源默认使用应用图标作为通知icon,在5.0以上系统将应用图标作为statusbar icon可能显示不正常,用户可定义没有阴影和渐变色的icon替换这个文件,文件名不要变。
说明 2:使用android studio的开发者,如果使用jniLibs文件夹导入so文件,则仅需将所有cpu类型的文件夹拷进去;如果将so文件添加在module的libs文件夹下,注意在module的gradle配置中添加一下配置:

 android {
        ......
        sourceSets {
            main {
                jniLibs.srcDirs = ['libs']
                ......
            }
            ......
        }
        ......
    }

5. 配置 AndroidManifest.xml

根据 SDK 压缩包里的 AndroidManifest.xml 样例文件,来配置应用程序项目的 AndroidManifest.xml 。
主要步骤为:
• 复制备注为 “Required” 的部分
• 将备注为替换包名的部分,替换为当前应用程序的包名
• 将AppKey替换为在Portal上注册该应用的的Key,例如(9fed5bcb7b9b87413678c407)
温馨提示
如果使用android studio, 可在AndroidManifest中引用applicationId的值,在build.gradle配置中 defaultConfig节点下配置,如:

defaultConfig {
      applicationId "cn.jpush.example" // <--您应用的包名
      ……
 }

在AndroidManifest中使用 ${applicationId} 引用gradle中定义的包名
AndroidManifest 示例

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="您应用的包名"
    android:versionCode="216"
    android:versionName="2.1.6"
    >
    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="23" />

        <!-- Required -->
        <permission 
            android:name="您应用的包名.permission.JPUSH_MESSAGE"  
            android:protectionLevel="signature" />

    <!-- Required -->
    <uses-permission android:name="您应用的包名.permission.JPUSH_MESSAGE" />
    <uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!-- Optional. Required for location feature -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_TASKS" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:name="Your Application">

        <!-- Required SDK 核心功能-->
        <!-- option since 2.0.5 可配置PushService,DaemonService,PushReceiver,AlarmReceiver的android:process参数 将JPush相关组件设置为一个独立进程 -->
        <!-- 如:android:process=":remote" -->
        <service
            android:name="cn.jpush.android.service.PushService"
            android:enabled="true"
            android:exported="false" >
            <intent-filter>
                <action android:name="cn.jpush.android.intent.REGISTER" />
                <action android:name="cn.jpush.android.intent.REPORT" />
                <action android:name="cn.jpush.android.intent.PushService" />
                <action android:name="cn.jpush.android.intent.PUSH_TIME" />
            </intent-filter>
        </service>

        <!-- since 1.8.0 option 可选项。用于同一设备中不同应用的JPush服务相互拉起的功能。 -->
        <!-- 若不启用该功能可删除该组件,将不拉起其他应用也不能被其他应用拉起 -->
         <service
             android:name="cn.jpush.android.service.DaemonService"
             android:enabled="true"
             android:exported="true">
             <intent-filter >
                 <action android:name="cn.jpush.android.intent.DaemonService" />
                 <category android:name="您应用的包名"/>
             </intent-filter>
         </service>

        <!-- Required -->
        <receiver
            android:name="cn.jpush.android.service.PushReceiver"
            android:enabled="true" >
          <intent-filter android:priority="1000"> 
                <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED_PROXY" /> 
                <category android:name="您应用的包名"/> 
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.USER_PRESENT" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
            <!-- Optional -->
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
     <!-- Required SDK核心功能-->
        <activity
            android:name="cn.jpush.android.ui.PushActivity"
            android:configChanges="orientation|keyboardHidden"
            android:exported="false" >
            <intent-filter>
                <action android:name="cn.jpush.android.ui.PushActivity" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="您应用的包名" />
            </intent-filter>
        </activity>
        <!-- Required SDK核心功能-->
        <service
            android:name="cn.jpush.android.service.DownloadService"
            android:enabled="true"
            android:exported="false" >
        </service>
        <!-- Required SDK核心功能-->
        <receiver android:name="cn.jpush.android.service.AlarmReceiver" />

        <!-- User defined. 用户自定义的广播接收器-->
         <receiver
             android:name="您自己定义的Receiver"
             android:enabled="true">
             <intent-filter>
                 <!--Required 用户注册SDK的intent-->
                 <action android:name="cn.jpush.android.intent.REGISTRATION" /> 
                 <!--Required 用户接收SDK消息的intent--> 
                 <action android:name="cn.jpush.android.intent.MESSAGE_RECEIVED" /> 
                 <!--Required 用户接收SDK通知栏信息的intent-->
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_RECEIVED" /> 
                 <!--Required 用户打开自定义通知栏的intent-->
                 <action android:name="cn.jpush.android.intent.NOTIFICATION_OPENED" /> 
                 <!--Optional 用户接受Rich Push Javascript 回调函数的intent-->
                 <action android:name="cn.jpush.android.intent.ACTION_RICHPUSH_CALLBACK" /> 
                 <!-- 接收网络变化 连接/断开 since 1.6.3 -->
                 <action android:name="cn.jpush.android.intent.CONNECTION" />
                 <category android:name="您应用的包名" />
             </intent-filter>
         </receiver>

        <!-- Required. For publish channel feature -->
        <!-- JPUSH_CHANNEL 是为了方便开发者统计APK分发渠道。-->
        <!-- 例如: -->
        <!-- 发到 Google Play 的APK可以设置为 google-play; -->
        <!-- 发到其他市场的 APK 可以设置为 xxx-market。 -->
        <!-- 目前这个渠道统计功能的报表还未开放。-->
        <meta-data android:name="JPUSH_CHANNEL" android:value="developer-default"/>
        <!-- Required. AppKey copied from Portal -->
        <meta-data android:name="JPUSH_APPKEY" android:value="Your AppKey"/> 
    </application>
</manifest>

6. 配置和代码说明

必须权限说明
权限 用途
You Package.permission.JPUSH_MESSAGE 官方定义的权限,允许应用接收JPUSH内部代码发送的广播消息。
RECEIVE_USER_PRESENT 允许应用可以接收点亮屏幕或解锁广播。
INTERNET 允许应用可以访问网络。
WAKE_LOCK 允许应用在手机屏幕关闭后后台进程仍然运行
READ_PHONE_STATE 允许应用访问手机状态。
WRITE_EXTERNAL_STORAGE 允许应用写入外部存储。
READ_EXTERNAL_STORAGE 允许应用读取外部存储。
WRITE_SETTINGS 允许应用读写系统设置项。
VIBRATE 允许应用震动。
MOUNT_UNMOUNT_FILESYSTEMS 允许应用挂载/卸载 外部文件系统。
ACCESS_NETWORK_STATE 允许应用获取网络信息状态,如当前的网络连接是否有效。
集成 JPush Android SDK 的混淆
• 请下载4.x及以上版本的proguard.jar, 并替换你Android Sdk “tools\proguard\lib\proguard.jar”
• 请在工程的混淆文件中添加以下配置:
-dontoptimize
•-dontpreverify
•-dontwarn cn.jpush.**
•-keep class cn.jpush.* { ; }
•v2.0.5 ~ v2.1.7 版本有引入 gson 和 protobuf ,增加排除混淆的配置。(2.1.8版本不需配置)
•#==================gson && protobuf==========================
•-dontwarn com.google.**
•-keep class com.google.gson.* {;}
•-keep class com.google.protobuf.* {;}码
JPush SDK 提供的 API 接口,都主要集中在 cn.jpush.android.api.JPushInterface 类里。
基础API
• init 初始化•public static void init(Context context)etDebugMode 设置调•// You can enable debug mode in developing state. You should close debug mode when release.
•public static void setDebugMode(boolean debugEnalbed)计代码
• 参考文档: 统计分析 API
调用示例代码(参考 example 项目)
• init 只需要在应用程序启动时调用一次该 API 即可。
• 以下代码定制一个本应用程序 Application 类。需要在 AndoridManifest.xml 里配置。请参考上面 AndroidManifest.xml 片断,或者 example 项目。

public class ExampleApplication extends Application {@Overridepublic void onCreate() {
•           super.onCreate();
•           JPushInterface.setDebugMode(true);
•           JPushInterface.init(this);
•       }
•   }

测试确认
• 确认所需的权限都已经添加。如果必须的权限未添加,日志会提示错误。
• 确认 AppKey(在Portal上生成的)已经正确的写入 Androidmanifest.xml 。
• 确认在程序启动时候调用了init(context) 接口
• 确认测试手机(或者模拟器)已成功连入网络 + 客户端调用 init 后不久,如果一切正常,应有登录成功的日志信息
• 启动应用程序,在 Portal 上向应用程序发送自定义消息或者通知栏提示。详情请参考管理Portal。
o 在几秒内,客户端应可收到下发的通知或者正定义消息 如果 SDK 工作正常,则日志信息会如下图所示:
这里写图片描述
如图所示,客户端启动分为 4 步:
• 检查 metadata 的 appKey 和 channel ,如果不存在,则启动失败
• 初始化 JPush SDK,检查 JNI 等库文件的有效性,如果库文件无效,则启动失败
• 检查 Androidmanifest.xml,如果有 Required 的权限不存在,则启动失败
• 连接服务器登录,如果存在网络问题,则登陆失败,或者前面三步有问题,不会启动JPush SDK

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值