متاح في متجر الأصول: https://assetstore.unity.com/packages/tools/integration/native-share-for-droid-ios-112731
موضوع المنتدى: https://forum.unity.com/threads/native-share-for-droid-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-droid
هناك طريقتان لإعداد البرنامج المساعد على 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 يدويًا. MIME ليس له أي تأثير على iOSAddFile( Texture2D texture, string createdFileName = "Image.png" )
: يحفظ الملمس إلى Application.TemporaryCachepath مع اسم الملف المحدد ويضيف ملف الصورة إلى إجراء المشاركةAddEmailRecipient( string emailAddress )
: يمنح تلقائي حقل المستفيدين من تطبيقات البريد الإلكتروني على نظام Android. ليس له أي تأثير على iOSSetTitle( string title )
: يعين عنوان مربع حوار Share على نظام Android. ليس له أي تأثير على iOSAddTarget( string androidPackageName, string androidClassName = null )
: يشارك المحتوى على تطبيق معين على نظام Android. إذا تم ترك AndroidClassName فارغًا ، فسيتم تضييق قائمة الأنشطة في مربع الحوار "Share" إلى الأنشطة في AndroidPackageName المحددة التي يمكنها التعامل مع إجراء المشاركة هذا. لاحظ أن AndroidClassName ، إذا تم توفيره ، يجب أن يكون الاسم الكامل للنشاط (مع الحزمة الخاصة به). يمكنك استدعاء هذه الوظيفة عدة مرات. هذه الوظيفة ليس لها تأثير على iOSSetCallback( ShareResultCallback callback )
: يستدعي وظيفة رد الاتصال بعد اكتمال إجراء المشاركة. لدى ShareresultCallback التوقيع التالي: void ShareResultCallback( ShareResult result, string shareTarget )
ShareResult result
3 قيم:string shareTarget
بتخزين معلومات حول التطبيق الذي حدده المستخدم من ورقة المشاركة. يمكن أن تكون فارغة أو فارغة ، إذا لم يتم توفير هذه المعلومات. عادة ، هذا هو اسم الحزمة/اسم الفئة للتطبيق المحدد. يمكنك استخدام هذه القيمة لتحديد ما إذا كان المستخدم قد اختار Twitter من ورقة المشاركة: shareTarget != null && shareTarget.ToLowerInvariant().Contains( "twitter" )
أخيرًا ، سيقدم استدعاء وظيفة share () لكائن 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 باستخدام التعبيرات العادية. إرجاع صحيح إذا تم العثور على اسم حزمة/فئة مطابقة بنجاح. يمكن أن تكون مفيدة عندما تريد استخدام وظيفة AddTarget ولكن لا تعرف اسم الحزمة/الفئة الدقيقة للنشاط الهدف. إذا تم ترك classnameregex فارغة ، يتم إرجاع النشاط الأول في الحزمة المطابقة. هذه الوظيفة تُرجع دائمًا على iOS على Android ، يمكنك المشاركة على تطبيق معين عبر AddTarget . بالنسبة لنظام التشغيل iOS ، يمكنك الاطلاع على هذا المنشور ومعرفة ما إذا كان يعمل من أجلك: https://forum.unity.com/threads/native-share-for-droid-ios-open-source.519865/page-4#post -4011874
لا يمكن فقط مشاركة صورة/ملف مع نص/موضوع على بعض التطبيقات (على سبيل المثال Facebook) ، فإنهم يحذفون عن عمد الصورة أو النص من المحتوى المشترك. تتطلب منك هذه التطبيقات استخدام SDKs الخاصة بها لإجراءات المشاركة المعقدة. للحصول على أفضل توافق ، أوصيك بمشاركة الصورة فقط أو النص فقط.
يضيف Nativeshare عنصر <queries>
إلى AndroidManifest.xml بسبب تغيير الرؤية الجديدة للحزمة. يمكن إصلاح خطأ الإنشاء باتباع هذه الخطوات: Android 11 ، Android 12. في أسوأ الحالات ، إذا كنت موافقًا على عدم عمل Nativeshare على بعض الأجهزة المتأثرة ، فيمكنك فتح nativeshare.aar مع Winrar أو 7-Zip ثم قم بإزالة العنصر <queries>...</queries>
من AndroidManifest.xml .
إذا كنت تقوم بتشغيل نشاط الوحدة في عملية منفصلة ، فعليك تعديل AndroidManifest.xml داخل nativeshare.aar بحيث يتم تشغيل كلا من NativeShareCustomShareDialogActivity
و NativeShareBroadcastListener
أيضًا على نفس العملية ، على سبيل المثال: على سبيل المثال:
< activity android : name = " .NativeShareCustomShareDialogActivity " ... android : process = " :YourProcess " />
< receiver android : name = " .NativeShareBroadcastListener " ... android : process = " :YourProcess " />
إذا كنت متأكدًا من أن المكون الإضافي الخاص بك محدث ، فقم بتمكين خيار ملف Proguard المخصص من إعدادات المشغل وإضافة السطر التالي إلى هذا الملف: -keep class com.yasirkula.unity.* { *; }
أضف NativeShareNamespace.NSShareResultCallbackAndroid
إلى قسم Skip Classes
في أصول إعدادات upfuscator الخاصة بك.
يلتقط الرمز التالي لقطة الشاشة للعبة كلما انقرت على الشاشة ، ويحفظها في مسار مؤقت ثم يشاركها:
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();
}