Цель : я хочу иметь концентратор уведомлений для тестирования и еще один для производства при публикации приложения. В идеале я хочу использовать Sandbox Notification Hub, чтобы указать идентификатор установки моего устройства для тестирования push-уведомлений.
Примечание : С помощью Android для тестирования я просто использую Production Hub для тестирования и просто нацеливаю на идентификатор установки Android моего устройства, и это работает. Но уведомления iOS Push работают с сертификатами и режимами Sandbox / Production.
В Azure у меня есть пространство имен Центра уведомлений. Пространство имен содержит два концентратора, один из которых установлен в производственном режиме, а другой - в изолированную программную среду (путем переключения переключателя)
Вот шаги, которые я описал:
- Производственный концентратор имеет загруженный производственный сертификат p12, который ранее был экспортирован из цепочки для ключей, щелкнув правой кнопкой мыши «Apple Push Services: com.company.myappname»
2. В концентратор песочницы загружен сертификат sandbox p12, который ранее был экспортирован из цепочки для ключей, щелкнув правой кнопкой мыши «Apple Development iOS Push Services: com.company.myappname»
В веб-API, размещенном в Azure, есть два метода Post для каждого рабочего режима и режима песочницы. Различие между методами заключается в переключении концентратора и общей конечной точки по умолчанию на соответствующие значения в портале Azure.
[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. Вот как я могу зарегистрироваться для получения push-уведомлений в мобильном приложении:
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 в режиме «песочницы», я меняю ключ «aps-environment» Entitlements.plist на «development» и использую Postman для нацеливания на метод Post разработки, размещенный в бэкэнде Azure.
В результате все работает нормально на производственном концентраторе, но не на песочнице.
Когда я отправляю сообщение в концентратор Песочницы, используя маршрут разработки для нацеливания на метод разработки Post в Web API, я получаю следующее:
{
«Успех»: 0,
«Отказ»: 0,
«Результаты»: ноль
}
Я не могу понять, почему это до этого момента. Я уже использовал свое устройство в производственном режиме и в песочнице для тестирования приложения, задаваясь вопросом, имеет ли это какое-либо отношение к нему.