Приложение iAd на iPhone 2G (и других устройствах, отличных от iOS 4)

Как мне получить приложение, в котором iAds можно будет запускать на iPhone 2G? Я понимаю, что это устройство не поддерживает iAds, поэтому я бы хотел, чтобы код не выполнялся.

Вот часть моего кода. Файл .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

Однако я все равно получаю сообщение об ошибке. Приложение всегда вылетает и отображает только загрузочную заставку. Я получаю всплывающее окно с сообщением: «Ошибка при запуске исполняемого 'приложения' Ошибка при запуске удаленной программы: не удалось получить задачу для процесса 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

person michaellindahl    schedule 19.03.2011    source источник
comment
возможный дубликат Совместимы ли приложения, использующие iAd, со старой версией iOS   -  person Brad Larson    schedule 20.03.2011


Ответы (2)


Как говорит Дэниел Уайт, сначала вам нужно установить слабую ссылку на библиотеку iAd (таким образом, библиотека не будет связываться с вашим приложением во время выполнения, если в ОС ее нет). Для этого разверните дерево под именем вашего приложения в Targets в Xcode и щелкните элемент Link Binary With Libraries. После этого вы сможете найти iAd.framework и изменить его роль с «Требуется» на «Слабая».

Затем в своем коде вы захотите выполнить проверку во время выполнения (а не во время компиляции, как вы делаете сейчас) для инфраструктуры 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 и более ранних версиях.

person Jeff Hay    schedule 20.03.2011
comment
Нужно ли заключать какой-либо код в файл .h? (строка импорта, <ADBannerViewDelegate>, ADBannerView *adView;) Или что-нибудь еще в файле .m? (bannerViewDidLoadAd метод, неудачный метод и adView.delegate=nil; [adView release]; код в методе dealloc) Спасибо - person michaellindahl; 21.03.2011
comment
@michaellindahl: вам нужно будет окружить все, что ссылается на класс ADBannerView или его экземпляр, в ваш .m (а также любые константы, связанные с iAD, и т. д.). Однако, если вы объявите adView как просто UIView (вместо ADBannerView) в файле .h, вы можете избежать необходимости окружать код там и в dealloc (но все же можете назначить IBOutlet в IB). Поскольку <ADBannerViewDelegate> на самом деле просто вещь времени компиляции, вам вообще не нужно беспокоиться об этом. - person Jeff Hay; 21.03.2011

Вам придется удалить условную компиляцию и слабую ссылку на библиотеку iAd. Для проверки версии следует использовать стандартные if блоки.

Вот учебное пособие, которое я нашел: http://www.vellios.com/2010/07/04/using-ios-4-frameworks-on-os-3/

То, что вы делаете с ifdefs, - это условная компиляция.

person Daniel A. White    schedule 19.03.2011