我正在使用推送通知开发iOS聊天,我使用Firebase云消息传递,但我遇到了这个问题:
当应用程序被杀死(不在后台)时,有一种方法可以从通知中获取回调以获取内容(聊天消息)吗?
获取消息并将其保存在内部数据库中的唯一方法是在我启动应用程序时检查我的服务器是否有未读消息?
Firebase的文档在这个论点上似乎不太明确.只有当我发送静默通知(没有"通知"字段)didReceiveRemoteNotification时,才会在我打开应用程序时调用应用程序回调,但我只能收到最后一次通知.此回调不在后台调用
更新02/12/2016:
经过大量测试后,我联系了苹果支持,他们通过这封电子邮件回复了我:
我正在回答有关后台推送通知的问题.
本主题首次在WWDC 2013会议204 WWDC 2013中进行了讨论:多任务处理的新功能.静默推送通知(那些其有效负载仅包含内容可用密钥且没有警报,标记或声音密钥的通知)仅在iOS确定能够执行此操作时才会受到限制.
始终显示具有用户可见键的推送通知,例如以高优先级(优先级10)发送的警报,声音或徽章.但是,如果通知还包含内容可用密钥,则通知可能会受到限制,因此除非用户点击通知,否则不会在后台发送到应用程序.
无论有效负载如何,以低优先级(优先级5)发送的通知都会受到限制.应始终以低优先级发送无声推送通知.
正如WWDC会议所说,您可能希望设备上的所有应用每小时最多可以发送几次静音推送通知.但完全可能和恰当的是你根本不会收到任何东西.
节流的目的是预测用户何时启动应用程序,从而允许后台活动以节能方式更新应用程序的内容.它还可以防止应用程序使用后台流量消耗太多用户的电池或蜂窝数据.
一旦设备范围的电池或数据预算耗尽,在重置预算之前不会再发送后台推送通知.预算每24小时重置一次,用户或开发人员操作无法更改此计划.
由于这些预算适用于设备上的所有应用,因此您自己以外的应用可能会耗尽预算.您可以在设置>常规>使用情况>电池使用情况中查看应用的总体电池使用情况.
节流阀还跟踪设备网络连接不良的情况,因为当网络连接不稳定时连续尝试连接到APN会导致大量功耗.这是推送通知无法到达设备的最常见原因.要检查网络连接是否影响推送通知,可以使用"观察推送状态消息"中的步骤.
如果您使用附加的调试器运行应用程序,则禁用限制.这允许您测试正确接收通知,但只应被视为最佳情况.
此外,从iOS 9开始,用户可以通过打开设置>电池中的低功耗模式随时关闭油门.
要测试后台推送通知,请按照下列步骤操作.
- 将您的设备连接到Mac.
- 从Xcode启动您的应用程序.
- 启动后,单击"停止"按钮(左上角的方形图标),从Xcode中停止应用程序.
- 在Xcode中,执行Debug - > Attach to Process - > [Fill in Process Name to waiting] - > Attach
- 发送内容可用的推送通知:1,您的应用每次都会收到通知.
您可以使用Instruments中的进程列表确认您的应用程序是否在后台运行.
您还可以使用Wi-Fi和插入墙上电源的设备进行测试.
如果您要发送静默推送通知,请确保使用APNs Provider API或二进制提供程序API,以便将通知优先级设置为5.(默认优先级为10.)
如果您认为限制无法正常工作,请通过https://developer.apple.com/bug-reporting提交错误报告.限制工作的详细信息不是公共API,但iOS工程师会查看这些错误报告,并可以确定是否按预期限制通知.
重要的一点是,应该永远不要设计应用程序,以期收到每个推送通知.这不是APN的工作方式; 它旨在通知用户或应用程序发生了一些感兴趣的事件.如果未收到推送通知,预计应用程序可以正常工作,尽管功能可能会降低.用户可以随时关闭推送通知或后台应用程序更新,当然,如果设备没有Internet连接,则不会收到推送通知.
从iOS 7开始,当用户从多任务显示器强制退出应用程序时,除位置和VoIP(在iOS 9.3及更高版本上)之外的所有背景类别都表现一致.在用户选择再次启动应用程序之前,不会再自动启动应用程序.这尊重用户不让应用程序运行的意图,如果应用程序在启动时行为不端并崩溃,这可能是一项非常重要的恢复技术.
如果您关闭已配置为接收后台通知的应用,则在重新打开后才会收到它们.
在这封电子邮件之后,我试图发送电报被杀的通知.电报接收推送通知并显示它,但如果我在设置离线模式后打开应用程序,则消息不会显示在聊天中(这意味着当我打开它时,确实会打电话联系服务器检查未读消息)!相反,whatsapp可以在后台添加消息,因为它是一个VoIP应用程序,它可以调用后台回调.
因此,添加消息的唯一方法是联系服务器并获取未读消息.
在android中存在同样的问题,但可能你可以使用后台服务来解决它(并在它被杀死时重启它).
现在我必须选择是否使用Apple推送通知或FCM推送通知.可靠性是一样的吗?(因为,例如,Android中的Telegram使用专有的推送服务和FCM,因为他们说FCM不是很可靠)
在我的Android应用程序中,我需要使用OkHttp库对我的服务器执行一些请求.我有一个ssl证书,包括四个部分:
我已经在portecle 1.9中导入了所有部分,然后我设置了我的密钥库密码,并且我已经导出了.bks证书.
然后我在我的应用程序项目的res/raw文件夹中插入了mycert.bks.现在我尝试使用以下代码通过https连接到我的服务器:
OkHttpClient client = new OkHttpClient();
try{
client.setSslSocketFactory(getPinnedCertSslSocketFactory(context));
RequestBody formBody = new FormEncodingBuilder()
.add("params", "xxx")
.build();
Request request = new Request.Builder()
.url("https:\\mydomain.com")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
return response.body().string();;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private SSLSocketFactory getPinnedCertSslSocketFactory(Context context) {
try {
KeyStore trusted = KeyStore.getInstance("BKS");
InputStream in = context.getResources().openRawResource(R.raw.mycert);
trusted.load(in, "mypass".toCharArray());
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory trustManagerFactory = …Run Code Online (Sandbox Code Playgroud)