From 8a7639aaf42d480b8e29f0704d71f8324e5783b4 Mon Sep 17 00:00:00 2001 From: Jacob Hanshaw Date: Sun, 3 May 2020 17:12:58 -0700 Subject: [PATCH] Fix reference to deprecated pop over calls, add option to pass url, and handle null string parameters. --- Plugins/NativeShare/NativeShare.cs | 22 +++- Plugins/NativeShare/iOS/NativeShare.mm | 149 +++++++++++++++++++++++-- 2 files changed, 157 insertions(+), 14 deletions(-) diff --git a/Plugins/NativeShare/NativeShare.cs b/Plugins/NativeShare/NativeShare.cs index de60d82..36c09a7 100644 --- a/Plugins/NativeShare/NativeShare.cs +++ b/Plugins/NativeShare/NativeShare.cs @@ -36,10 +36,11 @@ private static AndroidJavaObject Context } #elif !UNITY_EDITOR && UNITY_IOS [System.Runtime.InteropServices.DllImport( "__Internal" )] - private static extern void _NativeShare_Share( string[] files, int filesCount, string subject, string text ); + private static extern void _NativeShare_Share( string[] files, int filesCount, string subject, string text, string url, bool prioritizeFile ); #endif private string subject; + private string url; private string text; private string title; @@ -70,6 +71,14 @@ public NativeShare SetSubject( string subject ) return this; } + public NativeShare SetUrl(string url) + { + if (url != null) + this.url = url; + + return this; + } + public NativeShare SetText( string text ) { if( text != null ) @@ -114,7 +123,7 @@ public NativeShare AddFile( string filePath, string mime = null ) public void Share() { - if( files.Count == 0 && subject.Length == 0 && text.Length == 0 ) + if( files.Count == 0 && string.IsNullOrEmpty(subject) && string.IsNullOrEmpty(text) && string.IsNullOrEmpty(url) ) { Debug.LogWarning( "Share Error: attempting to share nothing!" ); return; @@ -123,15 +132,16 @@ public void Share() #if UNITY_EDITOR Debug.Log( "Shared!" ); #elif UNITY_ANDROID - AJC.CallStatic( "Share", Context, targetPackage, targetClass, files.ToArray(), mimes.ToArray(), subject, text, title ); + string contextText = !string.IsNullOrEmpty(text) ? (text + " " + url) : url; + AJC.CallStatic( "Share", Context, targetPackage, targetClass, files.ToArray(), mimes.ToArray(), subject, contextText, title ); #elif UNITY_IOS - _NativeShare_Share( files.ToArray(), files.Count, subject, text ); + _NativeShare_Share( files.ToArray(), files.Count, subject, text, url, true ); #else Debug.Log( "No sharing set up for this platform." ); #endif } - #region Utility Functions +#region Utility Functions public static bool TargetExists( string androidPackageName, string androidClassName = null ) { #if !UNITY_EDITOR && UNITY_ANDROID @@ -175,6 +185,6 @@ public static bool FindTarget( out string androidPackageName, out string android return false; #endif } - #endregion +#endregion } #pragma warning restore 0414 diff --git a/Plugins/NativeShare/iOS/NativeShare.mm b/Plugins/NativeShare/iOS/NativeShare.mm index 9d8f066..45233c5 100644 --- a/Plugins/NativeShare/iOS/NativeShare.mm +++ b/Plugins/NativeShare/iOS/NativeShare.mm @@ -1,16 +1,142 @@ +#import +#import #ifdef UNITY_4_0 || UNITY_5_0 #import "iPhone_View.h" #else extern UIViewController* UnityGetGLViewController(); #endif +@interface PlatformDependentMediaProvider:UIActivityItemProvider +@property (nonatomic, copy) NSString *filePath; +- (PlatformDependentMediaProvider *)initWithFilePath:(NSString *)filePath; +@end +@implementation PlatformDependentMediaProvider +@synthesize filePath; + +- (PlatformDependentMediaProvider *)initWithFilePath:(NSString *)filePath { + if (self = [super initWithPlaceholderItem:filePath]) { + self.filePath = filePath; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return [[UIImage alloc] init]; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType { + if ([activityType isEqualToString:@"com.facebook.Messenger.ShareExtension"]) { + return filePath.length != 0 ? [[UIImage alloc] initWithContentsOfFile:filePath] : nil; + } + + return filePath.length != 0 ? [NSURL fileURLWithPath:filePath] : nil; +} +@end + +@interface OptionalPlatformDependentMediaProvider:UIActivityItemProvider +@property (nonatomic, copy) NSString *filePath; +- (OptionalPlatformDependentMediaProvider *)initWithFilePath:(NSString *)filePath; +@end +@implementation OptionalPlatformDependentMediaProvider +@synthesize filePath; + +- (OptionalPlatformDependentMediaProvider *)initWithFilePath:(NSString *)filePath { + if (self = [super initWithPlaceholderItem:filePath]) { + self.filePath = filePath; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return [[UIImage alloc] init]; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType { + if ([activityType isEqualToString:UIActivityTypePostToFacebook]) { + return nil; + } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { + return nil; + } else if ([activityType isEqualToString:@"com.facebook.Messenger.ShareExtension"]) { + return filePath.length != 0 ? [[UIImage alloc] initWithContentsOfFile:filePath] : nil; + } + + return filePath.length != 0 ? [NSURL fileURLWithPath:filePath] : nil; +} +@end + +@interface OptionalPlatformDependentImageProvider:UIActivityItemProvider +@property (nonatomic, copy) UIImage *image; +- (OptionalPlatformDependentImageProvider *)initWithImage:(UIImage *)image; +@end +@implementation OptionalPlatformDependentImageProvider +@synthesize image; + +- (OptionalPlatformDependentImageProvider *)initWithImage:(UIImage *)image { + if (self = [super initWithPlaceholderItem:image]) { + self.image = image; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return image; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType { + if ([activityType isEqualToString:UIActivityTypePostToFacebook]) { + return nil; + } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { + return nil; + } else if ([activityType isEqualToString:@"com.facebook.Messenger.ShareExtension"]) { + return image; + } + + return image; +} +@end + +@interface OptionalPlatformDependentUrlProvider:UIActivityItemProvider +@property (nonatomic, copy) NSString *urlPath; +- (OptionalPlatformDependentUrlProvider *)initWithUrlPath:(NSString *)urlPath; +@end +@implementation OptionalPlatformDependentUrlProvider +@synthesize urlPath; + +- (OptionalPlatformDependentUrlProvider *)initWithUrlPath:(NSString *)urlPath { + if (self = [super initWithPlaceholderItem:urlPath]) { + self.urlPath = urlPath; + } + return self; +} + +- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { + return urlPath.length != 0 ? [[NSURL alloc] initWithString:urlPath] : [[NSURL alloc] initWithString:@""]; +} + +- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType { + if ([activityType isEqualToString:UIActivityTypePostToFacebook]) { + return nil; + } else if ([activityType isEqualToString:UIActivityTypePostToTwitter]) { + return nil; + } else if ([activityType isEqualToString:@"com.facebook.Messenger.ShareExtension"]) { + return nil; + } + + return urlPath.length != 0 ? [[NSURL alloc] initWithString:urlPath] : nil; +} +@end + // Credit: https://github.com/ChrisMaire/unity-native-sharing -extern "C" void _NativeShare_Share( const char* files[], int filesCount, char* subject, const char* text ) +extern "C" void _NativeShare_Share( const char* files[], int filesCount, char* subject, const char* text, const char* url, bool prioritizeFile ) { NSMutableArray *items = [NSMutableArray new]; + if(filesCount == 0 || !prioritizeFile) + [items addObject:[[NSURL alloc] initWithString: [NSString stringWithUTF8String:url]]]; + else if( url && strlen( url ) > 0 ) + [items addObject:[[OptionalPlatformDependentUrlProvider alloc] initWithUrlPath: [NSString stringWithUTF8String:url]]]; - if( strlen( text ) > 0 ) + if( text && strlen( text ) > 0 ) [items addObject:[NSString stringWithUTF8String:text]]; // Credit: https://answers.unity.com/answers/862224/view.html @@ -18,14 +144,21 @@ { NSString *filePath = [NSString stringWithUTF8String:files[i]]; UIImage *image = [UIImage imageWithContentsOfFile:filePath]; - if( image != nil ) - [items addObject:image]; - else - [items addObject:[NSURL fileURLWithPath:filePath]]; + if(prioritizeFile) { + if( image ) + [items addObject:image]; + else + [items addObject:[[PlatformDependentMediaProvider alloc] initWithFilePath:filePath]]; + } else { + if( image ) + [items addObject:[[OptionalPlatformDependentImageProvider alloc] initWithImage:image]]; + else + [items addObject:[[OptionalPlatformDependentMediaProvider alloc] initWithFilePath:filePath]]; + } } UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; - if( strlen( subject ) > 0 ) + if( subject && strlen( subject ) > 0 ) [activity setValue:[NSString stringWithUTF8String:subject] forKey:@"subject"]; UIViewController *rootViewController = UnityGetGLViewController(); @@ -38,4 +171,4 @@ UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:activity]; [popup presentPopoverFromRect:CGRectMake( rootViewController.view.frame.size.width / 2, rootViewController.view.frame.size.height / 2, 1, 1 ) inView:rootViewController.view permittedArrowDirections:0 animated:YES]; } -} \ No newline at end of file +}