#if !TARGET_OS_TV // // SocialGate.m // Unity-iPhone // // Created by lacost on 2/15/14. // // #import #import #import #import #if UNITY_VERSION < 450 #include "iPhone_View.h" #endif #import "ISN_NativeCore.h" @interface ISN_SocialGate : NSObject @property (nonatomic, strong) UIDocumentInteractionController * documentInteractionController; + (id) sharedInstance; - (void) twitterPost:(NSString*)status url: (NSString*) url media: (NSString*) media; - (void) fbPost:(NSString*)status url: (NSString*) url media: (NSString*) media; - (void) mediaShare:(NSString*)text media: (NSString*) media; - (void) sendEmail:(NSString*)subject body: (NSString*) body recipients: (NSString*) recipients media: (NSString*) media; - (void)whatsappShareText:(NSString *)msg; - (void)whatsappShareImage:(NSString *)media; @end @implementation ISN_SocialGate static ISN_SocialGate * cg_sharedInstance; + (id)sharedInstance { if (cg_sharedInstance == nil) { cg_sharedInstance = [[self alloc] init]; } return cg_sharedInstance; } #define MMM_WHATSAPP_URL @"whatsapp://" #define MMM_WHATSAPP_IMAGEFILENAME @"wa.wai" #define MMM_WHATSAPP_IMAGEUTI @"net.whatsapp.image" -(BOOL)whatsappInstalled{ return [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:MMM_WHATSAPP_URL]]; } -(void)whatsappShareText:(NSString *)msg { NSString * urlWhats = [NSString stringWithFormat:@"whatsapp://send?text=%@",msg]; NSURL * whatsappURL = [NSURL URLWithString:[urlWhats stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; if ([[UIApplication sharedApplication] canOpenURL: whatsappURL]) { [[UIApplication sharedApplication] openURL: whatsappURL]; } else { //Probably report the errror } } -(void)whatsappShareImage:(NSString *)media { NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; UIImage *image = [[UIImage alloc] initWithData:imageData]; NSString *filepath=[NSTemporaryDirectory() stringByAppendingPathComponent:MMM_WHATSAPP_IMAGEFILENAME]; NSURL *fileURL = [NSURL fileURLWithPath:filepath]; // save image to path.. if([UIImagePNGRepresentation(image) writeToFile:filepath atomically:YES]){ // setup a document interaction controller with our file .. UIDocumentInteractionController *dic = [self setupControllerWithURL:fileURL usingDelegate:nil]; self.documentInteractionController=dic; dic.UTI = MMM_WHATSAPP_IMAGEUTI; dic.name = MMM_WHATSAPP_IMAGEFILENAME; dic.annotation=@{@"message":@"Test Text",@"text":@"Test Text"}; UIViewController *vc = UnityGetGLViewController(); [dic presentOpenInMenuFromRect:vc.view.bounds inView:vc.view animated:YES]; // exit; we're not calling activityDidFinish here, but later in documentInteractionControllerDidDismissOpenInMenu. return; } } - (UIDocumentInteractionController *) setupControllerWithURL: (NSURL*) fileURL usingDelegate: (id ) interactionDelegate { UIDocumentInteractionController *interactionController = [UIDocumentInteractionController interactionControllerWithURL: fileURL]; interactionController.delegate = interactionDelegate; return interactionController; } -(void) mediaShare:(NSString *)text media:(NSString *)media { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: mediaShare"]; UIActivityViewController *controller; if(media.length != 0) { NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; UIImage *image = [[UIImage alloc] initWithData:imageData]; //[UIPopoverPresentationController alloc] ini [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: image added"]; if(text.length != 0) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: text added"]; controller = [[UIActivityViewController alloc] initWithActivityItems:@[text, image] applicationActivities:nil]; } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: no text"]; controller = [[UIActivityViewController alloc] initWithActivityItems:@[image] applicationActivities:nil]; } } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: no media"]; controller = [[UIActivityViewController alloc] initWithActivityItems:@[text] applicationActivities:nil]; } UIViewController *vc = UnityGetGLViewController(); NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] >= 8) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: iOS8 detected"]; UIPopoverPresentationController *presentationController = [controller popoverPresentationController]; presentationController.sourceView = vc.view; } [vc presentViewController:controller animated:YES completion:nil]; } -(void) twitterPost:(NSString *)status url:(NSString *)url media:(NSString *)media { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: twitterPost"]; [SLComposeServiceViewController attemptRotationToDeviceOrientation]; SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; if(tweetSheet == NULL) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: SLServiceTypeTwitter not avaliable "]; UnitySendMessage("ShareManager", "OnTwitterPostFailed", [ISN_DataConvertor NSStringToChar:@""]); return; } if(status.length > 0) { [tweetSheet setInitialText:status]; } if(media.length > 0) { NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; UIImage *image = [[UIImage alloc] initWithData:imageData]; [tweetSheet addImage:image]; } if(url.length > 0) { NSURL *urlObject = [NSURL URLWithString:url]; [tweetSheet addURL:urlObject]; } UIViewController *vc = UnityGetGLViewController(); [vc presentViewController:tweetSheet animated:YES completion:nil]; tweetSheet.completionHandler = ^(SLComposeViewControllerResult result) { NSArray *vComp; switch(result) { // This means the user cancelled without sending the Tweet case SLComposeViewControllerResultCancelled: vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] < 7) { [tweetSheet dismissViewControllerAnimated:YES completion:nil]; } [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Tweet message was cancelled"]; UnitySendMessage("ShareManager", "OnTwitterPostFailed", [ISN_DataConvertor NSStringToChar:@""]); break; // This means the user hit 'Send' case SLComposeViewControllerResultDone: [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Done pressed successfully"]; vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] < 7) { [tweetSheet dismissViewControllerAnimated:YES completion:nil]; } UnitySendMessage("ShareManager", "OnTwitterPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); break; } }; } - (void)twitterPostGif:(NSString *)status url:(NSString*)gifPath { NSURL *url = [NSURL URLWithString:@"https://api.twitter.com/1.1/statuses/update_with_media.json"]; NSMutableDictionary *paramater = [[NSMutableDictionary alloc] init]; //set the parameter here. to see others acceptable parameters find it at twitter API here : http://bit.ly/Occe6R [paramater setObject:status forKey:@"status"]; ACAccountStore *accountStore = [[ACAccountStore alloc] init]; ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [accountStore requestAccessToAccountsWithType:accountType options:nil completion:^(BOOL granted, NSError *error) { if (granted == YES) { NSArray *accountsArray = [accountStore accountsWithAccountType:accountType]; if ([accountsArray count] > 0) { ACAccount *twitterAccount = [accountsArray lastObject]; SLRequest *postRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodPOST URL:url parameters:paramater]; NSData *imageData = [[NSData alloc] initWithContentsOfFile:gifPath]; // GIF89a file [postRequest addMultipartData:imageData withName:@"media[]" type:@"image/gif" filename:@"animated.gif"]; [postRequest setAccount:twitterAccount]; // or postRequest.account = twitterAccount; [postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { NSString *output = [NSString stringWithFormat:@"HTTP response status: %li", (long)[urlResponse statusCode]]; NSLog(@"output = %@",output); dispatch_async(dispatch_get_main_queue(), ^{ }); if([urlResponse statusCode] == 200) { UnitySendMessage("ShareManager", "OnTwitterPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); } else { UnitySendMessage("ShareManager", "OnTwitterPostFailed", [ISN_DataConvertor NSStringToChar:@""]); } }]; } } }]; } - (void) fbPost:(NSString *)status url:(NSString *)url media:(NSString *)media { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: fbPostWithMedia"]; [SLComposeServiceViewController attemptRotationToDeviceOrientation]; SLComposeViewController *fbSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeFacebook]; if(fbSheet == NULL) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: SLServiceTypeFacebook not avaliable "]; UnitySendMessage("ShareManager", "OnFacebookPostFailed", [ISN_DataConvertor NSStringToChar:@""]); return; } if(status.length > 0) { [fbSheet setInitialText:status]; } if(media.length > 0) { NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; UIImage *image = [[UIImage alloc] initWithData:imageData]; [fbSheet addImage:image]; } if(url.length > 0) { NSURL *urlObject = [NSURL URLWithString:url]; [fbSheet addURL:urlObject]; } UIViewController *vc = UnityGetGLViewController(); [vc presentViewController:fbSheet animated:YES completion:nil]; fbSheet.completionHandler = ^(SLComposeViewControllerResult result) { NSArray *vComp; switch(result) { case SLComposeViewControllerResultCancelled: vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] < 7) { [fbSheet dismissViewControllerAnimated:YES completion:nil]; } [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Tweet message was cancelled"]; UnitySendMessage("ShareManager", "OnFacebookPostFailed", [ISN_DataConvertor NSStringToChar:@""]); break; // This means the user hit 'Send' case SLComposeViewControllerResultDone: vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."]; if ([[vComp objectAtIndex:0] intValue] < 7) { [fbSheet dismissViewControllerAnimated:YES completion:nil]; } [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Done pressed successfully"]; UnitySendMessage("ShareManager", "OnFacebookPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); break; } }; } - (void) sendEmail:(NSString *)subject body:(NSString *)body recipients: (NSString*) recipients media:(NSString *)media { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: sendEmail"]; //Create a string with HTML formatting for the email body NSMutableString *emailBody = [[NSMutableString alloc] initWithString:@""] ; #if UNITY_VERSION < 500 [emailBody retain]; #endif //Add some text to it however you want [emailBody appendString:@"

