美文网首页iOS学习
真机、内购、广告、支付宝

真机、内购、广告、支付宝

作者: 闲得一B | 来源:发表于2016-04-20 22:40 被阅读213次

    真机测试

    1、根据电脑的钥匙串生成CSR文件。
    2、生成电脑证书CER(需要CSR文件)。
    3、然后根据应用AppID,指定手机设备的UDID来生成一个描述文件。如果没有证书,就生成一个p12文件,再生成描述文件iOS App Development。
    总结:哪台电脑的哪个应用运行在哪个设备上。


    打包测试

    1、生成测试证书(App Store and Ad Hoc既能测试又能发布程序)
    2、配置AppID。根据设备生成描述文件App Hoc。
    注意:测试release版本。因为发布的也是release版本。


    发布程序

    用需要CSR文件生成一个发布证书,再根据应用AppID,生成描述文件App Store。
    注意:AppID需要配置一个明确的,也就是你的项目名。才能实现内购。


    内购流程:

    图左线:服务器 ------------- 图中线:App---------------- 图右线:苹果


    内购.png

    使用代理:
    1、Get Set of Product IDs内购商品信息最好存放到服务器,因为界面的展示都是根据模型显示(将数据放到一个集合里面:NSSet/Web Service)前提是需要将项目在苹果内购后台信息配置好
    2、向苹果请求有效的内购商品信息Request Valid Product IDs (苹果可能限制某些商品)怎么请求:SKProductsRequest(创建这个请求)。
    3、苹果返回有效的内购商品信息Valid DIs Returned
    4、展示购买的选项(展示界面)Display Purchase Options
    5、用户开始购买(User Initiates Purchase):选中某个商品,创建票据(SKPayment),将票据加入到交易队列里面(User Works Through Dialogs)
    6、监听交易队列交易成功还是失败(添加观察者,遵守协议,实现方法进行回调)。
    (代理一对一,观察者一对多)


    要使用内购,需要导入StoreKit框架

    请求有效的产品
    1) 实例化产品请求
    SKProductsRequest  *request =[[SKProductsRequestalloc]initWithProductIdentifiers:identifiers];
    2) 设置代理
    [requestsetDelegate:self];
    3) 启动请求
    [requeststart];
    
    提示:
    1. 实例化请求时,必须指定有效的identifiers集合,之所以如此处理,主要是为了确保提交的内购商品真的通过了苹果的审批,处于可用状态!
    2. 要想获取到准确的可用产品集合,需要通过代理方法实现
    -(void)productsRequest:(SKProductsRequest*)request didReceiveResponse:(SKProductsResponse*)response
    
    1. 越狱用户无法测试内购,但是可以购买

    购买产品
    1. 内购的交易过程是通过SKPaymentTransactionObserver监控的,因此需要为IAPHelper添加交易观察者:
    添加交易观察者对象
    [[SKPaymentQueuedefaultQueue]addTransactionObserver:sharedInstance];
    
    1. 由于发起交易需要使用SKProduct对象,因此需要使用字典记录所有可用的商品
    NSMutableDictionary         *_productsDict;
    

    交易队列回调方法
     -(void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray*)transactions
    {
        for(SKPaymentTransaction*transaction intransactions) {
            //购买完成
                if(transaction.transactionState== SKPaymentTransactionStatePurchased){
                NSLog(@"购买完成%@", transaction.payment.productIdentifier);
                [queue finishTransaction:transaction];
            } elseif(transaction.transactionState== SKPaymentTransactionStateFailed){
                if(transaction.error.code!= SKErrorPaymentCancelled){
                    NSLog(@"交易失败:%@", transaction.error.localizedDescription);
                }
            }
        }
    }
    

    恢复购买
        [[SKPaymentQueuedefaultQueue]restoreCompletedTransactions];
    

    购买数据记录
        [[NSUserDefaultsstandardUserDefaults]setBool:isPurchasedforKey:productId];
        [[NSUserDefaultsstandardUserDefaults]synchronize];
    

    内购注意

    比如用tableview的cell来显示数据时,不应该让这个cell能双击,避免将多个票据放到队列中。应该在点击时,让用户不能再点击,避免产生多个票据。
    交易的状态:
    SKPaymentTransactionStatePurchasing:正在购买、
    SKPaymentTransactionStatePurchased:购买成功(已经购买)、
    SKPaymentTransactionStateFailed:购买失败、
    SKPaymentTransactionStateRestored:恢复商品(不同手机时能恢复)、
    SKPaymentTransactionStateDeferred:未决定(iOS8)
    当购买时程序退出:有状态记录,根据状态恢复。


    广告

    广告的展现内容,是由苹果根据应用程序的关键字,分类,上架地区等综合评定后自动推送的,应用程序无需关心
    广告控件(ADBannerView)

    添加iAd.framework框架,添加ADBannerView视图,并设置代理方法
    广告条加载完成之前最好隐藏

        -(void)bannerViewDidLoadAd:(ADBannerView*)banner {
            self.bannerBottomConstraint.constant= 20.0;    
            [UIViewanimateWithDuration:0.5animations:^{
                [self.viewlayoutIfNeeded];
            }];   
            NSLog(@"广告加载成功");
        }
        -(void)bannerView:(ADBannerView*)banner didFailToReceiveAdWithError:(NSError*)error {
            NSLog(@"广告加载失败%@",error);
        }
    

    广告的代理方法
    // 广告加载失败
    - (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
    {
    }
    // 即将加载广告
    - (void)bannerViewWillLoadAd:(ADBannerView *)banner
    {
    }
    // 广告已经加载
    - (void)bannerViewDidLoadAd:(ADBannerView *)banner
    {
        //self.bannerViewBottomCon:约束
        //等广告加载完毕后以动画的方式显示
        self.bannerViewBottomCon.constant = 0;
        [UIView animateWithDuration:0.5 animations:^{
            [self.view layoutIfNeeded];
        }];
    }
    //广告退出
    - (void)bannerViewActionDidFinish:(ADBannerView *)banner
    {
    }
    

    支付宝

    支付宝的前提:购买的物品必须是和应用程序无关的,比如:团购卷/衣服/电子产品。否则不允许上架,如会员,游戏道具。
    内购:用户将钱给苹果,苹果分给商户。
    支付宝:用户将钱给支付宝。


    支付宝大致流程:

    1、向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)和私钥(privateKey)
    2、下载支付宝SDK,生成订单信息,签名加密
    3、调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
    4、支付完毕后,支付宝客户端会自动跳回到原来的应用程序
    5、在原来的应用程序中显示支付结果给用户看


    集成支付宝:

    1、和支付宝签约(产品负责)
    2、下载支付宝SDK和官方文档
    3、拖入对应的SDK文件等(加密的静态库、订单类、订单类)
    4、当用户购买某一个商品时
    4.1生成订单信息
    4.2对订单进行加密
    4.3打开支付宝客户端让用户支付
    4.4获取支付的回调信息

        // 1.获取签约之后的三个数据
        NSString *partner = @"";
        NSString *seller = @"";
        NSString *privateKey = @"";
       > 
        // 2.生成订单和签名
        Order *order = [[Order alloc] init];
        order.partner = partner;
        order.seller = seller;
        order.tradeNO = nil; //订单ID(由商家自行制定)
        order.productName = product.name; //商品标题
        order.productDescription = product.detail; //商品描述
        order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格
        >
        // 服务器的回调地址
        order.notifyURL =  @"http://www.xxx.com"; // 用户支付成功后,支付宝服务器会同步通知我们的服务器.我们服务器需要有一个可以回调的地址
        order.service = @"mobile.securitypay.pay";//接口
        order.paymentType = @"1";//
        order.inputCharset = @"utf-8";
        order.itBPay = @"30m";//过期时间,分钟
        order.showUrl = @"m.alipay.com";
        >
        //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
        NSString *appScheme = @"alipay";
       > 
        //将商品信息拼接成字符串
        NSString *orderSpec = [order description];
       > 
        //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
        id<DataSigner> signer = CreateRSADataSigner(privateKey);
        NSString *signedString = [signer signString:orderSpec];
        >
        //将签名成功字符串格式化为订单字符串,请严格按照该格式
        NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                           orderSpec, signedString, @"RSA"];
        >
        // 跳转到支付宝进行支付
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"reslut = %@",resultDic);
        }];
    

    补充:

    1、获取商品信息
    2、生成订单
    3、打开支付宝,确定支付
    4、支付宝服务器扣钱--->银行....
    5、支付宝服务器返回结果给支付宝客户端,同时支付宝服务器异步返回结果给商品服务器(防止黑客),支付宝客户端返回结果给自己的app.
    6、成功就会在appDalegate中获取到信息。

    // 跳用支付宝客户端开始支付
        // callBack : 如果用户没有安装支付宝客户端,弹出webView让用户支付
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"reslut = %@",resultDic);
        }];
    

    相关文章

      网友评论

        本文标题:真机、内购、广告、支付宝

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