2014-06-07 120 views
0

我正在尝试使用cocos2d x C++在应用程序中集成应用程序购买。我正在使用easyNdk助手进行应用内购买。我的应用程序购买完美适用于我的Objective C应用程序。但对于cocos2d的X是以下行Cocos2dx InApp为ios购买

if ([[RageIAPHelper sharedInstance] productPurchased:productP.productIdentifier]) 

其实值从CPP进来的参数形式完美的文件,并正确显示其在NSLog的值抛出错误,但它总是显示对象作为零甚至objetcs打印其在NSLog的

储值还@try捕捉条件不工作

终于抛出了以下错误enter image description here

请帮助我,我有什么关系? 感谢

我.CPP代码

NDKHelper::AddSelector("HelloWorldSelectors", 
          "SampleSelector", 
          callfuncND_selector(Main::cameFromObjC), 
          this); 

      CCDictionary* prms = CCDictionary::create(); 
      prms->setObject(CCString::create("SampleSelector"), "to_be_called"); 
      prms->setObject(CCString::create(result), "BirdNameKey"); 
SendMessageWithParams(string("SampleSelector"), prms); 

和.mm代码

- (void) SampleSelector:(NSObject *)prms 
{ 
    NSLog(@"purchase something called"); 
    NSDictionary *parameters = [[NSDictionary alloc]init];// (NSDictionary*)prms; 
    parameters = (NSDictionary*)prms; 
    NSLog(@"Passed params are : %@", parameters); 

    // Fetching the name of the method to be called from Native to C++ 
    // For a ease of use, i have passed the name of method from C++ 
    NSString* CPPFunctionToBeCalled = (NSString*)[parameters objectForKey:@"to_be_called"]; 
    //NSString *str = [NSString stringWithFormat:@"%@",[parameters valueForKey:@"BirdNameKey"]]; 
    NSString *BirdName = [parameters valueForKey:@"BirdNameKey"]; 
    NSString *str = [[NSString alloc]initWithFormat:@"%@",[parameters objectForKey:@"BirdNameKey"]]; 
    NSUserDefaults *d2 = [NSUserDefaults standardUserDefaults]; 
    NSLog(@"%@ , %@ , %@", str,BirdName,[d2 objectForKey:@"product"]); // output is ok for all 
    SKProduct * product = (SKProduct *) [ APPDELEGATE.productDictionary objectForKey:[d2 objectForKey:@"product"]]; 
    [ APPDELEGATE.priceFormatter setLocale:product.priceLocale]; 
    APPDELEGATE.currentProduct =product; 

if ([[RageIAPHelper sharedInstance] productPurchased:product.productIdentifier]) 
     { 
      // check the product purchased or not but app crash at this if statement 
     } 
    [IOSNDKHelper SendMessage:CPPFunctionToBeCalled WithParameters:nil]; 
} 
+0

你发送给这个MM文件这个值,是字符*?另外,你有没有在MM文件中记录这个值?另外,您使用的这个对象的剩余部分是什么? –

+0

