如何让iAds能够在iPhone 2G上运行的应用程序。我知道这个设备不支持iAd,因此我希望代码不被执行。
以下是我的一些代码。 .h文件:
#import <UIKit/UIKit.h>
#ifdef __IPHONE_4_0
#import <iAd/iAd.h>
#endif
@interface ViewController : UIViewController
#ifdef __IPHONE_4_0
<ADBannerViewDelegate>
#endif
{
#ifdef __IPHONE_4_0
ADBannerView *adView;
#endif
...
在.m文件中,我将所有iAd编码包围如下:
#ifdef __IPHONE_4_0 //iAd Code
adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
adView.frame = CGRectOffset(adView.frame, 0, 500);
adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
[self.view addSubview:adView];
adView.delegate = self;
self.bannerIsVisible = NO;
#endif
但是我仍然收到错误。该应用程序总是崩溃,只会显示启动图像。我得到一个弹出窗口,“Error Starting Executable'app'错误启动远程程序:无法获得进程411的任务。”这是控制台:
GNU gdb 6.3.50-20050815 (Apple version gdb-1518) (Thu Jan 27 08:40:30 UTC 2011)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin --target=arm-apple-darwin".tty /dev/ttys000
warning: Unable to read symbols from "iAd" (not yet mapped into memory).
target remote-mobile /tmp/.XcodeGDBRemote-6877-41
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
答案 0 :(得分:1)
正如丹尼尔怀特所说,首先你必须弱链接到iAd库(这样,如果操作系统没有它,库就不会在运行时链接到你的应用程序)。为此,请在Xcode中的Targets中的应用程序名称下展开树,然后单击Link Binary With Libraries
项。然后你应该能够找到iAd.framework并将其角色从“Required”改为“Weak”。
然后,在您的代码中,您将要执行运行时(不是编译时,正如您现在所做的那样)检查iAd框架。例如,
// Add in iAd banner, if we are running on 4.0+
Class adBannerClass = NSClassFromString(@"ADBannerView");
if (adBannerClass != nil)
{
adView = ....
这样,相同的代码将在iOS 4.0+设备和iOS 3.2及更早版本的设备上执行。
答案 1 :(得分:0)
您必须删除对iAd库的条件编译和弱链接。您应该使用标准if
块来检查版本。
以下是我发现的教程:http://www.vellios.com/2010/07/04/using-ios-4-frameworks-on-os-3/
您正在使用ifdef
进行的操作是有条件的编译。