iOS 設定

內部中介服務未公開供用戶使用

使用 Audience Network 的內部出價目前為封閉測試版,未公開供用戶使用。若有任何變更,我們將提供進一步的更新。

您可以改為透過我們合作的其中一個中介服務平台存取 Audience Network 出價。

整合

步驟 1:設定

  1. FBBiddingKit.framework 拖放至您的專案內,選擇「Copy items if needed(必要時複製項目)」,並在「Add to targets(新增至目標)」中選擇目標(如有需要)。
  2. 新增以下 Umbrella Header 來匯入 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:Waterfall 和 WaterfallEntry

  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. 建立瀑布策略和提供歷程 CPM:
  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:ABTest 和 ABTestSegment

  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];
}