unity 苹果 ipv6审核

xiaoxiao2021-02-28  111

参考地址:http://www.cnblogs.com/cslunatic/p/5816918.html

http://www.manew.com/forum.php?mod=viewthread&tid=90569&page=1#pid1111243

unity开发了一款游戏进行商品提交的时候被拒,原因我理解的是在ipv6的网络环境下无法进行和我们iipv4服务器进行沟通。但是ipv6的客户端是不能直接连接ipv4的服务端,而且国内的云服务器几乎没有ipv6地址。需要通过DNS64或者NAT64的转换地址才能连接。DNS64/NAT64是苹果提供的转换通道。

首先,查看苹果官方发布的IPv6过度技术。里面原理啦什么的说的很详细。https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1

2.unity版本建议4.7.2版本以上。

 3.2.1:打开新建的U3D调试工程,选择File菜单栏---->Build Settings----->IOS平台------->Ohter Settings----->Configuration---->Scriptiong Backend 选项(选择 IL2CPP) 以及 Architecture 选项(选择 Universal);           3.2.2:在苹果操作系统下新建一个 XCode(6.2以上) 工程--------->新建一个Object-C 文件------->新建的OC文件后缀 .m 更换为.mm文件 只为支持C/C++代码互编。接下来我们开始编写 苹果官方给出的 兼容代码。            3.2.2.1:代码如下:

#import <sys/socket.h> #import <netdb.h> #import <arpa/inet.h> #import <err.h>                      #define MakeStringCopy( _x_ ) ( _x_ != NULL && [_x_ isKindOfClass:[NSString class]] ) ? strdup( [_x_ UTF8String] ) : NULL                     extern "C"{                                 const char* getIPv6(const char *mHost,const char *mPort)                                 {                                         if( nil == mHost )                                                 return NULL;                                         const char *newChar = "No";                                         const char *cause = NULL;                                         struct addrinfo* res0;                                         struct addrinfo hints;                                         struct addrinfo* res;                                         int n, s;                                                                                  memset(&hints, 0, sizeof(hints));                                                                                  hints.ai_flags = AI_DEFAULT;                                         hints.ai_family = PF_UNSPEC;                                         hints.ai_socktype = SOCK_STREAM;                                         //此处是IOS的关键函数                                         if((n=getaddrinfo(mHost, "http", &hints, &res0))!=0)                                         {                                                 printf("getaddrinfo error: %s\n",gai_strerror(n));                                                 return NULL;                                         }                                                                                  struct sockaddr_in6* addr6;                                         struct sockaddr_in* addr;                                         NSString * NewStr = NULL;                                         char ipbuf[32];                                         s = -1;                                         for(res = res0; res; res = res->ai_next)                                         {                                                 if (res->ai_family == AF_INET6)                                                 {                                                         addr6 =( struct sockaddr_in6*)res->ai_addr;                                                         newChar = inet_ntop(AF_INET6, &addr6->sin6_addr, ipbuf, sizeof(ipbuf));                                                         NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar                                                                                                                                                 encoding:NSASCIIStringEncoding];                                                         NSString * TempB = [NSString stringWithUTF8String:"&&ipv6"];                                                                                                                  NewStr = [TempA stringByAppendingString: TempB];                                                         printf("%s\n", newChar);                                                 }                                                 else                                                 {                                                         addr =( struct sockaddr_in*)res->ai_addr;                                                         newChar = inet_ntop(AF_INET, &addr->sin_addr, ipbuf, sizeof(ipbuf));                                                         NSString * TempA = [[NSString alloc] initWithCString:(const char*)newChar                                                                                                                                                  encoding:NSASCIIStringEncoding];                                                         NSString * TempB = [NSString stringWithUTF8String:"&&ipv4"];                                                                                                                  NewStr = [TempA stringByAppendingString: TempB];                                                                                 printf("%s\n", newChar);                                                 }                                                 break;                                         }                                                                                                                           freeaddrinfo(res0);                                                                                  printf("getaddrinfo OK");                                                                                  NSString * mIPaddr = NewStr;                                         return MakeStringCopy(mIPaddr);                                 }                         }    3.3:将编写好的OC(.mm)文件 复制到我们的Unity3d工程目录中的Assets----->Plugins--->ios(没有的话 新建一个文件夹命名为此 名字)文件夹下面。这样我们在 mac(苹果系统)下打包出来 会直接被带入到 XCode 工程 文件夹下面的 Libraries 文件目录下。    3.4: 接下来 Unity3d客户端 这边调用 IOS 原生 代码:      3.4.1:代码如下:             using System.Runtime.InteropServices; //引入此程序集可以调用IOS代码了。                                  public class CompatibilityIP                 {                         [DllImport("__Internal")]                         private static extern string getIPv6(string host, string port);                         private static string GetIPv6(string host, string port)                         {                 #if UNITY_IPHONE && !UNITY_EDITOR                                 return getIPv6(host, port);                 #endif                                 return host + "&&ipv4";                         }                         public static void GetIpType(string serverIp,string serverPort,out  string newServerIp,out AddressFamily newServerAddressFamily)                         {                                 newServerAddressFamily = AddressFamily.InterNetwork;                                 newServerIp = serverIp;                                 try                                 {                                         string mIPv6 = GetIPv6(serverIp, serverPort);                                         if (!string.IsNullOrEmpty(mIPv6))                                         {                                                 string[] strTemp = Regex.Split(mIPv6, "&&");                                                 if (strTemp.Length >= 2)                                                 {                                                         string type = strTemp[1];                                                         if (type == "ipv6")                                                         {                                                                 newServerIp = strTemp[0];                                                                 newServerAddressFamily = AddressFamily.InterNetworkV6;                                                         }                                                 }                                         }                                 }                                 catch (Exception e)                                 {                                         Debug.LogError(e.Message);                                 }                         }                 }         3.5:修改Socket创建方式:           3.5.1:代码如下:                 string serverIp;             AddressFamily ipType;             CompatibilityIP.GetIpType("必须是域名IP(不能是数字IP)","端口号", out serverIp, out ipType);                         Socket clientSocket = new Socket(ipType, SocketType.Stream, ProtocolType.Tcp);                         IPAddress address = IPAddress.Parse(serverIp);                         point = new IPEndPoint(address,端口号);                         clientSocket.BeginConnect(point,异步连接回调函数, clientSocket);

百度云地址:http://pan.baidu.com/s/1dEJTxoH

测试的话,搭建ipv6环境,手机连接ipv6网络,打印LOG,xcode观察输出。

转载请注明原文地址: https://www.6miu.com/read-68743.html

最新回复(0)