美文网首页
苹果开发中心这点事

苹果开发中心这点事

作者: 宙斯YY | 来源:发表于2018-07-06 11:47 被阅读15次

一.开发者账号

苹果开发者账号分为个人,公司,企业三种类型。

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监听消息各种状态
//同本地消息

相关文章

网友评论

      本文标题:苹果开发中心这点事

      本文链接:https://www.haomeiwen.com/subject/uvpvuftx.html