不眠不休,棄而不捨的搞了好多天,終於把In-App Purchase的問題搞定了,嚴格說來啟用In-App不難,但難的是一旦有問題時不容易了解問題出在哪,得花很大的精神去檢查,所以趁剛搞定時趕緊來寫個簡單的心得。希望和我一樣的有志一同,想上AppStore用IAP騙賺錢的iOS開發者,可以少走一點冤枉路...
首先是設定的部份,步驟相當的複雜且煩瑣,但是可以參考底下這篇文章,它把整個設定和程式碼的部份交代得非常詳細,請務必照這篇文章來試做,且每一個環節都不能疏忽,所以我這邊就不再重複了。
In App Purchases: A Full Walkthrough
那...滿滿的都是英文,對於像我這種有英文障礙的人是很大的困擾,沒關係,對岸有人將它完整翻譯成簡體中文,這真是功德無量,佛心來的。
IAP(程序内购买): 完全攻略
如果還是對簡體中文有若干的閱讀障礙,那那那...只好把文章整篇複製貼到Word文件,然後用內建的繁簡轉換吧~
簡單的說,當一切就緒時,可以先透過簡單的程式碼,用SKProductsRequest檢查ProductID是否合法,來判定整個設定/環境/程式碼是否正常。
if ([SKPaymentQueuecanMakePayments]) { NSLog(@"Parental-controls are disabled"); SKProductsRequest *productsRequest = [[SKProductsRequestalloc] initWithProductIdentifiers: [NSSetsetWithObject:@"com.yourcompany.appname.productid1"]]; productsRequest.delegate = self; [productsRequest start]; } else { NSLog(@"Parental-controls are enabled"); }
//SKProductsRequestDelegate - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { SKProduct *validProduct = nil; int count = [response.products count]; if (count > 0) { validProduct = [response.products objectAtIndex:0]; NSLog(@"validProduct = %@",validProduct.productIdentifier); } else if (!validProduct) { NSLog(@"No products available"); }
for (NSString *invalidProductId in response.invalidProductIdentifiers) { NSLog(@"Invalid product id: %@" , invalidProductId); } }
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{ UIAlertView *alerView = [[UIAlertViewalloc] initWithTitle:@"Alert"message:[error localizedDescription] delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil]; [alerView show]; [alerView release];
} |
如果一路照著做下來,很僥倖的成功了,代表你的命好,運氣相當不錯,一次就能成功。不過,台灣的程式設計師幾乎都是命運坎坷來的(有這種好運的人,應該去買樓炒股買彩卷),而且有越來越多的iOS開發者都是原本錢途暗淡,事業財運不佳才轉職來幹的工作,所以命運乖違的iOS Programmer不用奢望一次搞定,第一次接觸IAP一定會遇到不能運作的問題,這是正常的。
成功的話,Console會顯示validProduct = com.yourcompany.appname.productid1,若不幸失敗,Console會顯示 No products avalable,Invalid product id: com.yourcompany.appname.productid1。如果是其他錯誤(通常是無法連線網路這種明顯問題),會跳出Alert視窗。最麻煩的是出現response.invalidProductIdentifiers,就是所謂的『Invalid Product ID』羅生門事件,這表示ProductID回傳錯誤,卻沒有錯誤碼可以對照。
一旦ProductID回傳錯誤,表示這個產品(Product)無法被付款購買,也不會進入付款的流程,於是開發者也收不到任何收入,於是開發者很快就餓死了,所以這個問題很嚴重...
ProductID錯誤的原因,請參考底下的一篇英文文章,內容已經整理出個大概,原因相當多,一旦發生問題時可依條列逐一檢查:
Invalid Product IDs
節錄文章內容如下:
- Have you enabled In-App Purchases for your App ID?
- Have you checked Cleared for Sale for your product?
- Have you submitted (and optionally rejected) your application binary?
- Does your project’s .plist Bundle ID match your App ID?
- Have you generated and installed a new provisioning profile for the new App ID?
- Have you configured your project to code sign using this new provisioning profile?
- Are you building for iPhone OS 3.0 or above?
- Are you using the full product ID when when making an
SKProductRequest
? - Have you waited several hours since adding your product to iTunes Connect?
- Are your bank details active on iTunes Connect?
- Have you tried deleting the app from your device and reinstalling?
以上的答案都要是YES,如果有一項答案是NO,它就極可能是導致Invalid Product ID的原因。最後再補充一項...應該是日以繼夜蒐遍網海,誠心跪拜股狗大神,終於打動股狗大仙顯靈,特賜的苦味良藥一帖,開示第101個Invalid Product ID的原因...
You can not use a JB device to test IAP.
看懂了嗎?就這個原因讓我搞很多天...TNND搞死我了...
留言列表