2014-04-29 2 views
2

나는 인터넷을 통해 며칠 동안보고 있으며 내 문제에 대한 해결책을 찾을 수 없습니다. 앱을 만들었고 앱 구매를 통해 광고를 삭제하길 원합니다. 내 문제는 "BuyProduct"버튼을 클릭 할 때 응용 프로그램이 충돌하는 경우입니다. 그런 다음 [[SKPaymentQueue defaultQueue] addPayment:payment]; 줄 뒤에 "스레드 1 : EXC_BAD_ACCESS (코드 = 1, 주소 = 0x16e6f6980)"오류 메시지가 나타납니다. 내 PurchasedViewController의 다음앱 구매 중 - 때때로 앱 충돌이 발생했습니다

내 .H :

​- (IBAction)PurchaseItem:(id)sender { 
_purchaseController = [[PurchasedViewController2 alloc] initWithNibName:nil bundle:nil]; 
_purchaseController.productID [email protected]"PS.PileUp.RemoveAds"; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:_purchaseController]; 
[self presentViewController:_purchaseController animated:YES completion:NULL]; 
[_purchaseController getProductID:self]; 
} 

당신에게 매우 뭉크 감사 : 여기

​#import <UIKit/UIKit.h> 
#import <StoreKit/StoreKit.h> 
@interface PurchasedViewController2 : UIViewController <SKPaymentTransactionObserver, SKProductsRequestDelegate>{ 
NSTimer *myTimer; 
int countdown; 
} 
@property (strong, nonatomic) SKProduct *product; 
@property (strong, nonatomic) NSString *productID; 
@property (strong, nonatomic) IBOutlet UILabel *productTitle; 
@property (strong, nonatomic) IBOutlet UITextView *productDescription; 
@property (strong, nonatomic) IBOutlet UIButton *buyButton; 
@property (weak, nonatomic) IBOutlet UIButton *goBack; 
@property (weak, nonatomic) IBOutlet UILabel *labelGray; 
@property (weak, nonatomic) IBOutlet UILabel *labelCountdown; 
- (IBAction)GoBack:(id)sender; 
- (IBAction)BuyProduct:(id)sender; 
- (IBAction)Restore:(id)sender; 
-(void)getProductID:(UIViewController *)viewController; 
-(void)UnlockPurchase; 
-(void)update; 
@end 

하는 .m은

​#import "PurchasedViewController2.h" 
#import "ViewController.h" 
@interface PurchasedViewController2() 
@property (strong, nonatomic) ViewController *homeViewController; 
@end 
@implementation PurchasedViewController2 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
if (self) { 
// Custom initialization 
} 
return self; 
} 
- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
countdown = 5; 
_labelCountdown.text = [NSString stringWithFormat:@"%i",countdown]; 
_goBack.enabled = FALSE; 
myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(update) userInfo:nil repeats:YES]; 
// Do any additional setup after loading the view. 
} 
-(void)update{ 
countdown--; 
if (countdown >=0) { 
_labelCountdown.text = [NSString stringWithFormat:@"%i",countdown]; 
} 
if (countdown <=0) { 
_labelCountdown.hidden = TRUE; 
_labelGray.hidden = TRUE; 
_goBack.enabled = TRUE; 
[myTimer invalidate]; 
} 
} 
- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 
/* 
#pragma mark - Navigation 
// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
// Get the new view controller using [segue destinationViewController]. 
// Pass the selected object to the new view controller. 
} 
*/ 
- (IBAction)GoBack:(id)sender { 
[self dismissViewControllerAnimated:YES completion:NULL]; 
} 
- (IBAction)BuyProduct:(id)sender { 

SKPayment *payment = [SKPayment paymentWithProduct:_product]; 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] addPayment:payment]; 
} 
-(void)viewDidUnload{ 
[[SKPaymentQueue defaultQueue]removeTransactionObserver:self]; 
[super viewDidUnload]; 
} 
- (IBAction)Restore:(id)sender { 
[[SKPaymentQueue defaultQueue] addTransactionObserver:self]; 
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]; 
} 
-(void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue{ 
[self UnlockPurchase]; 
} 
-(void)getProductID:(ViewController *)viewController{ 
_homeViewController = viewController; 
if ([SKPaymentQueue canMakePayments]) { 
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithObject:self.productID]]; 
request.delegate = self; 

[request start]; 
} 
else{ 
_productDescription.text = @"Please enable in app purchase in your setting"; 
} 
} 

#pragma mark _ 
#pragma mark SKProductsRequestDelegate 
-(void) productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{ 

NSArray *products = response.products; 

if (products.count != 0) { 
_product = products[0]; 
_buyButton.enabled = YES; 
_productTitle.text = _product.localizedTitle; 
_productDescription.text = _product.localizedDescription; 
} 
else{ 
_productTitle.text = @"Product Not Found"; 
} 
products = response.invalidProductIdentifiers; 
for (SKProduct *product in products) { 
NSLog(@"Product not Found: %@", product); 
} 
} 

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { 
for (SKPaymentTransaction *transaction in transactions) { 
switch (transaction.transactionState) { 
case SKPaymentTransactionStatePurchased:[self UnlockPurchase]; 
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
break; 
case SKPaymentTransactionStateFailed:NSLog(@"Transaction Failed"); 
[[SKPaymentQueue defaultQueue] finishTransaction:transaction]; 
default: 
break; 
} 
} 
} 

-(void)UnlockPurchase{ 
_buyButton.enabled = NO; 
[_buyButton setTitle:@"Purchased" forState:UIControlStateDisabled]; 
[_homeViewController Purchased]; 
} 
@end 

여기 뷰의 내 전화입니다

답변

0

1 여러분과 같은 사람들은 BuyProduct 버튼을 누르는 것에서 _product를 만드는 것까지 경쟁 조건을 가지고 있습니다. 일반적으로 사용자가 BuyProduct를 누르기 전에 SKProductsRequest를 완료해야합니다. 즉, Buyproduct를 누르면 _product에 원하는 가치가 있음을 알고 있습니까?

+0

내가 조금 변경 한 만 키우면가 작동하지 않습니다 :( 을': 나는에 GoBack을 방법을 변경 ("buyPoduct 버튼을 누르면"@) 경우 (self.product = 0!) { SKPayment의 * 결제 = SKPayment paymentWithProduct : _product] [SKPaymentQueue defaultQueue] addTransactionObserver : 자기] [SKPaymentQueue defaultQueue] addPayment : 지불]; } }' – user3459164

2

Thx 나는 그것을 풀어. (ID) 보낸 사람 { NSLog : - (IBAction를) BuyProduct

- (IBAction)GoBack:(id)sender { 
[[SKPaymentQueue defaultQueue]removeTransactionObserver:self]; 
[self dismissViewControllerAnimated:YES completion:NULL]; 

가}