2011年5月16日 星期一

Corona SDK -- Apple In-App Purchase -- Part 2

ok~~ 看過In-App Purchase之Part 1之後,我們直接進入程式該如何寫吧。
    1.首先,跟其他使用方法一樣,一定要先require store這個Library
-----------------------------------------
store = require (“store”)
----------------------------------------- 2.然後,馬上就要設定store初始話,設定store的listener -----------------------------------------
store.init(listener)
----------------------------------------- 3.可以向iTune下命令要索取可購買項目的資訊,在下命令之前,要先把您的In-App Purchase資訊的ProductID準備好,放在一個table裡面。 -----------------------------------------
listOfProductID = { “com.anscamobile.InAppPurchase.item001”, “com.anscamobile.InAppPurchase.item002”, “com.anscamobile.InAppPurchase.item002” }
----------------------------------------- 然後按照以下語法,下命令去索取資訊,當有資訊返回(event)時, 去找listener(callback function)的function執行動作 store.loadProducts(listOfProductID, listener) 執行此命令後,會回傳以下參數: event.product 可以購買的物件參數,包含title, description, price, 以及Product ID,都是你在iTune connect裡面設定的資訊 event.invalidProduct 如果你設定的listOfProductID裡面,有包含有問題的或者不存在的項目,就會把無法購買的項目回傳,以檢視你的listOfProduct是不是有問題 因此,在 store.loadProducts的listener裡面,就要把這些資訊儲存起來(尤其是price資訊,因為各國的幣值都不相同,你總不能叫歐洲也用美金買,他會提供歐元的數值,在iTune connect裡面也有說明) 範例程式: -----------------------------------------
store = require (“store”) store.init(transactionCallback) local validProducts, invalidProducts = {}, {} listOfProductID = { “com.anscamobile.InAppPurchase.item001”, “com.anscamobile.InAppPurchase.item002”, “com.anscamobile.InAppPurchase.item002” } store.loadProducts( listOfProducts, loadProductsCallback ) local function loadProductsCallback( event ) validProducts = event.products invalidProducts = event.invalidProducts creat_InApp_button() for i=1, #validProducts do print(validProducts[i].title) print(validProducts[i].price) print(validProducts[i].description) end end
----------------------------------------- 以上範例程式,就可以把你在iTune connect裡面設定的購買項目資訊給取出。我在 loadProductsCallback( event )裡面偷藏了一個 creat_InApp_button()這個function,這是幹嘛的呢?你有這些資訊之後,當然需要建立出GUI給玩家選擇吧,不然玩家怎麼買,所以當取得資訊之後(這步驟也確定網路連線與AppID正確),就可以建立相關button或者list提供玩家點選購買。 那當玩家點選購買之後,首先,建議先檢查這個device(iPhone或者iPod)是否可以購買(因為會有父母封鎖小孩手機的購買能力,所以要先檢查),可以利用 store.canMakePurchases 來取得可否購買資訊,如果可以購買,那會return true,檢查範例如下: -----------------------------------------
if store.canMakePurchases then store.purchase( {product} ) else native.showAlert("Store purchases are not available, please try again later", { "OK" } ) end
----------------------------------------- 如果可以購買,程式就會下命令 store.purchase( ProductID ) 去購買,然後返回的資訊會回到你上面設定的store.init(listener)的callback function ( transactionCallback)。這邊的程式,主要處理以下幾件事: 1. 成功購買物件(via store.purchase()) 2. 玩家取消購買物件(after store.purchase() was called) 3. 購買物件失敗(也會回傳原因)(via store.purchase()) 4. 前一次的購買被中斷(可能被電話來中斷),App store會繼續購買 因此,會回傳 event.transaction 參數,包含: state productIdentifier receipt identifier originalReceipt originalIdentifier originalDate errorType errorString 因此,從 event.transaction.state可以得知,玩家購買的狀況是purchased(購買成功)、restored、cancelled(玩家取消購買)、failed(購買失敗)、或者回傳是unknown的資訊。 依照回傳的state分門別類記錄起來。例如:玩家購買成功,那corona程式裡面自行要記錄玩家購買了什麼東東,因為In-App Purchase只提供購物的平台,並不會幫你的程式記錄購買了哪些東西、買了幾個東西。當然,如果是一次性的物品,再次購買時,In-App Purchase系統會告知已經買過了,可以再次下載。但是在程式中一定都要記錄購買了哪些東西。 然而,玩家購買到哪一項物品,In-App Purchase會透過 event.transaction.Identifier回傳是哪一個物品ID被購買,所以要自行判斷哪一個物品被買到,例如:補充藥水被買到,數量要增加並記錄起來。 transactionCallback範例程式: -----------------------------------------
--利用 identify_buy_what程式判別哪一項物品被買到,並傳回被買到的index local function identify_buy_what(productIdentifier) local index=0 if productIdentifier == listOfProducts[1] then index=1 elseif productIdentifier == listOfProducts[2] then index=2 else index=0 end return index end --以下為 transactionCallback程式,需要執行相對應的動作 --"purchased"購買成功,需要知道哪一項物品被購買,然後記錄起來 --"restored" --"cancelled" 玩家取消購買 --"failed" 購買失敗,可以列出失敗原因給玩家了解 local function transactionCallback( event ) local index=0 if event.transaction.state == "purchased" then -- 檢查是哪一項物品被購買到,傳回index index = identify_buy_what(event.transaction.productIdentifier) --依照不同物品被買到,程式需有相對應的記錄或動作 if index ==1 then description = "Transaction successful! \n" description = description .. "You already buy " .. validProducts[index].title elseif index == 2 then description = "Transaction successful! \n" description = description .. "You already buy " .. validProducts[index].title .. "\n" else --也許購買成功但有出現其他問題,儘量列出給玩家看 description = "I don't know what you are buying.\n" description = description .. "Please try again later or connect to Apple.\n" end elseif event.transaction.state == "restored" then -- Reminder: your app must store this information somewhere -- Here we just display some of it description = "Restoring transaction:" .. "\n Original ID: " .. event.transaction.originalTransactionIdentifier .. "\n Original date: " .. event.transaction.originalDate elseif event.transaction.state == "cancelled" then -- 玩家取消購買物品 index = identify_buy_what(event.transaction.productIdentifier) description = "Transaction cancelled by user. \n" description = description .. "Buying " .. validProducts[index].title .. " failed." elseif event.transaction.state == "failed" then -- 購買失敗,列出失敗原因 description = "Transaction failed, type: ", event.transaction.errorType, event.transaction.errorString else -- 若event.transaction.state回傳奇怪資訊,將亦為一種Error,也須列給玩家了解 despriction = "Unknown event" end -- 最後,需要告知store 已經完成購買動作,等待下一次購買,若有下載的動作,最好等待程式下載完畢在執行次列程式。 store.finishTransaction( event.transaction ) end
----------------------------------------- 因此,整體的In-App Purchase動作,將如以下程序建立: 1. local store = require("store") 2. store.init (transactionCallback ) 3. store.loadProducts( listOfProducts, loadProductsCallback ) 4. setupStore()取得可購買物品的資訊後,需建立相關按鈕,或者list提供玩家購買 5. 在setupStore()建立的按鈕或list裡面,若玩家選擇購買某物品,則下命令store.purchase( {product} ),並等待回應 6. 下購買命令後,系統回應資訊會找到 store.init (transactionCallback )所設定的listener,因此需要 function transactionCallback( event )針對購買的結果作相對應動作。 7. 告知store以購買完畢 store.finishTransaction( event.transaction ) 整體範例程式,可以直接參考Corona SDK官方的In-App Purchase程式。 有需要我貼出我自己的程式的話,在留言給我唄。

沒有留言:

張貼留言