關(guān)于蘋果內(nèi)購的一些心得

根據(jù)公司的需求,我們的APP內(nèi)是有內(nèi)購的,從最開始開始做,到現(xiàn)在,也經(jīng)歷了好些,我覺得有些地方的注意點(diǎn)還得寫寫.

內(nèi)購的代碼,網(wǎng)上都有這里簡單的copy一下

首先,購買蘋果的商品,得確定一下,這個(gè)內(nèi)購商品是否存在

-(void) request_products_list_from_apple:(NSArray *) productIDs{

NSSet *productSet = [NSSet setWithArray:productIDs];

SKProductsRequest *apple_request = [[SKProductsRequest alloc] initWithProductIdentifiers:productSet];

apple_request.delegate = self;

NSLog(@"buy---test");

[apple_request start];

}

這段代碼是發(fā)起獲取商品請求,productIDs,是在iTunes里建立商品的對應(yīng)的ID ,如果有對應(yīng)的商品會(huì)在下面這個(gè)代理回調(diào)中返回商品信息

-(void)productsRequest:(SKProductsRequest? *)request didReceiveResponse:(SKProductsResponse *)response{

NSArray *products = [response products];

if (products != nil && [products count]>0) {

for(SKProduct *product in products){

NSLog(@"product info");

NSLog(@"SKProduct 描述信息%@", [product description]);

NSLog(@"產(chǎn)品標(biāo)題 %@" , product.localizedTitle);

NSLog(@"產(chǎn)品描述信息: %@" , product.localizedDescription);

NSLog(@"價(jià)格: %@" , product.price);

NSLog(@"Product id: %@" , product.productIdentifier);

}

}

}

確定商品存在以后就可以發(fā)起支付請求了,當(dāng)然在獲取商品之前最好先添加觀察者

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

然后發(fā)起支付請求

SKPayment *payment = [SKPayment paymentWithProduct:buy_product];//這個(gè)buy_product就是你要購買的商品,從上面代理回調(diào)返回的商品中篩選出來的

[[SKPaymentQueue defaultQueue] addPayment:payment];

支付過程中發(fā)生的變化,都會(huì)在下面回調(diào)中出現(xiàn)

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{

for (SKPaymentTransaction *trans in transactions) {

switch (trans.transactionState) {

case SKPaymentTransactionStateFailed:

{

NSLog(@" trans Failed");

switch(trans.error.code) {

case? SKErrorUnknown:

errorMsg = @"無法連接iTunes Store(如有疑問,可以詢問蘋果客服)";

break;

case? SKErrorClientInvalid:

errorMsg = @"客戶端驗(yàn)證錯(cuò)誤";

break;

case SKErrorPaymentCancelled:

errorMsg = @"訂單已取消";

break;

case SKErrorPaymentNotAllowed:

errorMsg = @"當(dāng)前蘋果設(shè)備無法購買商品(如有疑問,可以詢問蘋果客服)";

break;

case SKErrorPaymentInvalid:

errorMsg = @"購買商品標(biāo)識無效";

break;

case SKErrorStoreProductNotAvailable:

errorMsg = @"在目前的商店內(nèi)產(chǎn)品不可購買";

break;

case SKErrorCloudServicePermissionDenied:

errorMsg = @"用戶已不允許訪問云服務(wù)信息(如有疑問,可以詢問蘋果客服)";

break;

case SKErrorCloudServiceNetworkConnectionFailed:

errorMsg = @"設(shè)備沒有聯(lián)網(wǎng)";

break;

}

[[SKPaymentQueue defaultQueue] finishTransaction:trans];

}

break;

case SKPaymentTransactionStatePurchased:

{

NSLog(@" trans Purchased");

NSData *receiptData;

receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

if (receiptData != nil) {

NSDictionary *requestContents = @{

@"receipt-data": [receiptData base64EncodedStringWithOptions:0]

};

}

NSError *error;

NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents

options:0

error:&error];

NSString *base64_receipt = [[NSString alloc] initWithData:requestData encoding:NSUTF8StringEncoding];//這個(gè)是最后的驗(yàn)證信息,建議傳給服務(wù)端去驗(yàn)證(本地建議用keychain保存)

[[SKPaymentQueue defaultQueue] finishTransaction: trans];

}

break;

case SKPaymentTransactionStateDeferred:

{

NSLog(@" trans Deferred");

}

break;

case SKPaymentTransactionStateRestored:

{

NSLog(@"恢復(fù)購買");

NSData *receiptData;

receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

NSString *receipt = [[NSString alloc] initWithData:receiptData encoding:NSUTF8StringEncoding];

[[SKPaymentQueue defaultQueue] finishTransaction:trans];

}

break;

case SKPaymentTransactionStatePurchasing:

{

NSLog(@" trans Purchasing");

}

break;

default:

{

NSLog(@"");

}

break;

}

}

}

