Unity | Unity与IOS交互

最近做的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
  1. import:用来导入工具包,就是foundation框架。
  2. @interface memorySDK : NSObject:表示声明了memorySDK类,该类继承自NSObject。
  3. 在@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
  1. #import "memorySDK.h":用来导入.h中声明的属性和方法。
  2. @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文件,加入以下代码:
  1. extern "C":该写法为C++写法,作用为指示编译器这部分代码按C语言(而不是C++)的方式进行编译;
  2. 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:
  1.  [DllImport("__Internal")] :标识用Objective-C/C++实现的函数(注意是两个下划线);
  2. 注意参数类型: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文件:

原创文章 171 获赞 24 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_39766005/article/details/106102033