iOS开发实用技术之推送通知

##一 推送通知
- 什么是推送通知,有什么作用?
- 概念
- 向用户推送一条信息来通知用户某件事情
- 作用
- 可以在APP退到后台,或者关闭时;继续推送一条消息告诉用户某件事情

  • 推送通知的分类

    • 本地推送通知

      • “本地”可以理解为”不联网”;即使没有网络情况下,也可以推送通知消息
      • 通知发送方: 开发人员负责在APP内发送
      • 应用场景: 确定知道未来某个时间点应该提醒用户什么
    • 远程推送通知

      • 与“本地”相对,表示,必须在联网情况下才会向用户推送通知消息
        远程推送服务,又称为APNs(Apple Push Notification Services)
      • 通知发送方: 服务器
      • 应用场景:
        • 1.不确定未来某个时间点应该提醒用户什么,临时性的
        • 2.当APP彻底退出时也想继续让用户获取一些最新消息
  • 推送通知的呈现效果总结

    • 在屏幕顶部显示一块横幅(显示具体内容)
    • 在屏幕中间弹出一个UIAlertView(显示具体内容)
    • 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
    • 更新app图标的数字(说明新内容的数量)
    • 播放音效(提醒作用)

注意细节:发出推送通知时,如果当前程序正运行在前台,那么推送通知就不会被呈现出来,不管app打开还是关闭,推送通知都能如期发出

二 本地推送通知

  • 本地通知的简单实现
 // 1. 创建一个本地通知
   UILocalNotification *ln = [[UILocalNotification alloc] init];
 // 2 设定通知发送时间
   ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
 // 3 设置通知内容
   ln.alertBody = @"顺子要不要?";
  • 设置本地推送通知属性
// 推送通知的触发时间(何时发出推送通知) 
@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;
  • 开始推送通知

    • 根据fireDate设定的时间进行推送
      [[UIApplication sharedApplication] scheduleLocalNotification:ln];
    • 立即推送
      presentLocalNotificationNow:(UILocalNotification *)notification;
  • 监听用户点击通知

    • app处于前台
      • 此时不会弹框通知用户通知的到达,但是还是会调用对应的代理方法
    • app并没有关闭,一直隐藏在后台时

      • 此时用户点击通知信息后,会让app进入前台,并会调用AppDelegate的下面方法application: didReceiveLocalNotification:
    • app已经被关闭(进程已死)

      • 此时用户点击通知信息后,会启动app,启动完毕会调用AppDelegate的下面方法
        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
        launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象  
  • 设置本地通知快捷项
- (void)registerAuthor
{ 
    // 创建一个快捷操作组 NSSet<UIUserNotificationCategory *>
    UIMutableUserNotificationCategory *cate = [[UIMutableUserNotificationCategory alloc] init];
    // 用来多个操作组之间的识别
    cate.identifier = @"select";

    // 设置操作组的操作行为 NSArray<UIUserNotificationAction *>

    // 创建一个操作项
    UIMutableUserNotificationAction *action1 = [[UIMutableUserNotificationAction alloc] init];
    // 设置操作标识
    action1.identifier = @"king";
    // 设置行为名称
    action1.title = @"王炸";
    // 设置行为的执行模式
    action1.activationMode = UIUserNotificationActivationModeForeground;

    // 创建一个操作项
    UIMutableUserNotificationAction *action2 = [[UIMutableUserNotificationAction alloc] init];
    // 设置操作标识
    action2.identifier = @"pass";
    // 设置行为名称
    action2.title = @"要不起";
    // 设置行为的执行模式
    action2.activationMode = UIUserNotificationActivationModeBackground;

    NSArray *actions = @[action1, action2];
    [cate setActions:actions forContext:UIUserNotificationActionContextMinimal];

    NSSet *categories = [NSSet setWithObjects:cate, nil];
    // 创建通知设置对象 
    UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:categories];
    // 注册通知设置
    [[UIApplication sharedApplication] registerUserNotificationSettings:set];    
}
  • 额外设置
