2014-02-18 3 views
5

Ich versuche, Push-Benachrichtigungen aus meiner Rails App zu senden. Ich habe versucht, die Edelsteine ​​APNS, Houston, und sie funktionieren fantastisch, wenn ich auf meiner Entwicklungsmaschine bin.iOS Push-Benachrichtigung auf Heroku Rails App - wie die PEM-Datei zu liefern

Diese Edelsteine ​​brauchen die /path/to/PEM/file (Apples Zertifikat), um die Benachrichtigungen zu senden. Ich kann jedoch nicht herausfinden, wie diese Datei auf dem Produktionsserver bereitgestellt wird. Ich benutze Heroku.

Ich habe versucht, es auf Amazon-S3 (nicht öffentlich) hochgeladen und es von dort zu verwenden. Dies funktioniert jedoch nicht, da die Edelsteine ​​nach einer lokalen Datei (und nicht nach einem URI) suchen. Wie speichere ich eine lokale Datei auf Heroku?

Der Edelstein APNS benötigt den Pfad als String. Es prüft dann, ob die Datei existiert.

raise "The path to your pem file does not exist!" unless File.exist?(self.pem) 

Das Juwel Houston erfordert die PEM als File Objekt. Ich kann jedoch nicht File.open("url_to_my_pem_file")

+0

ich Sie senden, ein bisschen auf der Frequenz Ihrer Mitteilungen abhängen, sondern ein Zertifikat auf S3 Mitteln Hosting wird eine kleine Verzögerung immer verursachen (weil Sie die Datei in Ihre lokale Umgebung kopieren müssen, bevor Sie sie senden. – wspruijt

Antwort

3

Ich endete beim Kopieren der AWS-S3-Datei in die Heroku App, verwenden Sie die kopierte Version (da es lokal ist), und löschen Sie dann die kopierte Datei, sobald die Benachrichtigungen gesendet wurden.

fname = "tempfile.pem" 
# open the file, and copy the contents from the file on AWS-S3 
File.open(fname, 'wb') do |fo| 
    fo.print open(AWS::S3::S3Object.url_for(LOCATION_ON_S3, BUCKET_NAME)).read 
end 
file = File.new(fname) 
# use the newly created file as the PEM file for the APNS gem 
APNS.pem = file 

device_token = '<a4e71ef8 f7809c1e 52a8c3ec 02a60dd0 b584f3d6 da51f0d1 c91002af 772818f2>' 
APNS.send_notification(device_token, :alert => 'New Push Notification!', :badge => 1, :sound => 'default') 

# delete the temporary file 
File.delete(fname) 

Ich schrieb einen Beitrag über sie - http://wp.me/p1pbh7-2j

Auf dem zweiten Gedanken, ich mag in dieser Frage Privatvermögen verwendet haben könnte - Where to put private documents to use in Rails applications?, aber auch die Antwort erwähnt, dass AWS-S3 ist wahrscheinlich ein besserer Idee.

7

Sie könnten einfach die Rails.root var verwenden, um einen lokalen Pfad zu erhalten. Wenn Sie Ihre Cert-Dateien auf S3 hosten, ist das vielleicht etwas übertrieben, und Sie machen Ihren Push-Server jetzt von S3 abhängig. Wenn es Ausfallzeiten gibt, können Sie nicht drücken. Außerdem werden Sie durch einen Webanruf gebremst.

Hier ist ein Beispielverfahren von meiner Schiene Produktion Push-Server:

def cert_path 
    path = "#{Rails.root}/config/apn_credentials/" 
    path += ENV['APN_CERT'] == 'production' ? "apn_gather_prod.pem" : "apn_gather_dev.pem" 
    return path  
end 
+0

Ich wäre nicht zu besorgt über Abhängigkeit und Ausfallzeiten von S3 ... – Antoine

+0

Wie haben Sie Cert-Datei zu "/ config/apn_credentials /" Verzeichnis hinzugefügt? Haben Sie es irgendwie kopiert oder Sie behalten es im Repository und machen Push zu Heroku? – tommybernaciak