Xamarin.iOS Azure Notification Hub работает в рабочей среде, но второй Hub, установленный в Sandbox, не работает - PullRequest
0 голосов
/ 16 ноября 2018

Цель : я хочу иметь концентратор уведомлений для тестирования и еще один для производства при публикации приложения. В идеале я хочу использовать Sandbox Notification Hub, чтобы указать идентификатор установки моего устройства для тестирования push-уведомлений.

Примечание : С помощью Android для тестирования я просто использую Production Hub для тестирования и просто нацеливаю на идентификатор установки Android моего устройства, и это работает. Но уведомления iOS Push работают с сертификатами и режимами Sandbox / Production.

В Azure у меня есть пространство имен Центра уведомлений. Пространство имен содержит два концентратора, один из которых установлен в производственном режиме, а другой - в изолированную программную среду (путем переключения переключателя)

Вот шаги, которые я описал:

  1. Производственный концентратор имеет загруженный производственный сертификат p12, который ранее был экспортирован из цепочки для ключей, щелкнув правой кнопкой мыши «Apple Push Services: com.company.myappname»

2. В концентратор песочницы загружен сертификат sandbox p12, который ранее был экспортирован из цепочки для ключей, щелкнув правой кнопкой мыши «Apple Development iOS Push Services: com.company.myappname»

  1. В веб-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());      
        }
  1. Чтобы запустить приложение Xamarin в режиме «песочницы», я меняю ключ «aps-environment» Entitlements.plist на «development» и использую Postman для нацеливания на метод Post разработки, размещенный в бэкэнде Azure.

    В результате все работает нормально на производственном концентраторе, но не на песочнице.

Когда я отправляю сообщение в концентратор Песочницы, используя маршрут разработки для нацеливания на метод разработки Post в Web API, я получаю следующее:

{ «Успех»: 0, «Отказ»: 0, «Результаты»: ноль }

Я не могу понять, почему это до этого момента. Я уже использовал свое устройство в производственном режиме и в песочнице для тестирования приложения, задаваясь вопросом, имеет ли это какое-либо отношение к нему.

...