本地推送UILocalNotification(整理)

穷苦的孩子没有开发账号, 只能测试下本地通知了

  /**本地通知 * 是由本地应用触发的, 基于时间行为的一种通知形式, 例如闹钟定时、待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知。 * UILocalNotification的属性有 fireDate、timeZone、repeatInterval、repeatCalendar、alertBody、 alertAction、hasAction、alertLaunchImage、applicationIconBadgeNumber、 soundName和userInfo。 iOS8.0添加的属性: 1. CLRegion *region: 设置一个CLRegion对象触发通知, 当用户进入或离开一个地理区域, 根据CLRegion对象本身的属性设置。注册多个UILocalNotifications不同区域包含相同的标识符将导致未定义行为。触发区域的UILocalNotifications的数量是有限的。为了使用region-triggered通知, 应用程序必须设置"when-in-use"来对CoreLocation授权 2. BOOL regionTriggersOnce: 默认YES: 多次进入退出该区域仅触发一次 NO: 每次进入或退出该区域都会触发 3. NSString *alertTitle(iOS8.2): 默认nil, 4. NSString *category: +[UIUserNotificationSettings settingsForTypes:categories:]的参数, 本地通知的标识 5. */
创建本地推送通知对象
UILocalNotification *ln = [[UILocalNotification alloc] init];
设置本地推送通知属性
//推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate;

//推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;

//在锁屏时显示的动作标题(完整标题:“滑动来” + alertAction)
@property(nonatomic,copy) NSString *alertAction;

//音效文件名
@property(nonatomic,copy) NSString *soundName;

//app图标数字
@property(nonatomic) NSInteger applicationIconBadgeNumber;

//每隔多久重复发一次推送通知
@property(nonatomic) NSCalendarUnit repeatInterval;

//点击推送通知打开app时显示的启动图片
@property(nonatomic,copy) NSString *alertLaunchImage;

//附加的额外信息
@property(nonatomic,copy) NSDictionary *userInfo;

//时区
@property(nonatomic,copy) NSTimeZone *timeZone;
(一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)

//调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];

//获得被调度(定制)的所有本地推送通知
@property(nonatomic,copy) NSArray *scheduledLocalNotifications;
(已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)

//取消调度本地推送通知
- (void)cancelLocalNotification:(UILocalNotification *)notification;
- (void)cancelAllLocalNotifications;

//立即发出本地推送通知
- (void)presentLocalNotificationNow:(UILocalNotification *)notification;

/**创建本地通知的步骤 * 1. 创建 UILocalNotification * 2. 设置触发通知的时间, fireDate * 3. 配置通知的内容: 通知主题, 通知内容, 图标等 * 4. 配置通知传递的自动义参数userInfo(可选) * 5. 调用通知,可以使用scheduleLocalNotification:按计划调度一个通知,也可以使用presentLocalNotificationNow立即调用通知。 */

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

    /**两种情况去运行: * 一种是启动程序关闭程序,等到接收到通知之后点击通知重新进入程序; * 另一种是启动程序后,进入后台, 在前台也可以 另种分别按照前面说的情况调用不同的方法接收到userInfo写入本地文件系统。有了userInfo一般来说就可以根据这个信息进行一些处理,例如可以根据不同的参数信息导航到不同的界面,假设是更新的通知则可以导航到更新内容界面等。 */

    /**注意: *1. 在使用通知之前必须注册通知类型,如果用户不允许应用程序发送通知,则以后就无法发送通知,除非用户手动到iOS设置中打开通知。 *2. 本地通知是有操作系统统一调度的,只有在应用退出到后台或者关闭才能收到通知。(注意:这一点对于后面的推送通知也是完全适用的。) *3. 通知的声音是由iOS系统播放的,格式必须是Linear PCM、MA4(IMA/ADPCM)、µLaw、aLaw中的一种,并且播放时间必须在30s内,否则将被系统声音替换,同时自定义声音文件必须放到main boundle中。 *4. 本地通知的数量是有限制的,最近的本地通知最多只能有64个,超过这个数量将被系统忽略。 *5. 如果想要移除本地通知可以调用UIApplication的cancelLocalNotification:或cancelAllLocalNotifications移除指定通知或所有通知。 */
//[[UIDevice currentDevice].systemVersion floatValue] >= 8.0

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_8_0
    //iOS8.0
    ///第一个按钮
    UIMutableUserNotificationAction *action = [[UIMutableUserNotificationAction alloc] init];
    action.identifier = @"action";
    action.title = @"接受";
    /* UIUserNotificationActivationModeForeground 点击的时候启动程序 UIUserNotificationActivationModeBackground 点击的时候不启动程序,后台处理 */
    action.activationMode = UIUserNotificationActivationModeForeground;

    ///第二个按钮
    UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
    action2.identifier = @"action2";
    action2.title = @"拒绝";
    action2.activationMode = UIUserNotificationActivationModeBackground;
    action2.authenticationRequired = NO;//YES:需要解锁才能处理,ModeForeground不用设置此项
    action2.destructive = YES;//警告按钮, 红色

    ///创建动作按钮的类别集合
    UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
    category.identifier = @"alert";//这组动作的标识符
    /** UIUserNotificationActionContextDefault UIUserNotificationActionContextMinimal */
    [category setActions:@[action, action2] forContext:UIUserNotificationActionContextMinimal];

    // 3.创建UIUserNotificationSettings,并设置消息的显示类类型
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:
                                           UIUserNotificationTypeBadge |
                                           UIUserNotificationTypeSound |
                                           UIUserNotificationTypeAlert categories:[NSSet setWithObjects:category, nil]];
    // 4.注册推送
    [[UIApplication sharedApplication] registerUserNotificationSettings:setting];
    //远程推送 [[UIApplication sharedApplication] registerForRemoteNotifications];
