IOS设备兼容Ipv5/ipv6访问Ipv4服务器
来源:互联网 发布:手机连发软件 编辑:程序博客网 时间:2024/06/04 18:24
本文转载自:http://www.manew.com/thread-90569-1-1.html
这几天接到运营的一个苹果版 强制性需求,也就是 客户端 网络环境在 ipv4/ipv6 的情况下都能访问 公司外网服务器(ipv4),整理整理思绪。将自己的所测试成功的案例分享一下给有需要的朋友.
1.解决目标
兼容移动设备(IOS系统)能够正常访问服务器(IPv4)。
2.解决思路
2.1:了解苹果官方发布的兼容文档.
2.2:了解unity3d访问IOS代码的流程.
2.3:搭建测试环境
2.4:测试兼容代码.
3.执行
3.1:查看苹果官方发布的IPv6过度技术(https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html#//apple_ref/doc/uid/TP40010220-CH213-SW1)
3.2:我们使用一个新建的unity3d工程进行我们的测试。U3D版本 必须是(4.7.2) 这个可以自行查看一下 u3d 官方的发行说明。
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:代码如下:
#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);5.结束
以上事情都以准备完毕。剩下的就是使用 Unity3d客户端(4.7.2) 在 Mac(苹果系统) 下 Build 出来~。 Build 的完毕 打开 XCode 开发工具 进行 安装到IOS设备。安装完毕~在IOS设备上 任意切换 你的网络环境 进行测试。以上代码 亲测。已通过。
- IOS设备兼容Ipv5/ipv6访问Ipv4服务器
- IOS socket 兼容IPV4与IPV6
- IOS 客户端 socket IPV4兼容IPV6
- 除了IPv4,还有IPv5、IPv6、IPv7和IPv9,IPv10
- IPV4服务器如何支持ipv6访问
- iOS——socket适配ipv6,同时兼容ipv4
- IPv6为啥无法兼容IPv4?
- Unity3d 判断 IOS 设备网络环境 IPV4 or IPV6
- iOS ipv4和ipv6转换
- C++ IPv4与IPv6的兼容编码
- C++ IPv4与IPv6的兼容编码
- C++ IPv4与IPv6的兼容编码
- socket连接库,兼容ipv6,ipv4,为IOS上架做准备
- iOS获得当前设备的IP最方便最好的方法 (分IPv4 & IPv6)
- (0035) iOS 开发之获得当前设备的IP(分IPv4 & IPv6)
- iOS应用兼容IPv6
- iOS应用兼容IPv6
- iOS ipv6 兼容
- Fragment用法详细说明
- 学习java多线程的线程池
- Activity生命周期
- TMS320F28335之系统时钟
- 手把手教你做三级联动
- IOS设备兼容Ipv5/ipv6访问Ipv4服务器
- 软件架构
- 手把手教你做三级联动
- 维护篇(5.2)-07. 调整DHCP租约时间 ❀ 飞塔 (Fortinet) 防火墙
- Hint 强制使用索引有时失灵?
- CUDA 7.5 不支持GCC4.7及以上的版本
- Android Activity生命周期(二)
- ViewPager中的过时方法和循环的实现
- socket编程总结(七)int socket/connect()/send()/recv()/close()/shutdown()/recvfrom