美文网首页
在Appdelgate中判断程序入口

在Appdelgate中判断程序入口

作者: 凡几多 | 来源:发表于2017-03-17 16:22 被阅读112次

    需求:

    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中判断程序入口

          本文链接:https://www.haomeiwen.com/subject/uxmenttx.html