目标:发布该应用程序时,我希望拥有一个用于测试的Notification Hub和一个用于生产的Notification Hub。理想情况下,我想使用沙盒通知中心来定位设备的安装ID以测试推送通知。
注意:使用Android进行测试时,我仅使用Production Hub进行测试,并且仅将设备的Android安装ID作为目标即可。但是iOS Push通知可用于证书和沙盒/生产模式。
在Azure中,我有一个通知中心命名空间。命名空间包含两个集线器,一个在生产模式下设置,另一个在沙箱中设置(通过切换开关)
这些是我介绍的步骤:
2。沙箱中心具有上载的沙箱p12证书,该证书先前是通过右键单击“ Apple Development iOS Push Services:com.company.myappname”从钥匙串导出的
Azure托管的Web API中有两种Post方法,分别用于生产和沙箱模式。两种方法之间的区别是将集线器和默认共享终结点切换到Azure Portal中的相应值。
[AllowAnonymous]
[HttpPost, Route("sendForIOSDevelopment")]
public async Task<IHttpActionResult> SendTestToIOSInstallationId([FromBody]string message, string installationId)
{
if (string.IsNullOrWhiteSpace(installationId))
{
var model = new
{
error = new
{
code = 400,
message = "installation id is null or empty"
}
};
return Content(HttpStatusCode.BadRequest, model); //400 Bad Request with error message
}
//string hubName = "sandboxModeHub";
string hubName = "productionModeHub";
//string hubNameDefaultShared = "sandboxModeHubFullSharedEndPoint";
string hubNameDefaultShared = "productionModeHubFullSharedEndPoint";
NotificationHubClient hub = NotificationHubClient
.CreateClientFromConnectionString(hubNameDefaultShared, hubName, enableTestSend: true);
var templateParams = new Dictionary<string, string>
{
["messageParam"] = message
};
NotificationOutcome result = await hub.SendTemplateNotificationAsync(templateParams, "$InstallationId:{" + installationId + "}").ConfigureAwait(false);
return Ok(result); //200 Ok with model result
}
4。这是我在移动应用中注册推送通知的方式:
private async Task SendRegistrationToServerAsync(NSData deviceToken)
{
//this is the template/payload used by iOS. It contains the "messageParam"
// that will be replaced by our service
const string templateBodyAPNS = @"{
""aps"" : {
""alert"" : ""$(messageParam)"",
""mutable-content"": 1
},
}";
var templates = new JObject();
templates["genericMessage"] = new JObject
{
{"body", templateBodyAPNS }
};
// send registration to web api
var client = new MobileServiceClient(MyAppName.App.MobileServiceUrl);
await client.GetPush().RegisterAsync(deviceToken, templates);
//get the installation id
Console.WriteLine("Installation id: " + client.InstallationId.ToString());
}
要在沙盒模式下运行Xamarin应用,我将Entitlements.plist的“ aps-environment”键更改为“ development”,并使用Postman定位Azure后端托管的开发Post方法。
发生的事情是,一切在Production中心上都可以正常运行,而在Sandbox中心上却没有。
当我使用开发路线发布到沙箱中心时,以Web API中的开发Post方法为目标时,我得到了这个信息:
{ “成功”:0, “失败”:0, “结果”:null }
我不知道为什么到现在为止。我已经在生产模式和沙箱中都使用过我的设备来测试该应用程序,想知道这是否与它有关。