• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在应用程序购买 - 应用程序有时会崩溃

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:35:44 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我已经在互联网上浏览了几天,但找不到解决问题的方法。我创建了一个应用程序,并希望您通过应用程序内购买来删除广告。我的问题是,当我单击“购买产品”按钮时,应用程序有时会崩溃。然后我在 [[SKPaymentQueue defaultQueue] addPayment:payment]; 行之后收到错误消息“Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x16e6f6980)”。

这里是我的 PurchasedViewController 的 .h:

​#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)GoBackid)sender;
- (IBAction)BuyProductid)sender;
- (IBAction)Restoreid)sender;
-(void)getProductIDUIViewController *)viewController;
-(void)UnlockPurchase;
-(void)update;
@end

这里是.m

​#import "urchasedViewController2.h"
#import "ViewController.h"
@interface PurchasedViewController2 ()
@property (strong, nonatomic) ViewController *homeViewController;
@end
@implementation PurchasedViewController2
- (id)initWithNibNameNSString *)nibNameOrNil bundleNSBundle *)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 selectorselector(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)prepareForSegueUIStoryboardSegue *)segue senderid)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
- (IBAction)GoBackid)sender {
[self dismissViewControllerAnimated:YES completion:NULL];
}
- (IBAction)BuyProductid)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 = @"lease 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 = @"roduct Not Found";
}
products = response.invalidProductIdentifiers;
for (SKProduct *product in products) {
NSLog(@"roduct 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"urchased" forState:UIControlStateDisabled];
[_homeViewController Purchased];
}
@end

这是我的观点:

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

非常感谢你



Best Answer-推荐答案


谢谢,我解决了。我将 GoBack 方法更改为:

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

}

关于ios - 在应用程序购买 - 应用程序有时会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23371475/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap