##一 推送通知
- 什么是推送通知,有什么作用?
- 概念
- 向用户推送一条信息来通知用户某件事情
- 作用
- 可以在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;
- 根据fireDate设定的时间进行推送
监听用户点击通知
- app处于前台
- 此时不会弹框通知用户通知的到达,但是还是会调用对应的代理方法
app并没有关闭,一直隐藏在后台时
- 此时用户点击通知信息后,会让app进入前台,并会调用AppDelegate的下面方法
application: didReceiveLocalNotification:
- 此时用户点击通知信息后,会让app进入前台,并会调用AppDelegate的下面方法
app已经被关闭(进程已死)
- 此时用户点击通知信息后,会启动app,启动完毕会调用AppDelegate的下面方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
- 此时用户点击通知信息后,会启动app,启动完毕会调用AppDelegate的下面方法
- app处于前台
- 设置本地通知快捷项
- (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方法中添加如下代码
- 在iOS 8.0+,如果要使用本地通知,需要得到用户的许可
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 : 某台电脑就能发布某个程序
- 一.开发iOS程序的推送功能, iOS端需要做的事
远程推送应用配置过程(详细过程可参考真机调试)
- 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)
- 个推
- 信鸽
- 推送通知总结
- 推送通知权限
- 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
- 项目–>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
- 参照集成文档