美文网首页极光征文
极光征文 | 我与极光推送在一起的第二年

极光征文 | 我与极光推送在一起的第二年

作者: 流船 | 来源:发表于2019-01-03 23:09 被阅读127次
    image.png

    背景

    我是在两年前认识极光,没错是通过老师认识的,极光给了我第一个印象"推送",导致现在极光推送四个字已经成了一个领域的代名词。就和提起当当网 第一个印象就是"书城"一样,除了推送做的好以外,极光的IM、统计、短信认证等等我都在用。这篇文章主要分享一下我与极光的故事、并且分享android端集成推送的步骤。

    当时在学校的时候,老师为了培养我们自己在网上查阅资料自学一些三方sdk的使用,例如:地图、统计、推送、等等以后项目会经常用到的一些知识。印象最深的就是"极光推送",因为极光是我接触的第一个三方的平台。参加工作之后推送一直在用极光的服务,比想象中的还易集成、效率高。

    功能说明

    极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。极光推送客户端支持 Android,iOS 两个平台。
    本 Android SDK 方便开发者基于 JPush 来快捷地为 Android App 增加推送功能。

    主要功能

    • 保持与服务器的长连接,以便消息能够即时推送到达客户端
    • 接收通知与自定义消息,并向开发者 App 传递相关信息

    主要特点

    • 客户端维持连接占用资源少、耗电低
    • SDK 丰富的接口,可定制通知栏提示样式
    • 服务器大容量、稳定

    步骤

    第一步:创建应用

    • 首先去官网 极光官网注册账号并且创建应用。
    image.png

    创建完成之后拿到AppKey,没错这个AppKey就是让你创建好的应用,通过一些配置信息和你Studio上的project关联上。我的是: AppKey ee1deb569254b851888ed8fa

    image.png

    之后继续跟进推送设置。点击完成推送设置之后会设置包名


    image.png

    例如:我创建好的项目包名是 如下图: 点击保存之后应用就已经设置好了。接下来进行项目配置。


    image.png

    第二步:项目配置

    1.首先去官网下载好极光的sdk下载页
    2.下载成功后将Jpush-android-3.x.x-release.zip压缩包的内容解压如下图所示目录结构
    3.打开下载好的包。如下图


    我们需要做的就是把目录libs文件夹下的复制到我们的project中,接下来按照文档中的自动集成方式进行操作
    image.png
    • 确认 android studio 的 Project 根目录的主 gradle 中配置了 jcenter 支持。(新建 project 默认配置就支持)
    buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        
    
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
    }
    
    allprojects {
    repositories {
        google()
        jcenter()
    }
    }
    
    • 在 module 的 gradle 中添加依赖和 AndroidManifest 的替换变量。这时候就用到了我们应用上的appkey

        defaultConfig {
        applicationId "com.example.mac.myfirstapp"//JPush 上注册的包名.
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
      
        ndk {
            //选择要添加的对应 cpu 类型的 .so 库。
            abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
            // 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
        }
      
        manifestPlaceholders = [
                JPUSH_PKGNAME : applicationId,
                JPUSH_APPKEY : "ee1deb569254b851888ed8fa", //JPush 上注册的包名对应的 Appkey.
                JPUSH_CHANNEL : "developer-default", //暂时填写默认值即可.
        ]
        }
      
      
      dependencies {
      .....
      implementation 'cn.jiguang.sdk:jpush:3.1.6'  // 此处以JPush 3.1.6 版本为例。
      implementation 'cn.jiguang.sdk:jcore:1.2.5'  // 此处以JCore 1.2.5 版本为例。
      }
      
    • 根据文档上提示: 如果在添加以上 abiFilter 配置之后 android Studio 出现以下提示:
      NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin

      则在 Project 根目录的 gradle.properties 文件中添加:
      android.useDeprecatedNdk=true

    • 到现在项目就已经成功集成极光推送了。我们可以在极光平台上模拟一下推送信息。


      image.png

    进行到这里通知就已经完全可以收到了,但是如果要和后台交互的话,这样是完全不够的,需要我们自定义广播,还需要绑定设备id也就是RegistrationID,而这个id是怎么拿到的呢?文档已经给我们自定义好了Receiver参考:

    public class MyReceiver extends BroadcastReceiver {
    private static final String TAG = "MyReceiver";
     
    private NotificationManager nm;
     
    @Override
    public void onReceive(Context context, Intent intent) {
       String content=intent.getStringExtra("msgContent");
        Bundle bundle=intent.getExtras();
        regId = JPushInterface.getRegistrationID(context);
       // SharedPreferencesUtils.
        Log.e(TAG, "广播的id " + regId);
        SharedPreferencesUtils.saveString(context, "regId", regId);
    
        if (null == nm) {
            nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }
         
        Bundle bundle = intent.getExtras();
        Logger.d(TAG, "onReceive - " + intent.getAction() + ", extras: " + AndroidUtil.printBundle(bundle));
         
        if (JPushInterface.ACTION_REGISTRATION_ID.equals(intent.getAction())) {
            Logger.d(TAG, "JPush 用户注册成功");
             
        } else if (JPushInterface.ACTION_MESSAGE_RECEIVED.equals(intent.getAction())) {
            Logger.d(TAG, "接受到推送下来的自定义消息");
                     
        } else if (JPushInterface.ACTION_NOTIFICATION_RECEIVED.equals(intent.getAction())) {
            Logger.d(TAG, "接受到推送下来的通知");
     
            receivingNotification(context,bundle);
    
        } else if (JPushInterface.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) {
            Logger.d(TAG, "用户点击打开了通知");
        
           openNotification(context,bundle);
    
        } else {
            Logger.d(TAG, "Unhandled intent - " + intent.getAction());
        }
    }
    
    
     private void receivingNotification(Context context, Bundle bundle){
     String title = bundle.getString(JPushInterface.EXTRA_NOTIFICATION_TITLE);
        Logger.d(TAG, " title : " + title);
        String message = bundle.getString(JPushInterface.EXTRA_ALERT);
        Logger.d(TAG, "message : " + message);
        String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
        Logger.d(TAG, "extras : " + extras);
    }
    
    private void openNotification(Context context, Bundle bundle){
        String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);
        String myValue = "";
        try {
            JSONObject extrasJson = new JSONObject(extras);
            myValue = extrasJson.optString("myKey");
        } catch (Exception e) {
            Logger.w(TAG, "Unexpected: extras is not a valid json", e);
            return;
        }
        if (TYPE_THIS.equals(myValue)) {
            Intent mIntent = new Intent(context, ThisActivity.class);
            mIntent.putExtras(bundle);
            mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mIntent);
        } else if (TYPE_ANOTHER.equals(myValue)){
            Intent mIntent = new Intent(context, AnotherActivity.class);
            mIntent.putExtras(bundle);
            mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(mIntent);
        }
    }
    }
    

    完结

    到这里其实已经就算完工了,app端集成起来还是蛮简单的,如果有需要还可以继续完成自定义消息、通知样式、等等。这里也只是简单的介绍一下极光推送的使用步骤,如果开发者有进一步的了解的话还需要多看一下文档,或者移步至极光社区,今天写这个文章一是为了参加活动 二是记录一下脚印。希望一年之后的自己在看到这篇文章的时候能说一句"好菜 真的好菜啊哈哈~~" 进步的标志~ 如果有不足的地方还请更正一下 3q~

    另外祝认真看完这篇文章的人 新年快乐 啊哈哈。

    「本文为极光征文参赛文章」

    相关文章

      网友评论

        本文标题:极光征文 | 我与极光推送在一起的第二年

        本文链接:https://www.haomeiwen.com/subject/asjcrqtx.html