一开始我以为接入ShareSDK去实现分享功能,没想到要实现IOS的原生分享去实现这个功能。本人对OC一点都不熟悉,一脸蒙蔽。然后我开始在网上去找资料,发现一篇Unity实现IOS的截屏分享功能,然后我改一下他的源代码去实现了这个功能。代码如下(功能是实现了,但是不熟悉OC,源代码不敢修改的太多,有空再来搞)。

一 在Unity中声明OC中的函数并且调用OC函数

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_IPHONE && !UNITY_EDITOR
using System.Runtime.InteropServices;
#endif  public class GJCNativeShare : MonoBehaviour {  //声明OS函数#if UNITY_IPHONE && !UNITY_EDITOR  [DllImport ("__Internal")]  private static extern void _GJC_NativeShare(string text, string encodedMedia);  #endif  //回调的委托public delegate void OnShareSuccess(string platform);  public delegate void OnShareCancel(string platform);  public OnShareSuccess onShareSuccess = null;  public OnShareCancel onShareCancel = null;  //单利private static GJCNativeShare _instance = null;  public static GJCNativeShare Instance {  get {  if (_instance == null) {  _instance = GameObject.FindObjectOfType(typeof(GJCNativeShare)) as GJCNativeShare;  if (_instance == null) {  _instance = new GameObject ().AddComponent<GJCNativeShare> ();  _instance.gameObject.name = _instance.GetType ().FullName;  }  }  return _instance;  }  }  /// <summary>/// 调用OC函数/// </summary>public void NativeShare() {  Debug.Log("NativeShare");  #if UNITY_IPHONE && !UNITY_EDITOR  _GJC_NativeShare("", "");  #endif  }  /// <summary>/// 分享成功的回调/// </summary>/// <param name="result">Result.</param>private void OnNativeShareSuccess(string result){  // Debug.Log("success: " + result);  if (onShareSuccess!=null){  onShareSuccess(result);  }  }  /// <summary>/// 分享失败的回到/// </summary>/// <param name="result">Result.</param>private void OnNativeShareCancel(string result){  // Debug.Log("cancel: " + result);  if (onShareCancel != null){  onShareCancel(result);  }  }  }

2 在Xcode中编写GJCSocialShare.h文件

#import <UIKit/UIKit.h>@interface GJCSocialShare : NSObject+ (id) sharedInstance;- (void) nativeShare:(NSString*)text media: (NSString*) media;@end@interface GJC_DataConvertor : NSObject+ (NSString*) charToNSString: (char*)value;
+ (const char*) NSIntToChar: (NSInteger) value;
+ (const char*) NSStringToChar: (NSString *) value;
+ (NSArray*) charToNSArray: (char*)value;+ (const char*) serializeErrorWithData:(NSString *)description code: (int) code;
+ (const char*) serializeError:(NSError *)error;+ (NSMutableString *) serializeErrorWithDataToNSString:(NSString *)description code: (int) code;
+ (NSMutableString *) serializeErrorToNSString:(NSError *)error;+ (const char*) NSStringsArrayToChar:(NSArray *) array;
+ (NSString *) serializeNSStringsArray:(NSArray *) array;@end

3 在Xcode中编写GJCSocialShare.mm文件

#import "GJCSocialShare.h"
#import <Social/Social.h>NSString * const STR_SPLITTER = @"|";
NSString * const STR_EOF = @"endofline";
NSString * const STR_ARRAY_SPLITTER = @"%%%";@implementation GJCSocialSharestatic GJCSocialShare * gjc_sharedInstance;+ (id)sharedInstance {if (gjc_sharedInstance == nil)  {gjc_sharedInstance = [[self alloc] init];}return gjc_sharedInstance;
}-(void) nativeShare:(NSString *)text  media:(NSString *)media {NSLog(@"==============>nativeShare");//UIImage *shareImg = [UIImage imageNamed:@"9.jpg"];//  UIImage *shareImg1 = [UIImage imageNamed:@"14.jpg"];NSString *shareTitle = @"分享 触不到的你 下载链接";NSURL *shareURL = [NSURL URLWithString:@"http://www.baidu.com"];NSArray *activityItems = @[shareURL,shareTitle];// UIActivityViewController *activeViewController = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];UIActivityViewController *controller;controller =[[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];UIViewController *vc =  UnityGetGLViewController();NSArray *vComp = [[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."];if ([[vComp objectAtIndex:0] intValue] >= 8) {UIPopoverPresentationController *presentationController = [controller popoverPresentationController];presentationController.sourceView = vc.view;presentationController.sourceRect = CGRectMake(vc.view.bounds.origin.x+vc.view.bounds.size.width/2,vc.view.bounds.origin.y+vc.view.bounds.size.height,0, 0);presentationController.permittedArrowDirections = 0;}[vc presentViewController:controller animated:YES completion:nil];controller.completionWithItemsHandler = ^(UIActivityType  _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {//        NSLog(@"activityType :%@", activityType);if (completed){//回调Unity函数UnitySendMessage("GJCNativeShare", "OnNativeShareSuccess", [GJC_DataConvertor NSStringToChar:activityType]);//            NSLog(@"completed!");}else{if (activityType != nil){//回调Unity函数UnitySendMessage("GJCNativeShare", "OnNativeShareCancel", [GJC_DataConvertor NSStringToChar:activityType]);}else{//回调Unity函数UnitySendMessage("GJCNativeShare", "OnNativeShareCancel", [GJC_DataConvertor NSStringToChar:@""]);}//            NSLog(@"cancel!");}};
}@end@implementation GJC_DataConvertor+(NSString *) charToNSString:(char *)value {if (value != NULL) {return [NSString stringWithUTF8String: value];} else {return [NSString stringWithUTF8String: ""];}
}+(const char*)NSIntToChar:(NSInteger)value {NSString *tmp = [NSString stringWithFormat:@"%ld", (long)value];return [tmp UTF8String];
}+ (const char*) NSStringToChar:(NSString *)value {return [value UTF8String];
}+ (NSArray *)charToNSArray:(char*)value {NSString* strValue = [GJC_DataConvertor charToNSString:value];NSArray *array;if([strValue length] == 0) {array = [[NSArray alloc] init];} else {array = [strValue componentsSeparatedByString:STR_ARRAY_SPLITTER];}return array;
}+ (const char*) NSStringsArrayToChar:(NSArray *) array {return [GJC_DataConvertor NSStringToChar:[GJC_DataConvertor serializeNSStringsArray:array]];
}+ (NSString *) serializeNSStringsArray:(NSArray *) array {NSMutableString * data = [[NSMutableString alloc] init];for(NSString* str in array) {[data appendString:str];[data appendString: STR_ARRAY_SPLITTER];}[data appendString: STR_EOF];NSString *str = [data copy];
#if UNITY_VERSION < 500[str autorelease];
#endifreturn str;
}+ (NSMutableString *)serializeErrorToNSString:(NSError *)error {NSString* description = @"";if(error.description != nil) {description = error.description;}return  [self serializeErrorWithDataToNSString:description code: (int) error.code];
}+ (NSMutableString *)serializeErrorWithDataToNSString:(NSString *)description code:(int)code {NSMutableString * data = [[NSMutableString alloc] init];[data appendFormat:@"%i", code];[data appendString: STR_SPLITTER];[data appendString: description];return  data;
}+ (const char*) serializeErrorWithData:(NSString *)description code: (int) code {NSString *str = [GJC_DataConvertor serializeErrorWithDataToNSString:description code:code];return [GJC_DataConvertor NSStringToChar:str];
}+ (const char*) serializeError:(NSError *)error  {NSString *str = [GJC_DataConvertor serializeErrorToNSString:error];return [GJC_DataConvertor NSStringToChar:str];
}@endextern "C" {void _GJC_NativeShare(char* text, char* encodedMedia) {NSString *status = [GJC_DataConvertor charToNSString:text];NSString *media = [GJC_DataConvertor charToNSString:encodedMedia];[[GJCSocialShare sharedInstance] nativeShare:status media:media];}
}

4 然后将写好的.h和.mm文件导入到Unity中Plugins文件中,并且勾上Social Framework dependences 这个库。

转载于:https://www.cnblogs.com/weiqiangwaideshijie/p/7779139.html

