Is there a way to open urls received in a push notification without opening the app in ios 10?

╄→尐↘猪︶ㄣ 提交于 2019-12-02 14:53:13

问题


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

回答1:


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.



来源:https://stackoverflow.com/questions/41887690/is-there-a-way-to-open-urls-received-in-a-push-notification-without-opening-the

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!