2019-09-04 15:49:46 u013983033 阅读数 1191

1 、注册通知

//后台进前台通知 UIApplicationDidBecomeActiveNotification
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];

//进入后台UIApplicationDidEnterBackgroundNotification
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];

2、实现通知方法

//进入后台方法
- (void)didEnterBackground {
        NSLog(@"%@", NSStringFromSelector(_cmd));
}

    //每次后台进前台都会执行这个方法
- (void)didBecomeActive {
        NSLog(@"%@", NSStringFromSelector(_cmd));
}

3 、移除通知

- (void)dealloc {
    [[NSNotificationCenter defaultCenter]removeObserver:self]; //移除通知
}
2016-06-04 10:35:14 xy_26207005 阅读数 1649

iOS本地通知

  • 所有的逻辑都在AppDelegate中, 一个程序更新后用户长时间没有使用的提醒
  • 由本地应用触发的, 它是基于时间行为的一种通知形式, 例如闹钟, 提醒事项, 过了一段时间后台程序提醒用户使用该应用

iOS 通知机制又叫做消息机制, 包括(本地通知, 推送通知)

  • 两种通知在iOS中的表现一致, 可以通过横幅或者弹框两种形式来告诉用户, 点击通知可以

打开应用程序, 但是两种实现原理却不相同

创建一个本地通知分为以下几个步骤

  1. 创建UILocationNotification
  2. 设置处理通知的时间fireDate
  3. 配置通知的内容 : 通知主体, 通知声音, 图片数字等
  4. 配置通知传递的自定义数据参数userinfo (可选)
  5. 调用通知, 可以使用scheduleLocationNotification 按计划调度一个通知. 也可以

presentLocationNotificationNow立即调用通知

进入应用后如果没有注册通知, 需要首先注册通知请求用户允许通知, 一旦调用完注册方法, 无论用户是否选择允许通知此刻都会调用应用程序 -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings 代理方法

在这个方法中根据用户的选择, 如果允许通知, 则会按照前面的步骤创建通知并在一定时间后执行

需要注意

  1. 在使用通知之前必须注册通知类型(声音, 图标, 内容)
  2. 本地通知是由操作系统统一调度, 只有关闭应用, 或者应用进入后台才能收到通知
  3. 通知的声音是由iOS系统播放的, 格式必须是Linear PCM、
    MA4(IMA/ADPCM)、µLaw、aLaw中的一种, 播放时间的限制(30s), 否则被系统声音替换,自定义的声音必须放到main Boundle中
  4. 本地通知的数量有限, 最近的本地通知最多只能有64个, 超过这个数量将被系统忽略

关于通知参数的接收问题notification.userinfo 中的绑定附加信息

如果用户关闭应用程序, 那么用户点击通知信息,会走 finishLaunchingWith这个方法

如果应用处于后台运行状态, 会走- didReceiveLocationNotification 会得到notification这个对象, 同时也会得到userinfo

在finish这个 方法中可以访问 launchOptions中键为UIApplicationLaunchOptionsLocalNotificationKey对象, 这个对象就是发送的通知, 由此对象再访问userinfo, 可以将userinfo写入文件方便关闭程序后再通过点击通知打开应用userinfo的过程

具体代码

/** 
 *  iOS 通知机制又叫做消息机制, 包括(本地通知, 推送通知) 
 两种通知在iOS中的表现一致, 可以通过横幅或者弹框两种形式来告诉用户, 点击通知可以打开应用程序 
 但是两种实现原理却不相同 
 */  

