Доступно в Asset Store: https://assetstore.unity.com/packages/tools/integration/native-share-for-android-ios-112731
Тема форума: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/
Discord: https://discord.gg/ujjt549aav
Поддерживать разработчика ☕
Этот плагин помогает вам поделиться файлами (изображения, видео, документы и т. Д.) И/или простой текст на Android и iOS. ContentProvider используется для обмена медиа на Android.
Есть 5 способов установить этот плагин:
"com.yasirkula.nativeshare": "https://github.com/yasirkula/UnityNativeShare.git",
openupm add com.yasirkula.nativeshare
Nativeshare больше не требует никакой ручной настройки на Android. Если вы использовали более старую версию плагина, вам нужно удалить <provider ... />
из вашего AndroidManifest.xml .
Для справки, устаревшая документация доступна по адресу: https://github.com/yasirkula/unitynativeshare/wiki/manual-setup-for-android
Есть два способа настроить плагин на iOS:
Просто создайте новый объект Nativeshare и настройте его, цепляя следующие функции, как вам нравятся (см. Пример кода):
Clear()
: очищает ранее установленное общее содержание (если есть). Полезно только если тот же экземпляр Nativeshare будет повторно использован для эффективности памятиSetSubject( string subject )
: устанавливает субъект (в основном используется в приложениях электронной почты)SetText( string text )
: устанавливает общий текст. Обратите внимание, что приложение Facebook будет пропустить текст, если существует (см. Эта тема)SetUrl( string url )
: устанавливает общий URL. В поддерживаемых приложениях для iOS этот URL -адрес используется для генерации предварительного просмотра целевой веб -страницы. Другие приложения для iOS могут добавить URL в текст или опустить его. Поделившись файлом на iOS или при обмене на Android, URL -адрес добавляется к тексту (если текст уже не содержит URL)AddFile( string filePath, string mime = null )
: добавляет файл в пути к действию общего. Вы можете добавить несколько файлов разных типов. MIME файла автоматически определяется, если остается null; Однако, если файл не имеет расширения и/или вы уже знаете MIME файла, вы можете ввести MIME вручную. Mime не влияет на iOSAddFile( Texture2D texture, string createdFileName = "Image.png" )
: сохраняет текстуру в приложение.AddEmailRecipient( string emailAddress )
: Автопулирует поле получателей приложений электронной почты на платформе Android. Не влияет на iOSSetTitle( string title )
: устанавливает заголовок диалогового окна «Общий диалог» на платформе Android. Не влияет на iOSAddTarget( string androidPackageName, string androidClassName = null )
: совместно использует контент на конкретном приложении на платформе Android. Если AndroidClassName остается нулевым, список действий в диалоговом окне «Общие» будет сужен до действий в указанном AndroidPackageName , которые могут справиться с этим действием общего пользования. Обратите внимание, что AndroidClassName, если предоставлено, должно быть полным названием деятельности (с его пакетом). Вы можете назвать эту функцию несколько раз. Эта функция не влияет на iOSSetCallback( ShareResultCallback callback )
: вызывает функцию обратного вызова после завершения действия общего действия. ShareresultCallback имеет следующую подпись: void ShareResultCallback( ShareResult result, string shareTarget )
ShareResult result
может занять 3 значения:string shareTarget
хранит информацию о приложении, которое пользователь выбрал из общего листа. Это может быть нулевым или пустым, если эта информация не предоставлена. Обычно это имя пакета/имя класса выбранного приложения. Вы можете использовать это значение, например, определить, выбрал ли пользователь Twitter из листа Share: shareTarget != null && shareTarget.ToLowerInvariant().Contains( "twitter" )
Наконец, вызов функции are () объекта Nativeshare представят лист акций.
bool NativeShare.TargetExists( string androidPackageName, string androidClassName = null )
: возвращает, существует ли приложение с указанным именем пакета/класса на устройстве Android. Если AndroidClassName остается нулевым, запрашивается только имя пакета. Эта функция всегда возвращает истину на iOSbool FindTarget( out string androidPackageName, out string androidClassName, string packageNameRegex, string classNameRegex = null )
: находит имя пакета/класса установленного приложения на устройстве Android, используя регулярные выражения. Возвращает True, если соответствующий имя пакета/класса находится успешно. Может быть полезным, когда вы хотите использовать функцию AddTarget , но не знаете точного имени пакета/класса целевой деятельности. Если ClassNamereGex остается нулевым, первое действие в соответствующем пакете возвращается. Эта функция всегда возвращает ложь на iOS На Android вы можете поделиться в конкретном приложении через AddTarget . Для iOS вы можете проверить этот пост и посмотреть, работает ли он для вас: https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/page-4#post -4011874
Просто невозможно поделиться изображением/файлом с текстом/субъектом в некоторых приложениях (например, Facebook), они намеренно опускают либо изображение, либо текст из общего контента. Эти приложения требуют, чтобы вы использовали свои собственные SDK для сложных совместных действий. Для лучшей совместимости я бы порекомендовал вам поделиться только изображением или только текстом.
Nativeshare добавляет <queries>
element в AndroidManifest.xml из -за изменения видимости нового пакета. Ошибка сборки может быть исправлена, выполнив эти шаги: Android 11, Android 12. В худшем случае, если вы в порядке, когда Nativeshar и затем удалите элемент <queries>...</queries>
из androidmanifest.xml .
Если вы выполняете деятельность Unity в отдельном процессе, то измените Androidmanifest.xml внутри nativeshare.aar , чтобы как NativeShareCustomShareDialogActivity
, так и NativeShareBroadcastListener
также работали на одном и том же процессе, например: EG:
< activity android : name = " .NativeShareCustomShareDialogActivity " ... android : process = " :YourProcess " />
< receiver android : name = " .NativeShareBroadcastListener " ... android : process = " :YourProcess " />
Если вы уверены, что ваш плагин актуален, тогда включите пользовательский опцию файла Proguard из настройки игрока и добавьте следующую строку в этот файл: -keep class com.yasirkula.unity.* { *; }
Добавьте NativeShareNamespace.NSShareResultCallbackAndroid
в раздел Skip Classes
вашего актива настройки сфускатора.
Следующий код фиксирует скриншот игры всякий раз, когда вы нажимаете на экран, сохраняет его во временном пути, а затем делится им:
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();
}