zoukankan      html  css  js  c++  java
  • iOS,AppDelegate介绍

    1.介绍

    2.方法

    3.第三方调用(Open URL)

    3.通知

    介绍

           AppDelegate就是iOS的垃圾场。App的生命周期管理?URL处理?通知?CoreData?大量第三方SDK的初始化?还有那些看起来放到哪里都不合适的函数?统统都被塞到AppDelegate.m里面

           这所有之中,application:didFinishLaunchingWithOptions:是最拥挤的一个。对于许多开发者来说,launchOptions参数如同Java main函数的String[]参数一样,被忽视了。然而,摆在眼前的事实是,launchOptions包含了许多关键性知识,涉及了app在iOS上的众多启动方式 

    方法

    //当应用程序启动时(不包括已在后台的情况下转到前台),调用此回调。
    – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
    //当应用程序全新启动,或者在后台转到前台,完全激活时,都会调用这个方法。如果应用程序是以前运行在后台,这时可以选择刷新用户界面。
    – (void)applicationDidBecomeActive:(UIApplication *)application;
    //当应用从活动状态主动到非活动状态的应用程序时会调用这个方法。这可导致产生某些类型的临时中断(如传入电话呼叫或SMS消息)。或者当用户退出应用程序,它开始过渡到的背景状态。使用此方法可以暂停正在进行的任务,禁用定时器,降低OpenGL ES的帧速率。游戏应该使用这种方法来暂停游戏。
    – (void)applicationWillResignActive:(UIApplication *)application;
    //当用户通过其它应用启动本应用时,会回调这个方法,url参数是其它应用调用openURL:方法时传过来的。
    – (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation NS_AVAILABLE_IOS(4_2);
    //当应用可用内存不足时,会调用此方法,在这个方法中,应该尽量去清理可能释放的内存。如果实在不行,可能会被强行退出应用。
    – (void)applicationDidReceiveMemoryWarning:(UIApplication *)application;
    //当应用退出,并且进程即将结束时会调到这个方法,一般很少主动调到,更多是内存不足时是被迫调到的,我们可以在这个方法里做一些数据存储操作。
    – (void)applicationWillTerminate:(UIApplication *)application;
    //当客户端注册远程通知时,会回调下面两个方法。
    //如果成功,则回调第一个,客户端把deviceToken取出来发给服务端,push消息的时候要用。
    //如果失败了,则回调第二个,可以从error参数中看一下失败原因。
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NS_AVAILABLE_IOS(3_0);
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0);
    //当应用在前台运行中,收到远程通知时,会回调这个方法。
    //当应用在后台状态时,点击push消息启动应用,也会回调这个方法。
    – (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
    //当应用收到本地通知时会调这个方法,如果在前台运行状态直接调用,如果在后台状态,点击通知启动时,也会回调这个方法
    – (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification NS_AVAILABLE_IOS(4_0);
    //当用户从台前状态转入后台时,调用此方法。使用此方法来释放资源共享,保存用户数据,无效计时器;并储存足够的应用程序状态信息的情况下被终止后,将应用程序恢复到目前的状态。如果您的应用程序支持后台运行,这种方法被调用,否则调用applicationWillTerminate:用户退出。
    – (void)applicationDidEnterBackground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);
    //当应用在后台状态,将要进行动前台运行状态时,会调用此方法。如果应用不在后台状态,而是直接启动,则不会回调此方法。
    – (void)applicationWillEnterForeground:(UIApplication *)application NS_AVAILABLE_IOS(4_0);

    第三方调用(Open URL)

          application:didFinishLaunchingWithOptions: 通过该方法通知的第三方app打开该应用(一般在应用被杀死情况下会进入)。

          -(BOOL)application: openURL: options:通过该方法通知的第三方app打开该应用((该方法在app还未被杀掉会进入这个)


          launchOptions里面还会附带下面这些key:
    UIApplicationLaunchOptionsURLKey: 标示了该应用程序是为了打开一个URL启动。这个Key对应的值是一个NSURL对象,表示要打开的URL。
    UIApplicationLaunchOptionsSourceApplicationKey: 标示了要求启动你的程序的那个app。对应的值是一个NSString,表示那个app的bundle ID。
    UIApplicationLaunchOptionsAnnotationKey: 标示了要求打开URL的那个app提供的自定义数据。对应的值是一个property-list类型的对象,包含自定义的数据。 

    通知

         推送通知

         //注册推送通知

    //注册推送通知
    -(void)registerRemoteNotification{
        // iOS8 下需要使用新的 API
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
            UIUserNotificationType myTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
            
            UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil];
            [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        }else {
            [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound];
        }
    }
    // 在 iOS8 系统中,还需要添加这个方法。通过新的 API 注册推送服务
    -(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
        [application registerForRemoteNotifications];
    }
    
    //注册推送服务成功获取deviceToken
    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
        //官方文档上建议开发者在每次启动应用时应该都向APNS获取device token并上传给服务器。
        //处理空格和<>
        NSString *deviceTokenString=[[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""]stringByReplacingOccurrencesOfString: @" " withString: @""];
        NSLog(@"deviceToken:%@",deviceTokenString);
    }
    //注册推送服务失败
    -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
        NSLog(@"注册推送通知失败:%@",[error.userInfo valueForKey:@"NSLocalizedDescription"]);
    }

       //接收推送通知

          接收到推送通知后,如果app当前处于前台运行状态,appDelgate的 application:didReceiveRemoteNotification:方法会被调用。然而,当app是因为用户滑动通知中心的推送消息而 启动时,application:didFinishLaunchingWithOptions:方法会被调用。这个时候,launchOption里面 会包含名为UIApplicationLaunchOptionsRemoteNotificationKey的key: 表明app有一个推送通知等待处理。这个key对应的值是一个包含了推送通知负载信息的NSDictionary。

    //这样看来,就有两个地方要写处理推送通知的代码。因此,一个通常的做法是在application:didFinishLaunchingWithOptions:里面手动调用application:didReceiveRemoteNotification::
    - (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
            [self application:application didReceiveRemoteNotification:launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]];
        }
    }

       本地通知

         //设置本地通知

    //设置本地通知
    -(void)registerLocalNotification{
        UILocalNotification *notification=[[UILocalNotification alloc] init];
       
        if (notification == nil) {
            return;
        }
        //设置本地通知的触发时间(如果要立即触发,无需设置),这里设置为20妙后
        notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
        //设置本地通知的时区
        notification.timeZone = [NSTimeZone defaultTimeZone];
        //通知内容
        notification.alertBody=@"起床了小笨蛋。。。";
        //通知被触发时播放的声音
        notification.soundName=UILocalNotificationDefaultSoundName;

         //本地自定义声音文件,一遍2到4秒

         //notification.soundName=@"BELL.WAV";

    //    //通知重复提示的单位可以是天、周、月
    //    notification.repeatInterval=NSCalendarUnitMinute;
        
        //在规定的日期触发通知
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];
        
        //立即触发一个通知
        //    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
    }

         与推送通知不同,UIApplication的delegate方法提供了一个统一的处理本地通知的地方。如果一个app是被本地通知启动的,会先 调用application:didReceiveLocalNotification:方法,然后才会调用 application:didFinishLaunchingWithOptions:(因此,就不需要在 application:didFinishLaunchingWithOptions:里面手动调用 application:didReceiveLocalNotification了)。

    本地通知在launchOptions里面的key为UIApplicationLaunchOptionsLocalNotificationKey,对应的值为UILocalNotification对象

  • 相关阅读:
    BootStrap弹出框插件popover简单实例
    peity(jQuery 插件可以将元素内容转换为一个小的 <svg> 饼图,圆环图,条形图和折线图)
    java生成API文档
    搭建eova开发环境
    搭建jfinal+maven框架
    注解Annotation
    【转】hive时间函数
    [hive][转]hive修改 表/分区语句
    【java findbugs集锦】【转】May expose internal representation by incorporating reference to mutable object
    [java学习笔记]继承和组合
  • 原文地址:https://www.cnblogs.com/douniwanxia/p/6409799.html
Copyright © 2011-2022 走看看