/** 
 *  本地通知 : 所有的逻辑都在AppDelegate中, 一个程序更新后用户长时间没有使用的提醒 
 由本地应用触发的, 它是基于时间行为的一种通知形式, 例如闹钟, 提醒事项, 过了一段时间后台程序提醒用户使用该应用, 
 创建一个本地通知分为以下几个步骤: 
 1. 创建UILocationNotification 
 2. 设置处理通知的时间fireDate 
 3. 配置通知的内容 : 通知主体, 通知声音, 图片数字等 
 4. 配置通知传递的自定义数据参数userinfo (可选) 
 5. 调用通知, 可以使用scheduleLocationNotification 按计划调度一个通知. 也可以presentLocationNotificationNow立即调用通知 

 进入应用后如果没有注册通知, 需要首先注册通知请求用户允许通知, 一旦调用完注册方法, 无论用户是否选择允许通知此刻都会调用应用程序 
 -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings代理方法 
 在这个方法中根据用户的选择, 如果允许通知, 则会按照前面的步骤创建通知并在一定时间后执行 

 */  
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  


    // 如果已经获得发送通知的授权则创建本地通知, 否则请求授权, 注意: 如果不请求授权在设置中没有对应的通知设置, 如果从来没有发送过请求, 即使通过设置也打不开消息允许设置  
    if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {  
        [self addLocationNotification];  
    }else {  
        // 必须要注册通知类型  
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]];  
    }  


    // Override point for customization after application launch.  
    return YES;  
}  



#pragma mark ---- 调用过用户注册通知方法之后执行(调用完 registerUserNotificationSettings:之后执行的)  
-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings  
{  
    if (notificationSettings.types != UIUserNotificationTypeNone) {  
        [self addLocationNotification];  
    }  
}  

#pragma mark ---- 进入前台后设置消息信息  
- (void)applicationWillEnterForeground:(UIApplication *)application  
{  
    // 进入前台取消应用消息图标  
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];  
}  


#pragma mark ---- 添加本地通知  
- (void)addLocationNotification  
{  
    // 定义本地通知对象  
    UILocalNotification *notification  = [[ UILocalNotification alloc] init];  
    // 设置调用时间----- 当前时间10秒之后  
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10.0];  
    // 通知重复次数  
    notification.repeatInterval = 2;  
    // 当前日历, 使用前对号设置时区等信息, 使其同步  
 //    notification.repeatCalendar = [NSCalendar currentCalendar];  


    // 设置通知的属性  
    // 1. 通知的主体 body  
    notification.alertBody = @"有好玩的东西, 快来尝试吧";  
    // 2. 应用程序图标左上角显示的消息数字  
    notification.applicationIconBadgeNumber = 1;  
    // 3. 待机界面的滑动动作提示  
    notification.alertAction = @"打开应用";  
    // 4. 通过点击通知打开应用时的启动图片, 这里使用默认图片  
    notification.alertLaunchImage = @"Default";  

    // 5. 收到通知时播放的声音, 默认消息声音  
    notification.soundName = UILocalNotificationDefaultSoundName; // 默认系统通知声音  
//    notification.soundName = @"sound.caf"; // 通知声音, 自定义  

    // 6. 设置用户信息  
    notification.userInfo = @{@"ID" : @1, @"user" : @"xiayan"}; // 绑定通知上的其他附加信息  

    // 7. 调用通知  
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];  
}  

/** 
 *  注意: 
 *   
    1. 在使用通知之前必须注册通知类型(声音, 图标, 内容) 
    2. 本地通知是由操作系统统一调度, 只有关闭应用, 或者应用进入后台才能收到通知 
    3. 通知的声音是由iOS系统播放的, 格式必须是Linear PCM、MA4(IMA/ADPCM)、µLaw、aLaw中的一种, 播放时间的限制(30s), 否则被系统声音替换, 自定义的声音必须放到main Boundle中 
    4. 本地通知的数量有限, 最近的本地通知最多只能有64个, 超过这个数量将被系统忽略 
    5. 如果想要移除本地通知可 
 */  
/** 
 *  关于通知参数的接收问题 
 * 
 *  notification.userinfo 中的绑定附加信息 
    如果用户关闭应用程序, 那么用户点击通知信息,会走 finishLaunchingWith 这个方法 
    如果应用处于后台运行状态, 会走- didReceiveLocationNotification 会得到notification这个对象, 同时也会得到userinfo 
    在finish这个 方法中可以访问 launchOptions中键为UIApplicationLaunchOptionsLocalNotificationKey对象, 这个对象就是发送的通知, 由此对象再访问userinfo, 可以将userinfo写入文件方便关闭程序后再通过点击通知打开应用userinfo的过程 
 */  
#pragma mark ---- 移除本地通知, 在不需要的此通知时移除通知  
- (void)removeNotification  
{  
    // 设置取消通知  
    [[UIApplication sharedApplication] cancelAllLocalNotifications];  

}  
2017-07-14 15:45:05 Cloudox_ 阅读数 8622

