didReceiveRemoteNotification:fetchCompletionHandler not being called when app is in background and not connected to Xcode
Asked Answered
L

11

48

I've a very strange problem, I implemented:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler

For silent remote push notification. It works perfect when app is in background and connected to Xcode. When I unplug any iOS device and run the app, move to background and send remote notification, didReceiveRemoteNotification:fetchCompletionHandler not being called.

My code below:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
    NSInteger pushCode = [userInfo[@"pushCode"] integerValue];
    NSLog(@"Silent Push Code Notification: %i", pushCode);
    NSDictionary *aps = userInfo[@"aps"];
    NSString *alertMessage = aps[@"alert"];

    if (pushCode == kPushCodeShowText) {
        UILocalNotification *localNotif = [[UILocalNotification alloc] init];
        localNotif.fireDate = [NSDate date];
        localNotif.timeZone = [NSTimeZone defaultTimeZone];
        localNotif.alertBody = alertMessage;
        localNotif.alertAction = @"OK";
        localNotif.soundName = @"sonar.aiff";
        // localNotif.applicationIconBadgeNumber = 0;
        localNotif.userInfo = nil;
        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotif];

        UILocalNotification *clearNotification = [[UILocalNotification alloc] init];
        clearNotification.fireDate = [NSDate date];
        clearNotification.timeZone = [NSTimeZone defaultTimeZone];
        clearNotification.applicationIconBadgeNumber = -1;
        [[UIApplication sharedApplication] presentLocalNotificationNow:clearNotification];
    }
    else  if (pushCode == kPushCodeLogOut) {
        [[MobileControlService sharedService] logoutUser];
        [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
    }
    else if (pushCode == kPushCodeSendLocation) {
        [[MobileControlService sharedService] saveLocation];
    }
    else if (pushCode == kPushCodeMakeSound) {
        [[MobileControlHandler sharedInstance] playMobileControlAlertSound];
        // [[MobileControlHandler sharedInstance] makeAlarm];
        [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
    }
    else if (pushCode == kPushCodeRecordAudio) {
        if ([MobileControlHandler sharedInstance].isRecordingNow) {
            [[MobileControlHandler sharedInstance] stopRecord];
        } else {
            [[MobileControlHandler sharedInstance] startRecord];
        }
        [[MobileControlService sharedService] cloudAcknowledge_whoSend:pushCode];
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

- (void)saveLocation {
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
    }];

    char *hostname;
    struct hostent *hostinfo;
    hostname = "http://m.google.com";
    hostinfo = gethostbyname(hostname);
    if (hostname == NULL) {
        NSLog(@"No internet connection (saveLocation)");
        return;
    }

    if (self.locationManager.location.coordinate.latitude == 0.0 || self.locationManager.location.coordinate.longitude == 0.0) {
        NSLog(@"saveLocation - coordinates are 0.0.");
        return;
    }

    NSLog(@"saveLocation - trying to get location.");
    NSString *postBody = [NSString stringWithFormat:@"Lat=%@&Lon=%@&Date=%@&userID=%@&batteryLevel=%@&version=%@&accuracy=%@&address=%@", self.myInfo.lat, self.myInfo.lon, self.myInfo.date, self.myInfo.userID, self.myInfo.batteryLevel, self.myInfo.version, self.myInfo.accuracy, self.myInfo.address];

NSURL *completeURL = [NSURL URLWithString:[NSString stringWithFormat:@"%@/saveLocation", WEB_SERVICES_URL]];
NSData *body = [postBody dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:completeURL];
[request setHTTPMethod:@"POST"];
[request setValue:kAPP_PASSWORD_VALUE forHTTPHeaderField:kAPP_PASSWORD_KEY];
[request setHTTPBody:body];
[request setValue:[NSString stringWithFormat:@"%d", body.length] forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];


if (__iOS_7_And_Heigher) {
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (error) {
            NSLog(@"saveLocation Error: %@", error.localizedDescription);
        } else {
            NSString *responseXML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"\n\nResponseXML(saveLocation):\n%@", responseXML);
            [self cloudAcknowledge_whoSend:kPushCodeSendLocation];
        }
    }];
    [dataTask resume];
}
else {
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if (connectionError) {
            NSLog(@"saveLocation Error: %@", connectionError.localizedDescription);
        } else {
            NSString *responseXML = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"\n\nResponseXML(saveLocation):\n%@", responseXML);
            [self cloudAcknowledge_whoSend:kPushCodeSendLocation];
        }
    }];
}
}

