我注意到在iOS 11 beta 2上,application:didReceiveRemoteNotification:fetchCompletionHandler无论应用程序的状态如何(背景/前景),都不会传递静默通知.
我实现了该UIApplicationDelegete方法,application:didReceiveRemoteNotification:fetchCompletionHandler并发送以下静默推送
{
"aps": {
"content-available": 1
},
"mydata": {
"foo": "bar"
}
}
Run Code Online (Sandbox Code Playgroud)
但是在iOS 11上没有调用委托方法.
它在其他版本的iOS上工作正常,文档部分配置静默通知没有提到应该做的任何其他事情.
这是iOS 11中的错误还是我错过了iOS 11中的新功能?
请注意,我不是在讨论或使用UserNotification发送静默推送所不需要的框架.
这是一个说明问题的示例项目(您必须设置自己的包ID)
当您在示例项目中进行午餐并将上述有效负载发送到应用程序时,您可以使用macOS控制台查看推送是否已正确传递到设备,而不是应用程序.
看来行为是随机的.有时在重新启动设备后,有效负载会正确传送,但一段时间后它会停止工作.
正如您在下面的屏幕截图中看到的那样,标记为1的推送仅对设备进行了延迟,并且推送2(设备重启后)也会传送到应用程序.
还是一样的行为.应该起作用的另一件事但不是以下.当应用程序的方案设置为"等待可执行文件启动"时,静音推送应该唤醒应用程序并在后台启动它.
在错误报告中仍然是Apple的相同行为而不是更新.
仍然是同样的问题.我现在使用的重现步骤如下:
didReceiveRemoteNotification: fetchCompletionHandler预期:应用程序从暂停状态进入后台并被didReceiveRemoteNotification: fetchCompletionHandler调用
实际:没有任何反应
编辑:今天在2015年8月27日重新测试,它再次运作,苹果已修复它.
我有一个处于开发模式的应用程序.该应用程序使用CKSubscription来获取服务器上的更改通知,为所有三个选项配置:创建,更新,删除.一切都运行正常但最近在回归测试期间我发现应用程序没有收到有关记录更新的通知,创建和删除通知仍然有效.正如我在仪表板上检查的那样,所有三个选项都正确设置了susbcription类型,并且应用程序已注册CKSubscription,因为它是在几天前工作时才像魅力一样.我没有收到CloudKit的任何错误.重置开发环境没有帮助.我已经重新测试了我确信它正在工作的版本,并得到了相同的结果.
知道可能导致这个问题的原因,我还应该检查/尝试什么?
附加信息: 我猜服务器端可能出现问题.我没有更改我订阅CloudKit事件和处理推送通知的代码中的任何内容 - 无论如何,它正在工作的版本不再获得更新通知.我正在处理的应用程序已发布,因此更改容器是不行的.不确定这是否会导致问题,只是想提一下:应用程序使用相同的容器将核心数据存储在云中 - 应用程序升级的目标是将数据迁移到CloudKit并将其用作云专门存储.令人困惑的是,一切都运行良好数周并突然停止工作,没有任何明确的原因,可能是因为密集测试的负载效应,添加记录类型......
使用从头开发的应用程序测试: 我编写了一个简单的测试应用程序来检查接收通知.我只能收到有关创建记录的通知.我的代码出了什么问题:
import UIKit
import CloudKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let container = CKContainer.defaultContainer()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let settings = UIUserNotificationSettings(forTypes: .Alert, categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
return true
}
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
println("didFailToRegisterForRemoteNotificationsWithError: \(error)")
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
println("didRegisterForRemoteNotificationsWithDeviceToken: \(deviceToken)")
subscribe()
}
func subscribe() {
// let predicate = NSPredicate(format: …Run Code Online (Sandbox Code Playgroud) 我创建了一个创建和更新订阅.创作总是很完美,我从其他设备获得推送通知.更新发送到iCloud,您可以在那里看到它们,但推送通知不会传递给设备.
- (void)subscribeWithType:(NSString*)type completionHandler:(void(^)(CKSubscription *))completionHandler
{
if (self.enabled == NO || _available == NO || _reachability.currentReachabilityStatus != ReachableViaWiFi)
{
if (completionHandler)
{
dispatch_async(dispatch_get_main_queue(), ^{
completionHandler(nil);
});
}
return;
}
NSPredicate *truePredicate = [NSPredicate predicateWithValue:YES];
CKSubscriptionOptions options = CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate;
CKSubscription *subscription = [[CKSubscription alloc] initWithRecordType:type
predicate:truePredicate
subscriptionID:[CTUtils GetUUID]
options:options];
CKNotificationInfo *notification = [[CKNotificationInfo alloc] init];
notification.shouldSendContentAvailable = YES;
notification.alertLocalizationKey = @"";
notification.shouldBadge = NO;
subscription.notificationInfo = notification;
CKModifySubscriptionsOperation *operation = [[CKModifySubscriptionsOperation alloc] initWithSubscriptionsToSave:@[subscription] subscriptionIDsToDelete:nil];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
__block …Run Code Online (Sandbox Code Playgroud) push-notification apple-push-notifications ios cloudkit cksubscription