在Appdelgate中判断程序入口

需求:

1、用户正常启动程序。
1、程序在后台时,接收到远程消息推送,用户点击推送消息跳转到相应界面。
2、用户点击苹果左侧的widget功能时,跳转到相应界面。
需要在app delegate中判断程序是从哪个入口进入的。

摘抄部分:

摘抄博客地址

当应用程序启动时执行,应用程序启动入口。只在应用程序启动时执行一次。application参数用来获取应用程序的状态、变量等,值得注意的是字典参数:(NSDictionary *)launchOptions,该参数存储程序启动的原因。

1、若用户直接启动,lauchOptions内无数据;
2、若由其他应用程序通过openURL:启动,则UIApplicationLaunchOptionsURLKey对应的对象为启动URL(NSURL),UIApplicationLaunchOptionsSourceApplicationKey对应启动的源应用程序的bundle ID (NSString);
3、若由本地通知启动,则UIApplicationLaunchOptionsLocalNotificationKey对应的是为启动应用程序的的本地通知对象(UILocalNotification);
4、若由远程通知启动,则UIApplicationLaunchOptionsRemoteNotificationKey对应的是启动应用程序的的远程通知信息userInfo(NSDictionary);
5、其他key还有UIApplicationLaunchOptionsAnnotationKey,UIApplicationLaunchOptionsLocationKey, UIApplicationLaunchOptionsNewsstandDownloadsKey。
如果要在启动时,做出一些区分,那就需要在下面的代码做处理。
比如:应用可以被某个其它应用调起(作为该应用的子应用),要实现单点登录,那就需要在启动代码的地方做出合理的验证,并跳过登录。

实现:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      //判断程序是从哪个入口进入的
    if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsRemoteNotificationKey]) {//用户是点击通知栏推送启动的
        // apn 内容获取:
        NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
        NSDictionary *apsDic = [remoteNotification objectForKey:@"aps"];
        
        NSString *message = [apsDic objectForKey:@"alert"];
        //NSString *badge = [apsDic objectForKey:@"badge"];//红点数量
        //NSString *sound = [apsDic objectForKey:@"sound"];//声音
        NSString *voaUrl = [remoteNotification objectForKey:@"url"];
        NSString *voaId = [remoteNotification objectForKey:@"id"];
        
        if (voaId && ([voaId integerValue] > 0)) {
            
            [self pushNewsDetailVC:voaId];//推送到新闻详情页
  
        }else if (voaUrl && ![@""isEqualToString:voaUrl]){//http://www.iyuba.com
            NSString *url = [NSString stringWithFormat:@"http://%@", voaUrl];
            //用手机浏览器打开
            if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]]) {
                [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];
            }
            
        }  
        NSUserDefaults *notificationDic = [NSUserDefaults standardUserDefaults];
        [notificationDic setObject:remoteNotification forKey:@"notification"];
        
        
    }else if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsURLKey]){
        NSLog(@"通过openURL打开,即点击widget进来的");
        
        NSURL *openUrl = [launchOptions objectForKey: UIApplicationLaunchOptionsURLKey];
        NSString *urlStr = openUrl.absoluteString;
        urlStr = [urlStr substringFromIndex:27];//WidgetOpenViewController://1035
        
        [self pushNewsDetailVC:urlStr];//推送到新闻详情页
        
//        UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"通过openURL打开" message:[NSString stringWithFormat:@"%@",urlStr] delegate:self cancelButtonTitle:@"我知道了" otherButtonTitles:nil];
//        [alertView show];
        
    }else{
        NSLog(@"用户是正常启动的程序");
    }

}

在此记录,以便以后查看,也可让更多需要此需求的人得到解答。
——凡几多

你可能感兴趣的:(在Appdelgate中判断程序入口)