quick-cocos2dx中 lua 和oc的通信

        quick-cocos2dx中 lua 和oc的通信中,遊戲的邏輯是用lua代碼,系統是ios系統,主要是oc代碼。那麼,如果要調用支付代碼,該如何調用呢?

        這裏兩者溝通的橋樑主要是使用luaoc這個模塊。廢話不多說,下面是lua端的例子。代碼如下:


                    local  function buySuccess(receipt)
                        print(" buySuccess! "..receipt)

                        print("  調用lua代碼向服務器請求驗證receipt的正確性")
        end

                local products = {
                    productIndex = 1,
                }

                luaoc.callStaticMethod("MyObserver", "buyProduct",products)
                luaoc.callStaticMethod("MyObserver", "registerScriptHandler", {listener = buySuccess})

可以明確的看出,     products是參數,buySuccess是回調函數,buyProduct是MyObserver的一個類。

             下面給出oc代碼的例子:

--MyObserver.h

#import <UIKit/UIKit.h>
#import <StoreKit/StoreKit.h>


enum
{
    IAP60DM = 0,
    IAP130DM,
    IAP370DM,
    IAP720DM,
    IAP1650DM,
    IAPWUJIN,
}buyDiamondTag;


@interface MyObserver : NSObject<SKProductsRequestDelegate,SKPaymentTransactionObserver>
{
     int buyType;
}


+(MyObserver*) sharedInstance;


-(void)requestProUpgradeProductData;
-(void)RequestProductData;
-(bool)CanMakePay;
-(void)buy:(int)type;
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions;
-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction;
-(void) completeTransaction: (SKPaymentTransaction *)transaction;
-(void) failedTransaction: (SKPaymentTransaction *)transaction;
-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction;
-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error;
-(void) restoreTransaction: (SKPaymentTransaction *)transaction;
-(void)provideContent:(NSString *)product;
-(void)recordTransaction:(NSString *)product;


+(void)buyProduct:(NSDictionary*)info;
+(void)registerScriptHandler:(NSDictionary*)info;




@end


--MyObserver.mm



#import "MyObserver.h"


#import "cocos2d.h"
#include "CCLuaEngine.h"
#include "CCLuaBridge.h"


#define ProductID_IAP60DM    @"xinshoudalibao"  //6
#define ProductID_IAP130DM   @"com.bluebox.130DM"  //12
#define ProductID_IAP370DM   @"com.bluebox.370DM" //30
#define ProductID_IAP720DM   @"com.bluebox.720DM"  //50
#define ProductID_IAP1650DM  @"com.bluebox.1650DM"  //98
#define ProductID_WUJIN      @"com.bluebox.WUJIN"


@implementation MyObserver


static MyObserver* _sharedInstance = nil;
static int functionId = 0;
static int buyItemdId = -1;
static NSString * receipt = @"";
static int buySuccess = 1;


+(MyObserver*)sharedInstance
{
    @synchronized([MyObserver class])
    {
        if (!_sharedInstance)
            [[self alloc] init];
        functionId = 0;
        [[SKPaymentQueue defaultQueue] addTransactionObserver:_sharedInstance];
        return _sharedInstance;
    }
    return nil;
}


+(id)alloc
{
    @synchronized([MyObserver class])
    {
        NSAssert(_sharedInstance == nil, @"Attempted to allocate a second instance of a singleton.\n");
        _sharedInstance = [super alloc];
        return _sharedInstance;
    }
    return nil;
}


+(void)buyProduct:(NSDictionary*)info
{
    int productIndex = 0;
    if ([info objectForKey:@"productIndex"])
    {
        productIndex = [[info objectForKey:@"prodectIndex"] intValue];
    }
    
    [[MyObserver sharedInstance] buy:productIndex];
}


+ (void) registerScriptHandler:(NSDictionary*)dict
{
    NSLog(@"%s: %@", __func__, dict);
    
    // functionId 是 Lua function 的引用 ID,參考 LuaJavaBridge 文章中的描述
    functionId = [[dict objectForKey:@"listener"] intValue]; //保存回調函數
    
//    NSLog(@" functionId %d",functionId);
//    // 1. 將引用 ID 對應的 Lua function 放入 Lua stack
//    cocos2d::LuaBridge::pushLuaFunctionById(functionId);
//    
//    // 2. 將需要傳遞給 Lua function 的參數放入 Lua stack
//    cocos2d::LuaBridge::getStack()->pushString("SDK_LEAVE_PLATFORM");
//    
//    // 3. 執行 Lua function
//    cocos2d::LuaBridge::getStack()->executeFunction(1);
    
//    auto director = cocos2d::Director::getInstance();
//    director->getScheduler()->schedule([=](float dt)
//                                       {
////                                           if (buySuccess!=1) {
//                                               NSString *a  = @"a";
//                                               NSLog(@" buyItemId %d",buyItemdId);
//                                               cocos2d::LuaBridge::pushLuaFunctionById(functionId);
//                                               cocos2d::LuaBridge::getStack()->pushString([a UTF8String]);
//                                               cocos2d::LuaBridge::getStack()->executeFunction(1);
//                                               // 4. 釋放引用 ID
////                                               cocos2d::LuaBridge::releaseLuaFunctionById(functionId);
////                                           }
////                                           NSLog(@" buySuccess %d",buySuccess);
//                                       } , self, 1.0f, 10, 0.0f, false, "SHOW_WINDOW_CALLBACK");
}