// 每隔多久重复发一次推送通知 
@property(nonatomic) NSCalendarUnit repeatInterval; 
// 点击推送通知打开app时显示的启动图片 
@property(nonatomic,copy) NSString *alertLaunchImage; 
// 附加的额外信息 
@property(nonatomic,copy) NSDictionary *userInfo; 
// 时区  (一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
@property(nonatomic,copy) NSTimeZone *timeZone;
  • 其他操作

    • 获得被调度(定制)的所有本地推送通知
      @property(nonatomic,copy) NSArray scheduledLocalNotifications;
      • 已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除
    • 取消调度本地推送通知
      - (void)cancelLocalNotification:(UILocalNotification )notification;
      - (void)cancelAllLocalNotifications;
      
  • 注意事项
    • 在iOS 8.0+,如果要使用本地通知,需要得到用户的许可
      在didFinishLaunchingWithOptions方法中添加如下代码
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; 
[application registerUserNotificationSettings:settings];

三 远程通知

  • 什么是远程推送通知
    • 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
    • 远程推送服务,又称为APNs(Apple Push Notification Services)

不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
  • 什么是长连接
    • 只要联网了,就一直建立连接
  • 长连接的作用

    • 时间校准
    • 系统升级
    • 查找我的iPhone
    • …..
  • 远程推送步骤

    • 一.开发iOS程序的推送功能, iOS端需要做的事
      • 1.请求苹果获得deviceToken
      • 2.得到苹果返回的deviceToken,发送deviceToken给公司的服务器
      • 3.监听用户对通知的点击
    • 二.调试iOS的远程推送功能, 必备条件:
      • 1.真机
      • 2.调试推送需要的证书文件
        • 1> aps_development.cer : 某台电脑就能调试某个app的推送服务
        • 2> iphone5_qq.mobileprovision : 某台电脑就能利用某台设备调试某个程序
    • 三.发布具有推送服务的app
      • 1> aps_production.cer : 如果发布的程序中包含了推送服务,就必须安装这个证书
      • 2> qq.mobileprovision : 某台电脑就能发布某个程序
  • 远程推送应用配置过程(详细过程可参考真机调试)

    • 1.创建支持远程推送功能的App ID
    • 2.创建调试证书,并选中刚刚创建的App ID
    • 3.下载CER文件,并导入钥匙串管理
    • 4.创建发布证书,并选中刚刚创建的App ID
    • 5.下载CER文件,并导入钥匙串管理
    • 6.检查App ID,确认证书已经指定
    • 7.生成描述文件
格式: {"aps":{"alert":"This is some fancy message.","badge":1,"sound":"default"}}
  • 远程推送应用程序开发过程

    • 1.新建应用程序
    • 2.指定AppID,在developer.apple.com上设置的AppID
  • 请求通知授权,获取deviceToken

    • 注意:只有真机可以进行调试,所以需要配置(调试证书,远程推送测试证书等)
    • 系统版本ios8之前和之后
// 请求获取deviceToken   
  if (isIOS(8.0)) {
     // 请求权限
     UIUserNotificationSettings *set = [UIUserNotificationSettings settingsForTypes:7 categories:nil];
     [[UIApplication sharedApplication] registerUserNotificationSettings:set];

     // 请求获取deviceToken(自动根据设备UDID, bundleID, 发送请求, 获取deviceToken)
     [[UIApplication sharedApplication] registerForRemoteNotifications];
    }else {

     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeNewsstandContentAvailability)];
    }
// 当得到苹果的APNs服务器返回的DeviceToken就会被调用
// 7040f7d5 5a974598 c5cf31b5 3e340b39 68affd25 122f0ce1 3f315226 396c2e5b
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"deviceToken是:%@", deviceToken);
}
/**
 *  接收到远程通知, 并且
 *  在前台,
 *  在后台, 点击通知
 *  锁屏, 滑动通知,
 *  app, 被彻底退出, 不执行这个方法, 应该 didFinishLaunchingWithOptions
 *  @param application 应用程序
 *  @param userInfo    额外信息
 */
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"接收到通知");
}

四 第三方推送


  • 推送通知总结
    • 推送通知权限
      • iOS8.0之前直接发送就可以
      • iOS8.0之后,需要请求授权,注册通知设置项
    • 通知显示要求
      • 当app处于后台, 或者被彻底关闭, 以及锁屏状态下, 通知都可以被展示
      • 如果app处于前台, 那么通知就不会被展现出来