@ Al-mo嗨,亲爱的,我将参数从.cpp文件传递给.mm文件,然后将其转换为NSDictionary。我的项目中没有使用任何retain关键字,因为它是ARC项目。恐怕我现在不应该在那里我必须设置retaincount :(,我不知道你是什么意思的“你有没有在MM文件中记录这个值”我也尝试使用CCUserDefault设置值,然后试图通过NSUserDefault来解决问题,但同样的问题存在:( –

+0

在发送之前,你能检查什么是你的字典的RETAINCOUNT,并且当你收到这本字典时,你接受它作为NSDICTIONARY(参数)还是你使用从CPP文件发送的Dictory创建了一个NSDictionary对象? –

回答

1

我也有这个问题,我解决了它。 在您的IAPhelper中。毫米

只有具备以下行

_purchasedProductIdentifiers = [[NSMutableSet alloc] init]; 

做替换该行

_purchasedProductIdentifiers = [NSMutableSet set]; 

如下图所示

- (id)initWithProductIdentifiers:(NSSet *)productIdentifiers { 

    if ((self = [super init])) { 

     // Store product identifiers 
     _productIdentifiers = productIdentifiers; 

     // Check for previously purchased products 
//  _purchasedProductIdentifiers = [NSMutableSet set]; 
     _purchasedProductIdentifiers = [[NSMutableSet alloc] init]; 
     for (NSString * productIdentifier in _productIdentifiers) { 
      BOOL productPurchased = [[NSUserDefaults standardUserDefaults] boolForKey:productIdentifier]; 
      if (productPurchased) { 
       [_purchasedProductIdentifiers addObject:productIdentifier]; 
       // NSLog(@"Previously purchased: %@", productIdentifier); 
      } else { 
       // NSLog(@"Not purchased: %@", productIdentifier); 
      } 
     } 

     // Add self as transaction observer 
     [[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 

    } 
    return self; 

} 
+0

它的工作。谢谢 –

+0

欢迎亲爱的:) – user3610913

0

我看到两个(潜在的)问题与您的代码,

首先

CCDictionary* prms = CCDictionary::create(); 

请注意,初始化数据对象这种方式并不能保证它不会被释放,当您尝试访问它后面的代码(在其他功能上专门)

所以,试试这个代替,

CCDictionary* prms = new CCDictionary(); 
prms->init ... (the initialization) 

但请注意,通过这样做,现在您有责任在完成该操作后删除此对象。另外,我不确定“setObject”方法的实现,如果它保留了对象,那么我相信这一步将不是必需的,但我不确定是否必须检查它!

其次

NSDictionary *parameters = [[NSDictionary alloc]init];// (NSDictionary*)prms; 
parameters = (NSDictionary*)prms; 
NSLog(@"Passed params are : %@", parameters); 

我觉得这是在铸件(或我可能是错的)

我建议你的问题做这样的事情

(NSDictionary *)nsDictionaryFromCCDictionary:(cocos2d::CCDictionary *)ccDictionary { 
if (ccDictionary == NULL) { 
    return NULL; 
} else if (ccDictionary->allKeys() == NULL) { 
    return NULL; 
} else if (ccDictionary->allKeys()->count() <= 0) { 
    return NULL; 
} 

cocos2d::CCLog("1"); 

NSMutableDictionary *nsDict = [NSMutableDictionary dictionaryWithCapacity:ccDictionary->allKeys()->count()]; 

cocos2d::CCLog("2"); 

for (int i = 0; i < ccDictionary->allKeys()->count(); i++) { 
    cocos2d::CCLog("3"); 

    cocos2d::CCObject* obj = ccDictionary->objectForKey(((cocos2d::CCString *)ccDictionary->allKeys()->objectAtIndex(i))->getCString()); 
    NSObject* nsObject; 
    if(isKindOfClass(obj, cocos2d::CCDictionary)) 
    { 
     nsObject = @"Dictionary"; 
    } 
    else if(isKindOfClass(obj, cocos2d::CCArray)) 
    { 
     nsObject = @"Array"; 
    } 
    else if (isKindOfClass(obj, cocos2d::CCString)) 
    { 
     const char* cstring = ((cocos2d::CCString*)obj)->getCString(); 
     nsObject = [[[NSString alloc] initWithBytes:cstring length:strlen(cstring) encoding:NSUTF8StringEncoding] autorelease]; 
    } 
    else if (isKindOfClass(obj, cocos2d::CCInteger)) 
    { 
     nsObject = [NSString stringWithFormat:@"%d", ((cocos2d::CCInteger*)obj)->getValue()]; 
    } 
    else 
    { 
     nsObject = @"Unknown Object"; 
    } 
    [nsDict setValue:nsObject forKey:[AnalyticXStringUtil nsstringFromCString:((cocos2d::CCString *)ccDictionary->allKeys()->objectAtIndex(i))->getCString()]]; 
} 

return nsDict; 

}

我粘贴了以上代码>>>https://github.com/diwu/AnalyticX/blob/master/Add-To-Your-Own-Project/AnalyticXStringUtil.mm

尝试接收字典作为CCDictionary,并检查此对象是否有效(因为mm可以有C++和目标c代码,所以这不会是一个问题)然后创建NSDictionary后,尝试打印它。我希望这次不会给你错误。

+0

亲爱的Al-mo我尝试了您的建议技术,但徒劳无功,即使我提供HardCoded In App pur追逐的关键,但仍然是抛出相同的错误我认为这可能是一些编译器问题 –

+0

我很想调试它......因为它似乎很奇怪! –

+0

你可以给我任何样品ios在应用程序购买代码运行在cocos2d-x –