-(id)init {
    self = [super init];
    if (self != nil) {
        // initialize stuff here
    }
    return self;
}


-(void)buy:(int)type
{
    buyType = type;
    buyItemdId = type;
    if ([SKPaymentQueue canMakePayments]) {
        //[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
        [self RequestProductData];
        NSLog(@"允許程序內付費購買");
    }
    else
    {
        NSLog(@"不允許程序內付費購買");
        UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:@"Alert"
                                                            message:@" You can‘t purchase in app store "
                                                           delegate:nil cancelButtonTitle:NSLocalizedString(@"Close(關閉)",nil) otherButtonTitles:nil];
        
        [alerView show];
        [alerView release];
        
    }
}


-(bool)CanMakePay
{
    return [SKPaymentQueue canMakePayments];
}


-(void)RequestProductData
{
    NSLog(@"---------請求對應的產品信息------------");
    NSArray *product = nil;
    switch (buyType) {
            
        case IAP60DM:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP60DM,nil];
            break;
        case IAP130DM:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP130DM,nil];
            break;
        case IAP370DM:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP370DM,nil];
            break;
        case IAP720DM:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP720DM,nil];
            break;
        case IAP1650DM:
            product=[[NSArray alloc] initWithObjects:ProductID_IAP1650DM,nil];
            break;
        case IAPWUJIN:
            product = [[NSArray alloc] initWithObjects:ProductID_WUJIN,nil];
        default:
            break;
    }
    NSSet *nsset = [NSSet setWithArray:product];
    SKProductsRequest *request=[[SKProductsRequest alloc] initWithProductIdentifiers: nsset];
    request.delegate=self;
    [request start];
    [product release];
}
//<SKProductsRequestDelegate> 請求協議
//收到的產品信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
    
    NSLog(@"-----------收到產品反饋信息--------------");
    NSArray *myProduct = response.products;
    NSLog(@"產品Product ID:%@",response.invalidProductIdentifiers);
    NSLog(@"產品付費數量: %d", [myProduct count]);
    // populate UI
    for(SKProduct *product in myProduct){
        NSLog(@"product info");
        NSLog(@"SKProduct 描述信息%@", [product description]);
        NSLog(@"產品標題 %@" , product.localizedTitle);
        NSLog(@"產品描述信息: %@" , product.localizedDescription);
        NSLog(@"價格: %@" , product.price);
        NSLog(@"Product id: %@" , product.productIdentifier);
    }
    SKPayment *payment = nil;
    switch (buyType) {
        case IAP60DM:
            NSLog(@" xinshoudalibao ");
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP60DM];    //支付$0.99
            break;
        case IAP130DM:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP130DM];    //支付$1.99
            break;
        case IAP370DM:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP370DM];    //支付$9.99
            break;
        case IAP720DM:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP720DM];    //支付$19.99
            break;
        case IAP1650DM:
            payment  = [SKPayment paymentWithProductIdentifier:ProductID_IAP1650DM];    //支付$29.99
            break;
        case IAPWUJIN:
             payment  = [SKPayment paymentWithProductIdentifier:ProductID_WUJIN];
            break;
        default:
            break;
    }
    NSLog(@"---------發送購買請求------------");
    [[SKPaymentQueue defaultQueue] addPayment:payment];
    [request autorelease];
}


- (void)requestProUpgradeProductData
{
    NSLog(@"------請求升級數據---------");
    NSSet *productIdentifiers = [NSSet setWithObject:@"com.productid"];
    SKProductsRequest* productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];
    productsRequest.delegate = self;
    [productsRequest start];
    
}
//彈出錯誤信息
- (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
    NSLog(@"-------彈出錯誤信息----------");
    UIAlertView *alerView =  [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert",NULL) message:[error localizedDescription]
                                                       delegate:nil cancelButtonTitle:NSLocalizedString(@"Close",nil) otherButtonTitles:nil];
    [alerView show];
    [alerView release];
}