"]; [emailBody appendString:body]; [emailBody appendString:@"

"]; /* if(media.length > 0) { // NSLog(@"media: %@",media); [emailBody appendString:[NSString stringWithFormat:@"

",media]]; } */ //close the HTML formatting [emailBody appendString:@""]; // NSLog(@"emailBody: %@",emailBody); //Create the mail composer window MFMailComposeViewController *emailDialog = [[MFMailComposeViewController alloc] init]; if(emailDialog == nil) { UnitySendMessage("ShareManager", "OnMailFailed", [ISN_DataConvertor NSStringToChar:@""]); return; } emailDialog.mailComposeDelegate = self; [emailDialog setSubject:subject]; [emailDialog setMessageBody:emailBody isHTML:YES]; if(media.length > 0) { NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; [emailDialog addAttachmentData:imageData mimeType:@"image/png" fileName:@"Attachment"]; } NSArray *emails = [recipients componentsSeparatedByString:@","]; [emailDialog setToRecipients:emails]; UIViewController *vc = UnityGetGLViewController(); [vc presentViewController:emailDialog animated:YES completion:nil]; #if UNITY_VERSION < 500 [emailDialog release]; [emailBody release]; #endif } #pragma private - (NSString*) photoFilePath { return [NSString stringWithFormat:@"%@/%@",[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"],@"tempinstgramphoto.igo"]; } - (void) mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error { switch (result) { case MFMailComposeResultCancelled: UnitySendMessage("ShareManager", "OnMailFailed", [ISN_DataConvertor NSStringToChar:@""]); [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Mail cancelled"]; break; case MFMailComposeResultSaved: UnitySendMessage("ShareManager", "OnMailFailed", [ISN_DataConvertor NSStringToChar:@""]); [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Mail saved"]; break; case MFMailComposeResultSent: UnitySendMessage("ShareManager", "OnMailSuccess", [ISN_DataConvertor NSStringToChar:@""]); [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Mail sent"]; break; case MFMailComposeResultFailed: UnitySendMessage("ShareManager", "OnMailFailed", [ISN_DataConvertor NSStringToChar:@""]); [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"ISN: Mail sent failure: %@", [error localizedDescription]]; break; default: UnitySendMessage("ShareManager", "OnMailFailed", [ISN_DataConvertor NSStringToChar:@""]); break; } UIViewController *vc = UnityGetGLViewController(); [vc dismissViewControllerAnimated:YES completion:NULL]; } @end @interface IOSInstaPlugin : NSObject + (id) sharedInstance; - (void) share:(NSString*)status media: (NSString*) media; @end @interface MGInstagram : NSObject extern NSString* const kInstagramAppURLString; extern NSString* const kInstagramOnlyPhotoFileName; //DEFAULT file name is kInstagramDefualtPhotoFileName //DEFAULT file name is restricted to only the instagram app //Make sure your photoFileName has a valid photo extension. + (void) setPhotoFileName:(NSString*)fileName; + (NSString*) photoFileName; //checks to see if user has instagram installed on device + (BOOL) isAppInstalled; //checks to see if image is large enough to be posted by instagram //returns NO if image dimensions are under 612x612 // //Technically the instagram allows for photos to be published under the size of 612x612 //BUT if you want nice quality pictures, I recommend checking the image size. + (BOOL) isImageCorrectSize:(UIImage*)image; //post image to instagram by passing in the target image and //the view in which the user will be presented with the instagram model + (void) postImage:(UIImage*)image inView:(UIView*)view; //Same as above method but with the option for a photo caption + (void) postImage:(UIImage*)image withCaption:(NSString*)caption inView:(UIView*)view; + (void) postImage:(UIImage*)image withCaption:(NSString*)caption inView:(UIView*)view delegate:(id)delegate; @end @interface IOSTwitterPlugin : NSObject + (id) sharedInstance; - (void) initTwitterPlugin; - (void) authificateUser; - (void) loadUserData; - (void) post:(NSString*)status; - (void) postWithMedia:(NSString*)status media: (NSString*) media; @end @implementation IOSInstaPlugin static IOSInstaPlugin *_sharedInstance; + (id)sharedInstance { if (_sharedInstance == nil) { _sharedInstance = [[self alloc] init]; } return _sharedInstance; } -(void) share:(NSString *)status media:(NSString *)media { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"Insta share"]; NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; UIImage *image = [[UIImage alloc] initWithData:imageData]; if ([[[UIDevice currentDevice] systemVersion] floatValue] < 5.0) { float i = [[[UIDevice currentDevice] systemVersion] floatValue]; NSString *str = [NSString stringWithFormat:@"We're sorry, but Instagram is not supported with your iOS %.1f version.", i]; UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; UnitySendMessage("IOSInstagramManager", "OnInstaPostFailed", [ISN_DataConvertor NSStringToChar:@"3"]); UnitySendMessage("ShareManager", "OnInstaPostFailed", [ISN_DataConvertor NSStringToChar:@"3"]); } else { if ([MGInstagram isAppInstalled]) { UIViewController *vc = UnityGetGLViewController(); [MGInstagram postImage:image withCaption:status inView:vc.view delegate:self]; } else { UnitySendMessage("IOSInstagramManager", "OnInstaPostFailed", [ISN_DataConvertor NSStringToChar:@"1"]); UnitySendMessage("ShareManager", "OnInstaPostFailed", [ISN_DataConvertor NSStringToChar:@"1"]); } } } - (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"documentInteractionControllerDidDismissOpenInMenu"]; UnitySendMessage("IOSInstagramManager", "OnInstaPostFailed", [ISN_DataConvertor NSStringToChar:@"2"]); UnitySendMessage("ShareManager", "OnInstaPostFailed", [ISN_DataConvertor NSStringToChar:@"2"]); } - (void) documentInteractionController: (UIDocumentInteractionController *) controller willBeginSendingToApplication: (NSString *) application { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"willBeginSendingToApplication"]; UnitySendMessage("IOSInstagramManager", "OnInstaPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); UnitySendMessage("ShareManager", "OnInstaPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); } @end @interface MGInstagram () { UIDocumentInteractionController *documentInteractionController; } @property (nonatomic) NSString *photoFileName; @end @implementation MGInstagram NSString* const kInstagramAppURLString = @"instagram://app"; NSString* const kInstagramOnlyPhotoFileName = @"tempinstgramphoto.igo"; + (instancetype) sharedInstance { static MGInstagram* sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[MGInstagram alloc] init]; }); return sharedInstance; } - (id) init { if (self = [super init]) { self.photoFileName = kInstagramOnlyPhotoFileName; } return self; } + (void) setPhotoFileName:(NSString*)fileName { [MGInstagram sharedInstance].photoFileName = fileName; } + (NSString*) photoFileName { return [MGInstagram sharedInstance].photoFileName; } + (BOOL) isAppInstalled { NSURL *appURL = [NSURL URLWithString:kInstagramAppURLString]; return [[UIApplication sharedApplication] canOpenURL:appURL]; } //Technically the instagram allows for photos to be published under the size of 612x612 //BUT if you want nice quality pictures, I recommend checking the image size. + (BOOL) isImageCorrectSize:(UIImage*)image { CGImageRef cgImage = [image CGImage]; return (CGImageGetWidth(cgImage) >= 612 && CGImageGetHeight(cgImage) >= 612); } - (NSString*) photoFilePath { return [NSString stringWithFormat:@"%@/%@",[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"],self.photoFileName]; } + (void) postImage:(UIImage*)image inView:(UIView*)view { [self postImage:image withCaption:nil inView:view]; } + (void) postImage:(UIImage*)image withCaption:(NSString*)caption inView:(UIView*)view { [self postImage:image withCaption:caption inView:view delegate:nil]; } + (void) postImage:(UIImage*)image withCaption:(NSString*)caption inView:(UIView*)view delegate:(id)delegate { [[MGInstagram sharedInstance] postImage:image withCaption:caption inView:view delegate:delegate]; } - (void) postImage:(UIImage*)image withCaption:(NSString*)caption inView:(UIView*)view delegate:(id)delegate { if (!image) [NSException raise:NSInternalInconsistencyException format:@"Image cannot be nil!"]; [UIImageJPEGRepresentation(image, 1.0) writeToFile:[self photoFilePath] atomically:YES]; NSURL *fileURL = [NSURL fileURLWithPath:[self photoFilePath]]; documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:fileURL]; #if UNITY_VERSION < 500 [documentInteractionController retain]; #endif documentInteractionController.UTI = @"com.instagram.exclusivegram"; documentInteractionController.delegate = delegate; if (caption) documentInteractionController.annotation = [NSDictionary dictionaryWithObject:caption forKey:@"InstagramCaption"]; [documentInteractionController presentOpenInMenuFromRect:CGRectZero inView:view animated:YES]; } @end @implementation IOSTwitterPlugin static IOSTwitterPlugin * itp_sharedInstance; + (id)sharedInstance { if (itp_sharedInstance == nil) { itp_sharedInstance = [[self alloc] init]; } return itp_sharedInstance; } - (void) initTwitterPlugin { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: Twitter init"]; NSString * status = @"0"; if([self IsTwitterAvaliable]) { if([self IsTwitterAuthed]) { status = @"1"; } } [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: Status init %@", status]; UnitySendMessage("IOSTwitterManager", "OnInited", [ISN_DataConvertor NSStringToChar:status]); } -(void) authificateUser { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: authificateUser"]; ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *twitterAccountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [account requestAccessToAccountsWithType:twitterAccountType options:NULL completion:^(BOOL granted, NSError *error) { if (granted) { NSArray *twitterAccounts = [account accountsWithAccountType:twitterAccountType]; if ([twitterAccounts count] > 0) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: OnAuthSuccess"]; UnitySendMessage("IOSTwitterManager", "OnAuthSuccess", [ISN_DataConvertor NSStringToChar:@""]); } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: OnAuthFailed no aacounts"]; UnitySendMessage("IOSTwitterManager", "OnAuthFailed", [ISN_DataConvertor NSStringToChar:@"0"]); } } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: OnAuthFailed no accses"]; UnitySendMessage("IOSTwitterManager", "OnAuthFailed", [ISN_DataConvertor NSStringToChar:@"1"]); } }]; } -(void) loadUserData { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: loadUserData"]; ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *twitterAccountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; [account requestAccessToAccountsWithType:twitterAccountType options:NULL completion:^(BOOL granted, NSError *error) { if (granted) { NSArray *twitterAccounts = [account accountsWithAccountType:twitterAccountType]; if ([twitterAccounts count] > 0) { ACAccount *twitterAccount = [twitterAccounts objectAtIndex:0]; // Creating a request to get the info about a user on Twitter [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: Using twitter acc with name: %@", twitterAccount.username]; SLRequest *twitterInfoRequest = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:[NSURL URLWithString:@"https://api.twitter.com/1.1/users/show.json"] parameters:[NSDictionary dictionaryWithObject:twitterAccount.username forKey:@"screen_name"]]; [twitterInfoRequest setAccount:twitterAccount]; // Making the request [twitterInfoRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: twitterInfoRequest finished"]; // Check if we reached the reate limit if ([urlResponse statusCode] == 429) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: Rate limit reached"]; UnitySendMessage("IOSTwitterManager", "OnUserDataLoadFailed", [ISN_DataConvertor NSStringToChar:@""]); return; } // Check if there was an error if (error) { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: Error: %@", error.localizedDescription]; UnitySendMessage("IOSTwitterManager", "OnUserDataLoadFailed", [ISN_DataConvertor NSStringToChar:@""]); return; } // Check if there is some response data if (responseData) { NSString *resp = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: Request Succsesful: %@", resp]; UnitySendMessage("IOSTwitterManager", "OnUserDataLoaded", [ISN_DataConvertor NSStringToChar:resp]); } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: No respoce data founded"]; UnitySendMessage("IOSTwitterManager", "OnUserDataLoadFailed", [ISN_DataConvertor NSStringToChar:@""]); } }); }]; } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: OnUserDataLoadFailed no accounts founded"]; UnitySendMessage("IOSTwitterManager", "OnUserDataLoadFailed", [ISN_DataConvertor NSStringToChar:@""]); } } else { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"MSP: OnUserDataLoadFailed no access"]; UnitySendMessage("IOSTwitterManager", "OnUserDataLoadFailed", [ISN_DataConvertor NSStringToChar:@""]); } }]; } -(void) postWithMedia:(NSString *)status media:(NSString *)media { [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"postWithMedia"]; NSData *imageData = [[NSData alloc] initWithBase64Encoding:media]; UIImage *image = [[UIImage alloc] initWithData:imageData]; SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; [tweetSheet setInitialText:status]; [tweetSheet addImage:image]; UIViewController *vc = UnityGetGLViewController(); [vc presentViewController:tweetSheet animated:YES completion:nil]; tweetSheet.completionHandler = ^(SLComposeViewControllerResult result) { switch(result) { // This means the user cancelled without sending the Tweet case SLComposeViewControllerResultCancelled: [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"Tweet message was cancelled"]; UnitySendMessage("IOSTwitterManager", "OnPostFailed", [ISN_DataConvertor NSStringToChar:@""]); [tweetSheet dismissViewControllerAnimated:YES completion:nil]; break; // This means the user hit 'Send' case SLComposeViewControllerResultDone: [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"Done pressed successfully"]; UnitySendMessage("IOSTwitterManager", "OnPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); [tweetSheet dismissViewControllerAnimated:YES completion:nil]; break; } }; } - (void) post:(NSString *)status { SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter]; [tweetSheet setInitialText:status]; UIViewController *vc = UnityGetGLViewController(); [vc presentViewController:tweetSheet animated:YES completion:nil]; tweetSheet.completionHandler = ^(SLComposeViewControllerResult result) { switch(result) { // This means the user cancelled without sending the Tweet case SLComposeViewControllerResultCancelled: [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"Tweet message was cancelled"]; UnitySendMessage("IOSTwitterManager", "OnPostFailed", [ISN_DataConvertor NSStringToChar:@""]); [tweetSheet dismissViewControllerAnimated:YES completion:nil]; break; // This means the user hit 'Send' case SLComposeViewControllerResultDone: [[ISN_NativeUtility sharedInstance] ISN_NativeLog: @"Done pressed successfully"]; UnitySendMessage("IOSTwitterManager", "OnPostSuccess", [ISN_DataConvertor NSStringToChar:@""]); [tweetSheet dismissViewControllerAnimated:YES completion:nil]; break; } }; } -(BOOL) IsTwitterAvaliable { return [SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter]; } -(BOOL) IsTwitterAuthed { ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *twitterAccountType = [account accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; NSArray *twitterAccounts = [account accountsWithAccountType:twitterAccountType]; if(twitterAccounts.count > 0) { return true; } else { return false; } } @end extern "C" { //-------------------------------------- // IOS Plugin Section //-------------------------------------- void _ISN_TwPost(char* text, char* url, char* encodedMedia) { [[ISN_SocialGate sharedInstance] twitterPost:[ISN_DataConvertor charToNSString:text] url:[ISN_DataConvertor charToNSString:url] media:[ISN_DataConvertor charToNSString:encodedMedia]]; } void _ISN_TwPostGIF(char* text, char* url) { [[ISN_SocialGate sharedInstance] twitterPostGif:[ISN_DataConvertor charToNSString:text] url:[ISN_DataConvertor charToNSString:url]]; } void _ISN_FbPost(char* text, char* url, char* encodedMedia) { [[ISN_SocialGate sharedInstance] fbPost:[ISN_DataConvertor charToNSString:text] url:[ISN_DataConvertor charToNSString:url] media:[ISN_DataConvertor charToNSString:encodedMedia]]; } void _ISN_MediaShare(char* text, char* encodedMedia) { NSString *status = [ISN_DataConvertor charToNSString:text]; NSString *media = [ISN_DataConvertor charToNSString:encodedMedia]; [[ISN_SocialGate sharedInstance] mediaShare:status media:media]; } void _ISN_SendMail(char* subject, char* body, char* recipients, char* encodedMedia) { NSString *mailSubject = [ISN_DataConvertor charToNSString:subject]; NSString *mailBody = [ISN_DataConvertor charToNSString:body]; NSString *mailRecipients = [ISN_DataConvertor charToNSString:recipients]; NSString *media = [ISN_DataConvertor charToNSString:encodedMedia]; [[ISN_SocialGate sharedInstance] sendEmail:mailSubject body:mailBody recipients:mailRecipients media:media]; } void _ISN_WP_ShareText(char* text) { NSString *msg = [ISN_DataConvertor charToNSString:text]; [[ISN_SocialGate sharedInstance] whatsappShareText:msg]; } void _ISN_WP_ShareMedia(char* encodedMedia) { NSString *media = [ISN_DataConvertor charToNSString:encodedMedia]; [[ISN_SocialGate sharedInstance] whatsappShareImage:media]; } //-------------------------------------- // Mobile Social Plugin Section //-------------------------------------- void _MSP_TwPost(char* text, char* url, char* encodedMedia) { _ISN_TwPost(text, url, encodedMedia); } void _MSP_FbPost(char* text, char* url, char* encodedMedia) { _ISN_FbPost(text, url, encodedMedia); } void _MSP_MediaShare(char* text, char* encodedMedia) { _ISN_MediaShare(text, encodedMedia); } void _MSP_SendMail(char* subject, char* body, char* recipients, char* encodedMedia) { _ISN_SendMail(subject, body, recipients, encodedMedia); } //-------------------------------------- // Mobile Social Plugin Instagram //-------------------------------------- void _ISN_InstaShare(char* encodedMedia, char* text) { NSString *status = [ISN_DataConvertor charToNSString:text]; NSString *media = [ISN_DataConvertor charToNSString:encodedMedia]; [[IOSInstaPlugin sharedInstance] share:status media:media]; } void _MSP_InstaShare(char* encodedMedia, char* text) { _ISN_InstaShare(encodedMedia, text); } //-------------------------------------- // Mobile Social Plugin Twitter //-------------------------------------- void _twitterInit () { [[IOSTwitterPlugin sharedInstance] initTwitterPlugin]; } void _twitterLoadUserData() { [[IOSTwitterPlugin sharedInstance] loadUserData]; } void _twitterAuthificateUser() { [[IOSTwitterPlugin sharedInstance] authificateUser]; } void _twitterPost(char* text) { NSString *status = [ISN_DataConvertor charToNSString:text]; [[IOSTwitterPlugin sharedInstance] post:status]; } void _twitterPostWithMedia(char* text, char* encodedMedia) { NSString *status = [ISN_DataConvertor charToNSString:text]; NSString *media = [ISN_DataConvertor charToNSString:encodedMedia]; [[IOSTwitterPlugin sharedInstance] postWithMedia:status media:media]; } } #endif