接上篇《Unity开发Android社交分享组件心得》
前边花了比较久的时间把分享的主要流程、分享组件的默认UI交互啥的都做完了,最近又适配了一下iOS平台的分享,这里简单记录一下适配过程中的注意点,细节就不详述了。
ShareSDK与ShareREC Object-C及其头文件覆盖问题
Mob的ShareSDK组件导入项目时,会同时包含Android和iOS的包,但是ShareRec是分平台导入的。
ShareSDK处理iOS Native代码的方式是首先将Native代码打包,在Editor脚本中,打包为Xcode项目的钩子代码里边,解压Native代码包,然后在Xcode中编译。
那么问题就来了: ShareREC也是这样处理的,而且它们的代码压缩包路径同样都是 Assets/ShareSDKiOSAutoPackage/Editor/SDKPorter/SDK.zip
。这一点估计会坑到一堆人吧 —— iOS平台下同时导入ShareSDK和ShareREC的包时,这个SDK.zip就会互相覆盖,Xcode中编译链接的时候各种找不到文件,检查包内容时也发现不了什么端倪,直到搞明白这俩SDK在iOS下的打包机制…
解决方案就是,把官方提供的ShareSDK.unitypackage和ShareREC.unitypackage中的SDK.zip包解压,合并,再压缩成SDK.zip,放入刚刚的路径,此问题解决
PNG图片压缩问题
ShareSDK中用到的png图片在Xcode中不可压缩,打包时会报错,有两种处理方法:
- BuildSettings里边将Compress PNG 选项设置为NO
- 将组件下所有png图片用ps打开,保存为无交错模式
其中第一中方式会导致打包的ipa文件特别大,所以正式使用时推荐采用第二种方式,将图片都处理一下
JSONKit ARC禁用
ShareREC中的 JSONKit.m
代码是不支持ARC的,编译时会报错,需要在Build Phase -> Compile Sources
中,给代码加上 -fno-objc-arc
选项,此时编译可以通过
iOS native share
可以通过Object-C代码打开iOS内native的分享窗口,来发送文件
在Assets/Plugins/iOS
目录下新建NativeShare.mm
文件
1 | #ifdef UNITY_4_0 || UNITY_5_0 #import "iPhone_View.h" #else extern UIViewController* UnityGetGLViewController(); #endif extern "C" void _ShareVideo(const char* path) { NSString *videoPath = [NSString stringWithUTF8String:path]; NSURL *videoURL = [NSURL fileURLWithPath:videoPath]; NSArray *items = @[videoURL]; UIActivityViewController *activity = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:Nil]; UIViewController *rootViewController = UnityGetGLViewController(); //if iPhone if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [rootViewController presentViewController:activity animated:YES completion:Nil]; } //if iPad else { // Change Rect to position Popover UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:activity]; [popup presentPopoverFromRect:CGRectMake(rootViewController.view.frame.size.width/2, rootViewController.view.frame.size.height/4, 0, 0)inView:rootViewController.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; } } |
在Android版本分享视频的地方添加宏1
2
3
4#if UNITY_IPHONE
[System.Runtime.InteropServices.DllImport( "__Internal" )]
private static extern void _ShareVideo( string path );
#endif
引入native分享视频函数1
2
3
4
5
6#if UNITY_ANDROID
//xxxxx
#elif UNITY_IPHONE
Debug.Log("==== final video path ====" + videoPath);
_ShareVideo(videoPath);
#endif
打包测试,iOS下分享图片视频都可用,至此,分享组件iOS适配完成。
本文链接:https://www.zoucz.com/blog/2017/07/26/unity-ios-native-share/