perimeterx_flutter_plugin 1.0.3 copy "perimeterx_flutter_plugin: ^1.0.3" to clipboard
perimeterx_flutter_plugin: ^1.0.3 copied to clipboard

A Flutter plugin for PerimeterX integration (Android & iOS). This plugin provides a way to integrate PerimeterX security features into your Flutter app or module.

perimeterx_flutter_plugin #

A Flutter plugin for PerimeterX.

Android iOS
Support SDK 21+ 12.0+

Example #

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:http/http.dart' as http;

import 'package:perimeterx_flutter_plugin/perimeterx_flutter_plugin.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  Map<String, String>? _pxHeaders;
  PerimeterxResult? _challengeResult;
  final _perimeterxFlutterPlugin = PerimeterXFlutter();

  Future<void> getHeaders() async {
    try {
      _pxHeaders = await _perimeterxFlutterPlugin.getHeaders();
    } on Exception {
      _pxHeaders = null;
    }

    setState(() {});
  }

  Future<void> getChallenge() async {
    try {
      final pxHeaders = await _perimeterxFlutterPlugin.getHeaders();
      final url = Uri.https('sample-ios.pxchk.net', '/login');
      final response = await http.get(url, headers: pxHeaders);
      if (response.statusCode == 403) {
        _challengeResult = await _perimeterxFlutterPlugin.handleResponse(
            response: response.body, url: url.toString());

        switch (_challengeResult!) {
          case PerimeterxResult.solved:
            // retry your request
            break;
          case PerimeterxResult.cancelled:
            // retry your request. The challenge will be presented again.
            break;
          case PerimeterxResult.failed:
            // handle the error
            break;
        }
      }
    } on Exception {
      _challengeResult = null;
    }
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Perimeterx example app'),
        ),
        body: Center(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                if (_pxHeaders != null)
                  for (var key in _pxHeaders!.keys)
                    Text(
                      '$key: ${_pxHeaders![key]}',
                      style: const TextStyle(
                        fontSize: 12,
                      ),
                    ),
                TextButton(
                  onPressed: () {
                    getHeaders();
                  },
                  child: const Text('Get Perimeterx Headers'),
                ),
                const Divider(),
                if (_challengeResult != null)
                  Text(
                    'Challenge result: ${_challengeResult!.name}',
                    style: const TextStyle(
                      fontSize: 12,
                      color: Colors.red,
                    ),
                  ),
                TextButton(
                  onPressed: () {
                    getChallenge();
                  },
                  child: const Text(
                    'Perimeterx Challenge',
                  ),
                )
              ],
            ),
          ),
        ),
      ),
    );
  }
}

Configuration #

iOS #

In AppDelegate start the PerimeterX befere with your APP_ID.

Example:

import Flutter
import UIKit
import PerimeterX_SDK

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {

      GeneratedPluginRegistrant.register(with: self)
      
      do {
          let policy = PXPolicy()
          policy.urlRequestInterceptionType = .none
          policy.doctorCheckEnabled = false
          try PerimeterX.start(appId: "API_ID", delegate: nil, policy: policy)
      }
      catch {
          print("error: \(error)")
      }
      
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

Android #

Add Theme.AppCompat.Light style

The SDK requires that the Theme.AppCompat.Light style will be set as the application's theme and create a MainApplication in your app. You should add it to the AndroidManifest.xml file:

<application>
    android:name=".MainApplication"
    android:theme="@style/Theme.AppCompat.Light"
</application>

Add the permissions

You should add it to the AndroidManifest.xml file:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET" />

Start the SDK

The automatic interceptor is not supported in Flutter, so any request from the Dart code has to be handled manually. Here is an example in MainApplication.kt:

class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        try {
            val policy = PXPolicy()
            policy.storageMethod = PXStorageMethod.DATA_STORE
            policy.urlRequestInterceptionType = PXPolicyUrlRequestInterceptionType.NONE
            policy.doctorCheckEnabled = false
            PerimeterX.start(this, "APP_ID", null, policy)
        }
        catch (exception: Exception) {
            println("failed to start. exception: $exception")
        }
    }
}
2
likes
160
pub points
38%
popularity

Publisher

verified publisherarthurmonteiro.com

A Flutter plugin for PerimeterX integration (Android & iOS). This plugin provides a way to integrate PerimeterX security features into your Flutter app or module.

Repository (GitHub)
View/report issues

Topics

#perimeterx #os-integration #captcha #security

Documentation

API reference

License

MIT (license)

Dependencies

flutter

More

Packages that depend on perimeterx_flutter_plugin