通知大家都不陌生,其实通知分两种,远程通知和本地通知。

远程通知是指服务器发出的通知,通过苹果的推送然后到达用户设备。本地通知是指不通过网络,直接安装应用后就可以接到通知了,典型的例子是日历、待办、闹钟等应用。

不过就表现形式来说两者基本一样,都会出现在通知中心,都可以出现在锁屏界面,都可以出现在界面上部,都可以添加应用上的红点。

这里我定时不断发送通知,每次收到通知都添加到列表中,点击列表可以复制通知内容。

对于本地通知,iOS 10以前和以后分两种实现方式,这里都放出来。

需要注意的是,现在在Xcode中使用远程通知功能需要在工程的Targets中的Capabilities标签里打开Push Notification权限,且需要APNS证书,不过本地通知是不需要的,可以直接测试接收通知。

iOS 10以上系统的实现

iOS 10以前使用UILocalNotification,iOS开始支持一个新的类库UNUserNotificationCenter,都给了他特定的前缀UN了,可见重视程度。

如上面第一张图所示,要发通知是需要用户同意的,也就是在第一次打开App的时候必须尝试注册通知,如果不注册,那么即使用户去设置中找也无法再通知里找到你的App然后打开。

所以我们需要在AppDelegate.m的application: didFinishLaunchingWithOptions:方法中注册通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 注册通知
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {

        }];


    return YES;
}

这样就会在第一次启动App时向用户索取权限。接下来就可以决定发什么通知以及收到通知后怎么处理了。

我们可以定义一个方法来发通知:

#import <UserNotifications/UserNotifications.h>

……

/**
 iOS 10以后的本地通知
 */
- (void)addlocalNotificationForNewVersion {
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.title = [NSString localizedUserNotificationStringForKey:@"Hello" arguments:nil];
    content.body = [NSString localizedUserNotificationStringForKey:[NSString stringWithFormat:@"Agent-%d",arc4random()%100] arguments:nil];
    content.sound = [UNNotificationSound defaultSound];

    //    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:alertTime repeats:NO];
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"OXNotification" content:content trigger:nil];

    [center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
        NSLog(@"成功添加推送");
    }];
}

发通知的所有内容就在这里了,明显可见content是一个通知体,定义通知的一些内容、声音等,然后放到request中,添加到通知中心就可以了。中间注释了一行是用来重复通知的,第一个参数是重复的时间间隔,最小60s,第二个参数是是否重复。因为60s太长了不便于测试,所以不如在外部写一个定时器,重复调用这个方法就可以了。

要接收通知并处理必须要遵循 UNUserNotificationCenterDelegate 这个协议,上面代码中就设置了delegate是self,然后就可以处理接收通知:

#pragma mark - UNUserNotificationCenterDelegate
// iOS 10收到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {

    NSDictionary * userInfo = notification.request.content.userInfo;
    UNNotificationRequest *request = notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题

    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        NSLog(@"iOS10 前台收到远程通知:%@", body);

    } else {
        // 判断为本地通知
        NSLog(@"iOS10 前台收到本地通知:{\\\\nbody:%@,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@,\\\\nsound:%@,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo);
        [self.dataArray addObject:content];
        [self.timeArray addObject:[self convertNSDateToNSString:[NSDate date]]];
        [self.tableView reloadData];
    }
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
}

我这边的处理是添加到数组中,并且记录通知的时间,好在列表中显示,至于列表怎么显示就不写在这了,需要的同学可以直接看工程代码。

关于iOS 10的通知流程就是这些了。

iOS 10以前系统的实现

老系统的实现其实要素都差不多,只不过提供的类库不一样,一样需要在应用一开始的时候注册通知:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // 注册通知,如果已经获得发送通知的授权则创建本地通知,否则请求授权(注意:如果不请求授权在设置中是没有对应的通知设置项的,也就是说如果从来没有发送过请求,即使通过设置也打不开消息允许设置)
    if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {
        [self addLocalNotificationForOldVersion];
    } else {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound  categories:nil]];
    }


    return YES;
}

添加通知我们也放到一个方法中:

/**
 iOS 10以前版本添加本地通知
 */
