Xamarin学习系列之极光消息推送

一般App都会有消息推送的功能,如果是原生安卓或者IOS集成消息推送很容易,各大推送平台都有相关的Sample,但是关于Xamarin.Forms的消息推送集成的资料非常少,下面就说下Xamarin.Forms(Android)怎么集成极光推送

准备工作:

1、了解极光推送原理:https://docs.jiguang.cn/jpush/client/Android/android_sdk/

2、下载极光官方Android SDK :https://docs.jiguang.cn/jpush/resources//

3、注册极光账号,拿到AppKey和Master Secret

4、学习xamarin绑定jar包 :https://developer.xamarin.com/guides/android/advanced_topics/binding-a-java-library/binding-a-jar/

以上是准备工作,熟悉以上的内容之后,我们正式进入极光推送集成

一、把极光官方的jar包转换成Dll

1、建立一个android Bindings Libary项目

2、解压极光官方Android SDK,我下载的版本是3.1.7

3、把jar包和so文件拷入对应文件夹下面,并设置Build Action,jar文件的Build Action设置为EmbeddedJar,so文件的Build Action设置为EmbeddedNativeLibrary,然后编译就OK了,我们可以在\bin\Debug目录看到dll了,可以用反编译工具检查下dll是否有效

二、修改AndroidManifest配置

我的配置并不是和极光官方Android SDK的AndroidManifest配置一样,我参考了网上的别人的代码,配置如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.LayoutDemo">
  <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="27" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <!--JPush Required-->
  <permission  android:name="com.companyname.LayoutDemo.permission.JPUSH_MESSAGE"  android:protectionLevel="signature" />
  <uses-permission android:name="com.companyname.LayoutDemo.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" /> 

  <application android:label="LayoutDemo" android:icon="@drawable/xamarin_logo">
    <!-- since 3.0.9 Required SDK-->
    <provider   android:authorities="com.companyname.LayoutDemo.DataProvider"   android:name="cn.jpush.android.service.DataProvider" android:exported="true"  />
    <!-- Required SDK 核心功能-->
    <!-- 可配置android:process参数将PushService放在其他进程中 -->
    <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="com.companyname.LayoutDemo"/>
      </intent-filter>
    </service>
    <!-- Required SDK核心功能-->
    <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="com.companyname.LayoutDemo"/>
      </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:theme="@android:style/Theme.NoTitleBar"
        android:exported="false" >
      <intent-filter>
        <action android:name="cn.jpush.android.ui.PushActivity" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.companyname.LayoutDemo" />
      </intent-filter>
    </activity>
    <!-- SDK核心功能-->
    <activity
        android:name="cn.jpush.android.ui.PopWinActivity"
        android:configChanges="orientation|keyboardHidden"
        android:exported="false"
        android:theme="@android:style/Theme.NoTitleBar">
      <intent-filter>
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="com.companyname.LayoutDemo" />
      </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" />
    <!-- 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="替换成你的APPKEY"/>
  </application>

</manifest>

把配置中所有com.companyname.LayoutDemo替换成你自己的app包名,然后替换Appkey,就ok了

三、在Android 项目的MainActivity中初始化PushNotification

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            initPushNotification();

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }

        private void initPushNotification()
        {
            IntentFilter filter = new IntentFilter();
            filter.AddAction(JPushInterface.ActionNotificationOpened);
            filter.AddAction(JPushInterface.ActionNotificationReceived);
            filter.AddAction(JPushInterface.ActionMessageReceived);
            filter.AddAction(JPushInterface.ActionRegistrationId);
            filter.AddAction(JPushInterface.ActionConnectionChange);
            NotificationReceiver receiver = new NotificationReceiver();
            RegisterReceiver(receiver, filter);
            JPushInterface.SetDebugMode(true);
            JPushInterface.Init(this.ApplicationContext);
        }

    }

