共计 5292 个字符,预计需要花费 14 分钟才能阅读完成。
精准推送是挪动端产品留存阶段的次要经营伎俩,精准推送经常会与用户画像紧密结合,针对用户的爱好、画像,采纳不同策略,但基于用户所属区域推送音讯却很难实现。目前市面上大多数第三方音讯推送服务商,在零碎未深度定制的状况下,通常不反对将推送人群范畴准确到某个商圈或较小的区域,而天文围栏技术能够很好地补救这一点。天文围栏就是用一个虚构的栅栏围出一个虚构天文边界,当手机进入、来到或在这个围起来的特定天文区域内流动时,手机能够主动接管告诉和正告音讯。将天文围栏和音讯推送相结合,即可实现对特定区域人群的精准音讯推送。
举个例子,一款游览出行类 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 最新技术资讯~