HMS Core地理围栏能力助你实现指定范围人群的精准消息推送
精准推送是移动端产品留存阶段的主要运营手段,精准推送常常会与用户画像紧密结合,针对用户的喜好、画像,采用不同策略,但基于用户所属区域推送消息却很难实现。目前市面上大多数第三方消息推送服务商,在系统未深度定制的情况下,通常不支持将推送人群范围精确到某个商圈或较小的区域,而地理围栏技术可以很好地弥补这一点。地理围栏就是用一个虚拟的栅栏围出一个虚拟地理边界,当手机进入、离开或在这个围起来的特定地理区域内活动时,手机可以自动接收通知和警告消息。将地理围栏和消息推送相结合,即可实现对特定区域人群的精准消息推送。
举个例子,一款旅游出行类App想在江苏推广其门票业务,他可以针对南京、苏州等城市的热门旅游景点划定地理围栏,当目标受众在特定时间段到达某个旅游景点附近时,将会收到一条特定消息推送“XX景点门票优惠券已放入账户中,立即领取>>”在用户有购买XX景点门票需求时应景推送优惠信息,让用户无法拒绝。
实现方法
用华为定位服务地理围栏能力结合推送服务消息推送能力,就可实现对指定范围人群的精准消息推送。通过设置特定的区域,可以检测用户的事件状态,例如他们何时进入、离开或停留在该区域,一旦满足触发条件,用户设备将实时收到消息推送。即使应用不在后台运行,也可以在用户设备上传递和显示消息,消息传递率可达99%。
效果展示:
- 在测试设备上安装演示应用。 
- 启动演示应用程序,点击地理围栏屏幕上的添加地理围栏,然后设置相关参数以创建地理围栏。 
- 等待地理围栏被触发。 
- 在触发地理围栏时检查收到的消息。 