添加NotificationReceiver类,把配置中的IntentFilter放在了代码中,这里和官方sample有点不一样

[BroadcastReceiver]
    [IntentFilter(new string[] { "cn.jpush.android.intent.REGISTRATION" }, Categories = new string[] { "com.companyname.LayoutDemo" })]
    [IntentFilter(new string[] { "cn.jpush.android.intent.MESSAGE_RECEIVED" }, Categories = new string[] { "com.companyname.LayoutDemo" })]
    [IntentFilter(new string[] { "cn.jpush.android.intent.NOTIFICATION_RECEIVED" }, Categories = new string[] { "com.companyname.LayoutDemo" })]
    [IntentFilter(new string[] { "cn.jpush.android.intent.NOTIFICATION_OPENED" }, Categories = new string[] { "com.companyname.LayoutDemo" })]
    [IntentFilter(new string[] { "cn.jpush.android.intent.CONNECTION" }, Categories = new string[] { "com.companyname.LayoutDemo" })]
    class NotificationReceiver : PushReceiver
    {
        public override void OnReceive(Context context, Intent intent)
        {
            base.OnReceive(context, intent);

            //当点击消息时进入,进入对应的页面
            if (intent.Action == JPushInterface.ActionNotificationOpened)
            {
                //When user tap the notification on notification center
                Bundle bundle = intent.Extras;
                string jsonData = bundle.GetString(JPushInterface.ExtraExtra);
            }
            //第一次安装app时进入,会拿到registrationID,保存registrationID,当用户登录之后把用户id和registrationID关联,方便之后一对一发送消息
            if (intent.Action == JPushInterface.ActionRegistrationId)
            {
                //Only call when first launch, get the registrationID
                string regID = JPushInterface.GetRegistrationID(context);
            }
            //当接收到信息时进入,弹出消息框
            if (JPushInterface.ActionMessageReceived.Equals(intent.Action))
            {

            }

 //当接收到信息时进入,弹出消息框
            if (JPushInterface.ActionNotificationReceived.Equals(intent.Action))
           {   

            }
            if (JPushInterface.ActionNotificationReceived.Equals(intent.Action))
            { 

            }
        }

    }

四、在极光推送网站注册,并测试发送

注意应用包名必须和配置文件保持一致,极光推送根据应用包名和AppKey进行识别,这两个参数必须正确。

如果是真机测试,必须开启软件的通知权限。

参考文章:

https://www.jianshu.com/p/5abe3924acab

https://github.com/JimmyPun610/XamarinAndroidJiGuangPushNotification

原文地址:https://www.cnblogs.com/fengchao1000/p/10084406.html

时间: 12-07

Xamarin学习系列之极光消息推送的相关文章

atitit.极光消息推送服务器端开发实现推送&#160;&#160;jpush&#160;v3.&#160;总结o7p

atitit.极光消息推送服务器端开发实现推送  jpush v3. 总结o7p 1. 推送所设计到底功能1 1.1. 内容压缩1 1.2. 多引擎1 2. reg  ,设置appkey and pwdkey1 3. 下载server  sdk   v31 4. push推送样例1 5. Code3 1. 推送所设计到底功能 1.1. 内容压缩 1.2. 多引擎 2. reg  ,设置appkey and pwdkey 3. 下载server  sdk   v3 https://github.c

thinkphp整合系列之友盟消息推送

上篇文章 thinkphp集成系列之phpmailer批量发送邮件讲过的: 邮件有着零成本.内容丰富的优点: 但是一个非常硬的硬伤:这家伙的及时性太差了: 尤其是随着90.00后的崛起:从上网开始体验的就是QQ.微信的即时通讯: 唯一有的邮箱也还是自动开通的QQ邮箱:然而还是一连串的未读: 那么有木有一种零成本.但是及时性比较好的方案呢? 有的:那就是消息推送:当然:前提是用户已经安装了app: 今个先就友盟的推送来讲解下:http://push.umeng.com/ 依然是以开源项目示例:ht

