2011年8月1日 星期一

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

我過去還真的沒有想到,In-App Purchase居然要寫到Part 3。為什麼我要寫Part3呢?其實在Part 1、2都已經把In App Purchase的使用方式都介紹的很詳盡了,但是,在”實務”上,是要添加小技巧的,以下為原因:

        1. 在連結In-App purchase的時候,如何讓所有動作(如按鈕、touch等)需暫停?
        2. 如果網路不通、或無網路服務,如何停止連線?
        3. 索取購物資訊的時候,如果發生錯誤,如何停止連線?
以下我將依序介紹該如何建構出一個好的In-App Purchase架構。
首先,先觀看一下,原本設計的流程架構:

以上流程架構完全是一條線的方式,商店初始化後,就索取資訊,然後建立按鈕等待使用者按下,然後等待系統回應。這樣一條龍式的程式設計,如果其中有一環節出問題,將使程式變成無限循環的Run下去,無法將購買步驟停止。因此,在這些流程中,需要加入一些判斷,去檢驗In-App Purchase是否還成功的持續連線中。因此會需要以下這些程式輔助:

1. 執行In-App Purchase時,會需要將目前畫面暫停,讓使用者知道目前在與In-App Purchase連線中,這邊採用以下程式:
native.setActivityIndicator( true )
這功能主要是可以顯示一個平台的執行畫面,類似如下圖:
當啟動此功能時,所有touch功能將無法使用,也就可以達到暫停所有行為。
2. 檢查網路系統
透過以下程式檢查網路系統,若無網路連線,則回報給使用者,無法連線In-App Purchase。
local function check_internet()
------------------------------
-- Internet check via Socket
------------------------------
    local internet
    if require("socket").connect("google.com", 80) == nil then
        print("No connection")
        internet = false
    else
        internet = true
    end
    return internet
end
那麼就可以利用以上方式來檢驗是否有網路連線,若無,跳出Alert顯示給使用者。
程式如下:
local function onCompleteok(event)
    if event.action == "clicked" then
        if event.index == 1 then
            print("OK")
            native.setActivityIndicator( false )
        end
    end
end

if check_internet() then
    print("Internet Connect OK")
    print("Start to set up  InAppPurchase")
else
    print("Internet Connect failure")
    native.showAlert("Internet failed",
        "No internet connection. Please check internet and try again later.",
        { "OK" }, onCompleteok )
end
3. 在索取購物資訊的時候,由於如果沒有回應,則程式就會卡在與In-App Purchase連線的部份,因此,在此嚴謹一點,一般會採用一個timer去監測是否有資訊回應,若無,將In-App Purchase動作關閉。程式如下:
local function call_ConnectionTimer()
    local timerPurchase
    local delayTime = 60000 -- 60 sec
    local function checkConnection()
        if Connection_OK then
            print("Connect GOOD")
        else
            native.showAlert("Internet failed",
                "No InAppPurchase store reply. Please check internet and try again later.",
                { "OK" }, onCompleteok )
        end
    end
    
    timerPurchase = timer.performWithDelay( delayTime, checkConnection )
    return timerPurchase
end
4. 在transactionCallback的時候,若是採購失敗,會回傳failed,也必須要顯示警示給使用者,然後解除螢幕鎖定:
native.showAlert("Failure notification",
    "Failed to initialize In App Purchase. Please try again later.", 
    { "OK" }, onCompleteok )
以上補充將完整In-App Purchase之流程。最近我將會開發In-App Purchase之模組,會將上述功能完整包入,若有興趣者,敬請期待。

1 則留言:

  1. 大大您好,感謝您熱血的不吝分享教學,內容充實又清楚!!實在是讓在下獲益良多!!謝謝!
    在此想請問一下的是,如果用Corona SDK製作多人網路遊戲(就像市面上看到的那些網頁遊戲),請問要如何存取SERVER的data base呢?

    感謝您的解答!!
    (註:在下之前有在玩 php<->MySQL是有熟悉了)

    回覆刪除