Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Apple推送通知-从生产应用程序获取空推送令牌-将在修复配置文件问题后发送推送令牌_Ios_App Store_Push Notification_Apple Push Notifications_Entitlements - Fatal编程技术网

Ios Apple推送通知-从生产应用程序获取空推送令牌-将在修复配置文件问题后发送推送令牌

Ios Apple推送通知-从生产应用程序获取空推送令牌-将在修复配置文件问题后发送推送令牌,ios,app-store,push-notification,apple-push-notifications,entitlements,Ios,App Store,Push Notification,Apple Push Notifications,Entitlements,我们将接收推送通知添加到iPhone应用程序中。一切都在测试/沙箱环境中工作,我们从应用程序中获取令牌id,并可以从服务器发送推送通知 但现在,该应用程序已获得批准,并从应用商店出来,我们收到了发送到服务器的空推送令牌/通知id。我们已经有600多个了。。。请注意,最终用户确实会获得弹出窗口以批准在应用程序中接收通知,该应用程序只是在批准后向我们的服务器发送空令牌。因此,APNS服务器可能会分发空令牌 以下问题向我们表明,这可能是由于我们用于为app store生成的配置文件中缺少“推送通知”权

我们将接收推送通知添加到iPhone应用程序中。一切都在测试/沙箱环境中工作,我们从应用程序中获取令牌id,并可以从服务器发送推送通知

但现在,该应用程序已获得批准,并从应用商店出来,我们收到了发送到服务器的空推送令牌/通知id。我们已经有600多个了。。。请注意,最终用户确实会获得弹出窗口以批准在应用程序中接收通知,该应用程序只是在批准后向我们的服务器发送空令牌。因此,APNS服务器可能会分发空令牌

以下问题向我们表明,这可能是由于我们用于为app store生成的配置文件中缺少“推送通知”权限造成的:

这项权利的缺失是由于苹果的ProvisioningProtal网站中的一个bug造成的,但正如以下文章中提到的“在下载新配置文件之前修改任何现有配置文件”

我们现在在.mobileprovision文件中拥有正确的权限:

<key>Entitlements</key>
<dict>
 ..   
 <key>aps-environment</key>
 <string>production</string>
 ..
权利
..   
aps环境
生产
..
因此,我们正在重建我们的应用程序,并将其添加到商店中。然后希望得到推送通知

我希望以上内容能对其他人有所帮助。但现在让我们来回答我的实际问题:当600多名用户在商店外安装下一个更新时,他们已经下载了当前版本,我们是否也会开始接收新的推送令牌?或者我们需要在我们的应用程序中添加一些初始代码吗?registerForRemoteNotifications方法目前仅在应用程序启动时调用。推送令牌id从空(“”)更改为实际令牌时是否也会触发?当然,我们不想再等一个(小)星期,等待新的AppStore批准,然后才发现推送通知对某些用户仍然不起作用。我希望外面的专家能告诉我们


注意:我们正在使用MonoTouch开发的iPhone应用程序,并使用(旧的)APNS Sharp库从我们的服务器发送通知,但我认为这些细节与此问题无关。

当600多名用户安装下一次更新并再次运行应用程序时,您的应用程序将调用
registerforremotentifications
(因为您说过在启动时调用它),并将获得非空的设备令牌(当调用
application:didRegisterforremotentificationswithDeviceToken:
时)。 Apple在其文档中声明,您应该在启动时始终调用此方法,而不是使用设备令牌的缓存副本,因为设备令牌不能保证保持不变。所以你不应该有任何问题

以下是APNS文件中的相关引用:

应用程序应在每次启动时进行注册,并给出 提供程序设置当前令牌。它叫 RegisterForRemotionTificationTypes:方法启动 登记过程。此方法的参数采用 UIRemoteNotificationType(对于OS X,则为NSRemoteNotificationType) 位掩码,指定 应用程序希望接收例如图标标识和声音, 但不是警报消息。在iOS中,用户随后可以修改 已在的通知首选项中启用通知类型 设置应用程序。在iOS和OS X中,您都可以检索 通过调用 enabledRemoteNotificationTypes方法。操作系统不支持 徽章图标、显示警报消息或播放警报声音(如果有) 即使指定了这些通知类型,也不会启用它们 在通知有效负载中

这也是相关的:

通过请求设备令牌并将其每年传递给提供商 应用程序启动时,您可以帮助确保提供程序 具有设备的当前令牌。如果用户将备份恢复到 设备或计算机,而不是为其创建备份的设备或计算机 (例如,用户将数据迁移到新设备或计算机),他 或者她必须至少启动一次应用程序,应用程序才能收到 再次通知。如果用户将备份数据恢复到新设备 或重新安装操作系统、设备令牌 变化。此外,永远不要缓存设备令牌并将其交给您的用户 供应商;无论何时需要,始终从系统获取令牌。 如果您的应用程序以前已注册,请调用 RegisterForRemotionTificationTypes:操作系统中的结果 立即将设备令牌传递给代理,而不会导致 额外的开销


谢谢@Eran,回答得很好!我再次详细检查了我的iPhone代码(实际上已经有一段时间了),我想确实应该在从空值更改为正确值时将推令牌发送给我们。我会把你的答案指定为确定答案,以防遇到真正精彩的答案,也会一直等到我们的应用程序从应用商店出来并开始工作。据我所知,这只能做一次:是的,它是有效的!应用程序中无需更改任何代码。下一个版本发布后,我们开始从用户那里接收推送令牌。当然,应用程序在更新后会重置/重新启动,因此在启动时会调用RegisterForRemoteNotifications,使用新的授权,现在APN会给我们令牌。