IMG_0001.PNG    

不眠不休,棄而不捨的搞了好多天,終於把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搞死我了...

sandbox  

arrow
arrow
    全站熱搜

    benjenq 發表在 痞客邦 留言(2) 人氣()