我正在为iPhone制作聊天应用程序,但我不确定对话消息应该如何立即出现.
我已经阅读了关于此主题的大量Google搜索结果.也是曾经的:
- http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server
- http://www.raywenderlich.com/3443/苹果推送通知服务教程部分-12
APNS方法:
将一个不可见的通知推送到iPhone,表示准备好读取新消息.因此,该应用程序将发出未读消息的请求.因此,我不会手动轮询新消息,而是让APNS帮忙.但我不确定?
套接字方法:
建立一个可以共享数据的套接字连接.在db中找到新消息时,它会自动将数据发送到应用程序.但是IP范围,防火墙,功耗等等呢?再次,我不确定:(
轮询方法:
制定一个我轮询请求的时间间隔,耗电量是我的敌人.
我的问题:
- 哪种方法最好?
- 其他建议?
- 我真的需要一些有这方面经验的人的利弊和专业人士.
例子总是好的.
谢谢
是否有可能区分其中的情况
我的情况:过去,我已经提示用户通知权限,但我从未跟踪过请求.后来,我停止尝试注册任何通知设置.现在,我想重新介绍用户通知.
在应用程序中发生重大事件后,我的计划是显示某种UI,以解释选择加入用户通知的好处.但是,如果用户已拒绝,我宁愿显示一个可以将其带入Settings.app的单独UI.
目前,我正在使用-[UIApplication currentUserNotificationSettings]抓取当前设置,但似乎这会返回UIUserNotificationTypeNone上述两种情况.
push-notification apple-push-notifications ios ios-permissions
如何使用自定义声音进行推送通知?
根据我的研究和阅读,我发现有效负载应该具有应用程序包中或应用程序数据容器的Library/Sounds文件夹中的文件名.
如何把文件放在那里?
我正在使用Google Firebase云消息传递API(FCM)向我的iOS应用发送推送通知. 当我在具有开发配置文件+开发推送通知(沙盒)证书的设备上测试应用程序时,我可以成功地使用推送通知.
但是我无法让它在生产环境中工作.我使用正确的生产配置文件和生产推送通知证书进行了临时构建.并通过iTunes将IPA文件同步到设备进行测试(不是直接来自xcode).我仍然无法从firebase控制台接收推送通知.
我已经将正确的开发和生产证书(带私钥)上传到firebase.我已经仔细检查过每一个可能出错的步骤,但是仍然无法找到问题.有没有办法解决这个问题?或者是不是可以将生产环境通知发送到AdHoc构建?
xcode apple-push-notifications ios firebase firebase-cloud-messaging
向iOS用户发送通知时,对于其中一些用户,我会收到响应状态码400(BadDeviceToken)或代码410(未注册).
从Apple关于"BadDeviceToken"的文档:
指定的设备令牌很糟糕.验证请求是否包含有效令牌以及令牌是否与环境匹配.
"坏"是什么意思?我知道设备令牌在某些时候是有效的.用户如何使其设备令牌变坏?
从关于"未注册"的文档:
设备令牌对于指定的主题处于非活动状态.
这是否意味着应用程序已被删除?或者这种反应可能还有其他原因.
apple-push-notifications http-headers ios http-status-code-400 http-status-code-410
2021 年 3 月 29 日,与 Apple 推送通知服务的基于令牌和证书的 HTTP/2 连接必须包含新的根证书 (AAACertificateServices 5/12/2020),以取代旧的 GeoTrust Global CA 根证书。为确保无缝过渡并避免推送通知传递失败,请在 3 月 29 日之前验证 HTTP/2 接口的新旧根证书都包含在每个通知服务器的信任存储中。
请注意,此时无需更新 Apple 向您颁发的 Apple Push Notification 服务 SSL 提供商证书。
我收到了关于更新推送通知证书的电子邮件。我已将 FCM (Firebase) 配置为使用 APNs 身份验证密钥发送推送通知。我还没有为推送通知生成任何证书。
我需要改变什么吗?
ssl apple-push-notifications ios firebase firebase-cloud-messaging
我有一个棚子负载从iPhone开发者门户网站导出"aps_developer_identity.cer"证书.它们都是使用相同的证书签名请求和(因此)相同的私钥创建的.如果我只从Apple Key Chain导出私钥,那么可以使用私钥和'aps_developer_identity.cer'并使用openssl创建我可以在我的(Windows)服务器上使用的合并的p12/pkcs#12证书.
为了清楚起见,我知道如何通过将私钥和证书一起导出来从密钥链中获取合并的p12,但是如果可以的话,我想删除所有额外的鼠标点击和输入.
如果应用程序正在运行(或从恢复模式打开),我想在iOS设备中检查"推送通知选项".如果选项为OFF,我使用以下代码进行检查:
-(void)PushNotificationServiceChecking
{
UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone)
{
NSString *msg = @"Please press ON to enable Push Notification";
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Push Notification Service Disable" message:msg delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"ON", nil];
alert.tag = 2;
[alert show];
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用以下代码进入"设置选项卡>>通知中心",以便用户可以手动操作:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (alertView.tag == 2)
{
if (buttonIndex == 0)
{
// this is the cancel button
}
else if (buttonIndex == 1)
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];
}
}
} …Run Code Online (Sandbox Code Playgroud) 我想在我的应用程序(Voip应用程序)中实现PushKit服务,但我有以下疑问:我看到我只能生成生产voip证书,如果我尝试在开发设备上测试voip推送通知服务,它是否有效?
这是我的实施测试:
使用这3行代码,我可以在didUpdatePushCredentials回调中获取push令牌,用于保存到我的服务器中.
PKPushRegistry *pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
pushRegistry.delegate = self;
pushRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
Run Code Online (Sandbox Code Playgroud)
服务器端我生成一个只有警报文本的"正常"有效负载推送通知,然后我发送到存储在我服务器中的voip令牌.
我使用带有调试日志的回调,但它们永远不会被调用!
- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type {
NSLog(@"didInvalidatePushTokenForType");
}
-(void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
NSLog(@"didReceiveIncomingPushWithPayload: %@", payload.description);
}
-(void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type {
if([credentials.token length] == 0) {
NSLog(@"voip token NULL");
return;
}
NSLog(@"didUpdatePushCredentials: %@ - Type: %@", credentials.token, type);
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试从我的服务器生成推送通知消息,以便先前上传的voip设备令牌,我从未通知didReceiveIncomingPushWithPayload回调,但是从服务器我得到200 ok消息(消息已成功发送)
我正在发送带有APNs Auth Key("永不过期")的推送通知,这种通知效果很好,直到我突然得到
403 Forbidden: {"reason":"InvalidProviderToken"}
Run Code Online (Sandbox Code Playgroud)
作为发送推送通知时的响应.当它工作一次并突然间没有失效日期时,可能是什么原因?与此同时,它再次推动了一些推动,但现在我再次得到错误...有没有其他人经历过这个?
编辑
不确定,但似乎这只发生在Ubuntu服务器上,而不是在我的本地(OS X)机器上...