gpt4 book ai didi

ios - iAd 卡住 Sprite Kit 应用

转载 作者:行者123 更新时间:2023-11-29 02:40:56 25 4
gpt4 key购买 nike

我发现点击 iAd 可以卡住任何 Sprite Kit 游戏的屏幕。这不仅仅是我的特定项目,因为库存的 Sprite Kit 示例项目也与 iAd 一起卡住。但这不会发生在模拟器中!我无法确定是因为模拟器运行 iOS 8 而我的实际测试设备是 7.1,还是因为模拟器只是一个模拟器,所以它做的事情不同。

因此,如果您点击 iAd,然后单击 iAd 中的链接进入 safari(或此时手动切换到任何应用程序),然后切换回 Sprite Kit 应用程序,该应用程序将被卡住。 iAd 横幅仍然有效,它会按照应有的方式加载广告。但是应用程序的其余部分被卡住了。或者具体来说,它仍然接收触摸和东西(我可以从 NSLog s 中看到)但节点的渲染被卡住。如果您通过点击它再次打开 iAd,然后关闭 iAd,则应用程序会以某种方式恢复并且再次正常工作。

如果你很好奇,这里是我对 Sprite Kit 示例项目所做的唯一修改:

// in GameViewController.h
#import <iAd/iAd.h>

@interface GameViewController : UIViewController <ADBannerViewDelegate>
@end


// in GameViewController.m
@interface GameViewController() {
ADBannerView* iAdBanner;
NSLayoutConstraint* centerAd;
}
@end

@implementation GameViewController
- (void)viewDidLoad
{
[super viewDidLoad];

// Configure iAd
iAdBanner = [[ADBannerView alloc] initWithFrame:CGRectZero];
iAdBanner.alpha = 0.0;
iAdBanner.delegate = self;
centerAd = [NSLayoutConstraint constraintWithItem:iAdBanner
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0.0];
[self.view addSubview:iAdBanner];
[self.view addConstraint:centerAd];

// The rest of viewDidLoad is the stock code. I'm not pasting that in...
}

// iAd delegate methods

-(void) bannerViewDidLoadAd:(ADBannerView *)banner {
// fade in iAd banner
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.5];
[banner setAlpha:1.0];
[UIView commitAnimations];
}

-(void) bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error {
NSLog(@"iAd error: %@", error.localizedDescription);
banner.alpha = 0.0;
}

另外,我将部署目标设置为 7.1(并且显然在项目中包含 iAd 框架)。

如您所见,我没有对可能导致此崩溃的应用程序执行任何操作。我只需添加 iAd 横幅即可。所以问题不在我的代码中。这一定是苹果框架中的一个错误。

有谁知道解决方法?我在互联网上找到了几个关于此的主题,但没有人能提出可行的解决方案。

编辑:

我发现我设备上的 iOS 7.1 调用了 bannerViewActionDidFinish: 返回应用程序时 .然而,模拟器中的 iOS 8 调用该方法 离开应用程序前 (确切地说,当您离开应用程序时)。这不会直接影响上面发布的代码,因为它没有实现此方法。但这确实表明 iOS 7.1 和 iOS 8 的 iAd 实现方式有所不同。

最佳答案

--- EDIT 2 中的最终答案 ---
好吧,我之前确实读过这个,并且我确实尝试过,但我之前尝试过时似乎失败了。我又试了一次,现在可以了。
所以你要做的是设置canDisplayBannerAds View Controller 的属性为 YES ,然后使用 originalContentView属性而不是正常的 view一个设置您的SKView .或者,如果您想从场景中访问您的 View ,那就是:self.view.window.rootViewController.originalContentView .所以基本上任何时候你需要对你的 View 做一些特定于 SKView 的事情。 (例如过渡到场景)以及常规 UIView 无法完成的操作然后使用 scene.view.window.rootViewController.originalContentView而不仅仅是 scene.view .原因是 iAd 以某种方式明确地将您的 View 转换为 UIView当您设置 canDisplayBannerAds View Controller 中的属性,因此您不能使用 SKView您的 View 中的方法了。 originalContentView是一种解决方法。
这完全解决了我的问题,应用程序现在恢复正常状态。
编辑:
不,它没有解决我的问题。 :(
现在打开广告时切换到另一个应用程序并返回不会卡住该应用程序。好的。但是现在只需打开和关闭一个广告,它就会以同样的方式卡住。这没有意义...
所以如果我不设置 canDisplayBannerAds在我的 View Controller 中,然后离开应用程序并返回是应用程序卡住的情况。但只是打开和关闭广告就可以了。但如果我设置 canDisplayBannerAds ,然后反过来。
这真的没有意义。我现在很迷茫...
编辑2(实际解决方案):
最后我解决了!但这并不容易,该死的...
所以问题出在 View 层次结构中。如果我添加 ADBannerView作为我主视图的 subview ,它会卡住应用程序。这很奇怪,因为这是在屏幕上添加横幅的建议方法。
如果我不手动将横幅添加为 subview ,它仍然会出现在屏幕上!我猜 iAd 的实现方式是,一旦初始化,无论如何它都会在屏幕上显示自己。不过看起来有点不同。如果它不是任何 View 的 subview ,那么它会从底部进入并带有“向上滑动”动画,将所有内容调整为位于其上方的较小框。我猜这是 iAd 横幅的默认行为。所以这样它不会卡住屏幕,它工作得很好!但是因为我想对横幅有更多的控制(比如自己制作动画,而不是把它留给横幅本身),所以我做了以下事情:
在我的 View Controller 中,我创建了一个 SKView 的实例。 (不是像往常一样将 self.view 转换为 SKView,而是一个全新的实例)。然后我将其添加为 self.view 的 subview .之后,我初始化 ADBannerView , 并将其添加为 self.view 的 subview 也是。请注意 self.view没有直接显示任何东西,我用它作为一个“容器”来容纳另外两个。 View 层次结构看起来像这样:

        self.view
/ \
SKView ADBannerView
这样 ADBannerView不是我的 SKView 的直接 subview 或 super View (这是我的游戏使用的主视图),因此它不能搞砸,因为它没有该 View 的概念,因为它们都是同一 View 的 subview 。此时我不知道你是否需要设置 canDisplayBannerAds是否在您的 View Controller 中。我已经设置好了,它可以工作。我没有尝试将其排除在外。
简而言之,我可以完全控制横幅 View 以及我的游戏 View ,并且它们不能相互混淆,因为它们不是 subview / super View 关系。
这很难弄清楚,但你去吧。如果您对 iAd 和 Sprite Kit 也有问题,只需像这样组织您的 View 。

关于ios - iAd 卡住 Sprite Kit 应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com