ReplayKit is one of the great new features introduced in iOS 9.0 +, and it's trivial to add to your projects. What's more, it's not just for games – you can record any kind of app just fine. I should add, though, that the recording quality is fairly low, so it's not worth trying to record fine details.

ReplayKit also does few cool things for you:

  • It automatically asks the user for permission to start recording the first time you try.
  • While recording no system user interface is shown, which means you can't see messages coming in from other apps.
  • When users stop recording, they'll get the chance to preview their recording, make changes, save it to their devices and share it – your app doesn't get an access to the recording. But you can find out if a user has saved or shared the recording.

You will find full implementation example below.

First fo all, you need to enable the ReplayKit API in the IOS Native plugin settings as showed on the screenshot below:

Start Recording 

Now you can start the ReplayKit API. It's fairly simple, just call StartRecording method when you want to start your record. You can find out record start result by subscribing to the ActionRecordStarted event. See the code snippet below:

ISN_ReplayKit.ActionRecordStarted += HandleActionRecordStarted;
bool microphoneEnabled = true;

void HandleActionRecordStarted (SA.Common.Models.Result res) {
	if(res.IsSucceeded) {
		Debug.Log("Record was sucssesfully started");
	} else {
		Debug.Log("Record start failed: " + res.Error.Message);

Note: Record starting may be failed due to number of reasons. If you want to find out why record wasn't started, you can refer to the res.Error.Code. Possible error codes can be found below:

Unknown 				= -5800
User Declined			= -5801
Disabled 				= -5802
Failed To Start 		= -5803
Failed 					= -5804
Insufficient Storage 	= -5805
Interrupted 			= -5806

Learn more at

Availability checking 

In case you want to check if the screen recording is available, you can use the IsAvailable property. Screen recording can be unavailable due to unsupported hardware, the user’s device displaying information over Airplay or through a TVOut session or another app using the recorder.

Debug.Log("ReplayKit Is Avaliable: " + ISN_ReplayKit.Instance.IsAvailable);

You can also find out if availability was changed by subscribing to the ActionRecorderDidChangeAvailability event as showed on the code snippet below

ISN_ReplayKit.ActionRecorderDidChangeAvailability += HandleActionRecorderDidChangeAvailability;

void HandleActionRecorderDidChangeAvailability (bool IsRecordingAvaliable) 	{
	Debug.Log("Is Recording Avaliable: " + IsRecordingAvaliable);

Microphone checking

If you requested recording with the mic after recording is started, you can check if a user allowed access to the mic by checking  IsMicEnabled property. 

Debug.Log("ReplayKit Is MicEnabled: " + ISN_ReplayKit.Instance.IsMicEnabled);

Stop Recording

Similar to the record start, all you need to do is to call the StopRecording methods and subscribe to the ActionRecordStoped event.  

See the code snippet below:

ISN_ReplayKit.ActionRecordStoped += HandleActionRecordStoped;

void HandleActionRecordStoped (SA.Common.Models.Result res) {
	if(res.IsSucceeded) {
		Debug.Log("Record was sucssesfully stopped");
	} else {
		Debug.Log("Record stop failed: " + res.Error.Message);

After a record is successfully stopped,  you can start video share dialog, so users will get the chance to preview their recording, make changes, save it to their devices and share it – your app doesn't get access to the recording. But you can find out if a user has  saved or shared the recording. See the code snippet below:

ISN_ReplayKit.ActionShareDialogFinished += HandleActionShareDialogFinished;

void HandleActionShareDialogFinished (ReplayKitVideoShareResult res) {
	if(res.Sources.Length > 0) {
		foreach(string source in res.Sources) {
			Debug.Log ("Success: User has shared the video to:" + source);
	} else {
		Debug.Log ("Fail: User declined video sharing!");

For example, if a user has save the video on device, with an example below you will see the logs similar to:

User has shared the video to:

and if a user has saved the video on device and shared it with facebook, the log will look like:

User has shared the video to:

DiscardRecording  can be only called after the ActionRecordStoped event block has been called. Use the ActionRecordDiscard  handler block to do any required cleanup. Code snippet can be found below.

ISN_ReplayKit.ActionRecordDiscard += HandleActionRecordDiscard;

void HandleActionRecordDiscard () {
	Debug.Log("Record Discarded");

Record Error Handling

By subscribing to the ActionRecordInterrupted event you can find out if a video record was interrupted by some reason.

ISN_ReplayKit.ActionRecordInterrupted += HandleActionRecordInterrupted;

void HandleActionRecordInterrupted (SA.Common.Models.Error error) {
	Debug.Log("Video was interrupted with error: " + error.Message);

You can also find out a video recording state with the IsRecording property:

if(ISN_ReplayKit.Instance.IsRecording) {
	Debug.Log("Something is currently on record");

Additional Settings

You can also choose iPad video editor mode between windowed and fullscreen by changing the setting below.

Known Issues

Plugins will automatically include the ReplayKit.framework into the Xcode project, and mark in as optional. In case you have issues with Replay Kit on IOS 8 or lower, make sure that ReplayKit.framework  is marked as optional. See the screenshot below.