最近做的Unity项目需要加入录频功能,在录频之前需要获取手机剩余存储空间。获取手机剩余存储空间用原生开发很好实现,这就需要用到Unity与IOS的交互。
IOS开发伙伴给了我两个文件:memorySDK.h与memorySDK.m文件。该怎么调用呢?一脸懵逼......
- memorySDK.h文件:
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface memorySDK : NSObject
+ (NSString *)freeDiskSpaceInBytes;
@end
NS_ASSUME_NONNULL_END
- import:用来导入工具包,就是foundation框架。
- @interface memorySDK : NSObject:表示声明了memorySDK类,该类继承自NSObject。
- 在@interface和@end之间是用来声明属性和方法的。
- memorySDK.m文件:
#import "memorySDK.h"
#include <sys/param.h>
#include <sys/mount.h>
@implementation memorySDK
+ (NSString *)freeDiskSpaceInBytes{
struct statfs buf;
unsigned long long freeSpace = -1;
if (statfs("/var", &buf) >= 0) {
freeSpace = (unsigned long long)(buf.f_bsize * buf.f_bavail);
}
NSString *str = [NSString stringWithFormat:@"手机剩余存储空间为:%0.2lld MB",freeSpace/1024/1024];
return str;
}
@end
- #import "memorySDK.h":用来导入.h中声明的属性和方法。
- @implementation memorySDK :实现memorySDK 类。
遇到困难不要慌,整体流程走一遍:
- Xcode新建工程,新建Cocoa Touch Class:GetFreeSpace;
- 在GetFreeSpace.h文件中声明方法:
+ (NSString *)freeDiskSpaceInBytes;
- 在GetFreeSpace.m文件中实现该方法:
OC定义方法的格式:+/- (方法类型)(返回值)方法名 { 实现 }
+(NSString *)freeDiskSpaceInBytes{
struct statfs buf;
unsigned long long freeSpace=-1;
if(statfs("/var", &buf)>=0)
{
freeSpace=(unsigned long long)(buf.f_bsize*buf.f_bavail);
}
NSString *str=[NSString stringWithFormat:@"%0.2lld",freeSpace/1024/1024];
return str;
}
- 在GetFreeSpace.m文件中,将 OC NSString类型转为C String类型:
OC调用方法的格式:[类名 方法名:参数]
static char *pz_strcpy(NSString *str)
{
if(!str||![str isKindOfClass:NSString.class])
{
return NULL;
}
const char *src=[str cStringUsingEncoding:NSUTF8StringEncoding];
if(src==NULL)
{
return NULL;
}
char *dst=(char *)malloc(strlen(src)+1);//malloc():动态分配内存
strcpy(dst, src);
return dst;
}
- 将.m改为.mm文件,加入以下代码:
- extern "C":该写法为C++写法,作用为指示编译器这部分代码按C语言(而不是C++)的方式进行编译;
- oc 中的.m 是objective c语言;oc 中的.mm 是objective c++语言。
#pragma mark - "C"
extern "C" {
char * _FreeDiskSpaceCallback(){
//以下为调用object-c的函数
NSString *str=[GetFreeSpace freeDiskSpaceInBytes];
return pz_strcpy(str);
}
}
- 将.h及.mm文件拷贝到Unity工程Plugins/iOS目录下,并创建脚本CallIos.cs:
- [DllImport("__Internal")] :标识用Objective-C/C++实现的函数(注意是两个下划线);
- 注意参数类型:c# string 对应的是.mm中 char *类型。
using System.Runtime.InteropServices;
public static class CallIOS
{
[DllImport("__Internal")]
private static extern string _FreeDiskSpaceCallback();
public static string GetIOSFreeSpace()
{
return _FreeDiskSpaceCallback();
}
}
- 获取IOS剩余存储空间,调用GetIOSFreeSpace()方法即可。
GetFreeSpace.h文件:
GetFreeSpace.mm文件: