In App购买集成SpriteKit

问题描述:

我需要您的建议,使用“在应用程序购买”删除iAd。 我有“In App Purchase”的工作代码。但我不知道如何实现它(IOS)SpriteKit游戏。当我在View Controller中实现它时工作得很好,但我需要它在MyScene.m中工作,所以当我点击“-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event”方法中的“购买”警报窗口时,会弹出并让玩家购买它In App购买集成SpriteKit

This code is working in Storyboard and has IBbutton but it is not seen in SKScene. 
I am beginner developer and know how SKScene and MyScene but thats now enough. 
If you want to look at code let me know thanks 




Here is ny Code: 
in View Controller.h I declare 


    @interface ViewController : UIViewController <ADBannerViewDelegate> 

{ 
    IBOutlet ADBannerView *iadBanner; 
// 

} 
@property (nonatomic,strong) NSArray*products; 

@property(nonatomic,strong)NSUserDefaults*defaults; 


@end 


In ViewController.m 

    #import "MyNewlyCreatedScene.h" 

#import "ViewController.h" 

#import <StoreKit/StoreKit.h> 

@interface ViewController() 

@end 

@implementation ViewController 

@synthesize /*idBanner*/ products,defaults; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[SKPaymentQueue defaultQueue]addTransactionObserver:(id)self]; 

    defaults =[NSUserDefaults standardUserDefaults]; 

    BOOL isPro=[defaults boolForKey:@"isPro"]; 



    if (!isPro) { 
     //user code here 
     [self fetchProducts]; 

} else { 
     iadBanner.alpha=0.0; 

} 

} 
-(void)bannerViewDidLoadAd:(ADBannerView *)banner{ 

    defaults =[NSUserDefaults standardUserDefaults]; 

    BOOL isPro=[defaults boolForKey:@"isPro"]; 

    if (!isPro) { 
     //user code here 

[UIView beginAnimations:nil context:NULL]; 

    [UIView setAnimationDuration:1]; 

      [banner setAlpha:1]; 

    [UIView commitAnimations]; 


    } 

    else 

    { 

     iadBanner.alpha=0.0; 

    } 

} 

-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{ 


    [UIView beginAnimations:nil context:NULL]; 

    [UIView setAnimationDuration:1]; 

    [banner setAlpha:0]; 

    [UIView commitAnimations]; 
} 

-(void)fetchProducts{ 
    SKProductsRequest*request = [[SKProductsRequest alloc]initWithProductIdentifiers:[NSSet 
setWithArray:@[@"testingAppPurchaseID "]]]; 

    request.delegate = (id)self; 

    [request start]; 
} 

-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 

    products = response.products; 

    NSLog(@"Product was purchased"); 
} 
-(void)request:(SKRequest*)request didFailWithError:(NSError *)error{ 

    NSLog(@"%@",error); 

} 

-(void)buy:(SKProduct*)product{ 

    SKPayment *payment = [SKPayment paymentWithProduct:product]; 

    [[SKPaymentQueue defaultQueue]addPayment:payment]; 
} 
-(IBAction)removeAdvertisment:(id)sender 
{ 
    SKProduct *prod = [products objectAtIndex:0]; 

    [self buy:prod]; 
} 
-(void)paymentQueue:(SKPaymentQueue*)queue updatedTransactions:(NSArray *)transactions{ 

    for (SKPaymentTransaction *tx in transactions) { 

     switch (tx.transactionState) { 

      case SKPaymentTransactionStatePurchased: 
       [[SKPaymentQueue defaultQueue]finishTransaction:tx]; 
       //_____________________ 
       iadBanner.alpha=0.0; 
       //______________________ 

      [defaults setBool:YES forKey:@"isPro"]; 
       break; 

      case SKPaymentTransactionStateFailed: 

       [[SKPaymentQueue defaultQueue]finishTransaction:tx]; 

       NSLog(@"Error:%@",tx.error); 

         break; 



      case SKPaymentTransactionStateRestored: 
       [[SKPaymentQueue defaultQueue]finishTransaction:tx]; 

       break; 


      default: 
       break; 
     } 
    } 

} 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning];`` 
    } 

@end 


In Storyboard I add iAdbannerView and a button and connect button to action, and set iAdbannerView to delegate 


Give me some hints how to solve this problem. 

我确定有很多开发者为什么在应用商店中有游戏,这意味着你们中的一些人在MyScene中实现了IN App Purchase,所以请帮助。

+0

“如果你想看代码,让我知道”......不,我们**有**看代码。如果你的代码有问题,你应该发布你的代码,我们还有什么建议改进和指出问题的? – LearnCocos2D 2014-11-01 10:35:05

你的代码对我来说确实很好。你只需要运行

-(IBAction)removeAdvertisment:(id)sender 

来触发购买是这样吗? 可以通过在块掩埋它像这样钩的objC方法调用到一个SKAction:

[SKAction runBlock:^ { 
      [self removeAdvertisment:self]; 
     }] 

那么你可以指示一些节点或其它(也许是一个textNode或spriteNode等冒充一个按钮)来运行这个动作

我会提到你可能要考虑两个不相干的东西...

  1. 一秒钟是一个相当缓慢的动画从视图中删除空adBanner。如果我是你,我会将动画时间缩短一半(至少)。

  2. 如果购买是为了移除广告,那么您应该在创建adBanner实例之前检查默认设置,并且如果用户已经付款,则不要添加。当用户进行购买时,您应该彻底删除横幅并将其删除,隐藏的横幅除了绑定内存并且可能会损害您的收入外,没有任何其他用途。

+0

感谢Jef的回复,我非常感谢,但是问题一直没有得到答复,我喜欢你的建议,尽管减少了amimation时间。我忙于实施这种方法,甚至没有意识到我可以这样做,我认为这是代码的运行方式:),而不是真正的程序员经验。应该有一些解决方案。也许我可以调用一些像xib这样的辅助视图控制器,并且所有代码都会在xib或其他视图控制器中,当我到达该视图控制器时,我可以保证购买按钮? – 2014-11-02 07:02:19