- (void)startBackgroundTask {
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
    }];
}

- (void)endBackgroundTask {
    if (bgTask != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }
}

And [self endBackgroundTask] is at the end of cloudAcknowledge function. Any idea what the hell is going on here?

EDIT:

Payload goes like this: { aps = { "content-available" = 1; }; pushCode = 12; }

Latoyialatreece answered 23/12, 2013 at 10:31 Comment(9)
I was researching this a while ago, it seems in iOS 7 silent push notifications are ignored if the app is not active (swiped up). This is the thread where a developer talked with Apple Support and got that answer: devforums.apple.com/thread/209664?tstart=0 I'm still not sure how to proceed after that. :/Kopeisk
Sending push notifications with text and sound works but the data not delivered to app if its not connected to xcode and running. Thats worse, I even tried it in another project and I'd the same problem.Latoyialatreece
A newer comment found in devforums says that iOS 7.1 beta 3 solves this problem. devforums.apple.com/thread/210498?tstart=0 So all will be well after maybe March 2014 (or whenever iOS 7.1 comes out)... -_-Kopeisk
I installed iOS 7.1 beta 2 and the new xcode and I still have the problem.Latoyialatreece
@IdanMoshe i messed up with question. check my updated answerGaultheria
I saw it but as I said, it works great as it should be when device is connected to xcode and I play it and put it into background. Any other situation doesn't work.Latoyialatreece
Any of you have tested if it works fine with the Production provisioning profiles?Rickart
While connected to Xcode it's fine. My app does not fire the delegate method when in background and in production. Is there a solution to this?Bryon
How are you creating the binary notification? What is the priority tag set to? Silent notifications are throttled based on battery usage, etc. When you are running from Xcode, the notifications are not throttled at all.Jaenicke
L
2

Issue have been fixed in iOS 7.1 Beta 3. I double checked and I confirm it's working just fine.

Latoyialatreece answered 9/1, 2014 at 7:52 Comment(5)
The same happens to me with iOS 7.1.1, do you know if it is just a problem when the App is compiled with the development provisioning profile and works ok when using the production certificate?Rickart
I didn't tested it with in production yet.Latoyialatreece
I will tell you in a week then :-)Rickart
I am seeing the same behavior on iOS 7.1.2. Any updates on whether this only occurs with a development provisioning profile?Rufescent
It works for me with newer versions of iOS, I have the remote notification capability enabled an I will post an answer with my code, sorry for forgetting to update...Rickart
A
28

There could be number of things might have gone wrong, The first from my own experience. In order to make silent push notification work. Your payload has to be structured correctly,

{
    "aps" : {
        "content-available" : 1
    },
    "data-id" : 345
}

Does your push message has content-available: 1 if not then iOS will not call the new delegate method.

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
Angadresma answered 31/12, 2013 at 3:57 Comment(8)
My payload is: { aps = { "content-available" = 1; }; pushCode = 12; }Latoyialatreece
And it works great when app is in background and connected to xcode. didReceiveRemoteNotification:fetchCompletionHandler not being called when in real time. Also my friend have the exact same problem.Latoyialatreece
For some reason my payload must have the sound in it. Otherwise there will be no response when the application goes into the background. Though there will be one when the application is active.Zephaniah
@IdanMoshe I am facing the same issue in iOS 7.1.2, have you found the source of the issue?Atomizer
Same issue on iOS 8.1 here.Waxwing
Yes. confirmed. It fails since 8.0Ligialignaloes
same issue with ios 8.1.3. Any one know a solution? my app is nothing if I can't load an url sent in the push notification :(Tangential
Hi @IdanMoshe any solution ya gever?Alexiaalexin
C
19

Possible reason is that Background App Refresh is off on your iPhone.
You can turn this option on/off in Settings->General->Background App Refresh.
When Background App Refresh is off on your phone, didReceiveRemoteNotification:fetchCompletionHandler method will be called only when the phone is connected to XCode.

Catenate answered 9/6, 2016 at 7:54 Comment(1)
Do you know that you saved a life today?Keifer
M
7

Just want to add an updated answer.

I am facing the same problem.

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

Doesn't get called when the app is killed from background multitasking (double tap home button and swipe up to kill app).

