情景感知,让“买买买”有了新的打开方式
场景
情景感知服务能带来什么
作为线下购物和消费类App,如何引流,促进用户消费,是痛点之一。即使商家准备了大量的优惠券,用户依然需要进入App内才能看到。
HMS情景感知服务(Awareness Kit),能提供一套完善的智能推送解决方案,根据多种感知状态的组合,精准判断用户意图,帮助商圈或店铺类的App,在每个潜在消费者用户拿起手机时,就能第一时间接收到各种优惠信息,从而促进销售。对于不适合的时间和场景,情景感知服务也能精准判断,避免对用户频繁打扰的通知。
什么是情景感知服务?
情景感知服务(Awareness Kit)能感知用户当前的时间、地理位置、活动状态、耳机状态、天气状况、环境光、车载连接状态、信标连接状态等情景,并通过能常驻后台运行的围栏能力向APP进行提醒,使APP能第一时间给用户提供精准和贴心的服务。上述情景感知能力还在不断扩充中,而且您可以自由组合这些感知能力,构建组合围栏,从而让APP的服务能力更加智能,更加精准。
在情景感知服务的支持下,App能给用户带来如下体验:
–闲暇时光,当你不经意的走到商场附近,或者在某个店铺门口驻留了数分钟,此时手机通知栏消息提醒你,今天商场有特别的优惠哟,要不要去消费一把?
–不用打开App,直接点通知,各类优惠券顺利到手,省去我左挑右选的时间。
–每个网红店,你走进去就能自动签到打卡噢,离专属优惠又更近了一步。
–可根据天气、时间的不同,推荐最合适的优惠信息,也可设置排除场景,避免在不适合购物和消费的时间、天气状态下打扰用户。
–可根据用户的活动状态,进行是否要进行推送的判断。用户步行经过商圈,或在商圈内驻足,则需要推送,但如果用户是骑车、乘车等状态,则避免推送。
情景感知服务提供的感知功能如下
地理围栏感知:自由设置围栏半径,用户进入/离开/驻留在围栏中均可提醒,建议使用围栏驻留感知,便于精准识别,避免无效提醒打扰用户
天气感知、时间感知、活动状态感知:根据合适的时间、天气,用户在商圈附近的活动状态,精准识别购物场景,避免无效提醒打扰用户
信标感知:实体店铺内安装信标(Beacon,一种基于蓝牙技术的硬件),用户进入范围后可进行通知提醒。信标和地理围栏的区别是范围大小不同,信标的感知范围一般只有十几米,可实现商场内不同店铺间的精确提醒。
情景感知服务的优势
–无需用户提前开启App,用户进入地理围栏范围后,即可后台激活App,触发通知。
–无惧App进程被系统杀死,通过围栏服务,依然可接受到通知。
–点击通知,即可前台激活APP,点击直接跳转App推荐界面。
–通过组合围栏实现精准推送;也可避免在用户不需要的场景提供无效通知,避免频繁打扰。
开发前准备
Awareness Kit集成需要有如下3个关键步骤,可以参考华为开发者联盟的文档
AppGallery Connect配置
集成HMS Awareness SDK
配置混淆脚本
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/awareness-preparation
代码开发关键步骤
1.创建围栏
double latitude = 22.4943;
double longitude = 113.7436;
double radius = 100;
long timeOfDuration = 30 * 1000L;
//创建一个stay的地理围栏,经纬度为商圈店铺的经纬度,半径设置为100m,驻留时间设置为30s
AwarenessBarrier stayBarrier = LocationBarrier.stay(latitude, longitude, radius, timeOfDuration);
//创建一个活动识别的围栏,识别的活动状态为乘车和骑行
AwarenessBarrier behaviorBarrier = BehaviorBarrier.keeping(BehaviorBarrier.BEHAVIOR_ON_BICYCLE,BehaviorBarrier.BEHAVIOR_IN_VEHICLE);
//创建一个时间围栏,该围栏的状态在深夜时间段(21点到次日6点)内为true
AwarenessBarrier timeBarrier = TimeBarrier.inTimeCategory(TimeBarrier.TIME_CATEGORY_NIGHT);
//对这三个围栏进行组合,组合围栏的状态只有在以下情况才会变为true:当用户驻留在地理围栏内超过30s且活动状态不是乘车或者骑行,且不是在夜晚时间段
AwarenessBarrier combinedBarrier = AwarenessBarrier.and(stayBarrier, AwarenessBarrier.not(timeBarrier), AwarenessBarrier.not(behaviorBarrier));
//创建一个PendingIntent,当围栏状态改变的时候,会触发该PendingIntent,这里以启动一个Service为例.
PendingIntent pendingIntent;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//在安卓8.0及以上,app处于后台时只可以启动前台Service
pendingIntent = PendingIntent.getForegroundService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
} else {
pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
//创建围栏的标签,后续可以通过标签查询或者删除该围栏
String combinedBarrierLabel = "combined barrier label";
2.注册围栏
//把刚刚创建好的组合围栏和它对应的label,pendingIntent注册给Awareness kit
Awareness.getBarrierClient(context).updateBarriers(new BarrierUpdateRequest.Builder()
.addBarrier(combinedBarrierLabel, combinedBarrier,pendingIntent).build())
.addOnSuccessListener(aVoid -> {
//注册围栏成功
Log.i(TAG,"add barrier success");
})
.addOnFailureListener(e -> {
//注册围栏失败
Log.e(TAG,"add barrier failed");
e.printStackTrace();
});
3.创建Service监听围栏事件
本示例中我们组合围栏的PendingIntent设置的是启动一个Service,所以需要定义对应的Service来监听围栏的状态
public class DemoService extends IntentService {
public DemoService() {
super("AwarenessDemoService");
}
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager manager = getSystemService(NotificationManager.class);
if (manager == null) {
return;
}
String channel_ID = "DemoService";
NotificationChannel channel = new NotificationChannel(channel_ID,getResources().getString(R.string.app_name),NotificationManager.IMPORTANCE_LOW);
manager.createNotificationChannel(channel);
Notification notification = new Notification.Builder(this,channel_ID).build();
startForeground(1,notification);
}
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
if (intent == null) {
Log.e(TAG, "Intent is null");
return;
}
//围栏的信息通过intent传递过来,我们通过Barrier.extract方法将其解析出来
BarrierStatus barrierStatus = BarrierStatus.extract(intent);
//通过BarrierStatus获取label和围栏的当前状态
String barrierLabel = barrierStatus.getBarrierLabel();
int status = barrierStatus.getPresentStatus();
if (status == BarrierStatus.TRUE && barrierLabel.equals(combinedBarrierLabel)) {
//围栏状态为true,代表用户已经在商铺附近驻留超过30s,且不是在骑行或者乘车,且现在不是深夜时间段
//这时就可以通知优惠信息给用户,或者进行其他业务逻辑
//send Notification....
}
}
}
Demo效果
我们做了一个简单的app demo,展示情景感知带来的购物体验提升
代码也做了开源,请移步github
https://github.com/Bun-Cheung/Awa-Shopping
开发者交流
更多建议和需求,欢迎联系 [email protected]