接上篇《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适配完成。

☞ 参与评论