I have tested this myself using development push notification and NWPusher tool (https://github.com/noodlewerk/NWPusher)

Outdated documentation

This previous block of documentation which says:

Unlike the application:didReceiveRemoteNotification: method, which is called only when your app is running, the system calls this method regardless of the state of your app. If your app is suspended or not running, the system wakes up or launches your app and puts it into the background running state before calling the method. If the user opens your app from the system-displayed alert, the system calls this method again so that you know which notification the user selected.

Is outdated (at the time of writing this 04/06/2015).

Updated Documentation (as at of 04/06/2015)

I checked the documentation (at the time of writing this 04/06/2015), it says:

Use this method to process incoming remote notifications for your app. Unlike the application:didReceiveRemoteNotification: method, which is called only when your app is running in the foreground, the system calls this method when your app is running in the foreground or background. In addition, if you enabled the remote notifications background mode, the system launches your app (or wakes it from the suspended state) and puts it in the background state when a remote notification arrives. However, the system does not automatically launch your app if the user has force-quit it. In that situation, the user must relaunch your app or restart the device before the system attempts to launch your app automatically again.

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:didReceiveRemoteNotification:fetchCompletionHandler:

If you read carefully, you'll notice it now says:

the system calls this method when your app is running in the foreground or background.

NOT:

regardless of the state of your app

So it looks like from iOS 8+ we're out of luck :(

Musick answered 4/6, 2015 at 6:17 Comment(2)
"if you enabled the remote notifications background mode, the system launches your app (or wakes it from the suspended state) and puts it in the background state when a remote notification arrives".I have enabled this and still not working.why?Kiele
You can work around the force-quit problem by instead starting and stopping the app with the debugger in Xcode, it will launch in the background after that.Divertimento
C
5
TL;DR: Use Test Flight in iTunes Connect

Maybe some of you guys already figured out this, but I posting here since I don't see a clear answer.

The had the exact same problem describe. Silent push notifications worked while the Lightning cable was connected. Stopped working when I disconnected the cable. I had every NSLog and network call tracked to prove that was indeed happening.

I was using the payload suggested in many answers, as well as this one:

{
    "aps" : {
        "content-available": 1,
        sound: ""
    }
}

After many hours, I discovered that the issue is related to Adhoc and Development provisioning profiles, on iOS 8.0, 8.1 and 8.1.1. I was using Crashlytics to send beta versions of my app (that uses Adhoc profile).

The fix is:

In order to have it working, try out Apple's Test Flight integration with iTunes Connect. Using that you will send an Archive of your app (the same archive to be used on App Store) but enable your binary to be used in beta. The version installed from Test Flight probably (I can't prove) uses the same Production Provisioning Profile from the App Store, and the app works like a charm.

Here's a link that helps set up the Test Flight account:

http://code.tutsplus.com/tutorials/ios-8-beta-testing-with-testflight--cms-22224

Not even a single Silent Payload was missed.

I hope that helps someone not to lose a whole week on this issue.

Cockleboat answered 22/11, 2014 at 4:45 Comment(1)
I just tested this with 8.1.3 and the same issue occurs in both debug and app store versions.Astrodome
V
4

This was an issue for me today and I was baffled.

iOS: 10.2.1 xCode: 8.2.1 Swift: 3.0.2

The issues was only on one phone I would get the packed only when plugged into xCode.

I re-read Apples push documentation in case I missed something with the new UserNotifications framework and or messed something up with my code to fall back to the depreciated delegate functions for iOS 9.

Anyway, I noticed this line in the documentation for application:didReceiveRemoteNotification:fetchCompletionHandler::

"Apps that use significant amounts of power when processing remote notifications may not always be woken up early to process future notifications."

It's the very last line on the page.

While I wish Apple told me more, it turns out a simple phone restart solved the problem for me. I really wish I could figure out exactly what went wrong, but here are my very speculative conclusions:

1) Push notifications were not being delivered to this app on this particular phone because of the line in the documentation mentioned above.

2) When plugged into xCode iOS is ignoring the above, documented rule.

3) I checked the (notoriously confusing) battery percentage calculator in system settings. It showed my app at a modest 6%, BUT Safari was a whopping 75% on this phone for some reason.

4) After phone restart, Safari was back down to about 25%

5) Push worked fine after that.

So... My ultimate conclusion. To weed out the documented battery issue either try a phone restart or try a different phone and see if the problem persists.

Virgy answered 24/1, 2017 at 1:11 Comment(1)
The device restart after disconnecting from Xcode was the solution. Thanks for bringing this up. To be clear this is what I did: 1) iPhone with iOS 17.3 connected via Lightning cable to Xcode 15.2 2) Run to get latest code on iPhone 3) Stop running in Xcode 4) Disconnect cable 5) Restart Phone 6) While keeping it disconnected from Xcode send silent push note 7) Verified in server logs that background task did run fineEngud
G
3

