본문 바로가기
Flutter/Snippet

플러터에서 AdMob API로 수익 정보 조회하기

by Maccrey Coding 2024. 7. 28.
728x90
반응형

 

오늘은 플러터 앱에서 AdMob API를 사용하여 광고 수익 정보를 조회하고 표시하는 방법에 대해 알아보겠습니다.

 

1. 준비 단계

 

먼저, pubspec.yaml 파일에 필요한 패키지를 추가합니다

dependencies:
  flutter:
    sdk: flutter
  http: ^latest_version
  intl: ^latest_version

 

2. AdMob API 인증 설정

 

AdMob API를 사용하기 위해서는 Google Cloud Console에서 프로젝트를 설정하고 서비스 계정 키를 생성해야 합니다.

이 과정은 다음과 같습니다

 

a. Google Cloud Console에서 새 프로젝트를 생성합니다.

b. AdMob API를 활성화합니다.

c. 서비스 계정을 생성하고 JSON 키 파일을 다운로드합니다.

d. AdMob 계정에서 이 서비스 계정에 대한 권한을 부여합니다.

 

3. API 호출 함수 구현

 

admob_service.dart 파일을 생성하고 다음 코드를 추가합니다

import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:intl/intl.dart';

class AdMobService {
  final String _baseUrl = 'https://admob.googleapis.com/v1/accounts/';
  final String _accountId = 'YOUR_ACCOUNT_ID';
  final String _accessToken = 'YOUR_ACCESS_TOKEN';

  Future<Map<String, dynamic>> getEarnings() async {
    final now = DateTime.now();
    final today = DateFormat('yyyy-MM-dd').format(now);
    final tomorrow = DateFormat('yyyy-MM-dd').format(now.add(Duration(days: 1)));
    final firstDayOfMonth = DateTime(now.year, now.month, 1);
    final lastDayOfMonth = DateTime(now.year, now.month + 1, 0);

    final response = await http.get(
      Uri.parse('$_baseUrl$_accountId/networkReport:generate'),
      headers: {
        'Authorization': 'Bearer $_accessToken',
        'Content-Type': 'application/json',
      },
      body: jsonEncode({
        'reportSpec': {
          'dateRange': {
            'startDate': {'year': firstDayOfMonth.year, 'month': firstDayOfMonth.month, 'day': firstDayOfMonth.day},
            'endDate': {'year': lastDayOfMonth.year, 'month': lastDayOfMonth.month, 'day': lastDayOfMonth.day},
          },
          'metrics': ['ESTIMATED_EARNINGS'],
          'dimensions': ['DATE'],
        },
      }),
    );

    if (response.statusCode == 200) {
      final data = jsonDecode(response.body);
      final rows = data['rows'] ?? [];

      double todayEarnings = 0;
      double tomorrowEarnings = 0;
      double monthEarnings = 0;

      for (var row in rows) {
        final date = row['dimensionValues'][0]['value'];
        final earnings = double.parse(row['metricValues'][0]['microsValue']) / 1000000;

        if (date == today) {
          todayEarnings = earnings;
        } else if (date == tomorrow) {
          tomorrowEarnings = earnings;
        }
        monthEarnings += earnings;
      }

      return {
        'today': todayEarnings,
        'tomorrow': tomorrowEarnings,
        'month': monthEarnings,
      };
    } else {
      throw Exception('Failed to load earnings data');
    }
  }
}

 

4. UI 구현

 

earnings_screen.dart 파일을 생성하고 다음과 같이 구현합니다

import 'package:flutter/material.dart';
import 'admob_service.dart';

class EarningsScreen extends StatefulWidget {
  @override
  _EarningsScreenState createState() => _EarningsScreenState();
}

class _EarningsScreenState extends State<EarningsScreen> {
  final AdMobService _adMobService = AdMobService();
  Map<String, dynamic> _earnings = {};
  bool _isLoading = false;

  @override
  void initState() {
    super.initState();
    _loadEarnings();
  }

  Future<void> _loadEarnings() async {
    setState(() {
      _isLoading = true;
    });
    try {
      final earnings = await _adMobService.getEarnings();
      setState(() {
        _earnings = earnings;
        _isLoading = false;
      });
    } catch (e) {
      setState(() {
        _isLoading = false;
      });
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('수익 정보를 불러오는데 실패했습니다.')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('AdMob 수익')),
      body: _isLoading
          ? Center(child: CircularProgressIndicator())
          : Padding(
              padding: EdgeInsets.all(16.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text('오늘 수익: \$${_earnings['today']?.toStringAsFixed(2) ?? '0.00'}'),
                  SizedBox(height: 8),
                  Text('내일 예상 수익: \$${_earnings['tomorrow']?.toStringAsFixed(2) ?? '0.00'}'),
                  SizedBox(height: 8),
                  Text('이번 달 수익: \$${_earnings['month']?.toStringAsFixed(2) ?? '0.00'}'),
                ],
              ),
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: _loadEarnings,
        child: Icon(Icons.refresh),
      ),
    );
  }
}

 

5. 주의사항

  • AdMob API는 실시간 데이터를 제공하지 않습니다. 대신 전날까지의 데이터를 제공합니다.
  • API 사용량에 제한이 있으므로, 너무 자주 요청하지 않도록 주의해야 합니다.
  • 실제 앱에서는 액세스 토큰을 안전하게 관리해야 합니다. 서버 사이드에서 토큰을 관리하고 API 요청을 처리하는 것이 좋습니다.
  • AdMob의 정책을 준수해야 하며, 수익 정보를 공개적으로 표시하는 것은 권장되지 않습니다.

이렇게 구현하면 플러터 앱에서 AdMob API를 사용하여 오늘, 내일, 이번 달의 광고 수익 정보를 조회하고 표시할 수 있습니다.

이 기능은 개발자가 자신의 앱 수익을 모니터링하는 데 유용하게 사용될 수 있습니다.

AdMob API를 사용할 때는 항상 최신 문서를 참조하고, Google의 정책을 준수해야 합니다.

또한, 사용자의 개인정보를 보호하고 보안을 유지하는 것이 중요합니다.

추가 질문이나 설명이 필요한 부분이 있으면 언제든 물어보세요!

 

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

728x90
반응형