-(void) requestDidFinish:(SKRequest *)request
{
    NSLog(@"----------反饋信息結束--------------");
}


-(void) PurchasedTransaction: (SKPaymentTransaction *)transaction{
    NSLog(@"-----PurchasedTransaction----");
    NSArray *transactions =[[NSArray alloc] initWithObjects:transaction, nil];
    [self paymentQueue:[SKPaymentQueue defaultQueue] updatedTransactions:transactions];
    [transactions release];
}


//<SKPaymentTransactionObserver> 千萬不要忘記綁定,代碼如下:
//----監聽購買結果
//[[SKPaymentQueue defaultQueue] addTransactionObserver:self];


- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions//交易結果
{
    NSLog(@"-----paymentQueue--------");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchased://交易完成
            {
                [self completeTransaction:transaction];
                 NSLog(@"-----交易完成 --------");


//                cocos2d::LuaEngine::defaultEngine()->executeGlobalFunction("paySuccess");
            }
            break;
                
            case SKPaymentTransactionStateFailed://交易失敗
            {
                [self failedTransaction:transaction];
                cocos2d::LuaEngine::getInstance()->executeGlobalFunction("payFailure");
                NSLog(@"-----交易失敗 --------");
            }
            break;
                
            case SKPaymentTransactionStateRestored://已經購買過該商品
            {
                [self restoreTransaction:transaction];
                NSLog(@"-----已經購買過該商品 --------");
            }
            break;
                
            case SKPaymentTransactionStatePurchasing:      //商品添加進列表
                NSLog(@"-----商品添加進列表 --------");
                break;
                
            default:
                break;


        }
    }
}




- (void) completeTransaction: (SKPaymentTransaction *)transaction
        
{
            NSLog(@"-----completeTransaction--------");
            // Your application should implement these two methods.
//            NSString *product = transaction.payment.productIdentifier;
//            if ([product length] > 0) {
//                
//                NSArray *tt = [product componentsSeparatedByString:@"."];
//                NSString *bookid = [tt lastObject];
//                if ([bookid length] > 0) {
//                    [self recordTransaction:bookid];
//                    [self provideContent:bookid];
//                }
//            }
    
    // Your application should implement these two methods.
    NSString * productIdentifier = transaction.payment.productIdentifier;
    receipt = [transaction.transactionReceipt base64Encoding];
    
//    NSData *working = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
//    // Tried 64 or 76 chars/line and LF or CR line endings
//    NSString *receipt = [working base64EncodedStringWithOptions:kNilOptions];


//     [transaction.transactionReceipt base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
//    NSLog(@"%@ ",receipt);
    
    if ([productIdentifier length] > 0) {
        // 向自己的服務器驗證購買憑證
        cocos2d::LuaBridge::pushLuaFunctionById(functionId);
        cocos2d::LuaBridge::getStack()->pushString([receipt UTF8String]);
        cocos2d::LuaBridge::getStack()->executeFunction(1);
    }
    // Remove the transaction from the payment queue.
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
}


//記錄交易
-(void)recordTransaction:(NSString *)product{
    NSLog(@"-----記錄交易--------");
}


//處理下載內容
-(void)provideContent:(NSString *)product{
    NSLog(@"-----下載--------");
}


- (void) failedTransaction: (SKPaymentTransaction *)transaction{
    NSLog(@"失敗");
    if (transaction.error.code != SKErrorPaymentCancelled)
    {
    }
    [[SKPaymentQueue defaultQueue] finishTransaction: transaction];
    
    
}
-(void) paymentQueueRestoreCompletedTransactionsFinished: (SKPaymentTransaction *)transaction{
    
}


- (void) restoreTransaction: (SKPaymentTransaction *)transaction


{
    NSLog(@" 交易恢復處理");
    
}


-(void) paymentQueue:(SKPaymentQueue *) paymentQueue restoreCompletedTransactionsFailedWithError:(NSError *)error{
    NSLog(@"-------paymentQueue----");
}




#pragma mark connection delegate
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSLog(@"%@",  [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    
    NSLog(@" didReceiveResponse! ");
    switch([(NSHTTPURLResponse *)response statusCode]) {
        case 200:
        case 206:
            break;
        case 304:
            break;
        case 400:
            break;
        case 404:
            break;
        case 416:
            break;
        case 403:
            break;
        case 401:
        case 500:
            break;
        default:
            break;
    }
}


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"test");
}


-(void)dealloc
{
    [super dealloc];
}
@end


代碼都有,主要是寫了一個buyProduct的函數。這個函數在lua中調用,在oc中實現,實現其中的功能。寫了一個mm文件。

這樣就能夠溝通了。



發佈了79 篇原創文章 · 獲贊 16 · 訪問量 58萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章