一.开发者账号
苹果开发者账号分为个人,公司,企业三种类型。
1.个人账号
功能:真机调试;打包测试;程序发布到AppStore;
优点:申请速度快
缺点:无法创建开发团队
2.公司账号
功能:真机调试;打包测试;程序发布到AppStore;
优点:可以创建开发团队
缺点:申请速度慢(需要邓白氏码)
3.企业账号
功能:真机调试;打包测试;
优点:可以创建开发团队;无需AppStore审核,迭代快
缺点:申请速度慢(需要邓白氏码);只能供指定人群使用
二.内购
1.配置流程
-
添加协议,税务,银行卡相关信息
1.png
-
添加商品信息
4.png
注意:必须上传审核图片,至少准备提交状态才可以获取到。
-
设置测试账号
2.png
注意:可以添加符合格式的随意邮箱地址,密码符合苹果规范。
2.代码
- 添加交易监听器
-(void)viewDidLoad
{
//监听交易状态
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
}
-(void)dealloc
{
//取消监听交易状态
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}
- 根据服务器数据从苹果开发者中心获取到可供销售的商品
#pragma mark - 从苹果开发者中心获取到可供销售的商品IDArray
-(void)getpurchaseProductFromApple:(NSSet*)productSet
{
SKProductsRequest * request=[[SKProductsRequest alloc]initWithProductIdentifiers:productSet];
request.delegate=self;
[request start];
}
#pragma mark - 获取到可供销售的商品回调
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
{
//无效的产品
SDLog(@"invalidProductIdentifiers:%@",response.invalidProductIdentifiers);
//可销售的产品
for(int i=0;i<response.products.count;i++)
{
SKProduct * product=response.products[i];
SDLog(@"localizedTitle:%@",product.localizedTitle);
SDLog(@"localizedDescription:%@",product.localizedDescription);
SDLog(@"price:%@",product.price);
label.text=product.localizedTitle;
curproduct=product;
}
}
- 购买商品,获取交易回调
#pragma mark - 购买商品
-(void)buyProduct
{
//判断APP是否允许内购
if([SKPaymentQueue canMakePayments])
{
SKPayment *payment = [SKPayment paymentWithProduct:curproduct];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}else
{
SDLog(@"不允许购买商品");
}
}
#pragma mark - 获取交易状态回调信息
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易结果
{
for (SKPaymentTransaction *transaction in transactions) {
switch (transaction.transactionState) {
case SKPaymentTransactionStatePurchased:
SDLog(@"交易成功");
//结束该交易队列,并记录
[queue finishTransaction:transaction];
[self recordTransaction:transaction];
break;
case SKPaymentTransactionStateFailed:
SDLog(@"交易失败");
[queue finishTransaction:transaction];
break;
case SKPaymentTransactionStateRestored:
SDLog(@"恢复购买");
[queue finishTransaction:transaction];
break;
case SKPaymentTransactionStatePurchasing:
SDLog(@"正在支付");
break;
case SKPaymentTransactionStateDeferred:
SDLog(@"延迟购买");
break;
default:
break;
}
}
}
#pragma mark - 记录交易成功状态,回服务器存储数据
- (void)recordTransaction:(SKPaymentTransaction*)transaction
{
SDLog(@"记录交易");
}
具体参考:
https://www.jianshu.com/p/aa5148b12817
https://www.jianshu.com/p/1ef61a785508
三.推送通知
1.本地通知
- 获取通知权限
#pragma mark 获取通知权限iOS8.0-iOS10.0方式不同
+(void)requestNotificationAuthority
{
if(@available(iOS 8.0, *)) {
if(@available(iOS 10.0, *)){
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
SDLog(@"允许推送通知");
}
}];
}else
{
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication]registerUserNotificationSettings:settings];
}
}
}
- iOS8.0发送消息(UILocalNotification)
#pragma mark - 发送消息
-(void)sendLocalNotification_ios8demo
{
UILocalNotification *localNote = [[UILocalNotification alloc] init];
// 2.设置本地通知(发送的时间和内容是必须设置的)
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
localNote.alertBody = @"iOS8.0";
/**
其他属性: timeZone 时区
repeatInterval 多长时间重复一次:一年,一个世纪,一天..
region 区域 : 传入中心点和半径就可以设置一个区域 (如果进入这个区域或者出来这个区域就发出一个通知)
regionTriggersOnce BOOL 默认为YES, 如果进入这个区域或者出来这个区域 只会发出 一次 通知,以后就不发送了
alertAction: 设置锁屏状态下本地通知下面的 滑动来 ...字样 默认为滑动来查看
hasAction: alertAction的属性是否生效
alertLaunchImage: 点击通知进入app的过程中显示图片,随便写,如果设置了(不管设置的是什么),都会加载app默认的启动图
alertTitle: 以前项目名称所在的位置的文字: 不设置显示项目名称, 在通知内容上方
soundName: 有通知时的音效 UILocalNotificationDefaultSoundName默认声音
可以更改这个声音: 只要将音效导入到工程中,localNote.soundName = @"nihao.waw"
*/
localNote.alertAction = @"滑动消息"; // 锁屏状态下显示: 滑动来快点啊
// localNote.alertLaunchImage = @"123";
if (@available(iOS 8.2, *)) {
localNote.alertTitle = @"通知标题";
} else {
// Fallback on earlier versions
}
localNote.soundName = UILocalNotificationDefaultSoundName;
/* 这里接到本地通知,badge变为5, 如果打开app,消除掉badge, 则在appdelegate中实现
[application setApplicationIconBadgeNumber:0];
*/
localNote.applicationIconBadgeNumber=1;
// 设置额外信息,appdelegate中收到通知,可以根据不同的通知的额外信息确定跳转到不同的界面
localNote.userInfo = @{@"type":@1};
//调用通知
[[UIApplication sharedApplication]scheduleLocalNotification:localNote];
}
- iOS8.0监听消息各种状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
SDLog(@"APP关闭状态点击本地通知");
}
#pragma mark - iOS8.0点击本地通知回调
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
SDLog(@"收到本地通知");
if (application.applicationState == UIApplicationStateInactive) {
//通知的额外信息,根据设置的通知的额外信息确定
SDLog(@"未关闭APP状态且后台收到本地通知%@",notification.userInfo);
}else
{
SDLog(@"前台收到本地通知%@",notification.userInfo);
}
}
- iOS10.0发送消息(UserNotifications)
-(void)sendLocalNotification_ios10demo
{
if (@available(iOS 10.0, *)){
//新建通知内容对象
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc]init];
content.title = @"iOS10";
content.subtitle = @"子标题内容";
content.body = @"主消息内容";
content.badge = @1;
//提醒声音
//UNNotificationSound *sound = [UNNotificationSound soundNamed:@"caodi.m4a"];
//content.sound = sound;
//图片信息
NSString *imageFile = [[NSBundle mainBundle] pathForResource:@"notification" ofType:@"png"];
UNNotificationAttachment *imageAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"imageAttachment" URL:[NSURL fileURLWithPath:imageFile] options:nil error:nil];
content.attachments = @[imageAttachment];
//点击可以显示文本输入框
UNTextInputNotificationAction *action1 = [UNTextInputNotificationAction actionWithIdentifier:@"replyAction" title:@"文字回复" options:UNNotificationActionOptionNone];
//点击进入应用
UNNotificationAction *action2 = [UNNotificationAction actionWithIdentifier:@"enterAction" title:@"进入应用" options:UNNotificationActionOptionForeground];
//点击取消,没有任何操作
UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@"cancelAction" title:@"取消" options:UNNotificationActionOptionDestructive];
//通过UNNotificationCategory对象将这几个action行为添加到通知里去
UNNotificationCategory *categroy = [UNNotificationCategory categoryWithIdentifier:@"Categroy" actions:@[action1,action2,action3] intentIdentifiers:@[@"replyAction",@"enterAction",@"cancelAction"] options:UNNotificationCategoryOptionCustomDismissAction];
//将categroy赋值到通知内容上
content.categoryIdentifier = @"Categroy";
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObjects:categroy, nil]];
//设置通知代理,用于检测点击方法
[[UNUserNotificationCenter currentNotificationCenter] setDelegate:self];
/* add request and notificaiton code ... */
//第三步:通知触发机制。(重复提醒,时间间隔要大于60s)
UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO];
//第四步:创建UNNotificationRequest通知请求对象
NSString *requertIdentifier = @"RequestIdentifier";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requertIdentifier content:content trigger:trigger1];
//第五步:将通知加到通知中心
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
SDLog(@"Error:%@",error);
}];
} else {
// Fallback on earlier versions
}
}
- iOS10.0监听消息各种状态(远程和本地都可以监听到)
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
SDLog(@"iOS10收到远程通知");
}else {
SDLog(@"iOS10收到本地通知");
NSString *categoryIdentifier = response.notification.request.content.categoryIdentifier;
if ([categoryIdentifier isEqualToString:@"Categroy"]) {
//识别需要被处理的拓展
if ([response.actionIdentifier isEqualToString:@"replyAction"]){
//识别用户点击的是哪个 action
UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse*)response;
//获取输入内容
NSString *userText = textResponse.userText;
//发送 userText 给需要接收的方法
SDLog(@"点击Action-文字恢复:%@",userText);
//[ClassName handleUserText: userText];
}else if([response.actionIdentifier isEqualToString:@"enterAction"]){
SDLog(@"点击Action-进入应用");
}else if([response.actionIdentifier isEqualToString:@"cancelAction"]){
SDLog(@"点击Action-取消");
}
}else
{
SDLog(@"(关闭或不关闭APP且)后台状态点击通知内容");
}
}
}
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]])
{
SDLog(@"iOS10APP前台收到远程通知");
}else
{
SDLog(@"iOS10APP前台收到本地通知");
}
}
2.远程通知
- iOS8.0监听消息各种状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if(launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey])
{
SDLog(@"APP关闭状态点击远程通知");
}
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
SDLog(@"收到远程通知");
}
- iOS10.0监听消息各种状态
//同本地消息
网友评论