# BenefitHub

Source: https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/benefithub
Platform: iOS
SDK major version: v6
Language: English (en)
Translation: AI-translated from Korean. Original: https://docs.buzzvil.com/docs/buzzbenefit-ios/v6/benefithub

Learn how to add and configure BenefitHub and implement additional features through the SDK interface.

> ✅  **Important**\
> In Buzzvil SDK v6, **BenefitHub has moved from a native implementation to a WebView-based implementation.**\
> This allows new features and content to be delivered in real time without updating the SDK or app, reducing the release burden for publishers while improving flexibility and scalability.

> ✏️  **Note**\
> BenefitHub is the new name for Feed.

## Key features

BenefitHub is an offerwall placement that can display a large number of ads. Buzzvil helps you design paths that bring users from other placement types into BenefitHub to show more ads.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/00-feed_02.png)

## Integration

Follow these steps to integrate BenefitHub.

### Step 1. Prepare

- Complete [Getting started](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/getting-started).

### Step 2. Display BenefitHub

BenefitHub opens as a full-screen UI. Ads are allocated automatically when BenefitHub is shown to the user.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/01-feed_01.png)

**Swift**

```swift
let yourViewController = UIViewController()
let benefitHub = BuzzBenefitHub()
benefitHub.show(on: yourViewController)
```

**Objective C**

```objectivec
UIViewController *yourViewController = [[UIViewController alloc] init];
BuzzBenefitHub *benefitHub = [[BuzzBenefitHub alloc] init];
[benefitHub showOn:yourViewController];
```

> ✏️  **Note**\
> To present the Feed placement in another form, see [Integrate BenefitHub as a child view controller](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/benefithub#%ED%95%98%EC%9C%84-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC%EB%A1%9C-%EB%B2%A0%EB%84%A4%ED%95%8F%ED%97%88%EB%B8%8C-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0).

## Basic settings

This section covers the basic features to configure in BenefitHub. You can enable them or change their settings without modifying or redeploying your app.

See the illustration below for BenefitHub's main features.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/03-feed_ui.png)

### Lucky Box

Lucky Box upgrades the Daily Reward feature that increases BenefitHub retention. Its revival system encourages users to maintain participation streaks, while network impression and video ads generate revenue through the basic Lucky Box reward flow. It also presents Buzzvil's direct-sales and network ads by category in a horizontally swipeable interface with infinite scrolling and automatic loading.

Once you integrate the SDK, you can enable this feature without additional development. It operates as a separate placement named `LuckyBox`, whose DAU and revenue you can monitor in the Dash admin.

After completing ad allocation and display in BenefitHub, contact your Buzzvil representative at <help@buzzvil.com> to enable the Lucky Box placement.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/04-feed_luckybox.png)

> ✏️  **Note**
>
> - By implementing an entry point that opens Lucky Box directly from your app, you can create a user experience that has **improved app DAU by up to 15%**. See [EntryPoint](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/entrypoint).

### Mission Pack

Mission Pack awards a percentage of the rewards users earn from ads as a special bonus when they complete all missions. These weekly missions start automatically on Monday and end at midnight on Sunday. Gamification introduces users to ads with strong revenue potential and can improve revenue. When a user clicks the Participate button on the Mission Pack screen, a screen opens where they can immediately engage with an ad that matches the mission.

- A clean, polished, user-centered UI and UX

- Support for opening the Mission Pack screen first when displaying BenefitHub

Once you integrate the SDK, you can enable this feature without additional development. After completing ad allocation and display in BenefitHub, contact your Buzzvil representative at <help@buzzvil.com> to enable Mission Pack.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/05-feed_missionpack.png)

> ✏️  **Note**
>
> - To implement a Mission Pack entry point, see [EntryPoint](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/entrypoint).

### Reward history

Reward history is a built-in feature that lets users view points earned through Buzzvil placements. Users can review the time and amount of each reward to clearly track their earnings.

> ✏️  **Note**\
> History is provided per user and includes only rewards from the last three months. The available history period may change under Buzzvil policy.\
> To disable reward history, contact your Buzzvil representative at <help@buzzvil.com>.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/00-feed_02.png)

#### Open reward history directly

You can open the reward history page directly from outside BenefitHub. See the code below.

**Swift**

```swift
let yourViewController = UIViewController()
let benefitHub = BuzzBenefitHub()
let benefitHubConfig = BuzzBenefitHubConfig.Builder()
  .setQueryParams(BuzzBenefitHubPage.history.toRedirectQueryParams())
  .build()
benefitHub.setConfig(benefitHubConfig)
benefitHub.show(on: yourViewController)
```

**Objective C**

```objectivec
UIViewController *yourViewController = [[UIViewController alloc] init];
BuzzBenefitHub *benefitHub = [[BuzzBenefitHub alloc] init];
BuzzBenefitHubConfig * benefithubConfig = [BuzzBenefitHubConfig configWith:^(BuzzBenefitHubConfigBuilder * _Nonnull builder) {
  builder.queryParams = [BuzzBenefitHubPage.history toRedirectQueryParams];
}];

[self.benefitHub setConfig:benefithubConfig];
[benefitHub showOn:yourViewController];
```

### Consent modal for sharing personal information with third parties

> ✅  **Important**\
> If you have a personal information processing agreement with Buzzvil and your app's own privacy policy lists Buzzvil as a processor, you do not need to show the UI for consent to share personal information with third parties described here.

Personal information protection law requires user consent to collect and use personal information. The Buzzvil SDK provides a UI to obtain consent. If a user does not consent to collection, ads are not allocated to BenefitHub. Users entering BenefitHub for the first time see the following UI.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/09-feed_privacy.png)

### ATT (App Tracking Transparency) permission guidance modal

This feature is provided to users who have not allowed app activity tracking. When a user enters BenefitHub, clicks an ad, and returns, a modal appears over the placement. Tapping its CTA opens a page explaining how to **Allow Tracking** in iOS **Settings**. Follow the page's instructions to allow tracking.

> ✏️ **Note**\
> To disable this feature, contact your Buzzvil representative at <help@buzzvil.com>.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/10-feed_att.png)

### Error screens

If ad allocation fails in BenefitHub, an appropriate error screen appears. Errors are distinguished by the user's state, network environment, and other conditions. Clear messages and buttons in the primary color configured in [Global theme](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/ui-configuration#%EC%A0%84%EC%B2%B4-%ED%85%8C%EB%A7%88) provide a consistent UI.