Unity实现IOS原生分享相关推荐

  1. c语言写桌面程序unity,Unity和iOS原生界面交互示例

    注意上面的Main方法中出现的UnityAppController,该类就是作为控制类来实现Unity在iOS上显示的功能,在Main方法中就是将该控制器作为参数传递,即Main方法之后就会进入该类执 ...

  2. Unity与iOS原生代码之间的相互调用

    1.Unity调用iOS: 1.1.在Unity C#中: [ DllImport( "__Internal" )] private static extern int _show ...

  3. Unity手机震动,Unity -> ios 震动

    说明 Unity 有自己的 接口 Handheld.Vibrate() 来实现手机的震动,这里来介绍下Unity调用ios原生震动. 下面有两种方法震动的实现,用来自己测试.建议使用方法一. 方法一 ...

  4. unity导出工程导入到iOS原生工程中详细步骤

    一直想抽空整理一下unity原生工程导入iOS原生工程中的详细步骤.做iOS+vuforia+unity开发这么长时间了.从最初的小小白到现在的小白.中间趟过了好多的坑.也有一些的小小收货.做一个喜欢 ...

  5. iOS原生如何加载HTML中img标签的图片

    原文出自:iOS原生如何加载HTML中img标签的图片 前言 最近iOS App项目中使用Webview加载H5页面比较多,也有不少朋友经常问到这个问题,在这里我也学习学习如何通过iOS原生的方式来加 ...

  6. ios 微信分享重新编码链接_微信民众号IOS端复制链接失足,安卓端分享链接翻开只能进入首页等题目的处理...

    近来在做某个需要在微信中翻开的项目,部份页面会经由过程微信分享或复制链接分享给其别人,然后就遇到了以下坑: 1.IOS端复制链接或在其他浏览器中翻开时,如果原网站链接原本应当是"http:/ ...

  7. 一个近乎完美的Unity全平台原生c#热更方案

    今天给大家推荐一个近乎完美的Unity全平台原生c#热更方案,相对比其他方案,此方案学习成本更低.完全支持c#所有特性.兼容性极高.占用内存低.执行小高. 项目简介 HybridCLR是一个特性完整. ...

  8. Unity内存优化经验分享

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  9. [Unity3D]Unity资料大全免费分享

    都是网上找的连七八糟的资料了,整理好分享的,有学习资料,视频,源码,插件--等等 东西比较多,不是所有的都是你需要的,可以按  ctrl+F 来搜索你要的东西,如果有广告,不用理会,关掉就可以了,如果 ...

最新文章

  1. AI一分钟 | 传许家印已投资贾跃亭FF;腾讯将发布可接收微信的智能音箱;阿里确认研发自动驾驶技术
  2. qgraphicsitem 复制副本_删除/删除/替换QGraphicsTextItem中的选定文本
  3. 交通监控系统服务器配置,监控系统服务器的配置
  4. Smack Extensions用户手册
  5. centos7网卡配置文件详解与固定服务器ip
  6. 趣味程序设计_打印日历
  7. PPT怎么修改母版背景
  8. php中关于qq第三方登录
  9. 深入理解java虚拟机(4)---类加载机制
  10. x264去方块滤波函数解析(二)
  11. ORA-39083 ORA-10615
  12. C语言编程编制职工档案管理程序,C语言 编写一个职工档案程序.doc
  13. 利用MATLAB实现WAV音频的LSB信息隐藏
  14. Geany下载与安装
  15. HM编码器代码阅读(32)——帧间预测之AMVP/Merge模式(七)encodeResAndCalcRdInterCU函数:残差计算、变换量化
  16. php get 号,php-GET请求不带问号
  17. Win7系统便签怎样设置一个闹钟提醒
  18. 进程管理(一)——进程
  19. 类名.class 类名.this 详解
  20. 扫雷游戏是一款十分经典的单机小游戏。 问题 H: 扫雷游戏

热门文章

  1. 下边框_css基础篇07--边框样式
  2. python `__str__`
  3. opencv-api getStructuringElement
  4. java 监听器能监听宕机_java内存泄漏与内存溢出
  5. html 样式初始化,css样式初始化
  6. Mysql学习总结(32)——MySQL分页技术详解
  7. Ehcache学习总结(1)--Ehcache入门介绍
  8. redis 命令别名_redis 命令、命令行根据前缀(通配符)批量删除redis存储的key
  9. php w 框架叫什么意思,框架是什么,为啥要用框架. 框架解决了什么
  10. 【速学速记】Python 高阶函数