Warum funktionieren Push-Benachrichtigungen im Testflug nicht?


75

Ich habe Push-Benachrichtigungen als Entwicklerkonto getestet und es hat funktioniert. Als ich jedoch versuchte, sie auf TestFlight zu stellen, damit die Tester sie testen konnten, wurde keine Push-Benachrichtigung angezeigt, aber die Daten wurden korrekt empfangen. Gibt es also eine Art von? Zertifikat, das ich für TestFlight generieren muss?


3
Verwenden Sie das Produktionszertifikat für TestFlight, da es sich um eine Distribution handelt, und verwenden Sie ssl: //gateway.push.apple.com: 2195 anstelle der Sandbox-URL, um die Benachrichtigung zu senden
Tarun Seera,

Antworten:


82

Aber als ich versuchte, es auf TestFlight zu stellen, damit die Tester es testen konnten, wurde keine Push-Benachrichtigung angezeigt, aber die Daten wurden korrekt empfangen.

Dieser Satz ist verwirrend. Wenn Sie die Push-Benachrichtigung nicht erhalten haben, welche Daten werden korrekt empfangen?

Wenn ich mich richtig erinnere, verwenden Sie für TestFlight ein AdHoc-Bereitstellungsprofil, das mit der Produktions-Push-Umgebung funktioniert. Daher benötigen Sie ein Produktions-Push-Zertifikat, um auf Geräte zu übertragen, auf denen die App über TestFlight installiert wurde. Vergessen Sie außerdem nicht, dass sich Entwicklungsgerätetoken von Produktionsgerätetoken unterscheiden. Stellen Sie daher sicher, dass Sie die richtigen Token verwenden.


2
Ich habe in den Dokumenten nichts über Produktionsgeräte-Token gesehen. Können Sie dies etwas spezifizieren?
Peter Piper

7
@ PeterPiper If the token came from the sandbox environment, such as when you are testing a development build in house, you can't send it to the production push service. Each push environment will issue a different token for the same device or computer. If you do send a device token to the wrong environment, the push service will see that as an invalid token and discard the notification.von hier genommen .
Eran

1
Lieber @Eran, haben Sie ein Tutorial, das zeigt, wie Sie ein Produktionszertifikat erstellen?
user3751548

Würde das auch für Benachrichtigungen für das GameKit gelten?
Apostolos

1
@tallis Ich weiß es nicht.
Eran

42
  1. Sie müssen das Produktionszertifikat für die Erstellung von Testflügen verwenden.
  2. Außerdem muss sanbox (Sandbox-Modus) aus der Push-Benachrichtigungs-URL im Push-Sendeskript entfernt werden.

1
# 1 war das, woran ich mich erinnern sollte. Vielen Dank.
BY

5
Testen: gateway.sandbox.push.apple.com Produktion: gateway.push.apple.com
mc.

13

Wenn Sie Firebase verwenden, müssen Sie Folgendes hinzufügen:

  • Testflug:

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        [[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeSandbox]; 
    }
    
  • Produktion:

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        [[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeProd]; 
    }
    

1
Dies mag eine sehr dumme Frage sein, aber was passiert, wenn Sie beides tun?
Gábor Angyal

2
@ GáborAngyal - Nicht klar, was passiert. Interessant ist dieser Satz "Wenn der Token-Typ auf FIRInstanceIDAPNSTokenTypeUnknown gesetzt ist, liest InstanceID das Bereitstellungsprofil, um den Token-Typ herauszufinden." von der Firebase-API FIRInstanceID setAPNSToken: Typ : . Das heißt logischerweise, dass jeder es einfach tun könnte type: FIRInstanceIDAPNSTokenTypeUnknown, damit wir uns nicht daran erinnern müssen, dies zu ändern. Ich habe es selbst nicht versucht ...
ToolmakerSteve

1
Ich habe versucht, das FIRInstanceIDAPNSTokenTypeUnknownArgument valuef oder type zu verwenden, und kann bestätigen, dass ich eine Push-Benachrichtigung für Testflight-Builds erhalten konnte
Tope

2
Mit der neuen Swift-Syntax von Firebase 4.0 heißt es jetzt Messaging.messaging (). setAPNSToken (deviceToken, Typ: .unknown)
dmathewwws

6

Verwenden Sie für TestFlight

  1. Produktionszertifikat
  2. "gateway.push.apple.com" auf dem Server (Backend-Job)

5

wenn Sie GCM verwendet haben. In Entwicklung:-

_registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
                             kGGLInstanceIDAPNSServerTypeSandboxOption:@YES};

Im Vertrieb: -

_registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
                             kGGLInstanceIDAPNSServerTypeSandboxOption:@NO};

2

Wir benötigen zwei Zertifikate zum Senden von Benachrichtigungen, eines für die Entwicklung und eines für die Produktion. In meinem Fall verwende ich die PushSharp-Lösung, um Benachrichtigungen zu senden.

Dies ist für die Entwicklung:

var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Sandbox, "development.p12", "password");
var broker = new ApnsServiceBroker(config);

Dies ist für die Produktion:

var config = new ApnsConfiguration(ApnsConfiguration.ApnsServerEnvironment.Production, "production.p12", "password");
var broker = new ApnsServiceBroker(config);

2

Für jemanden, der Python-Apns verwendet ( https://github.com/djacobs/PyAPNs ):

Wenn Sie ein APNS-Objekt wie z apns = APNs(cert_file="cert.pem", key_file="key.pem"). Sie müssen einen weiteren Parameter hinzufügen use_sandbox. Es wird sein apns = APNs(use_sandbox=False, cert_file="cert.pem", key_file="key.pem").

Viel Spaß beim Codieren.


0

Bitte stellen Sie sicher , dass Sie festgelegt haben , FirebaseAppDelegateProxyEnabledum YESin info.plist Datei.


0

Versuchen Sie für Firebase Folgendes:

#if DEBUG
    Messaging.messaging().setAPNSToken(apnsToken, type: .sandbox)
#else
    Messaging.messaging().setAPNSToken(apnsToken, type: .prod)
#endif
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.