Available on Asset Store: https://assetstore.unity.com/packages/tools/integration/native-share-for-android-ios-112731
Forum Thread: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/
Discord: https://discord.gg/UJJt549AaV
Support the Developer ☕
This plugin helps you natively share files (images, videos, documents, etc.) and/or plain text on Android & iOS. A ContentProvider is used to share the media on Android.
There are 5 ways to install this plugin:
"com.yasirkula.nativeshare": "https://github.com/yasirkula/UnityNativeShare.git",
openupm add com.yasirkula.nativeshare
NativeShare no longer requires any manual setup on Android. If you were using an older version of the plugin, you need to remove NativeShare's <provider ... />
from your AndroidManifest.xml.
For reference, the legacy documentation is available at: https://github.com/yasirkula/UnityNativeShare/wiki/Manual-Setup-for-Android
There are two ways to set up the plugin on iOS:
Simply create a new NativeShare object and customize it by chaining the following functions as you like (see example code):
Clear()
: clears the previously set share content (if any). Only useful if the same NativeShare instance will be reused for memory efficiencySetSubject( string subject )
: sets the subject (primarily used in e-mail applications)SetText( string text )
: sets the shared text. Note that the Facebook app will omit text, if exists (see this topic)SetUrl( string url )
: sets the shared url. On supported iOS apps, this url is used to generate a preview of the target webpage. Other iOS apps may append the url to the text or omit it. While sharing a file on iOS or while sharing anything on Android, the url is appended to the text (unless the text already contains the url)AddFile( string filePath, string mime = null )
: adds the file at path to the share action. You can add multiple files of different types. The MIME of the file is automatically determined if left null; however, if the file doesn't have an extension and/or you already know the MIME of the file, you can enter the MIME manually. MIME has no effect on iOSAddFile( Texture2D texture, string createdFileName = "Image.png" )
: saves the texture to Application.temporaryCachePath with the specified filename and adds the image file to the share actionAddEmailRecipient( string emailAddress )
: auto-populates the recipients field of e-mail applications on Android platform. Has no effect on iOSSetTitle( string title )
: sets the title of the share dialog on Android platform. Has no effect on iOSAddTarget( string androidPackageName, string androidClassName = null )
: shares content on a specific application on Android platform. If androidClassName is left null, list of activities in the share dialog will be narrowed down to the activities in the specified androidPackageName that can handle this share action. Note that androidClassName, if provided, must be the full name of the activity (with its package). You can call this function multiple times. This function has no effect on iOSSetCallback( ShareResultCallback callback )
: invokes the callback function after the share action is completed. ShareResultCallback has the following signature: void ShareResultCallback( ShareResult result, string shareTarget )
ShareResult result
can take 3 values:
string shareTarget
stores information about the app that the user has selected from the share sheet. It can be null or empty, if this information isn't provided. Usually, this is the package name/class name of the selected application. You can use this value to e.g. determine if the user has picked Twitter from the share sheet: shareTarget != null && shareTarget.ToLowerInvariant().Contains( "twitter" )
Finally, calling the Share() function of the NativeShare object will present the share sheet.
bool NativeShare.TargetExists( string androidPackageName, string androidClassName = null )
: returns whether the application with the specified package/class name exists on the Android device. If androidClassName is left null, only the package name is queried. This function always returns true on iOSbool FindTarget( out string androidPackageName, out string androidClassName, string packageNameRegex, string classNameRegex = null )
: finds the package/class name of an installed application on the Android device using regular expressions. Returns true if a matching package/class name is found successfully. Can be useful when you want to use the AddTarget function but don't know the exact package/class name of the target activity. If classNameRegex is left null, the first activity in the matching package is returned. This function always returns false on iOSOn Android, you can share on a specific app via AddTarget. For iOS, you can check out this post and see if it works for you: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/page-4#post-4011874
It is just not possible to share an image/file with text/subject on some apps (e.g. Facebook), they intentionally omit either the image or the text from the shared content. These apps require you to use their own SDKs for complex share actions. For best compatibility, I'd recommend you to share either only image or only text.
NativeShare adds <queries>
element to AndroidManifest.xml due to the new package visibility change. The build error can be fixed by following these steps: Android 11, Android 12. In the worst case, if you are OK with NativeShare not working on some of the affected devices, then you can open NativeShare.aar with WinRAR or 7-Zip and then remove the <queries>...</queries>
element from AndroidManifest.xml.
If you're running the Unity activity in a separate process, then modify AndroidManifest.xml inside NativeShare.aar so that both NativeShareCustomShareDialogActivity
and NativeShareBroadcastListener
also run on the same process, e.g:
<activity android:name=".NativeShareCustomShareDialogActivity" ... android:process=":YourProcess" />
<receiver android:name=".NativeShareBroadcastListener" ... android:process=":YourProcess" />
If you are sure that your plugin is up-to-date, then enable Custom Proguard File option from Player Settings and add the following line to that file: -keep class com.yasirkula.unity.* { *; }
Add NativeShareNamespace.NSShareResultCallbackAndroid
to the Skip Classes
section of your obfuscator settings asset.
The following code captures the screenshot of the game whenever you tap the screen, saves it in a temporary path and then shares it:
void Update()
{
if( Input.GetMouseButtonDown( 0 ) )
StartCoroutine( TakeScreenshotAndShare() );
}
private IEnumerator TakeScreenshotAndShare()
{
yield return new WaitForEndOfFrame();
Texture2D ss = new Texture2D( Screen.width, Screen.height, TextureFormat.RGB24, false );
ss.ReadPixels( new Rect( 0, 0, Screen.width, Screen.height ), 0, 0 );
ss.Apply();
string filePath = Path.Combine( Application.temporaryCachePath, "shared img.png" );
File.WriteAllBytes( filePath, ss.EncodeToPNG() );
// To avoid memory leaks
Destroy( ss );
new NativeShare().AddFile( filePath )
.SetSubject( "Subject goes here" ).SetText( "Hello world!" ).SetUrl( "https://github.com/yasirkula/UnityNativeShare" )
.SetCallback( ( result, shareTarget ) => Debug.Log( "Share result: " + result + ", selected app: " + shareTarget ) )
.Share();
// Share on WhatsApp only, if installed (Android only)
//if( NativeShare.TargetExists( "com.whatsapp" ) )
// new NativeShare().AddFile( filePath ).AddTarget( "com.whatsapp" ).Share();
}