我通过content-available在推送通知上使用标志来触发后台获取.我有fetch和remote-notification UIBackgroundModes启用.
这是我在AppDelegate.m中使用的实现:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"Remote Notification Recieved");
UILocalNotification *notification = [[UILocalNotification alloc] init];
notification.alertBody = @"Looks like i got a notification - fetch thingy";
[application presentLocalNotificationNow:notification];
completionHandler(UIBackgroundFetchResultNewData);
}
Run Code Online (Sandbox Code Playgroud)
当应用程序在后台运行时,它可以正常工作.(收到通知,应用程序触发"看起来像我收到通知"本地通知,因为上面的代码应该这样做).
但是,当应用程序未运行并且收到带有content-available标志的推送通知时,应用程序不会启动,并且didRecieveRemoteNotification永远不会调用委托方法.
WWDC视频最新的多任务处理(来自WWDC 2013的#204)显示了这一点:
它表示当收到带有content-available标志的推送通知时,应用程序将"启动到后台" .
为什么我的应用程序没有启动到后台?
所以真正的问题是:
用户强行退出应用后,iOS会执行后台任务吗?
有没有办法使用google的firebase发送静音APNS?似乎如果应用程序在后台,它将始终向用户显示通知.
谢谢?
push-notification apple-push-notifications firebase silentpush firebase-cloud-messaging
我正在使用CloudKit来存储用户数据,并希望在更改记录或创建新记录时获得推送通知.但它不起作用......
我注册了这样的订阅:
- (void) updateCloudSubscriptions {
NSPredicate *allPredicate = [NSPredicate predicateWithFormat:@"TRUEPREDICATE"];
CKSubscription *newOrUpdateSubscription = [[CKSubscription alloc]
initWithRecordType:kMyRecordType predicate:allPredicate options:
(CKSubscriptionOptionsFiresOnRecordCreation | CKSubscriptionOptionsFiresOnRecordUpdate)];
CKNotificationInfo *newOrUpdateNotificationInfo = [CKNotificationInfo new];
newOrUpdateNotificationInfo.shouldBadge = NO;
newOrUpdateNotificationInfo.shouldSendContentAvailable = YES;
newOrUpdateSubscription.notificationInfo = newOrUpdateNotificationInfo;
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:kMyContainerID]
publicCloudDatabase];
[publicDatabase saveSubscription:newOrUpdateSubscription
completionHandler:^(CKSubscription *theSubscription, NSError *saveError) {
if (saveError){
//error handling
}
NSLog(@"Subscription created");
}];
}
Run Code Online (Sandbox Code Playgroud)
这成功了.在CloudKit仪表板上,正确创建订阅.
在我的AppDelegate中,我现在有以下内容:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:
(UIUserNotificationTypeNone | UIUserNotificationTypeAlert …Run Code Online (Sandbox Code Playgroud) 当应用程序未连接到xcode时,iOS 7静音推送通知在后台不起作用.
我使用了以下有效负载,当应用程序在后台/前台/后台并连接到xcode时,控件进入应用程序:didReceiveRemoteNotification:fetchCompletionHandler方法
但是当应用程序处于后台并且未连接到xcode时,此方法永远不会被调用.
使用的有效负载:
{"content-available":1,"声音":""}
根据Apple的文档,我可以通过"content-available" = 1在aps有效负载字典中添加键值来注册静默通知.当安静通知到来时,我希望我的应用程序在后台唤醒.我在info.plist中设置了App downloads content in response to push notifications值Required background modes
这是我的有效载荷字典
{"aps":
{
"alert":"Notification alert","badge":1,"sound":"default","content-available":1
}
}
Run Code Online (Sandbox Code Playgroud)
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
当我的应用程序处于后台时,我正在收到回调.但我的问题是,当我们的应用程序处于被杀死状态时,我们可以回调这个或任何其他方法吗?
我不希望我的应用用户看到通知,但我希望我的应用通过静音通知在后台唤醒它来执行某项任务.
任何建议,将不胜感激.
我编写了一个移动应用程序,其中应显示即将发生的事件。该应用程序从服务器下载数据。每24小时分批准备一次数据,并准备在凌晨4点之后获取。这给了我一个绝佳的机会,可以在一夜之间同步它,并在用户打开应用程序时立即提供新数据。
这是我与服务器同步数据的第一种方法。它被宣传为非常强大的功能,但仅在测试环境之外单独使用它是不够的:
我认为可以配置后台获取操作的频率
// Setup background fetch
let timeIntervalEveryHour: NSTimeInterval = 3600
let sharedApp = UIApplication.sharedApplication()
sharedApp.setMinimumBackgroundFetchInterval(timeIntervalEveryHour)
Run Code Online (Sandbox Code Playgroud)
但是它仍然是动态的,我认为对于不经常使用应用程序的用户来说永远不会。
如果禁用了“后台应用程序刷新”(如果设备处于“低功耗模式”下会自动发生),则不会触发后台获取。
还考虑了其他问题,例如设备锁定时的数据保护和完成所有任务的30秒窗口。
因此,我下一步进行了配置,将服务器配置为在批处理就绪后发布静默通知,以发现这还不够:
有时,在应用程序启动时会分发静默推送通知,这可能会导致竞争状况,需要进行手动同步检查。因此,我将尝试通过添加
"alert" = "";有效负载来强制实施此操作。(因为它建议在这里)
为了确保数据始终是最新的(如果不是最近更新的),则当应用程序出现在前台用户时会收到警报,要求您进行手动同步。也可以稍后在“设置”标签中启动。不幸的是,根据分析,大多数获取请求都是手动发出的。
首次运行的情况也得到处理。
我正在考虑使用VOIP通知。即使应用被强行杀死,他们也应将其唤醒。但是我担心这会导致应用程序被拒绝。
有什么我想念的吗?我知道后台同步取决于多种因素,可能没有互联网连接等,但是有什么方法可以使其更可靠?
我正在寻找实现静默本地推送通知的方法.我想在用户超出范围时向用户发送静默通知.