为什么推送通知在testflight上不起作用?


75

我已经将推送通知作为开发者帐户进行了测试,并且可以正常工作,但是当我尝试将其放在TestFlight上以供测试人员进行测试时,它没有显示推送通知,但是可以正确接收数据,所以有一种我需要为TestFlight生成的证书?


3
将生产证书用于TestFlight,因为它是发行版,并使用ssl://gateway.push.apple.com:2195而不是沙箱URL发送通知
Tarun Seera '16

Answers:


82

但是,当我尝试将其放置在TestFlight上以供测试人员进行测试时,它没有显示推送通知,但可以正确接收数据。

那句话令人困惑。如果未收到推送通知,则正确接收了哪些数据?

无论如何,如果我没记错的话,对于TestFlight,您使用的是AdHoc配置文件,该文件可与生产推送环境一起使用。因此,您需要生产推送证书才能推送到通过TestFlight安装了该应用程序的设备。此外,请不要忘记开发设备令牌与生产设备令牌不同,因此请确保使用正确的令牌。


2
我在文档中没有看到任何有关生产设备令牌的信息-您能指定一下吗?
彼得·派珀

7
@PeterPiperIf 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.这里带走。
伊兰2015年

1
亲爱的@Eran,您有没有任何教程来展示如何创建生产证书?
user3751548

这也适用于GameKit的通知吗?
Apostolos

1
@tallis我不知道。
伊兰(Eran)

42
  1. 您需要使用生产证书进行testflight构建。
  2. 还需要从推送发送脚本中的推送通知URL中删除sanbox(沙盒模式)。

1
#1是我应该记住的。谢谢。
BY

5
测试:gateway.sandbox.push.apple.com生产:gateway.push.apple.com
MC。

13

如果您使用Firebase,则必须添加:

  • TestFlight:

    -(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
这可能是一个非常愚蠢的问题,但是如果您同时执行两个操作,会发生什么?
的Gabor Angyal

2
@GáborAngyal-不清楚会发生什么。这句话很有趣:“如果将令牌类型设置为FIRInstanceIDAPNSTokenTypeUnknown InstanceID,则会读取配置文件以找出令牌类型。” 从火力地堡API FIRInstanceID setAPNSToken:类型:。从逻辑上讲,这表示每个人都可以做type: FIRInstanceIDAPNSTokenTypeUnknown,因此我们不必记住要更改此设置。我自己还没有尝试过……
ToolmakerSteve

1
我尝试使用FIRInstanceIDAPNSTokenTypeUnknownvaluef或type参数,可以确认我能够在testflight构建上收到推送通知
Tope

2
有了Firebase 4.0新的Swift语法,现在是Messaging.messaging()。setAPNSToken(deviceToken,type:.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 apnshttps://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

对于Firebase,请尝试以下操作:

#if DEBUG
    Messaging.messaging().setAPNSToken(apnsToken, type: .sandbox)
#else
    Messaging.messaging().setAPNSToken(apnsToken, type: .prod)
#endif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.