Microsoft WNS 后端推送服务—Part1

需求:需要收到服务端主动发起的推送消息

项目是Unity项目,然后导出UWP平台(C++),项目之前接的是亚马逊aws sdk,实现ios和android的推送服务。

但是由于unity导出是IL2CPP项目,亚马逊sdk没有提供对其支持。

通过几天的摸索,找到AWS web api, 能拿到SNS的end point,但是仍然无法收到推送。

解决方案:重新接微软 WNS SDK 。

1.代码实现

  后端代码(erlang):

%%%-------------------------------------------------------------------
%%% @author lee
%%% @copyright (C) 2017, <COMPANY>
%%% @doc
%%%
%%% @end
%%% Created : 31. Jul 2017 10:50 AM
%%%-------------------------------------------------------------------
-module(lib_wns_push).
-author("lee").

-include("common.hrl").

%% API
-export([
  dispatch_test/0,
  dispatch/2,
  authenticate/0
]).

-define(ACCESS_BASEURL, "https://login.live.com/accesstoken.srf").
-define(SCOPE, "notify.windows.com").

-define(IBROWSE_OPTIONS(ContentType), [  % Ibrowse options ContentType = "text/html"
  {max_sessions, 1000},
  {max_pipeline_size, 500},
  {connect_timeout, 2000},
  {inactivity_timeout, 4000},
  {content_type, ContentType}]).

-define(WNS_DATA, <<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
                   <toast>
                   <visual>
                   <binding template=\"ToastGeneric\">
                        <text>~s</text>
                        <image placement=\"appLogoOverride\" hint-crop=\"circle\" src=\"ms-appx:///Assets/Square44x44Logo.scale-200.png\"/>
                        </binding>
                      </visual>
                   </toast>">>).


dispatch_test() ->
  XMLData = <<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>
                   <toast>
                   <visual>
                   <binding template=\"ToastGeneric\">
                        <text>\"Hello World\"</text>
                        <image placement=\"appLogoOverride\" hint-crop=\"circle\" src=\"ms-appx:///Assets/Square44x44Logo.scale-200.png\"/>
                        </binding>
                      </visual>
                   </toast>">>,
  dispatch("https://hk2.notify.windows.com/?token=AwYAAAB6hF5%2bwn01WJmmIumQf%2buOCFmvxqXjnzIp6xQpjaQIszPg8eNEtDoXWcl1SosSSc%2blzF7LOC%2fPsoA%2fmqr1%2bvyEuWZuVl2lUg5iI%2bGiDnFIvDSqmElAcBAEGoe8hkksQn4%3d", XMLData).

dispatch(ChannelURI, Notice) ->
  XMLBody = lists:flatten(io_lib:format(?WNS_DATA, [Notice])),
  case authenticate() of
    {ok, Token} ->
      Options = ?IBROWSE_OPTIONS("text/xml"),
      Headers = [
        {"Authorization", Token},
        {"Content-Type", "text/xml"},
        {"X-WNS-Type", "wns/toast"}, % X-WNS-Type: wns/toast | wns/badge | wns/tile | wns/raw
        {"X-WNS-RequestForStatus", "true"}],
      try
        case ibrowse:send_req(binary_to_list(ChannelURI), Headers, post, XMLBody, Options, 10000) of
          {ok, "200", _RetHeaders, BodyData} ->
            ok;
          Else ->
            ?ERR("microsoft err request ~p~n", [Else])
        end
      catch
        _E:_R ->
          ?ERR("microsoft crash request ~p~n", [Token])
      end;
    {err, Reason} -> erlang:error(Reason)
  end.


authenticate() ->
  Options = ?IBROWSE_OPTIONS("application/x-www-form-urlencoded"),
  Bodys = lists:append([
    "grant_type=", "client_credentials",
    "&client_id=", http_uri:encode("xxxxxx"),
    "&client_secret=", http_uri:encode("xxxxxxx"),
    "&scope=", http_uri:encode(?SCOPE)]),
  Headers = [{"Content-Type", "application/x-www-form-urlencoded"}],
  case ibrowse:send_req(?ACCESS_BASEURL, Headers, post, Bodys, Options, 10000) of
    {ok, "200", Head, Body} ->
      Json = jsx:decode(list_to_binary(Body)),
      {_AccessType, AccessToken} = {
        proplists:get_value(<<"token_type">>, Json),
        proplists:get_value(<<"access_token">>, Json)},
      AuthValue = binary_to_list(<<"Bearer ", AccessToken/binary>>),
      {ok, AuthValue};
    Else ->
      io:format("~w:~w microsoft err response ~p~n", [?MODULE, ?LINE, Else]),
      {err, Else}
  end.

 

  客户端代码:

void MainPage::RegisterWNS() 
{
	try
	{
		auto authTask = Concurrency::create_task(PushNotificationChannelManager::CreatePushNotificationChannelForApplicationAsync());
		authTask.then([=](PushNotificationChannel^ channel)
		{
			channel->PushNotificationReceived += ref new TypedEventHandler<PushNotificationChannel ^, PushNotificationReceivedEventArgs ^>(this, &MainPage::OnPushNotificationReceived);
			SendMessageToU3D(11, channel->Uri);//向unity发送数据
		});
	}
	catch (const std::exception&)
	{
		RegisterWNS();
	}
}

void MainPage::OnPushNotificationReceived(PushNotificationChannel ^sender, PushNotificationReceivedEventArgs ^args)
{
	switch (args->NotificationType)
	{
	case PushNotificationType::Toast:
		ToastNotificationManager::CreateToastNotifier()->Show(args->ToastNotification);
		break;
	case PushNotificationType::Badge:
		BadgeUpdateManager::CreateBadgeUpdaterForApplication()->Update(args->BadgeNotification);
		break;
	case PushNotificationType::Tile:
		TileUpdateManager::CreateTileUpdaterForApplication()->Update(args->TileNotification);
		break;
	case PushNotificationType::Raw:
		break;
	default:
		break;
	}
	//args->Cancel = true;
}

2.下一步 Part2 客户端主动推送

 https://blog.csdn.net/blog_lee/article/details/81568143

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值