iOS 设置

内部中介不公开提供

内部 Audience Network 竞价现在处于封测阶段,不公开提供。如有变化,我们将提供最新信息。

作为替代方案,您可以通过与我们合作的中介平台访问 Audience Network 竞价。

集成

第 1 步:配置

  1. 拖放 FBBiddingKit.framework 至您的项目中,选择 Copy items if needed(复制必要内容)并在 Add to targets(添加至目标)中选择目标(如果需要)。
  2. 通过添加以下伞头导入 FBBiddingKit
  3. #import <FBBiddingKit/FBBiddingKit.h>}
  4. 设置竞价者 SDK:
  5. #import <AppLovinSDK/AppLovinSDK.h>
    #import <Tapjoy/Tapjoy.h>
    #import <FBAudienceNetwork/FBAudienceNetwork.h>
    
    // Initializing AppLovin SDK
    [[ALSdk shared] initializeSdk];
    
    // Initializing Tapjoy SDK
    [Tapjoy connect:@"TAPJOY_SDK_KEY"];
    
    // Initializing Chartboost SDK
    [Chartboost startWithAppId:@"CHARTBOOST_APP_ID" appSignature:@"CHARTBOOST_APP_ID" completion:**nil];**
    
    // Initializing Facebook Audience Network SDK
    [FBAudienceNetworkAds initializeWithSettings:nil completionHandler:nil];
  6. 初始化竞价工具包:
    // Initializing BiddingKit
    FBBKConfiguration *configuration = [[FBBKConfiguration alloc] init];
    configuration.auctionTimeout = 10;
    configuration.verboseLoggingEnabled = YES;
    [FBBKBiddingKit initializeWithConfiguration:configuration];

第 2 步:瀑布策略和瀑布策略条目

  1. 将瀑布策略条目用作抽象实体摘录,为瀑布策略逻辑实施以下协议:
  2. @protocol FBBKWaterfall <NSObject>
    - (id<FBBKWaterfall>)createWaterfallCopy;
    /*!
     * @discussion Creates waterfall entry from bid, inserts and sort to keep order
     * @param bid Bid object with information that is needed to create an WaterfallEntry
     */
    - (void)insertEntryUsingBid:(FBBKBid *)bid;
    /*!
     * @discussion Inserts the given WaterfallEntry into the Waterfall. Should be sorted afterwards
     * @param entry Waterfall Entry to insert
     */
    - (void)insertEntry:(id<FBBKWaterfallEntry>)entry;
    /*!
     * @discussion Provides a an array of waterfall entries inside current waterfall
     * @return Array of presented waterfall entries
     */
    - (NSArray<id<FBBKWaterfallEntry>> *)entries;
    @end
    @protocol FBBKWaterfallEntry <NSObject>
    /*!
     * @discussion Provides a bid for current Waterfall Entry, if it exists
     * @return Stored bid value if presented or nil otherwise
     */
    @property (nonatomic, readonly, nullable) FBBKBid *bid;
    /*!
     * @discussion Cost Per Thousand for current Waterfall Entry
     * @return CPM in cents
     */
    @property (nonatomic, readonly) double CPMCents;
    /*!
     * @discussion Entry Name for current Waterfall Entry
     * @return Name of Entry that provided bid
     */
    @property (nonatomic, readonly) NSString *entryName;
    @end
  3. 创建瀑布策略并提供历史千次展示费用:
  4. id<FBBKWaterfall> waterfall = [[Waterfall alloc] init];
    [waterfall insertEntry:[[WaterfallEntry alloc] initWithName:@"NetworkA" cpm:0.3]];
    [waterfall insertEntry:[[WaterfallEntry alloc] initWithName:@"NetworkB" cpm:0.2]];

第 3 步:AB 测试和 AB 测试细分

  1. 实施 A/B 测试支持协议:
    @protocol FBBKABTest <NSObject>
    /*!
     * @discussion Equally splits the users into different segments
     * @return Segment for a current user
     */
    @property (nonatomic, readonly) id<FBBKABSegment> currentSegment;
    @end
    @protocol FBBKABSegment <NSObject>
    /*!
     * @discussion Segment identifier for current segment
     */
    @property (nonatomic, readonly) NSString *segment;
    @end
  2. 创建 A/B 细分和测试:
  3. id<FBBKABTest> abtest = [[ABTest alloc] init];
    id<FBBKABSegment> testA = [[ABSegment alloc] initWithSegment:@"A"];
    id<FBBKABSegment> control = [[ABSegment alloc] initWithSegment:@"B"];
    [abtest addSegment:testA];
    [abtest addSegment:control];