开发步骤
- 配置SDK的Maven仓地址。
(Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请根据您当前的Gradle插件版本,选择对应的配置过程。这里以7.1版本为例)
a) 在“buildscript > dependencies”中增加agcp插件配置。
buildscript {
i.	    dependencies {
ii.	        ...
iii.	        // 增加agcp插件配置,推荐您使用最新版本的agcp插件。
iv.	        classpath 'com.huawei.agconnect:agcp:1.6.0.300'
    }
v.	}
b) 项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址。
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
        // 配置HMS Core SDK的Maven仓地址。
        maven { url 'https://developer.huawei.com/repo/' }
    }
}
dependencyResolutionManagement {
    ...
    repositories {
        google()
        mavenCentral()
        // 配置HMS Core SDK的Maven仓地址。
        maven { url 'https://developer.huawei.com/repo/' }
    }
}
2.在“dependencies ”中添加如下编译依赖。
//应用级的“build.gradle”文件
dependencies {
    implementation 'com.huawei.hms:location: 6.4.0.300'
    implementation 'com.huawei.hms:push: 6.3.0.304'
}
- 在 AndroidManifest.xml 文件中声明系统权限。
因华为定位服务采用GNSS、Wi-Fi、基站等多种混合定位模式进行定位,赋予您的应用程序快速、精准地获取用户位置信息的能力,需要用到网络,精确的位置权限,粗略的位置权限如果您需要应用程序在后台执行时也具备持续定位能力,需要在Manifest文件中申请ACCESS_BACKGROUND_LOCATION权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARES_LOCATION" />
注:由于ACCESS_FINE_LOCATION,WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE是危险的系统权限,因此,您需要动态的申请这些权限。如果权限不足,Location Service将会拒绝为您的应用开启定位。
关键代码说明
代码文件路径: com.huawei.hmssample2.geofence\GeoFenceActivity.java
如果您的应用需要集成围栏Service实现服务推送,仅仅需要参考将GeoFenceActivity集成到您的应用中在接收围栏回调的同时发出推送的广播,即可实现。
- 触发地理围栏。
a) 根据需要创建地理围栏和地理围栏组,并设置相应的参数,比如围栏半径,触发时间等。
if (checkStyle(geofences, data.uniqueId) == false) {
    LocationLog.d("GeoFenceActivity", "not unique ID!");
    LocationLog.i("GeoFenceActivity", "addGeofence failed!");
    return;
}
geoBuild.setRoundArea(data.latitude, data.longitude, data.radius);
geoBuild.setUniqueId(data.uniqueId);
geoBuild.setConversions(data.conversions);
geoBuild.setValidContinueTime(data.validContinueTime);
geoBuild.setDwellDelayTime(data.dwellDelayTime);
geoBuild.setNotificationInterval(data.notificationInterval);
geofences.add(geoBuild.build());
LocationLog.i("GeoFenceActivity", "addGeofence success!");
b) 设置好相关参数之后通过intent注册广播
GeofenceRequest.Builder geofenceRequest = new GeofenceRequest.Builder();
geofenceRequest.createGeofenceList(GeoFenceData.returnList());
if (trigger.getText() != null) {
    int trigGer = Integer.parseInt(trigger.getText().toString());
    geofenceRequest.setInitConversions(trigGer);
    LocationLog.d(TAG, "trigger is " + trigGer);
} else {
    geofenceRequest.setInitConversions(5);
    LocationLog.d(TAG, "default trigger is 5");
}
final PendingIntent pendingIntent = getPendingIntent();
try {
    geofenceService.createGeofenceList(geofenceRequest.build(), pendingIntent)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(Task<Void> task) {
                if (task.isSuccessful()) {
                    LocationLog.i(TAG, "add geofence success!");
                    setList(pendingIntent, GeoFenceData.getRequestCode(), GeoFenceData.returnList());
                    GeoFenceData.createNewList();
                } else {
                    // Get the status code for the error and log it using a user-friendly message.
                    LocationLog.w(TAG, "add geofence failed : " + task.getException().getMessage());
                }
            }
        });
} catch (Exception e) {
    LocationLog.i(TAG, "add geofence error:" + e.getMessage());
}
private PendingIntent getPendingIntent() {
    Intent intent = new Intent(this, GeoFenceBroadcastReceiver.class);
    intent.setAction(GeoFenceBroadcastReceiver.ACTION_PROCESS_LOCATION);
    Log.d(TAG, "new request");
    GeoFenceData.newRequest();
    return PendingIntent.getBroadcast(this, GeoFenceData.getRequestCode(), intent,
        PendingIntent.FLAG_UPDATE_CURRENT);
}
- 触发消息推送。
在GeoFenceBroadcastReceiver的onReceive接收到围栏触发成功提示后发送推送通知,在通知栏接收通知并展示。
GeofenceData geofenceData = GeofenceData.getDataFromIntent(intent);
if (geofenceData != null) {
    int errorCode = geofenceData.getErrorCode();
    int conversion = geofenceData.getConversion();
    ArrayList<Geofence> list = (ArrayList<Geofence>) geofenceData.getConvertingGeofenceList();
    Location myLocation = geofenceData.getConvertingLocation();
    boolean status = geofenceData.isSuccess();
    sb.append("errorcode: " + errorCode + next);
    sb.append("conversion: " + conversion + next);
    if (list != null) {
        for (int i = 0; i < list.size(); i++) {
            sb.append("geoFence id :" + list.get(i).getUniqueId() + next);
        }
    }
    if (myLocation != null) {
        sb.append("location is :" + myLocation.getLongitude() + " " + myLocation.getLatitude() + next);
    }
    sb.append("is successful :" + status);
    LocationLog.i(TAG, sb.toString());
    Toast.makeText(context, "" + sb.toString(), Toast.LENGTH_LONG).show();
    //
    new PushSendUtils().netSendMsg(sb.toString());
}
注意:使用示例代码创建的地理围栏将触发转化类型 1 和 4 的两个回调。一个在用户进入地理围栏时触发,另一个在用户停留在地理围栏内时触发。如果在代码中将 Trigger 设置为 7,则会配置所有方案(包括进入、停留和离开地理围栏)的回调。
完成以上开发步骤就可以完成地理围栏推送功能,实现在指定区域内推送消息通知实现精准营销。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~
HMS Core地理围栏能力助你实现指定范围人群的精准消息推送的更多相关文章
- dotnet core使用IO合并技巧轻松实现千万级消息推送
		之前讲述过多路复用实现单服百万级别RPS吞吐,但在文中有一点是没有说的就是消息IO合并,如果缺少了消息IO合并即使怎样多路复用也很难达到百万级别的请求响毕竟所有应用层面的网络IO读写都是非常损耗性能的 ... 
- RabbitMQ消息队列(七)-通过fanout模式将消息推送到多个Queue中(.Net Core版)
		前面第六章我们使用的是direct直连模式来进行消息投递和分发.本章将介绍如何使用fanout模式将消息推送到多个队列. 有时我们会遇到这样的情况,多个功能模块都希望得到完整的消息数据.例如一个log ... 