redis 学习 五 消息推送

<?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publish.php */ //发布 $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('msg', '来自msg频道的推送'); echo "msg频道消息推送成功- \n"; $re

使用swoole进行消息推送通知,配合vb.net进行客户端开发一样爽

在以前的项目中,就曾听说过swoole的大名,想用来进行消息推送,但是当时只是有了初步的了解,并不敢大胆的运用到线上产品.所谓 识不足则多虑,威不足则多怒.所以就是怕,只能跟领导说了运用极光的推送功能,而且还说出了一定的理由,领导自然也只有相信了,那就用极光推送吧! 最近闲来无事,又重新温习了一下swoole的消息通知功能,虽然在项目开发当时,也曾实现过简单的操作的,但是这次温习更加深了学习,配合vb.net进行开发,感觉还是棒棒哒,下面是一套实现过程,如有需要参考,请拿去,不谢! 首先,我的开

Android消息推送

1.推送方式基础知识:  在移动互联网时代以前的手机,如果有事情发生需要通知用户,则会有一个窗口弹出,将告诉用户正在发生什么事情.可能是未接电话的提示,日历的提醒,或是一封新的彩信.推送功能最早是被用于Email中,用来提示我们新的信息.由于时代的发展和移动互联网的热潮,推送功能更加地普及,已经不再仅仅用在推送邮件了,更多地用在我们的APP中了. 当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震应急通>就需要及时获取服务器上最新的地震信息.要获取服务器上不定时

Android消息推送:手把手教你集成小米推送

前言 在Android开发中,消息推送功能的使用非常常见. 为了降低开发成本,使用第三方推送是现今较为流行的解决方案. 今天,我将手把手教大家如何在你的应用里集成小米推送 该文档基于小米推送官方Demo,并给出简易推送Demo 看该文档前,请先阅读我写的另外两篇文章: 史上最全解析Android消息推送解决方案 Android推送:第三方消息推送平台详细解析 目录 1. 官方Demo解析 首先,我们先对小米官方的推送Demo进行解析. 请先到官网下载官方Demo和SDK说明文档 1.1 Demo

Android消息推送机制

1.推送方式基础知识: 当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震应急通>就需要及时获取服务器上最新的地震信息.要获取服务器 上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现.第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上.? 虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is

iOS8之后对定位和消息推送API的修改

1.定位 定位是定位,地图是地图,在iOS中 CLLocation是专门负责定位或者获取位置信息的;而MAPkit是专门负责地图显示的 位置管理器(CLLocationManager) :负责获取,同时负责监控用户位置发生变化        //[注意] 位置管理器一定要写成属性,不是属性出栈就没有了    _manager = [[CLLocationManager alloc] init];        //设置位置管理器代理   <CLLocationManagerDelegate> 

消息推送

http://blog.csdn.net/axi295309066/article/details/53180628 消息推送 标签: 消息推送push极光推送小米推送即时通信 2016-11-16 00:16 70人阅读 评论(0) 收藏 举报 分类: Android基础(79) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 消息推送,即时通信,目的:想办法让服务器能够及时的通知客户端 消息推送最简单的方法就是使用第三方的,比如现在使用比较多的是小米推送.极光推送,消

浅谈APP消息推送

作为移动端APP产品运营最重要的运营手段,消息推送(push)被越来越多的APP厂商所重视,在信息泛滥的移动互联网时代,手机APP应用安装得越来越多,小小的手机屏幕每天收到的消息推送也越来越多,站在用户的角度去想,你会看每一条推送的内容吗? 消息推送(push)是App运营最优质的渠道,运用得当可以帮助产品运营人员更高效地实现运营目标,相反盲目得push也将带来反作用. APP消息推送具有以下几个特点: ①量大,用户数即是可push覆盖的数量.假如一个APP有5000万的活跃用户,且都取得了用户