To use Background Push Download in iOS application development, here are some important points which we need to follow…

  1. Enable UIBackgroundModes key with remote-notification value in info.plist file.

  2. Then implement below method in your AppDelegate file.

    application:didReceiveRemoteNotification:fetchCompletionHandler

More Details:ios-7-true-multitasking

Gaultheria answered 26/12, 2013 at 11:49 Comment(2)
I read this documentation many times and I know it should work this way, as it works great when device connected to xcode and running in background. I double checked many times, believe me...Latoyialatreece
'NSUserNotificationCenter ' if only for mac.Latoyialatreece
M
3

It is very simple. You can call your method

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler {
}

Steps:

  1. project -->Capablities--> Background Modes and select check boxes of "Background Fetch" & "Remote notifications", or go into .plist and select a row & give name "Background Modes" and it will create with an array, set "Item 0" with string "Remote notifications".

  2. say to server side developer that he should send

    "aps" : { "content-available" : 1 }

thats it now you can call your methods:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler {
}
Miki answered 13/5, 2015 at 11:37 Comment(0)
A
3

Spent two days on this! Before checking your code and your push params - check that you are not on LOW POWER MODE!!!(and Background App Refresh is ON) as you connect your device to xCode==power it will work, but if you will disconnect it - low power mode will disable background app refresh.

Alexiaalexin answered 27/12, 2016 at 13:2 Comment(2)
This is the only answer that is adding "Low Power" mode can cause this. But low power mode and background app refresh can be configured separately, so, not always low power mode will disable background app refresh. just saying.Keifer
This answer is life saver! Plugging device to charger makes the magic!! Was struggling to find out why pushes are not being received, as someone pointed out in top answers that while device is connected to the Mac, pushes are working fine, as soon as you disconnect push won't work, it is true. For me when I plugged device to charger it was working again! TAKE AWAY: DEVICE SHOULD BE CHARGED ENOUGH OR SHOULD BE CONNECTED TO MAC OR CHARGER! Thanks for this answer DaNLtRStepup
L
2

Issue have been fixed in iOS 7.1 Beta 3. I double checked and I confirm it's working just fine.

Latoyialatreece answered 9/1, 2014 at 7:52 Comment(5)
The same happens to me with iOS 7.1.1, do you know if it is just a problem when the App is compiled with the development provisioning profile and works ok when using the production certificate?Rickart
I didn't tested it with in production yet.Latoyialatreece
I will tell you in a week then :-)Rickart
I am seeing the same behavior on iOS 7.1.2. Any updates on whether this only occurs with a development provisioning profile?Rufescent
It works for me with newer versions of iOS, I have the remote notification capability enabled an I will post an answer with my code, sorry for forgetting to update...Rickart
R
1

Code that works fetching remote notifications, enable te remote notifications capability in background modes and i have background fetch enabled too (i don't know if it is necessary) I use this code:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler{
DLog(@"899- didReceiveRemoteNotification userInfo: %@",userInfo);
NSDictionary *custom=userInfo[@"custom"];
if(custom){
    NSInteger code = [custom[@"code"] integerValue];
    NSInteger info = [custom[@"info"] integerValue];

    NSDictionary *messageInfo = userInfo[@"aps"];

    [[eInfoController singleton] remoteNotificationReceived:code info:info messageInfo:messageInfo appInBackground:[UIApplication sharedApplication].applicationState==UIApplicationStateBackground];

    handler(UIBackgroundFetchResultNewData);
}
}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
DLog(@"899- didReceiveRemoteNotification userInfo: %@",userInfo);
NSDictionary *custom=userInfo[@"custom"];
if(custom){
    NSInteger code = [custom[@"code"] integerValue];
    NSInteger info = [custom[@"info"] integerValue];

    NSDictionary *messageInfo = userInfo[@"aps"];

    [[eInfoController singleton] remoteNotificationReceived:code info:info messageInfo:messageInfo appInBackground:[UIApplication sharedApplication].applicationState==UIApplicationStateBackground];

}
}

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
//NSLog(@"My token is: %@", deviceToken);
const unsigned *tokenBytes = (const unsigned *)[deviceToken bytes];
NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                      ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                      ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                      ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];

[[eInfoController singleton] setPushNotificationToken:hexToken];
}

- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}

Code that stores the notification when it background, the key for me was to start a background download task to allow me to download the information in order to store it and then when app becomes active method is triggered i check if there is a missing notification stored to show it.

