1.介绍

2.方法

3.第三方调用(Open URL)

3.通知

介绍

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

 

方法

//当应用程序启动时(不包括已在后台的情况下转到前台),调用此回调。
– (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]];
    }
}

   本地通知

     //设置本地通知

#import <UserNotifications/UserNotifications.h>

实现代理

UNUserNotificationCenterDelegate
 
    /*
         注册通知(推送)
         申请App需要接受来自服务商提供推送消息
         */
        if (@available(iOS 10.0, *)) {
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            center.delegate = self;
            [center requestAuthorizationWithOptions:UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge completionHandler:^(BOOL granted, NSError * _Nullable error) {
                if (!granted) {
                    
                }
            }];
            
            // 注册远程通知
            [[UIApplication sharedApplication] registerForRemoteNotifications];
        }
 
    if (@available(iOS 10.0, *)) {
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
            UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
            content.title = @"title";
            content.body = @"body";
            content.badge = 0;
            content.userInfo = @{};
        content.sound=[UNNotificationSound defaultSound];
        
            NSTimeInterval timeInterval = [[NSDate dateWithTimeIntervalSinceNow:3] timeIntervalSinceNow];
            // repeats,是否重复,如果重复的话时间必须大于60s,要不会报错
            UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:timeInterval repeats:NO];
            UNNotificationRequest *reqeust = [UNNotificationRequest requestWithIdentifier:@"noticeIdentifier" content:content trigger:trigger];
            [center addNotificationRequest:reqeust withCompletionHandler:^(NSError * _Nullable error) {
                if (error) {
                    DLog(@"error");
                }
            }];
        }
 
//代理回调,不实现不会通知弹窗
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    completionHandler(UNNotificationPresentationOptionSound | UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}