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

来源:互联网 发布:百电通打电话要网络 编辑:程序博客网 时间:2024/05/18 01:32

##一 推送通知
- 什么是推送通知,有什么作用?
- 概念
- 向用户推送一条信息来通知用户某件事情
- 作用
- 可以在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(@"接收到通知");}

四 第三方推送

  • 极光推送(JPush)
    • 极光SDK 集成指南: http://docs.jpush.cn/pages/viewpage.action?pageId=2621727
  • 个推
  • 信鸽
    • 经验: http://mdsa.51cto.com/services/

  • 推送通知总结
    • 推送通知权限
      • 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
  • 利用第三方的分享框架

    • 友盟分享:http://dev.umeng.com/social/ios/share/quick-integration
    • ShareSDK:http://wiki.mob.com/iOS快速集成指南
    • 百度社会化分享组件:http://developer.baidu.com/soc/share
  • 系统自带社交分享实现

    • 导入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
    • 参照集成文档
0 0