{"id":32305456,"url":"https://github.com/peerwaya/flutter_call_kit","last_synced_at":"2025-10-23T06:51:23.508Z","repository":{"id":45261618,"uuid":"213427775","full_name":"peerwaya/flutter_call_kit","owner":"peerwaya","description":"Flutter iOS CallKit framework - Currently iOS \u003e= 10.0 only","archived":false,"fork":false,"pushed_at":"2021-12-27T00:34:48.000Z","size":138,"stargazers_count":55,"open_issues_count":17,"forks_count":47,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-21T05:50:11.546Z","etag":null,"topics":["call-kit","callkit","flutter","ios","pushkit","voip","webrtc"],"latest_commit_sha":null,"homepage":null,"language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/peerwaya.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-07T16:04:47.000Z","updated_at":"2024-03-17T05:02:03.000Z","dependencies_parsed_at":"2022-09-21T09:02:45.286Z","dependency_job_id":null,"html_url":"https://github.com/peerwaya/flutter_call_kit","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/peerwaya/flutter_call_kit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerwaya%2Fflutter_call_kit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerwaya%2Fflutter_call_kit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerwaya%2Fflutter_call_kit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerwaya%2Fflutter_call_kit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peerwaya","download_url":"https://codeload.github.com/peerwaya/flutter_call_kit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peerwaya%2Fflutter_call_kit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280577134,"owners_count":26354072,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-23T02:00:06.710Z","response_time":142,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["call-kit","callkit","flutter","ios","pushkit","voip","webrtc"],"created_at":"2025-10-23T06:51:17.069Z","updated_at":"2025-10-23T06:51:23.503Z","avatar_url":"https://github.com/peerwaya.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Flutter Call Kit\n\n[![pub package](https://img.shields.io/pub/v/flutter_call_kit.svg)](https://pub.dartlang.org/packages/flutter_call_kit)\nFlutter Call Kit Plugin - Currently iOS \u003e= 10.0 only\n\n## Motivation\n\n**Flutter Call Kit** utilises a brand new iOS 10 framework **CallKit**  to make the life easier for VoIP developers using Flutter.\n\n**Note 1**: This plugin works for only iOS. No android support yet\n\n**Note 2** This plugin was inspired by [react-native-keep](https://github.com/react-native-webrtc/react-native-callkeep)\n\nFor more information about **CallKit** on iOS, please see [Official CallKit Framework Document](https://developer.apple.com/reference/callkit?language=objc) or [Introduction to CallKit by Xamarin](https://developer.xamarin.com/guides/ios/platform_features/introduction-to-ios10/callkit/)\n\n\n## iOS\n![Connection Service](https://github.com/react-native-webrtc/react-native-callkeep/blob/master/docs/pictures/call-kit.png)\n\n## Usage\nAdd `flutter_call_kit` as a [dependency in your pubspec.yaml file](https://flutter.io/using-packages/).\n\n\n## Example\n\n```dart\n\nimport 'package:flutter/material.dart';\nimport 'dart:async';\nimport 'package:uuid/uuid.dart';\nimport 'package:flutter_call_kit/flutter_call_kit.dart';\n\nvoid main() =\u003e runApp(MyApp());\n\nclass MyApp extends StatefulWidget {\n  @override\n  _MyAppState createState() =\u003e _MyAppState();\n}\n\nclass _MyAppState extends State\u003cMyApp\u003e {\n  bool _configured;\n  String _currentCallId;\n  FlutterCallKit _callKit = FlutterCallKit();\n  @override\n  void initState() {\n    super.initState();\n    configure();\n  }\n\n  Future\u003cvoid\u003e configure() async {\n    _callKit.configure(\n      IOSOptions(\"My Awesome APP\",\n          imageName: 'sim_icon',\n          supportsVideo: false,\n          maximumCallGroups: 1,\n          maximumCallsPerCallGroup: 1),\n      didReceiveStartCallAction: _didReceiveStartCallAction,\n      performAnswerCallAction: _performAnswerCallAction,\n      performEndCallAction: _performEndCallAction,\n      didActivateAudioSession: _didActivateAudioSession,\n      didDisplayIncomingCall: _didDisplayIncomingCall,\n      didPerformSetMutedCallAction: _didPerformSetMutedCallAction,\n      didPerformDTMFAction: _didPerformDTMFAction,\n      didToggleHoldAction: _didToggleHoldAction,\n    );\n    setState(() {\n      _configured = true;\n    });\n  }\n\n  /// Use startCall to ask the system to start a call - Initiate an outgoing call from this point\n  Future\u003cvoid\u003e startCall(String handle, String localizedCallerName) async {\n    /// Your normal start call action\n    await _callKit.startCall(currentCallId, handle, localizedCallerName);\n  }\n\n  Future\u003cvoid\u003e reportEndCallWithUUID(String uuid, EndReason reason) async {\n    await _callKit.reportEndCallWithUUID(uuid, reason);\n  }\n\n  /// Event Listener Callbacks\n\n  Future\u003cvoid\u003e _didReceiveStartCallAction(String uuid, String handle) async {\n    // Get this event after the system decides you can start a call\n    // You can now start a call from within your app\n  }\n\n  Future\u003cvoid\u003e _performAnswerCallAction(String uuid) async {\n    // Called when the user answers an incoming call\n  }\n\n  Future\u003cvoid\u003e _performEndCallAction(String uuid) async {\n    await _callKit.endCall(this.currentCallId);\n    _currentCallId = null;\n  }\n\n  Future\u003cvoid\u003e _didActivateAudioSession() async {\n    // you might want to do following things when receiving this event:\n    // - Start playing ringback if it is an outgoing call\n  }\n\n  Future\u003cvoid\u003e _didDisplayIncomingCall(String error, String uuid, String handle,\n      String localizedCallerName, bool fromPushKit) async {\n    // You will get this event after RNCallKeep finishes showing incoming call UI\n    // You can check if there was an error while displaying\n  }\n\n  Future\u003cvoid\u003e _didPerformSetMutedCallAction(bool mute, String uuid) async {\n    // Called when the system or user mutes a call\n  }\n\n  Future\u003cvoid\u003e _didPerformDTMFAction(String digit, String uuid) async {\n    // Called when the system or user performs a DTMF action\n  }\n\n  Future\u003cvoid\u003e _didToggleHoldAction(bool hold, String uuid) async {\n    // Called when the system or user holds a call\n  }\n\n  String get currentCallId {\n    if (_currentCallId == null) {\n      final uuid = new Uuid();\n      _currentCallId = uuid.v4();\n    }\n\n    return _currentCallId;\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: Scaffold(\n        appBar: AppBar(\n          title: const Text('Plugin example app'),\n        ),\n        body: Center(\n          child: Text('Flutter Call Kit Configured: $_configured\\n'),\n        ),\n      ),\n    );\n  }\n}\n\n```\n\n## Receiving a call when the application is not reachable.\n\nIn some case your application can be unreachable :\n- when the user kill the application\n- when it's in background since a long time (eg: after ~5mn the os will kill all connections).\n\nTo be able to wake up your application to display the incoming call, you can use [https://github.com/peerwaya/flutter_voip_push_notification](flutter_voip_push_notification) on iOS.\n\nYou have to send a push to your application with a library supporting PushKit pushes for iOS.\n\n### PushKit\n\nSince iOS 13, you'll have to report the incoming calls that wakes up your application with a VoIP push. Add this in your `AppDelegate.m` if you're using VoIP pushes to wake up your application :\n\n```objective-c\n- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion {\n  // Process the received push\n  [FlutterVoipPushNotificationPlugin didReceiveIncomingPushWithPayload:payload forType:(NSString *)type];\n\n  // Retrieve information like handle and callerName here\n  // NSString *uuid = /* fetch for payload or ... */ [[[NSUUID UUID] UUIDString] lowercaseString];\n  // NSString *callerName = @\"caller name here\";\n  // NSString *handle = @\"caller number here\";\n\n  [FlutterCallKitPlugin reportNewIncomingCall:uuid handle:handle handleType:@\"generic\" hasVideo:false localizedCallerName:callerName fromPushKit: YES];\n\n  completion();\n}\n```\n\n## Contributing\n\nAny pull request, issue report and suggestion are highly welcome!","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeerwaya%2Fflutter_call_kit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeerwaya%2Fflutter_call_kit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeerwaya%2Fflutter_call_kit/lists"}