##一 推送通知
- 什么是推送通知,有什么作用?
- 概念
- 向用户推送一条信息来通知用户某件事情
- 作用
- 可以在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;
开始推送通知
[[UIApplication sharedApplication] scheduleLocalNotification:ln];
presentLocalNotificationNow:(UILocalNotification *)notification;
监听用户点击通知
app并没有关闭,一直隐藏在后台时
application: didReceiveLocalNotification:
app已经被关闭(进程已死)
- (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;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil]; [application registerUserNotificationSettings:settings];
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知
长连接的作用
远程推送步骤
远程推送应用配置过程(详细过程可参考真机调试)
格式: {"aps":{"alert":"This is some fancy message.","badge":1,"sound":"default"}}
远程推送应用程序开发过程
请求通知授权,获取deviceToken
// 请求获取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(@"接收到通知");
}
什么是应用间跳转,应用场景
要打开本机上的其他应用程序,需要设置schemes,自定义的协议头
注意: URL可以没有路径,但是必须有协议头
在跳转到某一个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 字段 ,是数组类型
/** 只要是由其他应用程序打开的,就会调用此方法 */
/** 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
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://
什么是社交分析, 有什么作用?
如何实现社交分享
利用第三方的分享框架
系统自带社交分享实现
// 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"]]; // 配图