Чому push-сповіщення не працюють на testflight?


75

Я протестував push-сповіщення як обліковий запис розробника, і це спрацювало, але коли я спробував помістити його на TestFlight, щоб тестувальники тестували його, воно не відображало push-повідомлення, але дані отримані правильно, отже, є такий вид сертифікат, який мені потрібно створити для TestFlight?


3
Використовуйте виробничий сертифікат для TestFlight, оскільки він є збіркою дистрибутиву, і використовуйте ssl: //gateway.push.apple.com: 2195 замість URL-адреси пісочниці, щоб надіслати повідомлення
Tarun Seera,

Відповіді:


82

Але коли я спробував поставити його на TestFlight для тестувальників, щоб протестувати його, він не показав push-повідомлення, але дані отримані правильно.

Це речення бентежить. Якщо ви не отримали push-повідомлення, які дані отримали правильно?

У будь-якому випадку, якщо я правильно пам’ятаю, для TestFlight ви використовуєте профіль підготовки AdHoc, який працює з робочим середовищем push. Тому вам знадобиться виробничий сертифікат push, щоб перейти на пристрої, які встановили програму за допомогою TestFlight. Крім того, не забувайте, що маркери пристроїв розробки відрізняються від маркерів виробничих пристроїв, тому переконайтесь, що ви використовуєте правильні маркери.


2
я нічого не бачив про маркери виробничих пристроїв у документах - ви могли б це трохи вказати?
Пітер Пайпер,

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.взято звідси .
Еран,

1
Шановний @Eran, чи є у вас підручник, який би показав, як створити виробничий сертифікат?
user3751548

Чи стосується це також сповіщень про GameKit?
Апостолос,

1
@tallis Я не знаю.
Еран,

42
  1. Вам потрібно використовувати виробничий сертифікат для складання testflight.
  2. Також потрібно видалити санбокс (режим пісочниці) з URL-адреси push-сповіщень у сценарії push-відправки.

1
No1 - це те, що я мав пам’ятати. Дякую.
ПО

5
Тестування: gateway.sandbox.push.apple.com Виробництво: gateway.push.apple.com
mc.

13

Якщо ви використовуєте Firebase, вам слід додати:

  • Тестовий політ:

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
        [[FIRInstanceID instanceID] setAPNSToken:deviceToken type:FIRInstanceIDAPNSTokenTypeSandbox]; 
    }
    
  • Виробництво:

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

1
Це може бути дуже дурне запитання, але що станеться, якщо ви зробите обидва?
Gábor Angyal

2
@ GáborAngyal - Незрозуміло, що відбувається. Цікавим є це речення "Якщо для типу маркера встановлено значення FIRInstanceIDAPNSTokenTypeUnknown InstanceID прочитає профіль підготовки, щоб дізнатися тип маркера." з Firebase API FIRInstanceID setAPNSToken: type: . Логічно, це говорить про те, що кожен міг просто зробити type: FIRInstanceIDAPNSTokenTypeUnknown, щоб нам не потрібно було пам'ятати про це. Я ще не пробував цього ...
ToolmakerSteve

1
Я спробував використати FIRInstanceIDAPNSTokenTypeUnknownаргумент valuef або type і можу підтвердити, що мені вдалося отримати push-повідомлення про збірки testflight
Tope

2
з новим синтаксисом Swift у Firebase 4.0 це тепер Messaging.messaging (). setAPNSToken (deviceToken, тип: .unknown)
dmathewwws

6

Для TestFlight використовуйте

  1. Сертифікат виробництва
  2. "gateway.push.apple.com" на сервері (заднє завдання)

5

якщо ви використовували GCM. У розробці: -

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

У розподілі: -

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

2

Нам потрібні два сертифікати для надсилання сповіщень, один для розробки та один для виробництва. У моєму випадку я використовую рішення PushSharp для надсилання сповіщення.

Це для розвитку:

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

Це для виробництва:

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

2

Для когось використовуються Python apns ( https://github.com/djacobs/PyAPNs ):

При створенні об'єкта APNS такий apns = APNs(cert_file="cert.pem", key_file="key.pem"). Вам потрібно додати ще один параметр use_sandbox. Буде apns = APNs(use_sandbox=False, cert_file="cert.pem", key_file="key.pem").

Щасливого кодування.


0

Переконайтеся, що ви встановили FirebaseAppDelegateProxyEnabledзначення YESу файлі info.plist.


0

Для Firebase спробуйте:

#if DEBUG
    Messaging.messaging().setAPNSToken(apnsToken, type: .sandbox)
#else
    Messaging.messaging().setAPNSToken(apnsToken, type: .prod)
#endif
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.