0

I am trying to open a url that is passed in a push notification in ios 10. So far I haven't found a way to open a the url without opening the app. Is there a way to open urls received in a push notification without opening the app?

I have found a work-around to open the url (the work-around works for ios <10), but then again the app opens up first.

Update:

I've noticed that for the device (iOS 10.0) The following mentohds get involked application:didRegisterForRemoteNotificationsWithDeviceToken userNotificationCenter:willPresentNotification: userNotificationCenter:didReceiveNotificationResponse:

But -application:didReceiveRemoteNotification:fetchCompletionHandler: and -application:didReceiveRemoteNotification: aren't called.

I'm new to ios and this is how far I have gotten:

AppDelegate.h

#import <UIKit/UIKit.h>
#import <UserNotifications/UserNotifications.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate,UNUserNotificationCenterDelegate>

@property (strong, nonatomic) UIWindow *window;


@end

AppDelegate.m

#import "AppDelegate.h"

@interface AppDelegate ()


@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10)
{
    UNUserNotificationCenter * notificationCenter = [UNUserNotificationCenter currentNotificationCenter];
    notificationCenter.delegate = self;
    [notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound completionHandler:^(BOOL granted, NSError * error)
     {
         [[UIApplication sharedApplication] registerForRemoteNotifications];
         if (error)
         {
             NSLog(@"Auth. error:%@",[error localizedDescription]);
         }
     }];
    [notificationCenter getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * settings) {

    }];

}
else
{
    UIUserNotificationType type = UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound;
    UIUserNotificationSettings * settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    [[UIApplication sharedApplication] registerForRemoteNotifications];


}

return YES;
}
...
#pragma mark Push Notification methods
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
NSLog(@"didReceiveRemoteNotification:");
NSString * message = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
NSString * urlString = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
NSLog(@"1 Received Push URL: %@", urlString);

NSURL * url = [NSURL URLWithString:urlString];

if(url!=nil)
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10) {
        // iOS 10 and above
        [[UIApplication sharedApplication] openURL:url options:[NSDictionary dictionary] completionHandler:nil];
    }
    else
    {
        [[UIApplication sharedApplication] openURL:url]; // iOS <10
    }
}

if (application.applicationState == UIApplicationStateInactive)
{
    NSLog(@"Application inactive");
    [[NSUserDefaults standardUserDefaults] setValue:message forKey:@"Push_Message"];
}
else if (application.applicationState == UIApplicationStateBackground)
{
    NSLog(@"Application in background");
}
else
{
    NSLog(@"Application active");
}
}
#pragma mark Notification Registration methods
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString* token = [[[[deviceToken description]
                     stringByReplacingOccurrencesOfString: @"<" withString: @""]
                    stringByReplacingOccurrencesOfString: @">" withString: @""]
                   stringByReplacingOccurrencesOfString: @" " withString: @""];

NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken:\n%@",token);

}
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"Error:%@",[error localizedDescription]);
NSLog(@"Suggest:%@",[error localizedRecoverySuggestion]);
}
#pragma mark App Push notification methods

-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
NSLog(@"didRegisterUserNotificationSettings");
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"UserInfo: %@",userInfo);
NSString * messageString = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
NSLog(@"Message:%@",messageString);
NSString * messageurl = [[userInfo valueForKey:@"aps"] valueForKey:@"alert"];
NSLog(@"2 Received Push URL: %@", messageurl);

NSURL * url = [NSURL URLWithString:messageurl];

if(url!=nil)
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10) {
        // iOS 10 and above
        [[UIApplication sharedApplication] openURL:url options:[NSDictionary dictionary] completionHandler:nil];
    }
    else
    {
        [[UIApplication sharedApplication] openURL:url]; // iOS <10
    }
}

[[NSNotificationCenter defaultCenter] postNotificationName:@"PushMessage" object:self userInfo:@{@"alertString":messageString}];
}
#pragma mark UNUserNotificationCenterDelegate methods

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler
{
NSLog(@"didReceiveNotificationResponse");
//--URL click--//

//Kindly suggest what can be done here?
completionHandler(UNNotificationPresentationOptionAlert);
}
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
NSLog(@"willPresentNotification");
completionHandler(UNNotificationPresentationOptionAlert);
}


@end
Prashant
  • 336
  • 3
  • 18
  • 1
    I guess you can use silent push notification for this purpose. Silent push notification can be received without letting user know, and when app is in background mode. Please refer http://stackoverflow.com/a/36695473/1922188 – Anoop Nyati Jan 27 '17 at 05:54
  • I have configured the background mode to receive the notification. But I want the user to click the notification and then be redirected to the url, but without the app being opened. It is possible in android, but is it possible in ios? – Prashant Jan 27 '17 at 06:37

1 Answers1

0

Hopefully you can't control the behaviour of the push before launching the app. You get control over the push only after the app launched.

Dinesh
  • 41
  • 1
  • 6