相关疑难解决方法(0)

如果用户强行退出,iOS会将我的应用程序启动到后台吗?

我通过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会执行后台任务吗?

push-notification apple-push-notifications ios ios7

217
推荐指数
4
解决办法
12万
查看次数

Firebase无声apns通知

有没有办法使用google的firebase发送静音APNS?似乎如果应用程序在后台,它将始终向用户显示通知.

谢谢?

push-notification apple-push-notifications firebase silentpush firebase-cloud-messaging

24
推荐指数
5
解决办法
3万
查看次数

CloudKit推送通知didReceiveRemoteNotification从未调用过

我正在使用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)

macos objective-c apple-push-notifications ios cloudkit

9
推荐指数
2
解决办法
2629
查看次数

当应用程序未连接到xcode时,iOS 7静音推送通知在后台不起作用

当应用程序未连接到xcode时,iOS 7静音推送通知在后台不起作用.

我使用了以下有效负载,当应用程序在后台/前台/后台并连接到xcode时,控件进入应用程序:didReceiveRemoteNotification:fetchCompletionHandler方法

但是当应用程序处于后台并且未连接到xcode时,此方法永远不会被调用.

使用的有效负载:

{"content-available":1,"声音":""}

ios7

5
推荐指数
1
解决办法
1188
查看次数

Apple的无声推送通知能否在后台启动我的应用程序?

根据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 当我的应用程序处于后台时,我正在收到回调.但我的问题是,当我们的应用程序处于被杀死状态时,我们可以回调这个或任何其他方法吗?

我不希望我的应用用户看到通知,但我希望我的应用通过静音通知在后台唤醒它来执行某项任务.

任何建议,将不胜感激.

apple-push-notifications ios

5
推荐指数
2
解决办法
4024
查看次数

在iOS上可靠的后台同步

前言

我编写了一个移动应用程序,其中应显示即将发生的事件。该应用程序从服务器下载数据。每24小时分批准备一次数据,并准备在凌晨4点之后获取。这给了我一个绝佳的机会,可以在一夜之间同步它,并在用户打开应用程序时立即提供新数据。

后台获取

这是我与服务器同步数据的第一种方法。它被宣传为非常强大的功能,但仅在测试环境之外单独使用它是不够的:

  • 没有办法强制后台提取以确切的时间间隔执行。

我认为可以配置后台获取操作的频率

// Setup background fetch
let timeIntervalEveryHour: NSTimeInterval = 3600
let sharedApp = UIApplication.sharedApplication()
sharedApp.setMinimumBackgroundFetchInterval(timeIntervalEveryHour)
Run Code Online (Sandbox Code Playgroud)

但是它仍然是动态的,我认为对于不经常使用应用程序的用户来说永远不会。

  • 如果禁用了“后台应用程序刷新”(如果设备处于“低功耗模式”下会自动发生),则不会触发后台获取。

  • 还考虑了其​​他问题,例如设备锁定时的数据保护和完成所有任务的30秒窗口。

远程(静默)通知

因此,我下一步进行了配置,将服务器配置为在批处理就绪后发布静默通知,以发现这还不够:

  • 如果应用程序被用户强行杀死或重新启动设备,则不会处理通知。
  • 速率限制。交货将延迟,这取决于Apple未明确指定的多种因素,但可能取决于电池寿命,手机是否使用手机等。

    有时,在应用程序启动时会分发静默推送通知,这可能会导致竞争状况,需要进行手动同步检查。因此,我将尝试通过添加"alert" = "";有效负载来强制实施此操作。(因为它建议在这里)

  • 用户可以通过取消设置“后台应用刷新”来禁用静默推送通知- 源

手动同步

为了确保数据始终是最新的(如果不是最近更新的),则当应用程序出现在前台用户时会收到警报,要求您进行手动同步。也可以稍后在“设置”标签中启动。不幸的是,根据分析,大多数获取请求都是手动发出的。

首次运行的情况也得到处理。

下一步

我正在考虑使用VOIP通知。即使应用被强行杀死,他们也应将其唤醒。但是我担心这会导致应用程序被拒绝。

问题

有什么我想念的吗?我知道后台同步取决于多种因素,可能没有互联网连接等,但是有什么方法可以使其更可靠?

xcode synchronization ios

5
推荐指数
0
解决办法
311
查看次数

iOS无声本地推送通知目标c?

我正在寻找实现静默本地推送通知的方法.我想在用户超出范围时向用户发送静默通知.

push push-notification ios

2
推荐指数
1
解决办法
2653
查看次数