iOSの設定

自社メディエーションは一般公開されません

Audience Networkによる自社入札は、現時点で非公開ベータ版であり、一般公開されません。この状況が変化した時点で、アップデートが提供される予定です。

それまでの間、Facebookとパートナー関係にあるメディエーションプラットフォームのうちのいずれか1つにより、Audience Network入札にアクセスできます。

統合

ステップ1: 設定

  1. FBBiddingKit.framework をプロジェクトにドラッグ&ドロップし、[必要な場合、アイテムをコピー] を選択し、(必要に応じて)[ターゲットに追加] のターゲットを選択します。
  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. ウォーターフォールを作成し、過去の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: 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];
}