RSS-канал службы push-уведомлений Apple

Я разрабатываю приложение для ios 5.1. Теперь я настроил push-уведомления, которые можно отправлять из программы Mac «pushmebaby». Мой вопрос: как вы можете отправлять push-уведомления на все устройства каждый раз, когда RSS-канал получает новую запись (возможно, через PHP?)?

спасибо!


person user1110365    schedule 02.04.2012    source источник


Ответы (1)


Насколько я понимаю, вам нужно отслеживать все идентификаторы устройств (как? Лично я создал базу данных). Когда человек впервые устанавливает приложение и подписывается на службу уведомлений, приложение должно отправить вам идентификатор устройства и имя пользователя (некоторый тип ключа) на ваш сервер.

VB Отправка push-уведомлений ANPSLibrary это просто функция, которую я создал для отправки push-уведомлений, вам нужно вызвать эту функцию, чтобы отправить уведомление.

Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography.X509Certificates
Imports System.Security.Cryptography
Imports System.Net.Security
Imports System.Net.Sockets
Imports System.Threading
Imports System.Linq
Imports System.Collections.Generic
Imports System.Runtime.Serialization
Imports System





Public Class PushNotification



    'Send PushNotifications
    '///sanbox is true, if we are developing, and false if we are out of developing
    '///testDeviceToken is the id of the device you want to send the push notfication to
    '///Message is the message we want the to send to the device
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    Public Shared Function sendrequest(ByVal sandbox As Boolean, ByVal testDeviceToken As String, ByVal Message As String)

        Dim strHost As String
        Dim strP12FileName As String
        Dim strP12FilePassword As String
        Dim strJsonMsg As String
        Dim certificate As X509Certificate2
        Dim certificateCollection As X509CertificateCollection
        Dim nPort As Integer = 2195
        Dim apnsClient As TcpClient
        Dim apnsStream As SslStream


        Try
            ' Sets the Host to the correct server. 
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            If sandbox = True Then
                strHost = "gateway.sandbox.push.apple.com"
            Else
                strHost = "gateway.push.apple.com"
            End If


            'The path of the certificate 
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            strP12FileName = "C:\Users\filelocation"
            strP12FilePassword = "password"

            'Putting Message in json format
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            strJsonMsg = "{""aps"":{""alert"":""" & Message & """,""badge"":1}}"


            certificate = New X509Certificate2(strP12FileName, strP12FilePassword)
            certificateCollection = New X509CertificateCollection
            certificateCollection.Add(certificate)

            'builds connection
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

            apnsClient = New TcpClient(strHost, nPort)
            apnsStream = New SslStream(apnsClient.GetStream(), True, _
                                       New RemoteCertificateValidationCallback(AddressOf validateServerCertificate), _
                                        New LocalCertificateSelectionCallback(AddressOf selectLocalCertificate))

            apnsStream.AuthenticateAsClient(strHost, certificateCollection, System.Security.Authentication.SslProtocols.Ssl3, False)

            'Turns everything in Bytes
            '-------------------------------------------------------------------------------------------------------------------------

            'Cannot be more than Binary size of 32
            Dim DeviceToken((testDeviceToken.Length / 2) - 1) As Byte
            For i As Integer = 0 To 31
                DeviceToken(i) = Byte.Parse(testDeviceToken.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber)
            Next


            'Cannot be more than Binary size of 256
            Dim payload() As Byte = Encoding.UTF8.GetBytes(strJsonMsg)

            Dim DeviceTokenSize() As Byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(Convert.ToInt16(DeviceToken.Length)))
            Dim payloadSize() As Byte = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(Convert.ToInt16(payload.Length)))

            'Creates a Byte Array
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            Dim NotificationSize As Integer = 1 + DeviceTokenSize.Length + DeviceToken.Length + payloadSize.Length + payload.Length
            Dim Notification(NotificationSize) As Byte

            Notification(0) = 0
            Buffer.BlockCopy(DeviceTokenSize, 0, Notification, 1, DeviceTokenSize.Length)
            Buffer.BlockCopy(DeviceToken, 0, Notification, 1 + DeviceTokenSize.Length, DeviceToken.Length)
            Buffer.BlockCopy(payloadSize, 0, Notification, 1 + DeviceTokenSize.Length + DeviceToken.Length, payloadSize.Length)
            Buffer.BlockCopy(payload, 0, Notification, 1 + DeviceTokenSize.Length + DeviceToken.Length + payloadSize.Length, payload.Length)

            'Sends the Notification and closes and stream
            '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
            apnsStream.Write(Notification)
            apnsStream.Close()
        Catch




        Finally
            'cleaning
            strHost = Nothing
            strP12FileName = Nothing
            strP12FilePassword = Nothing
            strJsonMsg = Nothing
            certificate = Nothing
            certificateCollection = Nothing
            nPort = Nothing
            apnsClient = Nothing
            apnsStream = Nothing
        End Try
        Return True

    End Function
    'This is needed for RemoteCertificateValidationCallback
    Public Shared Function validateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors)

        Return True 'Dont care about server's cert

    End Function
    'This is needed for LocalCertificateSelectionCallback
    Public Shared Function selectLocalCertificate(ByVal sender As Object, ByVal targetHost As String, ByVal localCertificates As X509CertificateCollection, _
        ByVal remoteCertificate As X509Certificate, ByVal acceptableIssuers As String())

        Dim certificate As X509Certificate2
        certificate = New X509Certificate2("C:\Users\filelocation", "password")
        Return certificate

    End Function

End Class

VB drive// по существу создает форму с двумя текстовыми полями, одно для ввода токена устройства и одно для сообщения. затем создайте драйвер ниже

Imports ANPSLibrary
Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click


        PushNotification.sendrequest(True, txtToken.Text, txtMsg.Text)
    End Sub
End Class
person A.sharif    schedule 02.04.2012
comment
да, верно, но мне также нужно что-то вроде php-скрипта или чего-то еще для отправки этих push-сообщений...? - person user1110365; 03.04.2012
comment
верный. У меня есть 2 решения для Visual Studio 2010, одно на vb и одно на C#. Хотели бы вы посмотреть на них? или вы хотите это в php? - person A.sharif; 03.04.2012
comment
Да. Вам просто нужно было бы сказать мне, что мне нужно изменить - person user1110365; 03.04.2012
comment
спасибо! но как мне это сохранить и куда мне это загрузить? - person user1110365; 03.04.2012
comment
по сути, так работает отправка уведомлений. вам нужен сертификат, идентификатор устройства и сообщение (в виде строки json). Если вы отправляете push-уведомление в качестве теста, вы отправляете его на сервер песочницы (сервер разработчика), в противном случае вы отправляете его на обычный сервер. вы откроете поток с сервером и сначала отправите сертификат. сервер отправит вам свой сертификат, который вас не особо волнует. - person A.sharif; 03.04.2012
comment
затем вам нужно отправить двоичное сообщение на сервер, которое будет содержать идентификатор устройства, фактическое сообщение, насколько все велико. вот документация Apple, если вам нужно более подробное объяснение. developer.apple.com/library/mac/#documentation/ - person A.sharif; 03.04.2012
comment
Мой код находится в визуальной студии. Я думаю, вам нужна визуальная студия, чтобы вы могли запустить мою программу. - person A.sharif; 03.04.2012