iOS在飞行模式下无法取消远程通知的注册。

7

我的应用程序中的一个功能是在用户从应用程序注销时取消远程推送通知。当设备处于飞行(离线)模式时,是否有方法可以取消注册应用程序的推送通知,当用户注销时?

我尝试了这段代码,但当我重新联网时仍然收到通知, [[UIApplication sharedApplication] unregisterForRemoteNotifications];

有人能帮助我如何在设备处于飞行模式时从通知中心删除应用程序吗?


1
你不需要连接互联网来注销吗? - dgund
@DGund 我曾经也有同样的误解,但实际上你需要在线才能成功取消通知。即使你在没有连接的情况下注销了,你仍然会收到通知。 - user1732255
2个回答

2
苹果控制远程推送通知。如果您离线,则逻辑上无法禁用它。当苹果首次看到您在线且推送未被禁用时,它会向您发送推送。没有办法阻止iDevice显示苹果发送给用户的推送,因为这不在应用程序的控制范围内。
所以只有一种可能性:设备再次上线后,您必须立即禁用推送。而且仍然是一个运气问题,苹果先获得的消息是您在线还是禁用推送。还有一个问题,苹果想要发送到设备的通知在设备离线时会发生什么。当在线时重新发送它们还是先禁用它们?我不知道。您需要进行研究。
因此,您唯一的机会是,如果用户在线时您的应用程序在后台运行。您需要防止您的应用程序被挂起(这里是如何实现的),以便能够响应系统通知。您需要的通知是在线状态更改的通知,我只知道它存在。这个资源可能会有所帮助。因此,当设备上线时,它将通知您的应用程序在后台等待(未挂起)。然后,您可以通过立即注销远程推送来做出反应。
这可能是您在这方面能够实现的最好的结果。希望这可以帮助到您。

0

添加一个标志或类似的东西(可以随意命名,比如ShouldRecallUnregister),当您调用

[[UIApplication sharedApplication] unregisterForRemoteNotifications];

如果没有网络连接,则将其设置为YES,并在注销成功时保持为NO。

将其存储在UserDefaults中([[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ShouldRecallUnregister"];),并在applicationDidBecomeActive:中检查其值,例如(或者在适合您的应用程序的任何地方)。

如果是YES,请再次调用[[UIApplication sharedApplication] unregisterForRemoteNotifications];


这样,您将在飞行模式关闭并应用程序激活的时间范围内获得进一步的通知。 - ilmiacs
感谢提供解决方案。unregisterForRemoteNotifications方法没有回调事件来追踪注销是否成功。有没有一种方法可以追踪它? - user1732255
@rdurand,这个解决方案可能不适合我的要求,因为一旦用户退出应用程序,我就不应该收到通知。在这个解决方案中,只有当用户重新启动或将应用程序带到前台时,注销才会完成。在此之前,我们仍然会收到通知。有更好的方法吗? - user1732255
好吧,我看不到更好的方法,主要是因为如果用户在飞行模式下注销,然后离开应用程序,您将无法处理通知,因为您的应用程序将处于非活动状态...否则我会建议使用didReceiveRemoteNotification,但这在这里是无用的..也许你应该只允许用户在网络可用时断开连接。这并不是一个坏习惯,因为网络必须处于活动状态才能重新连接..目前,我没有看到其他解决方案..如果我想到了什么,我一定会告诉你。 - rdurand
“Logged out of the app”是什么意思?是指应用程序不在前台,还是指您没有登录到应用程序连接的某个在线服务中? - ilmiacs
我觉得他指的是后者。希望是这样,因为否则这个问题就意味着“如何在应用程序在后台时禁用推送通知”,而这基本上就是推送通知的好处所在,哈哈。 - rdurand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接