第 4 步:竞价者

  1. 实施竞价者,或使用符合协议的预定义竞价者:
    @protocol FBBKBidder <NSObject>
    /*!
     * An Identifier for a bidder
     */
    @property (nonatomic, readonly) NSInteger identifier; 
    /*!
     * This method will return a name for bidder
     */
    @property (nonatomic, readonly, copy) NSString *bidderName;
    /*!
     * Provides bid asynchronously
     */
    - (void)retrieveBidComplete:(void (^)(FBBKBid *_Nullable bid))complete;
    /*!
     * Provides bid asynchronously
     */
    - (void)retrieveBidComplete:(nullable void (^)(FBBKBid *bid))complete
                         failed:(nullable void (^)(NSError *_Nullable error))failed;
    @end
  2. 设置您准备使用的竞价者。
    请注意:为获取 bidderToken,您需要集成 FBAudienceNetwork.framework
    #import <FBAudienceNetwork/FBAdSettings.h>
    
    // Provide required values for Facebook Bidder
    NSString *appId = @"YOUR_APP_ID";
    NSString *placementId = @"YOUR_PLACEMENT_ID";
    NSString *bidToken = [FBAdSettings bidderToken];
    FBBKFacebookAdBidFormat adBidFormat = FBBKFacebookAdBidFormatInterstitial;
    
    // Create parameters for Facebook Bidder
    FBBKFacebookBidderParameters *parameters =
      [[FBBKFacebookBidderParameters alloc] initWithAppId:appId
                                              placementId:placementId
                                              adBidFormat:adBidFormat
                                                 bidToken:bidToken];
    // Setup additional fields if needed
    parameters.testMode = YES;
    
    // Create Facebook Bidder
    FBBKFacebookBidder *facebookBidder = [[FBBKFacebookBidder alloc] initWithParameters:parameters];

第 5 步:竞拍

  1. 遵守竞拍协议:
    @protocol FBBKAuction <NSObject>
    /**
     * An integer indentifier for a particular FBBKAuction
     */
    @property (nonatomic, readonly) NSInteger auctionId;
    /**
     * Delegate for FBBKAuction instance. Set up for listenening to updates and notifications
     */
    @property (nonatomic, nullable, weak) id<FBBKAuctionDelegate> delegate;
    /**
     * Starts running the Auction with the given bidders FBBKBidder.
     * This method will run the auction asynchronously and will return immediately.
     * This method can be called only once.
     *
     * Bidders are added to an auction through (see -[FBBKAuctionImpl initWithBidders:];)
     * When the auction is finished, we will return a waterfall copy
     * (see -[FBBKWaterfall createWaterfallCopy];) which will include the results of the bids
     * of the auction results.
     * All bidders in the auction run in parallel and all start at the same time.
     * They are all given the same timeout defined by the configuration set in
     * (see +[FBBiddingKit initializeWithConfig:] method. Bidders that do not obtain a bid in the provided
     * time slot will not be considered for the auction, even if they return a bid later.
     *
     * @param waterfall The waterfall we want to use for this FBBKAuction
     */
    - (void)startUsingWaterfall:(id<FBBKWaterfall>)waterfall;
    /**
     * Must be called just before an ad is displayed. Notifies bidders of the demand source
     * (real-time or not) that has eventually displayed the ad. This is later used to estimate
     * ARPDAU by bidding kit and is necessary for optimisations
     *
     * @param winnerEntry the winning FBBKWaterfallEntry which is being shown on screen
     */
    - (void)notifyDisplayWinner:(id<FBBKWaterfallEntry>)winnerEntry;
    @end
    
    /**
     * This is an FBBKAuctionDelegate
     * We use it to notify about the auction completion
     */
    @protocol FBBKAuctionDelegate <NSObject>
    @optional
    /**
     * This method will be called when the Auction is completed
     *
     * @param auction Auction which notified about completion
     * @param waterfall The waterfall with the updated bidders.
     */
    - (void)fbbkAuction:(id<FBBKAuction>)auction didCompleteWithWaterfall:(id<FBBKWaterfall>)waterfall;
    @end
  2. 创建竞拍并传递竞价者
  3. // Create Auction
    id<FBBKAuction> abAuction = [[FBBKAuctionImpl alloc] initWithBidders:@[facebookBidder]];
  4. 设置委托:
  5. auction.delegate = self; // become a delegate to handle callbacks
    - (void)fbbkAuction:(id<FBBKAuction>)auction didCompleteWithWaterfall:(id<FBBKWaterfall>)waterfall
    {
        // TODO: use waterfall to show ads
    }
  6. 启动竞拍,传递测试和瀑布策略:
  7. [auction `startUsingWaterfall`:waterfall];
    }