- (void)addLocalNotificationForOldVersion {

    //定义本地通知对象
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    //设置调用时间
    notification.timeZone = [NSTimeZone localTimeZone];
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:2.0];//通知触发的时间,10s以后
    notification.repeatInterval = 2;//通知重复次数
    notification.repeatCalendar=[NSCalendar currentCalendar];//当前日历,使用前最好设置时区等信息以便能够自动同步时间

    //设置通知属性
    notification.alertBody = [NSString stringWithFormat:@"Agent-%d",arc4random()%100]; //通知主体
    notification.applicationIconBadgeNumber += 1;//应用程序图标右上角显示的消息数
    notification.alertAction = @"打开应用"; //待机界面的滑动动作提示
    notification.alertLaunchImage = @"Default";//通过点击通知打开应用时的启动图片,这里使用程序启动图片
    notification.soundName = UILocalNotificationDefaultSoundName;//收到通知时播放的声音,默认消息声音
//    notification.soundName=@"msg.caf";//通知声音(需要真机才能听到声音)

    //设置用户信息
    notification.userInfo = @{@"id": @1, @"user": @"cloudox"};//绑定到通知上的其他附加信息

    //调用通知
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
}

可以看到能够设置的东西还是蛮多的。

此外还有几个可能用得到的代理方法:

/**
 应用注册通知后

 @param application 应用
 @param notificationSettings 通知设置
 */
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    if (notificationSettings.types != UIUserNotificationTypeNone) {
        [self addLocalNotificationForOldVersion];
    }
}

/**
 应用进入前台时调用

 @param application 应用
 */
- (void)applicationWillEnterForeground:(UIApplication *)application {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];//进入前台取消应用消息图标
}

