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  

    2 Comments

    1. 第一次接觸iOS系統(買了iPAD 第4代 wifi+cellular 64G),用了十天的感想是垃圾一臺= .=跟當初接觸 Mac OS X的感覺差了十萬八千里= .=
      什麼都要錢,根本是騙錢的……自由度又很差……..真搞不懂為什麼iPhone 5這麼搶手???
      版主回覆:(12/13/2012 07:45:48 AM)
      蘋果的產品就是,電腦有它該做的事,iPad有它該做的事,iPhone有它該做的事,三個產品定位永遠不會互相打架,用戶也養成什麼時候拿iPad,什麼時後用電腦,習慣了根本想都不用想,反應跟直覺完全就是照著產品設定的定位在走,講難聽點是被制約,講好聽的就是這些設定完全符合直覺習慣與需求。
      換句話說,如果你滿懷期待iPad能做些不一樣的事,那麼真的會覺得它跟廢物一樣。

    2. 可能我之前中了windows的毒太深,用什麼都想 all in one ………..
      這次買iPad真的是「想買」的衝動而沒有經腦袋思考,本來對iPhone也充滿好奇(只看別人用,自己沒用過)被iPad 4澆了一大盆冷水(說iPhone 5是縮小版又能打電話的iPad 4應該不違過)
      版主回覆:(12/14/2012 01:46:05 AM)
      最早iPad發表示時,還被譏為納美人的iPod touch(不能打電話的iPhone)了無新意,不過還是一樣賣得嚇嚇叫。最早我也是覺得iPad這產品根本就是笑話,後來我竟然是依靠這個笑話混口飯吃。
      誰想得到這個笑話(以及其他廠牌的笑話產品)目前正在聯手終結傳統出版產業,韓國中小學正在導入無紙化教科書,美國四千多所教育機構將iPad列為重要教學載具,更別說印刷廠都倒得差不多了。這股洪流擋都擋不了。原因,它不是電腦那樣的萬能,但它確實改變了很多人使用電腦的習慣。以往開電腦的時間有一大部份都是上網、收信、看影片,現在大多轉移到平板上了。
      在福特發明車子前,大家都很期待能養出跑得飛快的馬。不過對想要馬的人來說,其實根本並不需要車子。至於想要馬還是車子呢?只有您自己最清楚了。

    發佈回覆給「葉日維」的留言 取消回覆

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *