BenefitHub
Learn how to add and configure BenefitHub and implement additional features through the SDK interface.
Key features
BenefitHub is an offerwall-style placement that supports many ads while matching your app's UI like a native placement. Buzzvil supports entry paths from other placements into BenefitHub to expose users to more ads.

Integration
Follow these steps to integrate BenefitHub.
Step 1. Prepare
- Complete Getting started.
- A Unit ID for BenefitHub, referred to below as
YOUR_FEED_UNIT_ID.
Step 2. Initialize BenefitHub
Add BZVFeedConfig to BuzzBenefitConfig.
import BuzzvilSDK
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
let feedConfig = BZVFeedConfig { builder in
builder.unitID = "YOUR_FEED_UNIT_ID"
}
let config = BuzzBenefitConfig.Builder("YOUR_APP_ID")
.setDefaultFeedConfig(feedConfig)
.build()
BuzzBenefit.shared.initialize(with: config)
return true
}
}
@import BuzzvilSDK;
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
BZVFeedConfig *feedConfig = [BZVFeedConfig configWithBlock:^(BZVFeedConfigBuilder * _Nonnull builder) {
builder.unitID = @"YOUR_FEED_UNIT_ID";
}];
BuzzBenefitConfig *config = [BuzzBenefitConfig configWithBlock:^(BuzzBenefitConfigBuilder * _Nonnull builder) {
builder.appID = @"YOUR_APP_ID";
builder.defaultFeedConfig = feedConfig;
}];
[BuzzBenefit sharedInstance] initializeWithConfig:config];
return YES;
}
@end
Step 3. Display BenefitHub
BenefitHub opens full screen. If ads have not already been allocated, it requests them automatically.

let yourViewController = UIViewController()
let buzzAdFeed = BZVBuzzAdFeed { _ in }
buzzAdFeed.show(on: yourViewController)
UIViewController *yourViewController = [[UIViewController alloc] init];
BZVBuzzAdFeed *buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {}];
[buzzAdFeed showOn:yourViewController];
Display BenefitHub with a non-default configuration
In addition to the default Feed using BZVFeedConfig configured through DefaultFeedConfig, you can display a different configuration. Create a new BZVFeedConfig and pass it to BZVBuzzAdFeed.feedConfig().
See the following example.
let yourViewController = UIViewController()
let buzzAdFeed = BZVBuzzAdFeed { builder in
builder.config = BZVFeedConfig { builder in
builder.unitID = "SECOND_BENEFIT_HUB_UNIT_ID"
}
}
buzzAdFeed.show(on: yourViewController)
UIViewController *yourViewController = [[UIViewController alloc] init];
BZVBuzzAdFeed *buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {
builder.config = [BZVFeedConfig configWithBlock:^(BZVFeedConfigBuilder * _Nonnull builder) {
builder.unitID = @"SECOND_FEED_UNIT_ID";
}];
}];
[buzzAdFeed showOn:yourViewController];
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.

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.
Enable this feature by integrating SDK 5.17.3 or later, without additional development. It operates as a separate LuckyBox placement, and you can monitor Lucky Box DAU and revenue in Dash Admin.
After completing ad allocation and display in BenefitHub, contact your Buzzvil representative at help@buzzvil.com to enable the Lucky Box placement.

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.
- Choose the number of ads and missions to display.
- A clean, polished, user-centered UI and UX
- Customize a wide range of UI settings without changing code.
- Adjust bonus reward rates based on revenue and user engagement.
- Support for opening the Mission Pack screen first when displaying BenefitHub
Enable this feature by integrating SDK 5.23.2 or later, without additional development. After completing ad allocation and display in BenefitHub, contact your Buzzvil representative at help@buzzvil.com to enable Mission Pack.

Ad category sections
Add mini carousel, standard carousel or grid sections above the existing BenefitHub content to highlight ads you want to grow or products users prefer, helping improve revenue and app activity.

Ad category filters
Filters let users focus on ad types they want to participate in, improving the experience and ad efficiency. Contact help@buzzvil.com to change UI strings, filter types or other settings.

Infinite scrolling
When users reach the end of the allocated ad list, more ads load automatically. Enabled by default, this can be toggled without editing code or redeploying the app. Contact help@buzzvil.com to change the setting.
Consent modal for sharing personal information with third parties
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.

ATT (App Tracking Transparency) authorization dialog
When enabled, the dialog appears when users on iOS 14 or later enter Feed without having granted tracking permission.
ATT (App Tracking Transparency) permission prompt
This feature is provided to users on iOS 14 and later who have not allowed app activity tracking. When a user on iOS 14 or later 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.

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 example entry point components. The sample app includes code for several custom entry points.

Step 1. Prepare
- Complete BenefitHub integration.
Step 2. Add an entry point
Create a BenefitHub entry point in a view controller by implementing a custom view extending BZVFeedEntryView and adding it as a subview.
Implement an entry point in code
The following example creates a custom view extending BZVFeedEntryView and adds it to a view controller.
- Define a subclass of
BZVFeedEntryViewand implement its layout.
import BuzzvilSDK
final class CustomFeedEntryView: BZVFeedEntryView {
let customSubview1 = UIView(frame: .zero)
let customSubview2 = UIView(frame: .zero)
required init?(coder: NSCoder) {
super.init(coder: coder)
setupView()
}
override init(frame: CGRect) {
super.init(frame: frame)
setupView()
}
private func setupView() {
// subview 초기화 및 LayoutConstraint 설정
// ...생략...
// 클릭이 가능한 영역을 지정합니다.
clickableViews = [customSubview1, customSubview2]
}
}
@import BuzzvilSDK;
@interface CustomFeedEntryView: BZVFeedEntryView
@end
@interface CustomFeedEntryView ()
@property (nonatomic, strong, readonly) UIView *customSubview1;
@property (nonatomic, strong, readonly) UIView *customSubview2;
@end
@implementation CustomFeedEntryView
- (instancetype)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
[self setupView];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setupView];
}
return self;
}
- (void)setupView {
// subview 초기화 및 LayoutConstraint 설정
// ...생략...
// 클릭이 가능한 영역을 지정합니다.
self.clickableViews = @[self.customSubview1, self.customSubview2];
}
@end
- Initialize and use your subclass (
CustomFeedEntryView) ofBZVFeedEntryView.
import UIKit
final class ViewController: UIViewController {
private lazy var customFeedEntryView: CustomFeedEntryView = {
let view = CustomFeedEntryView(frame: .zero)
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(customFeedEntryView)
// LayoutConstraint 설정
// ...
}
}
@interface ViewController ()
@property (nonatomic, strong, readonly) CustomFeedEntryView *customFeedEntryView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_customFeedEntryView = [[CustomFeedEntryView alloc] initWithFrame:CGRectZero];
[self.view addSubview:_customFeedEntryView];
// LayoutConstraint 설정
// ...
}
@end
Step 3. Display available points
Preview the available points, as shown below, to encourage users who have not yet entered BenefitHub to participate.

Follow these steps to preview the available points.
buzzAdFeed.load(
onSuccess: {
// 적립 가능한 포인트를 직접 구현한 UI에 업데이트합니다.
let availableReward = buzzAdFeed.availableRewards
},
onFailure: { error in
// 적립 가능한 포인트를 가져올 수 없는 경우
}
)
[buzzAdFeed loadOnSuccess:^() {
NSInteger availableReward = [buzzAdFeed availableRewards];
// 적립 가능한 포인트를 직접 구현한 UI에 업데이트합니다.
NSInteger availiableRewards = [buzzAdFeed availableRewards];
} onFailure:^(NSError * _Nonnull error) {
// 적립 가능한 포인트를 가져올 수 없는 경우
}];
Additional features
This section explains how to implement additional BenefitHub features.
Configure base rewards

Award points periodically simply for entering BenefitHub to encourage return visits. Contact help@buzzvil.com to enable base rewards or change the amount.
Check ad types
Buzzvil SDK provides APIs to identify ad types so you can offer different rewards or experiences for impression-based, action-based and other ads. See Check the ad type in User experience 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.

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.
import BuzzvilSDK
final class ContainerViewController: UIViewController {
let buzzAdFeed = BZVBuzzAdFeed { builder in }
override func viewDidLoad() {
super.viewDidLoad()
displayContentViewController(buzzAdFeed.viewController)
}
private func displayContentViewController(_ contentViewController: UIViewController) {
addChild(contentViewController)
contentViewController.view.frame = view.bounds
view.addSubview(contentViewController.view)
contentViewController.didMove(toParent: self)
}
}
@import BuzzvilSDK;
@interface ContainerViewController ()
@property (nonatomic, strong, readonly) BZVBuzzAdFeed *buzzAdFeed;
@end
@implementation ContainerViewController
- (void)viewDidLoad {
[super viewDidLoad];
_buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {}];
[self displayContentViewController:[_buzzAdFeed viewController]];
}
- (void)displayContentViewController:(UIViewController*)contentViewController {
[self addChildViewController:contentViewController];
contentViewController.view.frame = self.view.bounds;
[self.view addSubview:contentViewController.view];
[contentViewController didMoveToParentViewController:self];
}
@end
Reload ads
Call buzzAdFeed.load() before buzzAdFeed.show() to allocate new ads.
buzzAdFeed.load(
onSuccess: {
// 광고 재할당에 성공한 경우 호출됩니다.
},
onFailure: { error in
// 광고 재할당에 실패한 경우 호출됩니다.
}
)
[buzzAdFeed loadOnSuccess:^() {
// 광고 재할당에 성공한 경우 호출됩니다.
} onFailure:^(NSError * _Nonnull error) {
// 광고 재할당에 실패한 경우 호출됩니다.
}];
Change the initial BenefitHub screen
Select a filter when opening BenefitHub
Open BenefitHub with a selected filter other than 전체.
let yourViewController = UIViewController()
let feedConfig = BZVFeedConfig { builder in
builder.unitID = "BENEFIT_HUB_UNIT_ID"
builder.initialSelectedFilterName = "클릭적립"
}
let buzzAdFeed = BZVBuzzAdFeed(block: { builder in
builder.config = feedConfig
})
buzzAdFeed.show(on: yourViewController)
UIViewController *yourViewController = [[UIViewController alloc] init];
BZVFeedConfig *feedConfig = [BZVFeedConfig configWithBlock:^(BZVFeedConfigBuilder * _Nonnull builder) {
builder.unitID = @"BENEFITHUB_UNIT_ID";
builder.initialSelectedFilterName = @"클릭적립";
}];
BZVBuzzAdFeed *buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {
builder.config = feedConfig;
}];
[buzzAdFeed showOn:yourViewController];
Open Lucky Box directly
Use BZVBuzzAdFeed to display Lucky Box directly. BenefitHub launches alongside it.
let yourViewController = UIViewController()
let feedConfig = BZVFeedConfig { builder in
builder.unitID = "BENEFIT_HUB_UNIT_ID"
builder.initialNavigationPage = .luckyBox
}
let buzzAdFeed = BZVBuzzAdFeed(block: { builder in
builder.config = feedConfig
})
UIViewController *yourViewController = [[UIViewController alloc] init];
BZVFeedConfig *feedConfig = [BZVFeedConfig configWithBlock:^(BZVFeedConfigBuilder * _Nonnull builder) {
builder.unitID = @"BENEFITHUB_UNIT_ID";
builder.initialNavigationPage = BZVFeedInitialNavigationPageLuckyBox;
}];
BZVBuzzAdFeed *buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {
builder.config = feedConfig;
}];
[buzzAdFeed showOn:yourViewController];
Lucky Box entry point example
Use the showLuckyBox example in FeedViewController.swift and FeedViewController.m to implement a Lucky Box entry point.
// 베네핏허브를 열 때 럭키박스 화면 표시하기
func showLuckyBox() {
let buzzAdFeed = BZVBuzzAdFeed { builder in
builder.config = BZVFeedConfig { builder in
builder.unitID = "BENEFITHUB_UNIT_ID"
builder.initialNavigationPage = .luckyBox
}
}
buzzAdFeed.show(on: self)
}
// 베네핏허브를 열 때 럭키박스 화면 표시하기
- (void)showLuckyBox {
BZVBuzzAdFeed *buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {
builder.config = [BZVFeedConfig configWithBlock:^(BZVFeedConfigBuilder * _Nonnull builder) {
builder.unitID = @"BENEFITHUB_UNIT_ID";
builder.initialNavigationPage = BZVFeedInitialNavigationPageLuckyBox;
}];
}];
[buzzAdFeed showOn:self];
}
Open MissionPack directly
Use BZVBuzzAdFeed to display MissionPack directly. BenefitHub launches alongside it.
let yourViewController = UIViewController()
let feedConfig = BZVFeedConfig { builder in
builder.unitID = "BENEFIT_HUB_UNIT_ID"
builder.initialNavigationPage = .missionPack
}
let buzzAdFeed = BZVBuzzAdFeed(block: { builder in
builder.config = feedConfig
})
UIViewController *yourViewController = [[UIViewController alloc] init];
BZVFeedConfig *feedConfig = [BZVFeedConfig configWithBlock:^(BZVFeedConfigBuilder * _Nonnull builder) {
builder.unitID = @"BENEFITHUB_UNIT_ID";
builder.initialNavigationPage = BZVFeedInitialNavigationPageMissionPack;
}];
BZVBuzzAdFeed *buzzAdFeed = [BZVBuzzAdFeed feedWithBlock:^(BZVBuzzAdFeedBuilder * _Nonnull builder) {
builder.config = feedConfig;
}];
[buzzAdFeed showOn:yourViewController];