第 6 步:A/B 竞拍

  1. 针对 A/B 测试竞拍使用此协议:
  2. @protocol FBBKABAuction <NSObject>
    /*!
     * @discussion An integer indentifier for a particular A/B Auction
     * @return Identifier of an auction
     */
    @property (nonatomic, readonly) NSInteger abAuctionId;
    /*!
     * @discussion Delegate for A/B Auction instance. Set up for listenening to updates and notifications
     */
    @property (nonatomic, weak, nullable) id<FBBKABAuctionDelegate> delegate;
    /*!
     * @discussion Chooses an A/B auction for segment and starts it with values provided by waterfall
     * @param test A/B test for this auction
     * @param waterfall Interface for providing waterfall entries
     */
    - (void)startWithABTest:(id<FBBKABTest>)test waterfall:(id<FBBKWaterfall>)waterfall;
    /*!
     * @discussion Should be invoked after displaying winner
     * @param winnerEntry FBBKWaterfallEntry which wins in current auction
     */
    - (void)notifyDisplayWinner:(id<FBBKWaterfallEntry>)winnerEntry;
    @end
    
    @protocol FBBKABAuctionDelegate <NSObject>
    @optional
    - (void)fbbkabAuction:(id<FBBKABAuction>)abAuction didCompleteWithWaterfall:(id<FBBKWaterfall>)waterfall;
    @end
  3. 创建竞拍,并传递竞价者:
    // Create Auction
    id<FBBKABAuction> abAuction = [[FBBKABAuctionImpl alloc] initWithBidders:@{
        testA : @[facebookBidder],
        control : @[],
    }];
  4. 设置委托:
    auction.delegate = self; // become a delegate to handle callbacks
    - (void)fbbkabAuction:(id<FBBKABAuction>)abAuction didCompleteWithWaterfall:(id<FBBKWaterfall>)waterfall
    {
        // TODO: use waterfall to show ads
    }
  5. 启动竞拍,传递测试和瀑布策略
    [auction startWithABTest:abtest waterfall:waterfall];

示例代码

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Initializing BiddingKit
    FBBKConfiguration *configuration = [[FBBKConfiguration alloc] init];
    configuration.auctionTimeout = 10;
    configuration.verboseLoggingEnabled = YES;
    [FBBKBiddingKit initializeWithConfiguration:configuration];
}

- (void)createAuction
{    
    // create and setup waterfall
    id<FBBKWaterfall> waterfall = [[Waterfall alloc] init];
    [waterfall insertEntry:[[WaterfallEntry alloc] initWithName:@"NetworkA" cpm:0.3]];
    [waterfall insertEntry:[[WaterfallEntry alloc] initWithName:@"NetworkB" cpm:0.2]];
    
    // Provide required values for Facebook Bidder
    NSString *appId = @"YOUR_APP_ID";
    NSString *placementId = @"YOUR_PLACEMENT_ID";
    NSString *bidToken = [FBAdSettings bidderToken];
    FBBKFacebookAdBidFormat adBidFormat = FBBKFacebookAdBidFormatInterstitial;    

    // Create parameters for Facebook Bidder
    FBBKFacebookBidderParameters *parameters =
     [[FBBKFacebookBidderParameters alloc] initWithAppId:appId
                                             placementId:placementId
                                               bidFormat:adBidFormat
                                                bidToken:bidToken];
    // Setup additional fields if needed
    parameters.testMode = YES;

    // Create Facebook Bidder
    FBBKFacebookBidder *facebookBidder = [[FBBKFacebookBidder alloc] initWithParameters:parameters];

    // Create Auction
    _abAuction = [[FBBKABAuctionImpl alloc] initWithBidders:@[facebookBidder]];
    _abAuction.delegate = self;
    
    // Start Auction
    [_abAuction startWithWaterfall:waterfall];
}

#pragma mark - FBBKABAuctionDelegate
- (void)fbbkAuction:(id<FBBKABAuction>)abAuction didCompleteWithWaterfall:(id<FBBKWaterfall>)waterfall;
{
    // waterfall contains your original waterfall entries
    // along with the real time bids

    // Our waterfall implementation is sorted by CPM, so first entry
    // has the highest price
    id<FBBKWaterfallEntry> winnerEntry = waterfall.entries.firstObject;

    // kFBBKFacebookBidderName -> 'FACEBOOK_BIDDER'
    if ([winnerEntry.entryName isEqualToString:kFBBKFacebookBidderName]) {
        FBBKBid *bid = entry.bid;
        // Create the rewarded video unit with a placement ID (generate your own on the Facebook app settings).
        // Use different ID for each ad placement in your app.
        self.rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:bid.placementId withUserID:@"user123" withCurrency:@"gold"];
        // Set a delegate to get notified on changes or when the user interact with the ad.
        self.rewardedVideoAd.delegate = self;
        [self.rewardedVideoAd loadAdWithBidPayload:bid.payLoad];

        // wait till ads is loaded in -interstitialAdDidLoad: callback
    } else {
        // Handle other networks
    }
}

#pragma mark - FBInterstitialAdDelegate
- (void)interstitialAdDidLoad:(FBInterstitialAd *)interstitialAd
{
    id<FBBKWaterfallEntry> winnerEntry = ...
    // Call notifyDisplayWinner before an ad is displayed
    [abAuction notifyDisplayWinner:winnerEntry];
    
    // Display ad
    [self showAdFromBid:entry.bid];
}