關于蘋果內購的一些心得

根據公司的需求,我們的APP內是有內購的,從最開始開始做,到現在,也經歷了好些,我覺得有些地方的注意點還得寫寫.

內購的代碼,網上都有這里簡單的copy一下

首先,購買蘋果的商品,得確定一下,這個內購商品是否存在

-(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];

}

這段代碼是發起獲取商品請求,productIDs,是在iTunes里建立商品的對應的ID ,如果有對應的商品會在下面這個代理回調中返回商品信息

-(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(@"產品標題 %@" , product.localizedTitle);

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

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

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

}

}

}

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

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];

然后發起支付請求

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

[[SKPaymentQueue defaultQueue] addPayment:payment];

支付過程中發生的變化,都會在下面回調中出現

-(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 = @"客戶端驗證錯誤";

break;

case SKErrorPaymentCancelled:

errorMsg = @"訂單已取消";

break;

case SKErrorPaymentNotAllowed:

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

break;

case SKErrorPaymentInvalid:

errorMsg = @"購買商品標識無效";

break;

case SKErrorStoreProductNotAvailable:

errorMsg = @"在目前的商店內產品不可購買";

break;

case SKErrorCloudServicePermissionDenied:

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

break;

case SKErrorCloudServiceNetworkConnectionFailed:

errorMsg = @"設備沒有聯網";

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];//這個是最后的驗證信息,建議傳給服務端去驗證(本地建議用keychain保存)

[[SKPaymentQueue defaultQueue] finishTransaction: trans];

}

break;

case SKPaymentTransactionStateDeferred:

{

NSLog(@" trans Deferred");

}

break;

case SKPaymentTransactionStateRestored:

{

NSLog(@"恢復購買");

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");//請求完成

}

上述過程基本就完成了內購的流程,其實也不難,但是,就這短短的流程之間就可能會發生好些問題,

在內購時,要加是否越獄的判斷,代碼順便也貼出來吧

#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應用是否存在

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

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

return YES;

}

//? return NO;

//不越獄的機器沒有這個權限來判定的

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;

//讀取環境變量

//? ? 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;

}

內購完成,蘋果返回的驗證最好在服務端進行驗證,網絡不佳的情況下,本地最好保存在鑰匙串(keychain)中,保存在沙盒可能刪掉app,憑證就沒有了,這個憑證是非常重要的,內購的唯一依據,蘋果只管這個商品有沒有效,不會對購買的商品是否一致驗證,有的人可以利用現成有效的憑證刷單的

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

給蘋果審核商品的時候注意名稱,有敏感詞匯,會被拒

審核app版本的時候,最好注明哪些不是內購商品,否則容易被誤解,導致被拒

就先寫這些,以后有在補充...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

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