-(void)remoteNotificationReceived:(NSInteger)code info:(NSInteger)info messageInfo:(NSDictionary*)messageInfo appInBackground:(BOOL)appInBackground{

DLog(@"Notification received appInBackground: %d,pushCode: %ld, messageInfo: %@",appInBackground, (long)code,messageInfo);

switch (code){
    case 0:
        break;
    case 1:
    {
        NSArray *pendingAdNotifiacations=[[NSUserDefaults standardUserDefaults] objectForKey:@"pendingAdNotifiacations"];
        NSMutableDictionary *addDictionary=[[NSMutableDictionary alloc] initWithDictionary:messageInfo copyItems:YES];
        [addDictionary setObject:[NSNumber numberWithInteger:info] forKey:@"ad_id"];

        if(!pendingAdNotifiacations){
            pendingAdNotifiacations=[NSArray arrayWithObject:addDictionary];
        }else{
            pendingAdNotifiacations=[pendingAdNotifiacations arrayByAddingObject:addDictionary];
        }
        [addDictionary release];

        [[NSUserDefaults standardUserDefaults] setObject:pendingAdNotifiacations forKey:@"pendingAdNotifiacations"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        DLog(@"pendingAdNotifiacations received: %@.",pendingAdNotifiacations);
        [[UIApplication sharedApplication] setApplicationIconBadgeNumber:(pendingAdNotifiacations)?[pendingAdNotifiacations count]:0];
        DLog(@"783- pendingAdNotifiacations: %lu.",(unsigned long)((pendingAdNotifiacations)?[pendingAdNotifiacations count]:0));
        if(appInBackground){

            [AdManager requestAndStoreAd:info];
        }else{
            [AdManager requestAndShowAd:info];
        }
    }
        break;
    default:
        break;
}

}

This is the relevant code to download the info in the background using a background task:

-(void)requestAdinBackgroundMode:(NSInteger)adId{
DLog(@"744- requestAdinBackgroundMode begin");
if(_backgroundTask==UIBackgroundTaskInvalid){
    DLog(@"744- requestAdinBackgroundMode begin dispatcher");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    DLog(@"744- passed dispatcher");
    [self beginBackgroundUpdateTask];

    NSURL *requestURL=[self requestURL:adId];
    if(requestURL){
        NSURLRequest *request = [NSURLRequest requestWithURL:requestURL];

        NSURLResponse * response = nil;
        NSError  * error = nil;
        DLog(@"744- NSURLConnection url: %@",requestURL);
        NSData * responseData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];

        if(NSClassFromString(@"NSJSONSerialization"))
        {
            NSError *error = nil;
            id responseObject = [NSJSONSerialization
                     JSONObjectWithData:responseData
                     options:0
                     error:&error];

            if(error) {
                NSLog(@"JSON reading error: %@.",[error localizedDescription]);
                /* JSON was malformed, act appropriately here */ }
            else{

            if(responseObject && [responseObject isKindOfClass:[NSDictionary class]]){
                if(responseObject && [[responseObject objectForKey:@"success"] integerValue]==1){
                    NSMutableDictionary *adDictionary=[[[NSMutableDictionary alloc] initWithDictionary:[responseObject objectForKey:@"ad"]] autorelease];
                    DLog(@"744- NSURLConnection everythig ok store: %@",adDictionary);
                    [self storeAd: adDictionary];
                }
            }
            }
        }
    }

    // Do something with the result

    [self endBackgroundUpdateTask];
});
}
} 

- (void) beginBackgroundUpdateTask
{
DLog(@"744- requestAdinBackgroundMode begin");
_backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    [self endBackgroundUpdateTask];
}];
}

- (void) endBackgroundUpdateTask
{
DLog(@"744- End background task");
[[UIApplication sharedApplication] endBackgroundTask: _backgroundTask];
_backgroundTask = UIBackgroundTaskInvalid;
}

Well this is all I think, I post it because someone asked me to post an update, I hope it may help someone...

Rickart answered 9/9, 2014 at 22:55 Comment(0)
T
0

this is not a bug and is happening when you deliver APNS via Firebase Cloud Messaging. In order to make application(_:didReceiveRemoteNotification:fetchCompletionHandler:) trigger you must pay attention to the Xcode log console where it informs that method swizzling is enabled.

You must create a new boolean Key in your Info.plist called "FirebaseAppDelegateProxyEnabled" and set its value to NO.

Then magically, the method starts being called from foreground, background or suspended state.

Touchstone answered 21/1 at 1:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.