8

Ho fatto delicatamente il passaggio da Google Cloud Messaging a Firebase Cloud Messaging.Firebase Cloud Messaging profilo di sviluppo e rilascio

Con GCM ho dovuto scegliere l'opzione sandbox. Come descritto qui: https://developers.google.com/cloud-messaging/ios/client#obtain_a_registration_token vedi punto 3.

per ricevere le notifiche push in modalità di debug che dovevo fare qualcosa di simile

[[GGLInstanceID sharedInstance] startWithConfig:instanceIDConfig]; 
_registrationOptions = @{kGGLInstanceIDRegisterAPNSOption:deviceToken, 
         kGGLInstanceIDAPNSServerTypeSandboxOption:@YES}; 

Per ricevere le notifiche push in un'App dall'AppStore (ad es PROVA Scelta dei colori) che ho avuto to say:

kGGLInstanceIDAPNSServerTypeSandboxOption:@NO}; 

Ora non riesco a trovare qualcosa di simile in Firebase. Per prima cosa ho pensato benissimo a non cambiare più questi stupidi valori. Ma ora non ricevo più notifiche push nelle mie app TestFlight.

Nella mia console di debug quando il debug sul dispositivo di un'uscita è come questo:

<FIRInstanceID/WARNING> APNS Environment in profile: development 

che è buono per il debug locale, ma indesiderato in PROVA Scelta dei colori. (Non so se questo accade per le app TestFlight, dal momento che non ho una console per loro.)

Quindi la mia domanda è: qualcuno sa se posso modificare manualmente l'opzione Sandbox in Firebase comunque?

Grazie,

Simon

risposta

9

Ho risolto il problema aggiungendo il codice seguente al progetto.

FIRInstanceIDAPNSTokenType.Sandbox verrà utilizzato quando si installa l'applicazione però PROVA Scelta dei colori,
e FIRInstanceIDAPNSTokenType.Prod quando la vostra applicazione va in diretta su App Store.

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
{ 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox) 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod) 
} 
1

ho seguito la documentazione fornita e stava avendo lo stesso problema, poi ho provato l'applicazione di avvio rapido e ha funzionato. La chiave sembra essere quella di aggiungere la logica per connettersi all'FCM dopo aver ottenuto un token, questo passaggio manca nella documentazione di installazione. Dopo averlo fatto, ha funzionato sul mio dispositivo di sviluppo al di fuori di TestFlight senza nessun altro commutatore speciale sandbox.

https://github.com/firebase/quickstart-ios/blob/master/messaging/FCM/AppDelegate.m#L85

// [START refresh_token] 
- (void)tokenRefreshNotification:(NSNotification *)notification { 
    // Note that this callback will be fired everytime a new token is generated, including the first 
    // time. So if you need to retrieve the token as soon as it is available this is where that 
    // should be done. 
    NSString *refreshedToken = [[FIRInstanceID instanceID] token]; 
    NSLog(@"InstanceID token: %@", refreshedToken); 

    // Connect to FCM since connection may have failed when attempted before having a token. 
    [self connectToFcm]; 

    // TODO: If necessary send token to appliation server. 
} 
// [END refresh_token] 

// [START connect_to_fcm] 
- (void)connectToFcm { 
    [[FIRMessaging messaging] connectWithCompletion:^(NSError * _Nullable error) { 
    if (error != nil) { 
     NSLog(@"Unable to connect to FCM. %@", error); 
    } else { 
     NSLog(@"Connected to FCM."); 
    } 
    }]; 
} 
// [END connect_to_fcm] 

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [self connectToFcm]; 
} 

// [START disconnect_from_fcm] 
- (void)applicationDidEnterBackground:(UIApplication *)application { 
    [[FIRMessaging messaging] disconnect]; 
    NSLog(@"Disconnected from FCM"); 
} 
// [END disconnect_from_fcm] 
1

E 'sulla funzione setAPNSToken(). È necessario impostare FIRInstanceIDAPNSTokenType su Prod durante l'aggiunta del token del dispositivo. Io uso rapido per questo, il codice che ho usato è questo:

func application(application: UIApplication, 
       didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) 
{ 
    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Prod) 
} 

anche se si desidera solo per rimuovere l'avviso, è possibile utilizzare un profilo di produzione di provisioning.

1

essere sicuri, utilizzare sotto:

#if DEBUG 
     FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox) 
    #else 
     FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: .prod) 
    #endif 

Non impostare inutilmente sandbox token prod tipo e viceversa.