BlackBerry Android Push-сервер сообщений
У меня возникают проблемы при попытке отправить уведомления для моего Z10. Устройство успешно регистрируется для push-уведомлений, и я получаю сгенерированный BlackBerry регистрационный идентификатор, как описано в разделе "Создание приложений Android с включенной поддержкой Push".
У меня проблемы, хотя при попытке отправить уведомления на этот сервер.
Для обычного Android я использовал библиотеку GCM-сервера. Мне пришлось изменить его так, чтобы сообщение отправлялось на серверы BlackBerry, т.е. https://cpxxx.pushapi.eval.blackberry.com/, где XXX - это мой CPID (идентификатор поставщика контента).
Проблема в том, что я получаю 404 взамен и не знаю, что вызвало это... Есть идеи? то же сообщение успешно отправляется на обычное устройство Android...
В качестве альтернативы, кому-нибудь удалось отправить push-сообщения на ваше устройство, и если да, не могли бы вы поделиться, как должен выглядеть запрос?
2 ответа
Наконец я смог сделать push-запрос. Вы должны отправить его на серверы BlackBerry. Я использовал BB SDK, доступный здесь. URL, который вы должны использовать, должен выглядеть следующим образом:
https://cpXXX.pushapi.eval.blackberry.com/mss/PD_pushRequest
образец кода:
IdGenerator idGenerator = new IdGeneratorImpl();
List<String> addresses = new ArrayList<String>();
JSONObject message = new JSONObject();
//populate message with key-value pairs
String data = message.toString();
//populate addresses with device PINs
PushMessageControl pushMessageControl = new PushMessageControl(PPGType.PUBLIC_PUSH, idGenerator, "[ YOUR BlackBerryAppId]", addresses);
Content content = new TextContent(data, "UTF-8");
PapService papService = new PapServiceImpl();
PushSDKProperties properties = new PushSDKPropertiesImpl();
properties.setPublicPpgAddress("[YOUR BLACKBERRY PPG ADDRESS]");
properties.setParserSpecialCharacters(BLACKBERRY_PARSER_SPECIAL_CHARACTERS);
properties.setHttpIsPersistent(false);
properties.setHttpConnectionTimeout(BLACKBERRY_CONNECTION_TIMEOUT);
properties.setDtdDeclarationPublic(BLACKBERRY_DTD_DECLARATION_PUBLIC);
properties.setHttpReadTimeout(BLACKBERRY_READ_TIMEOUT);
HttpClientImpl client = new HttpClientImpl();
client.setPushSDKProperties(properties);
papService.setHttpClient(client);
papService.setPushSDKProperties(properties);
PushResponse response = papService.push("[ YOUR BlackBerryAppId]", "[ YOUR BlackBerryPassword]", "[ YOUR BlackBerryAppId]", pushMessageControl, content);
где
private static final int BLACKBERRY_READ_TIMEOUT = 120000;
private static final int BLACKBERRY_CONNECTION_TIMEOUT = 60000;
private static final char[] BLACKBERRY_PARSER_SPECIAL_CHARACTERS = new char[] {'&', '"', ':', '<'};
private static final String BLACKBERRY_DTD_DECLARATION_PUBLIC = "<!DOCTYPE pap PUBLIC \"-//WAPFORUM//DTD PAP 2.1//EN\" \"http://www.openmobilealliance.org/tech/DTD/pap_2.1.dtd\">";
По вашему запросу есть много вещей, которые вы добавили:
- Вы должны создать запрос к этому URL
https://android.googleapis.com/gcm/send
, - Вы должны добавить в заголовок вашего запроса ключ API сервера.
- а также вы должны добавить в заголовок вашего запроса идентификатор отправителя, который будет представлен в консоли API Google как 2, так и 3.
- Наконец, это код, который я использовал для отправки уведомлений своим 5000 и более пользователям:
Примечание: он был разработан ASP.Net и VB.Net, но все должны применять одни и те же принципы:
Dim request As WebRequest = WebRequest.Create("https://android.googleapis.com/gcm/send")
request.Method = "POST"
request.ContentType = "application/json"
request.Headers.Add("Authorization: key=AIzaSyA47-XMaePL1mmI0P1yQ9V4sntMVn9q-1o")
request.Headers.Add("Sender: id=648406549877")
Dim collapsKey = Guid.NewGuid.ToString("n")
Dim postdata As String = "{""registration_ids"":" + ids(j) + ",""data"":{""message"":""" + TextBox1.Text + """,}" + ",""collapse_key"":""" + collapsKey + """,}"
Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postdata)
request.ContentLength = byteArray.Length
Dim dataStream As Stream = request.GetRequestStream
dataStream.Write(byteArray, 0, byteArray.Length)
dataStream.Close()
Dim resposne As WebResponse = request.GetResponse
Dim dataresponse As Stream = resposne.GetResponseStream
Dim reader As New StreamReader(dataresponse)
Dim sResponseFromServer As String = reader.ReadToEnd
reader.Close()