真机测试
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];
提示:
- 实例化请求时,必须指定有效的identifiers集合,之所以如此处理,主要是为了确保提交的内购商品真的通过了苹果的审批,处于可用状态!
- 要想获取到准确的可用产品集合,需要通过代理方法实现
-(void)productsRequest:(SKProductsRequest*)request didReceiveResponse:(SKProductsResponse*)response
- 越狱用户无法测试内购,但是可以购买
购买产品
- 内购的交易过程是通过SKPaymentTransactionObserver监控的,因此需要为IAPHelper添加交易观察者:
添加交易观察者对象
[[SKPaymentQueuedefaultQueue]addTransactionObserver:sharedInstance];
- 由于发起交易需要使用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);
}];
网友评论