什麼是訊息推送?
很多手機APP會不定時的給使用者推送訊息,例如一些新聞APP會給使用者推送使用者可能感興趣的新聞,或者APP有更新了,會給使用者推送是否選擇更新的訊息等等,這就是所謂的“訊息推送”。
更多APP訊息推送的介紹可查閱該篇文章:十分鐘帶你瞭解APP訊息推送(Push)?
常見的一些APP訊息推送示例
強營銷類:
直接把營銷力度,營銷模式以一種叫賣式方式展現出來,目的透過優惠,時效性勾起使用者貪小便宜的心理,好奇心理,如下所示:
強關聯性:
在資訊爆炸的時代,大腦會自動篩選對自己有價值的資訊和沒價值的資訊,如果在一條資訊中有@你,您之類的言語,大腦會自動識別,使用直接關聯的技巧在於巧用“你”相關的字眼。
強話題性:
營銷界有這麼一句話,沒有違和感就創造不了傳播,不出位就製造不了話題,那麼強話題性的文案自帶傳播屬性,一般都會擊中使用者內心的某個感觸,比如對社會的憤世嫉俗,對高房價的逆反心理,對旅遊的文藝心等等。
極光推送介紹
極光推送(JPush)是日均訊息量超百億級規模的 App 訊息推送專業服務平臺,極光推送支援 Android、iOS、QuickApp、Web 等平臺,SDK 接入方便快捷,推送通道高速穩定且支援海外專線,API 開放介面強大、靈活和易用、WEB 端支援建立通知、後效分析、標籤別名管理和故障排查等運營功能。 極光推送(JPush)在為開發者提供基礎推送服務的同時,還提供了使用者精準標籤、使用者分群、地理圍欄、應用內訊息、智慧傳送策略、智慧促活等服務能力,可有效提升訊息的送達率、展示率和點選率,透過精細化運營觸達助力 APP 提升日活和留存。
平臺型別支援
訊息型別支援
通知樣式支援
為什麼選擇極光作為APP的訊息推送平臺?
- 首先極光推送支援多平臺推送。
- 支援大規模的訊息推送。
- 極光推送對接方便,不同後端語言都提供了對應的SDK。
- 對於免費賬號支援也非常的友好(不過免費賬號高峰期有資源瓶頸,假如需要及時性很強的話可以購買高階版收費服務)。
快速對接Jpush極光推送
- 到極光推送官方網站註冊開發者帳號;
- 登入進入管理控制檯,建立應用程式,得到 Appkey(SDK 與伺服器端透過 Appkey 互相識別);
- 在推送設定中給 Android 設定包名、給 iOS 上傳證書、啟用 WinPhone,根據你的需求進行選擇;
.NET FX 4.5專案快速接入
該專案是基於C#/.NET(.NET Framework4.5.1的示例)極光推送對接例項,主要是對接極光整合為我們.Neter提供的SKD。在這裡我主要封裝了單個裝置註冊ID推送,裝置註冊ID批次推送和廣播推送三種推送三種方式,其他的推送方式大家可以參考文件去進行封裝。
- JPuhs-Sample?(封裝示例原始碼):https://github.com/YSGStudyHards/JPuhs-Sample
1、在專案中引入Jiguang.JPush nuget包
2、極光推送呼叫
namespace Jpush.Controllers
{
/// <summary>
/// 極光推送管理
/// </summary>
public class JPushManageController : Controller
{
private readonly JPushClientUtil _jPushClientUtil;
public JPushManageController(JPushClientUtil jPushClientUtil)
{
this._jPushClientUtil=jPushClientUtil;
}
/// <summary>
/// 單個裝置註冊ID推送
/// </summary>
/// <returns></returns>
public ActionResult SendPushByRegistrationId()
{
var isOk = _jPushClientUtil.SendPushByRegistrationId("追逐時光者歡迎你!", "2022新年快樂", "1507bfd3f715abecfa4", new Dictionary<string, object>(), true);
return Json(new { result = isOk });
}
/// <summary>
/// 裝置註冊ID批次推送(一次推送最多1000個)
/// </summary>
/// <returns></returns>
public ActionResult SendPushByRegistrationIdList()
{
var registrationIds = new List<string>() { "1507bfd3f715abecfa455", "1507bfd3f715abecfa433", "1507bfd3f715abecfa422" };
var isOk = _jPushClientUtil.SendPushByRegistrationIdList("追逐時光者歡迎你!", "2022新年快樂", registrationIds, new Dictionary<string, object>(), true);
return Json(new { result = isOk });
}
/// <summary>
/// 廣播推送
/// </summary>
/// <returns></returns>
public ActionResult BroadcastPush()
{
var isOk = _jPushClientUtil.BroadcastPush("追逐時光者歡迎你!", "2022新年快樂", new Dictionary<string, object>(), true);
return Json(new { result = isOk });
}
}
}
3、極光推送工具類(JPushClientUtil)
namespace Jpush.Common
{
/// <summary>
/// 極光推送工具類
/// </summary>
public class JPushClientUtil
{
private const string appKey = "youAppKey";
private const string masterSecret = "youMasterSecret";
private static JPushClient client = new JPushClient(appKey, masterSecret);
/// <summary>
/// 單個裝置註冊ID推送
/// </summary>
/// <param name="title">推送標題(Android才會存在)</param>
/// <param name="noticeContent">通知內容</param>
/// <param name="registrationid">裝置註冊ID(registration_id)</param>
/// <param name="extrasParam">擴充引數(傳入App接收的一些引數標識)</param>
/// <param name="isApnsProduction">注意:iOS是否推送生產環境(true是,false否推開發環境)</param>
/// <returns></returns>
public bool SendPushByRegistrationId(string title, string noticeContent, string registrationid, Dictionary<string, object> extrasParam = null, bool isApnsProduction = true)
{
//裝置標識引數拼接
var pushRegistrationId = new RegistrationIdList();
pushRegistrationId.registration_id.Add(registrationid);
return JPushBaseSendMessage(title, noticeContent, isApnsProduction, pushRegistrationId, extrasParam);
}
/// <summary>
/// 裝置註冊ID批次推送(一次推送最多1000個)
/// </summary>
/// <param name="title">推送標題(Android才會存在)</param>
/// <param name="noticeContent">通知內容</param>
/// <param name="registrationIds">註冊ID(registration_id)列表,一次推送最多1000個</param>
/// <param name="extrasParam">擴充引數(傳入App接收的一些引數標識)</param>
/// <param name="isApnsProduction">注意:iOS是否推送生產環境(true是,false否推開發環境)</param>
/// <returns></returns>
public bool SendPushByRegistrationIdList(string title, string noticeContent, List<string> registrationIds, Dictionary<string, object> extrasParam = null, bool isApnsProduction = true)
{
//裝置標識引數拼接
var pushRegistrationId = new RegistrationIdList();
pushRegistrationId.registration_id.AddRange(registrationIds);
return JPushBaseSendMessage(title, noticeContent, isApnsProduction, pushRegistrationId, extrasParam);
}
/// <summary>
/// 廣播推送
/// </summary>
/// <param name="title">推送標題(Android才會存在)</param>
/// <param name="noticeContent">通知內容</param>
/// <param name="extrasParam">擴充引數(傳入App接收的一些引數標識)</param>
/// <param name="isApnsProduction">注意:iOS是否推送生產環境(true是,false否推開發環境)</param>
/// <returns></returns>
public bool BroadcastPush(string title, string noticeContent, Dictionary<string, object> extrasParam = null, bool isApnsProduction = true)
{
return JPushBaseSendMessage(title, noticeContent, isApnsProduction, null, extrasParam, true);
}
/// <summary>
/// 極光訊息推送公共方法
/// </summary>
/// <param name="title">推送標題(Android才會存在)</param>
/// <param name="noticeContent">通知內容</param>
/// <param name="pushRegistrationId">裝置註冊ID(registration_id)</param>
/// <param name="isApnsProduction">iOS是否推送生產環境(true是,false否推開發環境)</param>
/// <param name="extrasParam">擴充引數</param>
/// <param name="isRadioBroadcast">是否廣播</param>
/// <returns></returns>
private bool JPushBaseSendMessage(string title, string noticeContent, bool isApnsProduction, RegistrationIdList pushRegistrationId, Dictionary<string, object> extrasParam, bool isRadioBroadcast = false)
{
try
{
object audience = pushRegistrationId;
if (isRadioBroadcast)
{
audience = "all";
}
var pushPayload = new PushPayload()
{
Platform = new List<string> { "android", "ios" },//推送平臺設定
Audience = audience,//推送目標
//notifacation:通知內容體。是被推送到客戶端的內容。與 message 一起二者必須有其一,可以二者並存。
Notification = new Notification
{
Alert = noticeContent,//通知內容
Android = new Android
{
Alert = noticeContent,//通知內容
Title = title,//通知標題
URIActivity = "com.king.sysclearning.platform.app.JPushOpenClickActivity",//該欄位用於指定開發者想要開啟的 activity,值為 activity 節點的 “android:name”屬性值;適配華為、小米、vivo廠商通道跳轉
URIAction = "com.king.sysclearning.platform.app.JPushOpenClickActivity",//該欄位用於指定開發者想要開啟的 activity,值為 "activity"-"intent-filter"-"action" 節點的 "android:name" 屬性值;適配 oppo、fcm跳轉
Extras = extrasParam //這裡自定義JSON格式的Key/Value資訊,以供業務使用。
},
IOS = new IOS
{
Alert = noticeContent,
Badge = "+1",//此項是指定此推送的badge自動加1
Extras = extrasParam //這裡自定義JSON格式的Key/Value資訊,以供業務使用。
}
},
Options = new Options//可選引數
{
//iOS 環境不一致問題:API 推送訊息給 iOS,需要設定 apns_production 指定推送的環境,false 為開發,true 為生產。
IsApnsProduction = isApnsProduction// 設定 iOS 推送生產環境。不設定預設為開發環境。
}
};
var response = client.SendPush(pushPayload);
//200一定是正確。所有異常都不使用 200 返回碼
if (response.StatusCode == HttpStatusCode.OK)
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
return false;
}
}
}
public class RegistrationIdList
{
/// <summary>
/// 裝置註冊ID
/// </summary>
public List<string> registration_id { get; set; } = new List<string>();
}
}
參考文章
- 十分鐘帶你瞭解APP訊息推送(Push):https://www.woshipm.com/operate/526224.html
- 極光詳細對接文件:https://docs.jiguang.cn/jpush/quickstart/3m_demo
加入DotNetGuide技術交流群
1、提供.NET開發者分享自己優質文章的群組和獲取更多全面的C#/.NET/.NET Core學習資料、影片、文章、書籍,社群組織,工具和常見面試題資源,幫助大家更好地瞭解和使用 .NET技術。
2、在這個群裡,開發者們可以分享自己的專案經驗、遇到的問題以及解決方案,傾聽他人的意見和建議,共同成長與進步。
3、可以結識更多志同道合的開發者,甚至可能與其他開發者合作完成有趣的專案。透過這個群組,我們希望能夠搭建一個積極向上、和諧友善的.NET技術交流平臺,為廣大.NET開發者帶來更多的價值。