-(void)request:(SKRequest *)request didFailWithError:(NSError *)error{

NSLog(@"request fail");//請求失敗

}

-(void)requestDidFinish:(SKRequest *)request{

NSLog(@"request finish");//請求完成

}

上述過程基本就完成了內(nèi)購的流程,其實(shí)也不難,但是,就這短短的流程之間就可能會(huì)發(fā)生好些問題,

在內(nèi)購時(shí),要加是否越獄的判斷,代碼順便也貼出來吧

#define USER_APP_PATH? ? ? ? ? ? ? ? @"/User/Applications/"

+(BOOL)isJailBreak{

//判斷文件是否存在

NSArray *arr = @[@"/Applications/Cydia.app",

@"/Library/MobileSubstrate/MobileSubstrate.dylib",

@"/bin/bash",

@"/usr/sbin/sshd",

@"/etc/apt"? ];

for (NSString *str in arr) {

if ([[NSFileManager defaultManager] fileExistsAtPath:str]) {

NSLog(@"The device is jail broken! path === %@",str);

return YES;

}

}

//return NO;

//判斷cydia應(yīng)用是否存在

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {

NSLog(@"The device is jail broken!");

return YES;

}

//? return NO;

//不越獄的機(jī)器沒有這個(gè)權(quán)限來判定的

if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {

NSLog(@"The device is jail broken!");

NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];

NSLog(@"applist = %@", applist);

return YES;

}

//? return NO;

//讀取環(huán)境變量

//? ? char *env = getenv("DYLD_INSERT_LIBRARIES");

//? ? NSLog(@"%s", env);

//? ? if (env) {

//? ? ? ? NSLog(@"The device is jail broken!");

//? ? ? ? return YES;

//? ? }

NSLog(@"The device is NOT jail broken!");

return NO;

}

內(nèi)購?fù)瓿?蘋果返回的驗(yàn)證最好在服務(wù)端進(jìn)行驗(yàn)證,網(wǎng)絡(luò)不佳的情況下,本地最好保存在鑰匙串(keychain)中,保存在沙盒可能刪掉app,憑證就沒有了,這個(gè)憑證是非常重要的,內(nèi)購的唯一依據(jù),蘋果只管這個(gè)商品有沒有效,不會(huì)對購買的商品是否一致驗(yàn)證,有的人可以利用現(xiàn)成有效的憑證刷單的

沙箱測試賬號,可以在調(diào)試狀態(tài)下,模擬真實(shí)購買流程,基本和正常賬號是一樣的,不過不能在線上版本使用

給蘋果審核商品的時(shí)候注意名稱,有敏感詞匯,會(huì)被拒

審核app版本的時(shí)候,最好注明哪些不是內(nèi)購商品,否則容易被誤解,導(dǎo)致被拒

就先寫這些,以后有在補(bǔ)充...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • - 消耗型項(xiàng)目 就像你玩游戲需要買金幣,買鉆石等,只要花錢就可以無限次的購買 - 非消耗型項(xiàng)目 就像你在App S...
    tiger2016閱讀 717評論 0 1
  • 自己開發(fā)的視頻直播項(xiàng)目,牽涉到充值金幣,用到了蘋果公司的內(nèi)購,趴坑了兩天,這里總結(jié)下實(shí)現(xiàn)蘋果內(nèi)購。 一. 創(chuàng)建測試...
    Leo丶Dicaprio閱讀 3,502評論 8 7
  • 不知不覺,來這里已經(jīng)有11天了,該學(xué)的東西還沒有完全學(xué)會(huì)。反而是越來越糊涂。特別是這兩天,跟了以前的一款板子,由于...
    遇見敏姑娘閱讀 355評論 0 0
  • 也許,很久很久以前我們都是一個(gè)個(gè)單純而又天真的精靈。只是在懵懂無知的時(shí)候逐漸地接觸到了這個(gè)滿是戴著面具生活的形形色...
    大漠郡主閱讀 272評論 0 4

友情鏈接更多精彩內(nèi)容