| Error condition                                              | Description                                                                                                                                                                                                                                                                                                                                            |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Consent to share personal information with third parties** | Appears when the user has not consented to sharing personal information with a third party. See [Consent modal for sharing personal information with third parties](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/benefithub#%EA%B0%9C%EC%9D%B8%EC%A0%95%EB%B3%B4-%EC%A0%9C3%EC%9E%90-%EC%A0%9C%EA%B3%B5-%EB%8F%99%EC%9D%98-%EB%AA%A8%EB%8B%AC). |
| **Users aged 14 or younger**                                 | BenefitHub allows ad participation only for users aged 14 or older, so users under 14 see a message that the service is unavailable. This is determined from the age information set in [Log in](https://docs.buzzvil.com/en/docs/buzzbenefit-ios/v6/getting-started#%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9A%94%EC%B2%AD%ED%95%98%EA%B8%B0).                |
| **Network problem**                                          | Appears when the network connection is unstable or offline.                                                                                                                                                                                                                                                                                            |
| **Unknown error**                                            | Appears when the system cannot identify a specific error. The message describes a temporary problem and encourages the user to try again shortly.                                                                                                                                                                                                      |

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/11-feed_error_screen.png)

## Implement entry paths in your app UI

You can implement views in your app layout, such as icons, buttons, or banners, to create entry paths into BenefitHub.

See the diagram below for examples of UI components that can serve as entry paths. The [GitHub sample code](https://github.com/Buzzvil/buzz-sdk-samples/tree/master/buzzvil-sdk-v6-android) also provides various examples of custom entry paths.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/D-app_feed_entry_01.png)

## Integrate AdMob ads (BuzzAdMob)

Add the `BuzzAdMob` adapter module to serve AdMob interstitial and rewarded interstitial ads within BenefitHub.

> ✏️  **Note**\
> AdMob integration is supported in **Buzzvil SDK 6.7.7 and later**.

> ✏️  **Note**\
> AdMob integration is available only to publishers using CocoaPods. You cannot add the `BuzzAdMob` module with Swift Package Manager; contact your Buzzvil representative if you use SPM.

> ✅  **Important**\
> Publishers do not need to implement ad handlers themselves. Opt in by adding the module and calling `register()`.\
> Do not put ad unit IDs in your code. Configure them in the **Buzzvil dashboard**, which passes them to the SDK.

### Step 1. Add the dependency

Add `Podfile` to `BuzzAdMob`.

```ruby
target 'YourApp' do
  pod 'BuzzAdMob', '1.0.1'
end
```

> ✏️  **Note**\
> `pod 'BuzzAdMob'` automatically includes `Google-Mobile-Ads-SDK` (11.0 or later). The core BuzzAdBenefitSDK has no AdMob dependency; AdMob is enabled only for publishers who add this module.

### Step 2. Register the AdMob App ID

Add the App ID issued in the AdMob console to `Info.plist`.

```xml
<key>GADApplicationIdentifier</key>
<string>ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy</string>
```

### Step 3. Register the adapter

Call `BuzzAdMob.register()` when the app starts.

**Swift**

```swift
import BuzzAdMob

BuzzAdMob.register()
```

**Objective C**

```objectivec
@import BuzzAdMob;

[BuzzAdMob register];
```

`register()` initializes AdMob (`MobileAds`), injects Buzzvil's ad handler, and automatically finds the topmost view controller for displaying ads based on the key window. Use `register(rootViewControllerProvider:)` to specify the view controller yourself, or `unregister()` to unregister the adapter.

## Additional features

### Integrate BenefitHub as a child view controller

To use your app's navigation bar instead of BenefitHub's navigation bar, integrate BenefitHub as a child view controller.

![](https://docs.buzzvil.com/api/content-image/buzzbenefit-ios/v6/image/03-feed/02-feed_sub_view_controller.png)

Add a child view controller to the parent view controller to integrate BenefitHub this way.

The following example adds and integrates BenefitHub as a child view controller.

**Swift**

```swift
import BuzzvilSDK

final class ContainerViewController: UIViewController {
  let benefitHub = BuzzBenefitHub()

  override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .systemBackground

    displayContentViewController(benefitHub.createViewController())
  }
  
  private func displayContentViewController(_ contentViewController: UIViewController) {
    addChild(contentViewController)
    contentViewController.view.frame = view.bounds
    view.addSubview(contentViewController.view)
    contentViewController.didMove(toParent: self)
  }
}
```

**Objective C**

```objectivec
@import BuzzvilSDK;

@interface ContainerViewController ()

@property (nonatomic, strong, readonly) BuzzBenefitHub *benefitHub;

@end

@implementation ContainerViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  _benefitHub = [[BuzzBenefitHub alloc] init];
  [self displayContentViewController:[_benefitHub createViewController]];
}

- (void)displayContentViewController:(UIViewController*)contentViewController {
  [self addChildViewController:contentViewController];
  contentViewController.view.frame = self.view.bounds;
  [self.view addSubview:contentViewController.view];
  [contentViewController didMoveToParentViewController:self];
}

@end
```

> ❗️ **Caution**\
> If you use a custom navigation bar, verify that actions such as going back work correctly.

You must call a function to perform BenefitHub's back action from a custom navigation bar.

**Swift**

```swift
import BuzzvilSDK

final class ContainerViewController: UIViewController {
  private lazy var benefitHub: BuzzBenefitHub = {
    let benefitHub = BuzzBenefitHub()
    let benefitHubConfig = BuzzBenefitHubConfig.Builder()
      .setNavigationBarHidden(false)
      .build()
    
    benefitHub.setConfig(benefitHubConfig)
    
    return benefitHub
  }()

  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.delegate = self
    view.backgroundColor = .systemBackground

    displayContentViewController(benefitHub.createViewController())
  }
  
  private func displayContentViewController(_ contentViewController: UIViewController) {
    addChild(contentViewController)
    contentViewController.view.frame = view.bounds
    view.addSubview(contentViewController.view)
    contentViewController.didMove(toParent: self)
  }

  private func customNavigationBar(navigationController: UINavigationController, viewController: UIViewController) {
    navigationController.navigationBar.tintColor = .red
    viewController.navigationItem.largeTitleDisplayMode = .never
    let backButton = UIBarButtonItem(title: "Back", style: .plain, target: self, action: #selector(backButtonTapped))
    viewController.navigationItem.leftBarButtonItem = backButton
    
    let navigationBar = navigationController.navigationBar
    let appearance = UINavigationBarAppearance()
    appearance.configureWithOpaqueBackground()
    appearance.backgroundColor = .systemBlue  // 원하는 색상으로 설정
    
    navigationBar.standardAppearance = appearance
    navigationBar.scrollEdgeAppearance = appearance
  }

  @objc
  private func backButtonTapped() {
    benefitHub.handleBackNavigation()
  }
}

extension ContainerViewController: UINavigationControllerDelegate {
  func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    customNavigationBar(navigationController: navigationController, viewController: viewController)
  }
}

```

**Objective C**

```objectivec
// ContainerViewController.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface ContainerViewController : UIViewController <UINavigationControllerDelegate>

@end

NS_ASSUME_NONNULL_END

// ContainerViewController.m
@import BuzzvilSDK;

@interface ContainerViewController  ()

@property (nonatomic, strong, readonly) BuzzBenefitHub *benefitHub;

@end

@implementation ContainerViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  self.navigationController.delegate = self;

  _benefitHub = [[BuzzBenefitHub alloc] init];
  BuzzBenefitHubConfig * buzzBenefitConfig = [BuzzBenefitHubConfig configWith:^(BuzzBenefitHubConfigBuilder * _Nonnull builder) {
    builder.isNavigationBarHidden = NO;
  }];
  [_benefitHub setConfig:buzzBenefitConfig];

  [self displayContentViewController:[_benefitHub createViewController]];
}

- (void)displayContentViewController:(UIViewController*)contentViewController {
  [self addChildViewController:contentViewController];
  contentViewController.view.frame = self.view.bounds;
  [self.view addSubview:contentViewController.view];
  [contentViewController didMoveToParentViewController:self];
}

- (void)customNavigationBar:(UINavigationController*)navigationController viewController:(UIViewController*)viewController {
  navigationController.navigationBar.tintColor = UIColor.redColor;
  viewController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever;
  UIBarButtonItem * navigationButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(backButtonTapped:)];
  viewController.navigationItem.leftBarButtonItem = navigationButton;
  
  UINavigationBar * navigationBar = navigationController.navigationBar;
  UINavigationBarAppearance * appearance = [[UINavigationBarAppearance alloc] init];
  [appearance configureWithOpaqueBackground];
  appearance.backgroundColor = UIColor.systemBlueColor;
  
  navigationBar.standardAppearance = appearance;
  navigationBar.scrollEdgeAppearance = appearance;
}

- (void)backButtonTapped:(id)sender {
  [self.benefitHub handleBackNavigation];
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  [self customNavigationBar:navigationController viewController:viewController];
}

@end
```

#### Remove the default navigation bar

You can hide the default navigation bar at the top of BenefitHub.

To change this setting, contact your Buzzvil representative at <help@buzzvil.com>.

> ❗️ **Caution**\
> If you use a custom navigation bar, verify that actions such as going back work correctly.

### Open a More page

You can open a specific More page directly from outside BenefitHub.

> ✏️  **Note**\
> The More page number is assigned in Buzzvil's internal admin settings (Web Config). Contact your Buzzvil representative at <help@buzzvil.com>.

#### Open a More page on its own

The More page opens independently and closes when the user goes back.

**Swift**

```swift
let yourViewController = UIViewController()
let benefitHub = BuzzBenefitHub()
let benefitHubConfig = BuzzBenefitHubConfig.Builder()
  .setRoutePath("0") // "0" 대신 "1", "2", "3" 등 버즈빌 담당자에게 전달받은 페이지 번호를 사용하세요.
  .build()
benefitHub.setConfig(benefitHubConfig)
benefitHub.show(on: yourViewController)
```

**Objective C**

```objectivec
UIViewController *yourViewController = [[UIViewController alloc] init];
BuzzBenefitHub *benefitHub = [[BuzzBenefitHub alloc] init];
BuzzBenefitHubConfig * benefithubConfig = [BuzzBenefitHubConfig configWith:^(BuzzBenefitHubConfigBuilder * _Nonnull builder) {
  builder.routePath = @"0"; // "0" 대신 "1", "2", "3" 등 버즈빌 담당자에게 전달받은 페이지 번호를 사용하세요.
}];

[self.benefitHub setConfig:benefithubConfig];
[benefitHub showOn:yourViewController];
```

#### Open a More page with a return to the main page

The main page is included in the navigation history when the More page opens, so going back returns to the main page.

**Swift**

```swift
let yourViewController = UIViewController()
let benefitHub = BuzzBenefitHub()
let benefitHubConfig = BuzzBenefitHubConfig.Builder()
  .setQueryParams(
    [
      "redirect_to": "0", // "0" 대신 "1", "2", "3" 등 버즈빌 담당자에게 전달받은 페이지 번호를 사용하세요.
      "target": "newTab"
    ]
  )
  .build()
benefitHub.setConfig(benefitHubConfig)
benefitHub.show(on: yourViewController)
```

**Objective C**

```objectivec
UIViewController *yourViewController = [[UIViewController alloc] init];
BuzzBenefitHub *benefitHub = [[BuzzBenefitHub alloc] init];
BuzzBenefitHubConfig * benefithubConfig = [BuzzBenefitHubConfig configWith:^(BuzzBenefitHubConfigBuilder * _Nonnull builder) {
  builder.queryParams = @{
      @"redirect_to": @"0", // "0" 대신 "1", "2", "3" 등 버즈빌 담당자에게 전달받은 페이지 번호를 사용하세요.
      @"target": @"newTab"
  };
}];

[benefitHub setConfig:benefithubConfig];
[benefitHub showOn:yourViewController];
```