/**
 收到通知后回调

 @param application 应用
 @param notification 通知
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(nonnull UILocalNotification *)notification {
    NSLog(@"%@", notification.alertBody);
}

不过我用这个老方法在iOS 10的手机上测试收不到通知,不知道是不是在新系统必须要用新的库。

没什么好结的,以上。


示例工程:https://github.com/Cloudox/OXNotificationTest
版权所有:http://blog.csdn.net/cloudox_

2016-07-27 16:16:43 qq_30970529 阅读数 803

有的时候我们需要APP进入后台后能够自动下载更新一些东西所以这里就说下iOS程序的后台下载任务,前面的博客说过要想进行后台任务就要在plist文件中进行注册,这里注册Required background modes选项,值是App downloads content from the network。当然了你如果不想注册还有个方法就是在Capabilities选项栏下开启Background Modes选项卡并且勾选后台获取Background fetch。
关于后台任务我们主要是在AppDelegate的几个代理方法中进行的,首先在

func applicationDidEnterBackground(application: UIApplication)

APP进入后台方法中我们要设置最小的后台获取时间间隔,这里我们设置最小的时间间隔

 func applicationDidEnterBackground(application: UIApplication) {
       //后台获取数据的时间,我们设置为最短时间
        application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)

    }

然后我们在另外一个代理方法中func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 执行获取方法中真正的实现后台下载任务

 //后台获取数据
    func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
         let url = NSURL(string: "http://img02.tooopen.com/images/20160525/tooopen_sl_163301938812.jpg")
        let task = NSURLSession.sharedSession().dataTaskWithURL(url!) { (data, respones, error) in

            if error != nil {
                //通知后台获取数据失败
                completionHandler(.Failed)
                self.sendLocationNotification("下载失败"+error!.description)
            }else {
                dispatch_async(dispatch_get_main_queue(), {
                   let controller = self.window!.rootViewController as! ViewController
                    if data != nil {
                        let imageload = UIImage(data: data!)
                        controller.imageView?.image = imageload

                        //通知获取数据成功
                        completionHandler(.NewData)
                        //发本地推送
                        self.sendLocationNotification("下载成功")
                    }
                })
            }
        }
        task.resume()
    }

当我们执行获取方法完成后无论是否成功都要给后台任务一个接过通知,这里成功通知数据更新了completionHandler(.NewData) 失败直接通知失败了 completionHandler(.Failed) 并且无论下载成功或者失败我们都会发送一个本地通知

 func sendLocationNotification(message:String) {
        //创建通知
        let notification = UILocalNotification()
        //推送消息
        notification.alertBody = message
        //推送时间
        notification.fireDate = NSDate()
        //角标
        notification.applicationIconBadgeNumber = 1
        //添加本地推送
        UIApplication.sharedApplication().scheduleLocalNotification(notification)

    }

当我们点击推送进入前台后要取消推送清除角标

 func applicationDidEnterBackground(application: UIApplication) {
       //后台获取数据的时间,我们设置为最短时间
        application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)

    }
2013-07-25 11:20:38 ran0809 阅读数 4557

概述


苹果公司为了确保IOS设备能在任何时候都能快速响应,保证用户体验,对后台运行的应用程序进行了限制。在IOS4以后,对第三方应用程序开放了后台处理,但在开放后台处理面很谨慎,只对一组用户经常遇到的任务开放。
IOS支持的后台处理主要有四种类型:

1.挂起


暂停执行代码,保留当前状态。用户返回应用程序时看起来一直在运行,实际上为了不让其占系统资源,任务都停止了。

2.本地通知(local notification)


本地通知与推送通知类似,但是由您编写的应用程序生成,这些通知可显示消息,播放声音甚至更新应用程序的徽章数值。

3.任务特定的后台处理


IOS以优雅的方式处理了一些用户需要的特定任务,比如后台继续播放音乐,或者定位,或者VoIP。可在项目的plist文件中的Required Background Modes中添加。

4.长时间运行的任务的任务完成


要使用任务完成,可在应用程序中对任务进行标记,指出该任务结束后才能安全的挂起应用,一般包括文件的上传,下载,大量计算等等。APPLE对这样标记的任务规定有10分钟来完成其操作,一般情况下这都很充足,10分钟后应用将挂起。

实现本地通知和任务完成的Demo



点击Alert Me 实现即使在关闭应用的情况下,过30秒进行本地通知
点击BackgroundCount 实现挂起的后台处理
两个任务完成时都有声音提醒

准备工作


#import <UIKit/UIKit.h>
//播放系统声音的框架
#import <AudioToolbox/AudioToolbox.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UILabel *countLabel;

- (IBAction)doCount:(id)sender;
- (IBAction)doAlert:(id)sender;

@end

.m文件中声明实例

@interface ViewController ()
{
    int _count;
    NSTimer *_timer;
    UIBackgroundTaskIdentifier _task;
    SystemSoundID _soundID;
    UILocalNotification *_localNotification;
}

初始化

- (void)viewDidLoad
{
    [super viewDidLoad];

    _count = 0;
    
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:soundPath], &_soundID);
    
    _localNotification = [[UILocalNotification alloc] init];
}


实现本地通知


- (IBAction)doAlert:(id)sender {
    //取消其他本地通知
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
    //设置属性,徽章数字,通知时间,时区,声音,间隔,内容等
    _localNotification.applicationIconBadgeNumber = 1;
    _localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:30];
    _localNotification.timeZone = [NSTimeZone defaultTimeZone];
    _localNotification.soundName = @"alertsound.wav";
    _localNotification.repeatInterval = NSDayCalendarUnit;
    _localNotification.alertBody = @"我是横幅提醒!";
    
    [[UIApplication sharedApplication] scheduleLocalNotification:_localNotification];
}

通知时效果



当然也可以在每次进入前台的时候把徽章数字清零

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
}


实现后台任务完成


- (IBAction)doCount:(id)sender {
    _task = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        
    }];
    //对计时器参数设置,调用countUp方法
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                              target:self
                                            selector:@selector(countUp)
                                            userInfo:nil
                                             repeats:YES];
}
//计数到100时停止结束,播放声音提醒。
- (void)countUp
{
    if (_count == 100) {
        AudioServicesPlaySystemSound(_soundID);
        
        [_timer invalidate];
        _timer = nil;
        [[UIApplication sharedApplication] endBackgroundTask:_task];
    } else {
        _count++;
        self.countLabel.text = [NSString stringWithFormat:@"%d", _count];
    }
}

效果


开始计数了,应用退到后台,很快就有声音提示 计数完成


IOS实现本地通知

阅读数 4729

iOS10 本地通知

阅读数 1150

iOS接收远程通知

阅读数 280

没有更多推荐了,返回首页