即时推送--个推的集成过程整理

来源:互联网 发布:小强软件测试 编辑:程序博客网 时间:2024/04/24 16:55


关于第三方即使推送现在有个推,极光, 友盟等, 百度推送,信鸽,阿里云这些就不说了  之前用过极光还行  ,现在把个推的官方文档集成一下,官方的说明不是太好,过程中出了许多小问题也一并记录在内,希望有用到的可以有所帮助



集成过程
第一步:添加Maven库地址 在最外gradle引入maven
allprojects {
repositories {
jcenter()
maven {
url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}
}
}

第二步:配置依赖

在app/build.gradle文件中配置依赖库,如下所示:

//相关配置
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.getui:sdk:+'
compile 'com.android.support:support-v4:+'
}

第三步:配置 so 库

在gradle.properties文件中配置useDeprecatedNdk,如下所示:

android.useDeprecatedNdk=true
在app/build.gradle文件中android/defaultConfig下指定需要 cup 架构的 so 库,如下图所示:
android { ... defaultConfig { ... ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64" } }}
注:如果 project 中包含其他 so 库且只支持某几种 cpu 架构,那么应该根据其他 so 库支持的 cpu 架构来配置
xmlns:tools="http://schemas.android.com/tools"   meta-data标签内加入 : tools:replace="value"
Application标签内加入如下服务声明:
 
<!-- 个推SDK配置开始 -->
<!-- 配置的第三方参数属性 -->
<meta-data
android:name="PUSH_APPID"
android:value="你的APPID" /> <!-- 替换为第三方应用的APPID -->
<meta-data
android:name="PUSH_APPKEY"
android:value="你的APPKEY" /> <!-- 替换为第三方应用的APPKEY -->
<meta-data
android:name="PUSH_APPSECRET"
android:value="你的APPSECRET" /> <!-- 替换为第三方应用的APPSECRET -->
<!-- 配置SDK核心服务 -->
<service
android:name="com.igexin.sdk.PushService"
android:exported="true"
android:label="NotificationCenter"
android:process=":pushservice" >
<intent-filter>
<action android:name="com.igexin.sdk.action.service.message"/>
</intent-filter>
</service>
 
<service
android:name="com.igexin.sdk.PushServiceUser"
android:exported="true"
android:label="NotificationCenterUser">
<intent-filter>
<action android:name="com.igexin.sdk.action.user.message"/>
</intent-filter>
</service>
 
<receiver android:name="com.igexin.sdk.PushReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="com.igexin.sdk.action.refreshls" />
<!-- 以下三项为可选的action声明,可大大提高service存活率和消息到达速度 -->
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver
android:name="com.igexin.sdk.PushManagerReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.igexin.sdk.action.pushmanager" />
</intent-filter>
</receiver>
<activity
android:name="com.igexin.sdk.PushActivity"
android:excludeFromRecents="true"
android:exported="false"
android:process=":pushservice"
android:taskAffinity="com.igexin.sdk.PushActivityTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.igexin.sdk.GActivity"
android:excludeFromRecents="true"
android:exported="true"
android:process=":pushservice"
android:taskAffinity="com.igexin.sdk.PushActivityTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<service
android:name="com.igexin.download.DownloadService"
android:process=":pushservice" />
<receiver android:name="com.igexin.download.DownloadReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<provider
android:name="com.igexin.download.DownloadProvider"
<!-- "你的包名"替换为第三方应用的包名 -->
android:authorities="downloads.你的包名"
android:exported="true"
android:process=":pushservice" />
<!-- 个推SDK配置结束 -->
Application标签外加入个推SDK运行时需要的权限:
 
<!-- 解决Android L上通知显示异常问题,targetSdkVersion需要设置成22 -->
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="22" />
<!-- 个推SDK权限配置开始 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
 
<!-- iBeancon功能与个推3.0电子围栏功能所需要的权限为非必需的可选择权限,可以选择性配置,以便使用个推3.0电子围栏功能 -->;
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 个推3.0电子围栏功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 浮动通知权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 自定义权限 -->
<uses-permission android:name="getui.permission.GetuiService.你的包名" />
<!--替换为第三方应用的包名-->
<permission
android:name="getui.permission.GetuiService.你的包名"
android:protectionLevel="normal" >
</permission><!--替换为第三方应用的包名-->
<!-- 个推SDK权限配置结束 -->



第四步:配置个推应用参数
/参数说明
manifestPlaceholders = [
GETUI_APP_ID : "APP_ID",
GETUI_APP_KEY : "APP_KEY",
GETUI_APP_SECRET : "APPSECRET",
PACKAGE_NAME : applicationId
]
//APP_ID、APP_KEY、APP_SECRET请根据个推开发者后台申请到的应用参数进行相应替换

第五步:配置透传

根据业务需要,在AndroidManifest.xml添加用于接收透传消息的BroadcastReceiver,第三方开发者需要自行实现该BroadcastReceiver,以便接收CID信息和服务端推送的透传消息。
 
<!-- 配置第三方Receiver -->
<!-- 此处com.getui.demo.PushDemoReceiver,需要替换成开发者自己的BroadcastReceiver文件全名-->
<receiver
android:name="com.getui.demo.PushDemoReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.igexin.sdk.action.${GETUI_APP_ID}" />//此处替换为为申请的appid才可以有透传功能并且获取到 clientid
</intent-filter>
</receiver>

在混淆文件中加入如下配置即可:

-dontwarn com.igexin.**-keep class com.igexin.**{*;}
遇到NDK与gradle的报错,将其换位gradle2.10  然后在gradle.properties加上android.useDeprecatedNdk=true




配置可选权限

该接入方式已包含个推服务所需必备权限,在此之外,您也可以在自己的AndroidManifest.xml中配置以下可选权限,以便使用个推3.0电子围栏功能。
 
<!-- iBeancon功能所需权限 -->;
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 个推3.0电子围栏功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

导入通知栏图标

为了修改通知栏提示图标,请在res/drawable-hdpi/、res/drawable-mdpi/、res/drawable-ldpi/等各分辨率资源目录下,放置相应尺寸的push.png图片。
将 “GETUI_ANDROID_SDK\资源文件\layout”下的xml布局文件复制到app模块的layout文件夹中:
初始化:  PushManager.getInstance().initialize(this.getApplicationContext());
注:该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,所以不建议在Application继承类中调用个推SDK初始化接口。

资源精简配置

如果您的工程启用了资源精简,即在build.gradle中指定如下参数:

buildTypes {    release {       minifyEnabled true       shrinkResources true       proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'    }}需要在res/raw中添加keep.xml,明确指定个推SDK所需的layout资源文件不能被精简,keep.xml文件:

 keep.xml文件内容如下:如此可以完成layout资源保护工作。

<?xml version="1.0" encoding="utf-8"?><resourcesxmlns:tools="http://schemas.android.com/tools"tools:keep="@layout/getui_notification"/>
Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:53:9-55:53 to override.

1.在Manifest标签下添加 tag:xmlns:tools="http://schemas.android.com/tools"

2.在Application标签下添加tag: 
tools:replace="android:value"

<applicationtools:replace="icon, label" ../>


查看Android Monitor信息,如图所示。在搜索框中输入“clientid”可以看到“clientid is xxx”,则意味则初始化SDK成功,并获取到相应的cid信息,恭喜你:-D,可以开始进行推送测试了。


集成过程
第一步:添加Maven库地址 在最外gradle引入maven
allprojects {
repositories {
jcenter()
maven {
url "http://mvn.gt.igexin.com/nexus/content/repositories/releases/"
}
}
}

第二步:配置依赖

在app/build.gradle文件中配置依赖库,如下所示:

//相关配置
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.getui:sdk:+'
compile 'com.android.support:support-v4:+'
}

第三步:配置 so 库

在gradle.properties文件中配置useDeprecatedNdk,如下所示:

android.useDeprecatedNdk=true
在app/build.gradle文件中android/defaultConfig下指定需要 cup 架构的 so 库,如下图所示:
android { ... defaultConfig { ... ndk { abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64" } }}
注:如果 project 中包含其他 so 库且只支持某几种 cpu 架构,那么应该根据其他 so 库支持的 cpu 架构来配置
xmlns:tools="http://schemas.android.com/tools"   meta-data标签内加入 : tools:replace="value"
Application标签内加入如下服务声明:
 
<!-- 个推SDK配置开始 -->
<!-- 配置的第三方参数属性 -->
<meta-data
android:name="PUSH_APPID"
android:value="你的APPID" /> <!-- 替换为第三方应用的APPID -->
<meta-data
android:name="PUSH_APPKEY"
android:value="你的APPKEY" /> <!-- 替换为第三方应用的APPKEY -->
<meta-data
android:name="PUSH_APPSECRET"
android:value="你的APPSECRET" /> <!-- 替换为第三方应用的APPSECRET -->
<!-- 配置SDK核心服务 -->
<service
android:name="com.igexin.sdk.PushService"
android:exported="true"
android:label="NotificationCenter"
android:process=":pushservice" >
<intent-filter>
<action android:name="com.igexin.sdk.action.service.message"/>
</intent-filter>
</service>
 
<service
android:name="com.igexin.sdk.PushServiceUser"
android:exported="true"
android:label="NotificationCenterUser">
<intent-filter>
<action android:name="com.igexin.sdk.action.user.message"/>
</intent-filter>
</service>
 
<receiver android:name="com.igexin.sdk.PushReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.intent.action.USER_PRESENT" />
<action android:name="com.igexin.sdk.action.refreshls" />
<!-- 以下三项为可选的action声明,可大大提高service存活率和消息到达速度 -->
<action android:name="android.intent.action.MEDIA_MOUNTED" />
<action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>
<receiver
android:name="com.igexin.sdk.PushManagerReceiver"
android:exported="false" >
<intent-filter>
<action android:name="com.igexin.sdk.action.pushmanager" />
</intent-filter>
</receiver>
<activity
android:name="com.igexin.sdk.PushActivity"
android:excludeFromRecents="true"
android:exported="false"
android:process=":pushservice"
android:taskAffinity="com.igexin.sdk.PushActivityTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity
android:name="com.igexin.sdk.GActivity"
android:excludeFromRecents="true"
android:exported="true"
android:process=":pushservice"
android:taskAffinity="com.igexin.sdk.PushActivityTask"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<service
android:name="com.igexin.download.DownloadService"
android:process=":pushservice" />
<receiver android:name="com.igexin.download.DownloadReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<provider
android:name="com.igexin.download.DownloadProvider"
<!-- "你的包名"替换为第三方应用的包名 -->
android:authorities="downloads.你的包名"
android:exported="true"
android:process=":pushservice" />
<!-- 个推SDK配置结束 -->
Application标签外加入个推SDK运行时需要的权限:
 
<!-- 解决Android L上通知显示异常问题,targetSdkVersion需要设置成22 -->
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="22" />
<!-- 个推SDK权限配置开始 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
 
<!-- iBeancon功能与个推3.0电子围栏功能所需要的权限为非必需的可选择权限,可以选择性配置,以便使用个推3.0电子围栏功能 -->;
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 个推3.0电子围栏功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 浮动通知权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<!-- 自定义权限 -->
<uses-permission android:name="getui.permission.GetuiService.你的包名" />
<!--替换为第三方应用的包名-->
<permission
android:name="getui.permission.GetuiService.你的包名"
android:protectionLevel="normal" >
</permission><!--替换为第三方应用的包名-->
<!-- 个推SDK权限配置结束 -->



第四步:配置个推应用参数
/参数说明
manifestPlaceholders = [
GETUI_APP_ID : "APP_ID",
GETUI_APP_KEY : "APP_KEY",
GETUI_APP_SECRET : "APPSECRET",
PACKAGE_NAME : applicationId
]
//APP_ID、APP_KEY、APP_SECRET请根据个推开发者后台申请到的应用参数进行相应替换

第五步:配置透传

根据业务需要,在AndroidManifest.xml添加用于接收透传消息的BroadcastReceiver,第三方开发者需要自行实现该BroadcastReceiver,以便接收CID信息和服务端推送的透传消息。
 
<!-- 配置第三方Receiver -->
<!-- 此处com.getui.demo.PushDemoReceiver,需要替换成开发者自己的BroadcastReceiver文件全名-->
<receiver
android:name="com.getui.demo.PushDemoReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.igexin.sdk.action.${GETUI_APP_ID}" />//此处替换为为申请的appid才可以有透传功能并且获取到 clientid
</intent-filter>
</receiver>

在混淆文件中加入如下配置即可:

-dontwarn com.igexin.**-keep class com.igexin.**{*;}
遇到NDK与gradle的报错,将其换位gradle2.10  然后在gradle.properties加上android.useDeprecatedNdk=true




配置可选权限

该接入方式已包含个推服务所需必备权限,在此之外,您也可以在自己的AndroidManifest.xml中配置以下可选权限,以便使用个推3.0电子围栏功能。
 
<!-- iBeancon功能所需权限 -->;
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- 个推3.0电子围栏功能所需权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

导入通知栏图标

为了修改通知栏提示图标,请在res/drawable-hdpi/、res/drawable-mdpi/、res/drawable-ldpi/等各分辨率资源目录下,放置相应尺寸的push.png图片。
将 “GETUI_ANDROID_SDK\资源文件\layout”下的xml布局文件复制到app模块的layout文件夹中:
初始化:  PushManager.getInstance().initialize(this.getApplicationContext());
注:该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,所以不建议在Application继承类中调用个推SDK初始化接口。

资源精简配置

如果您的工程启用了资源精简,即在build.gradle中指定如下参数:

buildTypes {    release {       minifyEnabled true       shrinkResources true       proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'    }}需要在res/raw中添加keep.xml,明确指定个推SDK所需的layout资源文件不能被精简,keep.xml文件:

 keep.xml文件内容如下:如此可以完成layout资源保护工作。

<?xml version="1.0" encoding="utf-8"?><resourcesxmlns:tools="http://schemas.android.com/tools"tools:keep="@layout/getui_notification"/>
Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:53:9-55:53 to override.

1.在Manifest标签下添加 tag:xmlns:tools="http://schemas.android.com/tools"

2.在Application标签下添加tag: 
tools:replace="android:value"

<applicationtools:replace="icon, label" ../>


查看Android Monitor信息,如图所示。在搜索框中输入“clientid”可以看到“clientid is xxx”,则意味则初始化SDK成功,并获取到相应的cid信息,恭喜你:-D,可以开始进行推送测试了。

0 0
原创粉丝点击