資産ストアで入手可能: 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/
不一致: 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で手動セットアップを必要としなくなりました。プラグインの古いバージョンを使用している場合は、 AndroidManifest.xmlからNativeShareの<provider ... />
削除する必要があります。
参照のために、レガシードキュメントはhttps://github.com/yasirkula/unitynativeshare/wiki/manual-setup-for-androidで入手できます
iOSでプラグインを設定するには、次の2つの方法があります。
新しいネイティブシェアオブジェクトを作成し、次の機能を好きなようにチェーンしてカスタマイズするだけです(コードの例を参照)。
Clear()
:以前に設定された共有コンテンツをクリアします(ある場合)。同じネイティブシェアインスタンスがメモリ効率のために再利用される場合にのみ便利ですSetSubject( string subject )
:件名を設定します(主に電子メールアプリケーションで使用されます)SetText( string text )
:共有テキストを設定します。 Facebookアプリが存在する場合はテキストを省略することに注意してください(このトピックを参照)SetUrl( string url )
:共有URLを設定します。サポートされているiOSアプリでは、このURLはターゲットWebページのプレビューを生成するために使用されます。他のiOSアプリは、URLをテキストに追加したり、省略したりする場合があります。 iOSでファイルを共有しているとき、またはAndroidで何かを共有している間、URLはテキストに追加されます(テキストに既にURLが含まれていない限り)AddFile( string filePath, string mime = null )
:パスのファイルを共有アクションに追加します。異なるタイプの複数のファイルを追加できます。ファイルのmimeは、左nullの場合、自動的に決定されます。ただし、ファイルに拡張機能がない場合、および/またはファイルのmimeを既に知っている場合は、手動でmimeを入力できます。 MIMEはiOSに影響を与えませんAddFile( Texture2D texture, string createdFileName = "Image.png" )
: application.temporarycachepathを指定されたファイル名で保存し、画像ファイルを共有アクションに追加しますAddEmailRecipient( string emailAddress )
:Androidプラットフォーム上の電子メールアプリケーションの受信者フィールドを自動入力します。 iOSには影響しませんSetTitle( string title )
:Androidプラットフォームで[共有]ダイアログのタイトルを設定します。 iOSには影響しませんAddTarget( string androidPackageName, string androidClassName = null )
:Androidプラットフォーム上の特定のアプリケーションでコンテンツを共有します。 AndroidClassNameがNULLのままになっている場合、[共有]ダイアログのアクティビティのリストは、この共有アクションを処理できる指定されたAndroidPackageNameのアクティビティに絞り込まれます。 AndroidClassNameは、提供されている場合は、アクティビティのフルネームでなければならないことに注意してください(パッケージ付き)。この関数を複数回呼び出すことができます。この関数はiOSに影響を与えませんSetCallback( ShareResultCallback callback )
:共有アクションが完了した後、コールバック関数を呼び出します。 ShareresultCallbackには次の署名があります: void ShareResultCallback( ShareResult result, string shareTarget )
ShareResult result
3つの値を取ることができます:string shareTarget
ユーザーが共有シートから選択したアプリに関する情報を保存します。この情報が提供されていない場合は、ヌルまたは空にすることができます。通常、これは選択したアプリケーションのパッケージ名/クラス名です。この値を使用して、ユーザーが共有シートからTwitterを選択したかどうかを判断できます: shareTarget != null && shareTarget.ToLowerInvariant().Contains( "twitter" )
最後に、ネイティブシェアオブジェクトの共有()関数を呼び出すと、共有シートが表示されます。
bool NativeShare.TargetExists( string androidPackageName, string androidClassName = null )
:指定されたパッケージ/クラス名のアプリケーションがAndroidデバイスに存在するかどうかを返します。 AndroidClassNameがnullのままである場合、パッケージ名のみが照会されます。この関数は常にiOSでtrueを返しますbool FindTarget( out string androidPackageName, out string androidClassName, string packageNameRegex, string classNameRegex = null )
:正規表現を使用してAndroidデバイスにインストールされたアプリケーションのパッケージ/クラス名を見つけます。一致するパッケージ/クラス名が正常に見つかった場合、trueを返します。 AddTarget機能を使用したいが、ターゲットアクティビティの正確なパッケージ/クラス名がわからない場合に役立ちます。 ClassnamereGexがNULLのままになっている場合、マッチングパッケージの最初のアクティビティが返されます。この関数は常にiOSでfalseを返しますAndroidでは、 AddTargetを介して特定のアプリで共有できます。 iOSについては、この投稿をチェックして、それがあなたのために機能するかどうかを確認できます:https://forum.unity.com/threads/native-share-for-android-ios-open-source.519865/page-4#post -4011874
一部のアプリ(Facebookなど)で画像/ファイルをテキスト/サブジェクトと共有することはできません。それらは、共有コンテンツの画像またはテキストのいずれかを意図的に省略します。これらのアプリでは、複雑な共有アクションに独自のSDKを使用する必要があります。最適な互換性のために、画像のみまたはテキストのみを共有することをお勧めします。
Nativeshareは、新しいパッケージの可視性の変更により、 <queries>
要素をAndroidManifest.xmlに追加します。ビルドエラーは、次の手順に従うことで修正できます。Android11、Android12。最悪の場合、NativeShareが影響を受けるデバイスの一部で作業していない場合は、Winrarまたは7-zipでnativeShare.AARを開くことができます。次に、 AndroidManifest.xmlから<queries>...</queries>
要素を削除します。
別のプロセスでUnityアクティビティを実行している場合は、 nativeshare.aar内のandroidmanifest.xmlを変更して、 NativeShareCustomShareDialogActivity
とNativeShareBroadcastListener
両方を同じプロセスで実行するように変更します。
< activity android : name = " .NativeShareCustomShareDialogActivity " ... android : process = " :YourProcess " />
< receiver android : name = " .NativeShareBroadcastListener " ... android : process = " :YourProcess " />
プラグインが最新のものであることを確認している場合は、プレーヤー設定からカスタムプログラムファイルオプション-keep class com.yasirkula.unity.* { *; }
有効にし、次の行をそのファイルに追加します。 -keep class com.yasirkula.unity.* { *; }
NativeShareNamespace.NSShareResultCallbackAndroid
をObfuscator Settings Assetの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();
}