五 应用间跳转

  • 什么是应用间跳转,应用场景

    • 1.使用第三方用户登录,需要用户授权,还需要”返回到调用的程序,同时返回授权的用户名”
    • 2.应用程序推广,网易彩票,设置-推荐应用-有很多应用程序图标如果本机已经安装过,会直接跳转到另外一个应用程序
      软件的广告,推广结果,后续会有一些列的金钱上的结算
    • 3.支付宝,第三方支付,淘宝,电话费充值。
  • 要打开本机上的其他应用程序,需要设置schemes,自定义的协议头

    • URL : 统一资源定位符
    • scheme(协议头) : 决定通过什么方式查找资源 http:// ftp:// tel:// file://
    • path(路径) : 资源路径 www.baidu.com 192.168.1.1/资源 110 /User/Desktop

注意: URL可以没有路径,但是必须有协议头
在跳转到某一个URL之前最好进行判断,是否可以打开

  • 默认情况下应用程序是没有自己的URL的,如果想要拥有自己的URL,需要设置URL
    • 项目–>info–>URL Types–>URL Scheme
      这里写图片描述
  • 要打开本机上的其他应用程序,需要设置schemes,自定义的协议头,可以打开其他的应用程序
    • 其他应用程序调用: application openURL:url
- (IBAction)openWangyi:(id)sender
{
    // 跳转到其他应用程序
    // schemes: 网易的scheme wangyi
    NSURL *url = [NSURL URLWithString:@"wangyi://view?newsid=201410130001"];

    // 判断本机是否安装了目标程序
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
        [[UIApplication sharedApplication] openURL:url];
    } else {
        NSLog(@"没有安装,可以再给定下载地址,前往");
    }
}

注意事项:(iOS9.0+需要配置url白名单):
在info.plist文件中添加LSApplicationQueriesSchemes 字段 ,是数组类型

  • 如果要返回调用的应用程序,需要知道调用我们的应用程序的scheme
/** 只要是由其他应用程序打开的,就会调用此方法 */
/** URL 就是其他应用程序,打开当前程序使用的URL */
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

/**
 openURL 是打开当前应用程序的url
 sourceApplication 是当开当前应用程序的源程序的BundleId
 提示:一旦重写了新方法,旧方法就不再被执行
 但是:很多第三方框架,都建议两个方法全都写
 */
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  • 经验: 常用APP对应的scheme
weixin://dl/scan 扫一扫
weixin://dl/moments 朋友圈
weixin://dl/settings 设置
weixin://dl/notifications 消息通知设置
有道 yddict://
随手记 fdmoney://
Evernote evernote://
QQ同步助手 qqpim://
QQ mqq://
淘宝taobao://
点评dianping:// dianping://search
微博 sinaweibo://
名片全能王camcard://
weico微博weico://
支付宝alipay://
豆瓣fm:doubanradio://
微盘 sinavdisk://
美团 imeituan://
京冬openapp.jdmoble://
我查查 wcc://
有道词典yddictproapp://
知乎zhihu://
优酷 youku://

六 社交分享

  • 什么是社交分析, 有什么作用?

    • 通过用户的分享,让更多的人去了解和使用这个App
    • 目前移动互联网应用程序推广的最重要手段之一
    • 属于口碑营销的范畴,经典成功案例是《疯狂猜图》
  • 如何实现社交分享

  • 利用iOS自带的Social.framework
  • 利用第三方的分享框架

  • 系统自带社交分享实现

    • 导入Social.framework
    • 代码实现
// 1 .判断服务是否可用 
[SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo] 
// 2 .弹出分享内容输入界面 
SLComposeViewController *cc = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo]; [self presentViewController:cc animated:YES completion:nil]; 
// 3 .额外设置 
[cc setInitialText:@"测试文字"];  // 初始化文字 
[cc addImage:[UIImage imageNamed:@"lufy"]];  // 配图
  • 第三方SDK实现(友盟分享) http://www.umeng.com/
    • 申请账号,创建应用
    • 下载SDK
    • 参照集成文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值