- DingTalk钉钉消息推送(.net core 3  WebApi尝鲜记)
		我发了个朋友圈,Swagger真他妈的牛B,解放了开发API的码农,麻麻再也不用担心我们写API文档耽误回家吃饭了. /// <summary> /// 发送钉钉消息 /// </s ... 
- .NET Core 企业微信消息推送
		接口定义 应用支持推送文本.图片.视频.文件.图文等类型.请求方式:POST(HTTPS)请求地址: https://qyapi.weixin.qq.com/cgi-bin/message/send? ... 
- HMS Core在MWC2022展示最新开放能力,助力开发者构建精品应用
		[2022年2月28日,巴塞罗那]世界移动通信大会MWC2022在巴塞罗那开幕.HMS Core设立了3个展台(Fira Gran Via,Hall 1),向全球开发者展示HMS Core 6的全新开 ... 
- 【FAQ】接入HMS Core推送服务过程中一些常见问题总结
		HMS Core 推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道.开发者通过集成推送服务,可以向客户端应用实时推送消息,构筑良好的用户关系,提升用户的感知度和活 ... 
- HMS Core基于地理位置请求广告,流量变现快人一步
		对于想买车的用户来说,如果走在路上刷社交软件时突然在App里收到一条广告:"前方500米商圈里的某品牌汽车正在做优惠,力度大福利多."不管买不买,八成都会去看看,原因有三:距离近. ... 
- 如何使用Postman调试HMS Core推送接口?
		HMS Core推送服务支持开发者使用HTTPS协议接入Push服务端.Postman是一款接口测试工具,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果.Postma ... 
- 解决.NET Core中MailKit无法使用阿里云邮件推送服务的问题
		在博问中(.net core怎么实现邮件发送)知道了MailKit无法使用阿里云邮件推送服务发送邮件的问题,自已实测也遇到同样的问题,而用自己搭建的邮件服务器没这个问题. 于是,向阿里云提交了工单.. ... 
随机推荐
- 解释 Spring 框架中 bean 的生命周期?
			Spring 容器 从 XML 文件中读取 bean 的定义,并实例化 bean. Spring 根据 bean 的定义填充所有的属性. 如果 bean 实现了 BeanNameAware 接口,Sp ... 
- Java 中能创建 volatile 数组吗?
			能,Java 中可以创建 volatile 类型数组,不过只是一个指向数组的引用,而不 是整个数组.我的意思是,如果改变引用指向的数组,将会受到 volatile 的保护, 但是如果多个线程同时改变数 ... 
- JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jsta
			JVM监控工具介绍 jstack - 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程 ... 
- Kali Linux 下安装配置MongoDB数据库    ubuntu  下安装配置MongoDB源码安装数据库
			Kali Linux 下安装配置MongoDB数据库 1.下载mongodb.tgz 压缩包: 2.解压到:tar -zxvf mongodb.tgz /usr/local/mongodb 3.创 ... 
- 什么是Viewport Meta(width详解)及在手机上的应用
			viewport是专为手机浏览器设计的一个meta标签: 有些屏幕很小有智能手机,但分辩率却可以做得很大,比如小米4的默认分辨率为:1920*1080,比许多电脑桌面的都还大,传统桌面网站直接放到手机 ... 
- Mybatis + js 实现下拉列表二级联动
			Mybatis + js 实现下拉列表二级联动 学习内容: 一.业务需求 二.实现效果 三.代码实现 1. province_city.jsp 2. TwoController 2. Province ... 
- Exchange日志清理
			1.清理日志--完整备份 Exchange Server 2013被部署在Windows Server 2012 及以上版本的操作系统中,使用操作系统内的"Windows Server Ba ... 
- Exchange批量删除邮件
			在实际工作中经常遇到以下问题:邮件发送给错误的收件人,简而言之就是邮件发错了,如果遇到群发更麻烦.Exchange中提供了批量删除邮件功能,当用户发现发送错误后,管理员可以检索并删除指定的邮件. 案例 ... 
- TINY语言采用递归下降分析法编写语法分析程序
			目录 自顶向下分析方法 TINY文法 消左提左.构造first follow 基本思想 python构造源码 运行结果 参考来源:聊聊编译原理(二) - 语法分析 自顶向下分析方法 自顶向下分析方法: ... 
- Vulnhub 之 Earth
			靶机地址:https://www.vulnhub.com/entry/the-planets-earth,755/ Kali IP:192.168.56.104 下载OVA文件后,直接通过Virtua ... 