#else


#endif

    //1. 定义本地通知
    UILocalNotification *notification = [[UILocalNotification alloc] init];

    //2. 设置调用时间, 设置为nil的话,那么UILocalNotification将在一段时候后被激发,而不是某一个确切时间被激发
    notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:10];

    //3. 设置当前时区
    notification.timeZone = [NSTimeZone defaultTimeZone];

    //设置重复间隔, NSCalendarUnit
    notification.repeatInterval = NSWeekCalendarUnit;
    //当前日历,使用前最好设置时区等信息以便能够自动同步时间
    //notification.repeatCalendar=[NSCalendar currentCalendar];

    //4. 设置通知的属性
    //4.1 通知主题
    notification.alertBody = @"订单来了";
    //4.2 通知消息数
    notification.applicationIconBadgeNumber += 1;
    //4.3 通知在待机界面的滑动动作提示->"滑动来打开应用"
    notification.hasAction = YES;//默认yes
    notification.alertAction = @"打开应用";
    //4.4 点击通知打开应用时的启动图片,这里使用程序启动图片
    notification.alertLaunchImage = @"launch.jpg";
    //4.5 设置收到通知时播放的声音, 默认消息声音
    // name of resource in app's bundle to play or UILocalNotificationDefaultSoundName
    //注意: 直接把.caf文件拖进目录是无效的, 使用右键点击"Add Files to xxxx", 选择想要添加的文件即可
    notification.soundName = @"1.caf";

#if __IPHONE_8_0
    notification.category = @"alert";
#endif
    /*SoundName: 1. app's bundle中资源的名字 2. UILocalNotificationDefaultSoundName */

    //4.6 设置用户信息: 绑定到通知上的其他附加信息
    notification.userInfo = @{@"id":@1,@"user":@"zhz"};//绑定到通知上的其他附加信息;
    /** * 从上面的程序可以看到userInfo这个属性我们设置了参数,那么这个参数如何接收呢? 1. 在iOS中如果点击一个弹出通知(或者锁屏界面滑动查看通知),默认会自动打开当前应用。 2. 由于通知由系统调度那么此时进入应用有两种情况: a. 如果应用程序已经完全退出那么此时会调用application: didFinishLaunchingWithOptions方法; 可以访问launchOptions中键为UIApplicationLaunchOptionsLocalNotificationKey的对象,这个对象就是发送的通知,由此对象再去访问userInfo。 b. 如果此时应用程序还在运行(无论是在前台还是在后台)则会调用application: didReceiveLocalNotification:方法接收消息参数。 参数中已经可以拿到notification对象,只要读取userInfo属性即可 */
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];


    //如果应用程序已经完全退出那么此时会调用
    if (launchOptions) {
        UILocalNotification *notification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocationKey];
        NSDictionary *dic = notification.userInfo;
        NSLog(@"--%@", dic);
    }


    return YES;     

#if __IPHONE_8_0
/** * 成功注册registerUserNotificationSettings:后,回调的方法 * *  @param application UIApplication *  @param notificationSettings UIUserNotificationSettings消息的显示类类型 */
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    //成功注册registerUserNotificationSettings:后,回调的方法
    NSLog(@"%s, %d", __FUNCTION__, __LINE__);
}

/** * 处理用户操作 * *  @param application UIApplication *  @param identifier 设置的按钮ID *  @param notification 本地通知notification *  @param completionHandler 处理完消息调用, 否则会出现警告 */
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler {
    //在非本App界面时收到本地消息,下拉消息会有快捷回复的按钮,点击按钮后调用的方法,根据identifier来判断点击的哪个按钮,notification为消息内容
    NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    completionHandler();//处理完消息调用, 否则会出现警告
}
#endif

/** * 当用户点击通知栏的该条通知时调用 * *  @param application UIApplication *  @param notification 本地通知 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(nonnull UILocalNotification *)notification {

    //收到本地推送消息后调用的方法
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"接收到本地提醒 in app" message:notification.alertBody delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
    [alert show];

    //这里,你就可以通过notification的useinfo,干一些你想做的事情了
    application.applicationIconBadgeNumber -= 1;
}

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

#pragma mark 移除本地通知,在不需要此通知时记得移除
/** * 两种方式取消注册的本地通知, 一种是取消指定的通知: [[UIApplication sharedApplication] cancelLocalNotification:localNotification]; 第二种是取消所有的注册通知: [[UIApplication sharedApplication] cancelAllLocalNotification]; */
-(void)removeNotification{
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

参考:
http://www.cnblogs.com/kenshincui/p/4168532.html

你可能感兴趣的:(本地推送UILocalNotification(整理))