ipv6被拒(更新版)
这篇文章是对上一篇文章的后续更新,不懂的的请看第一章节:ipv6被拒
上一篇文章是iOS原生socket(c语言)的网络通讯:
这篇文章用github上的CocoaAsyncSocket
介绍请看github上流行通讯框架CocoaAsyncSocket的简单使用说明书
由于后台以及flatbuffer的原因,通讯只能用串行,发送一个请求后必须等接收完后,才能发送下一个请求(用了c语言socket,CocoaAsyncSocket,NSStream)都无果,会的大神请留言。。。
这次是在更新版本的时候换了通讯框架用的CocoaAsyncSocket,第一个版本用的原生socket
在用CocoaAsyncSocket也会出现ipv6被拒的情况
一,首先说下更新版本的操作,
1.1在x-code进行相关的操作
1.1.1:TARGETS->General->Identity:
Version:1.0.0
Build:1.0.0
每一次打包Build:的版本就要+1,比如这回1.0.0,下次打包就是1.0.1,一定要Build不同,不然Application loader会上传app store失败
1.1.2:TARGETS->Build Settings->搜索Code Signing,下全部改为:iOS Distribution
1.1.2:PROJECT->Build Settings->搜索Code Signing下也是做相对的操作
1.1.4:TARGETS->Edit Scheme->Run->Info->Build configuration->Release
1.1.5:TARGETS->General->Signing下,一定要重新勾选Automatically manage signing
并选中你的开发Team
1.1.6:Clean一下
1.1.7:TARGETS->Generic iOS Device一定要选中锤子(或者选中你的真机)然后在Product->Archive(点击就可以打包了)Archive的意思就是存档打包的意思。
1.1.8:一定要选中Export,导出到桌面,然后用Application loader上传到app store
用Application Loader上传到app store
点击选中你的桌面的ipa包上传
二:接下来说下在官网的操作:
2.1.1:更新版本的时候选平台或版本(红色箭头),进行新的构建版本,选中后会把版本1的信息直接复制过来,只需要添加自己的新内容就是,官网下方的build也要改为你刚才打包的build1.0.0
这是和第一次上架所不同的地方
关于上架的详细的证书配置:参见:App上架流程(2017)
三:CocoaAsyncSocket因为ipv6被拒解决方案
https://github.com/robbiehanson/CocoaAsyncSocket/issues/405
修改这里的代码:1.- (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr
{
LogTrace();
NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue");
LogVerbose(@"IPv4: %@:%hu", [[self class] hostFromAddress:address4], [[self class] portFromAddress:address4]);
LogVerbose(@"IPv6: %@:%hu", [[self class] hostFromAddress:address6], [[self class] portFromAddress:address6]);
//add codes blow
if(address6)
{
[self setIPv6Enabled:YES];
}
……
}
2.- (void)setIPv6Enabled:(BOOL)flag
{
// Note:YES means kIPv6Disabled is OFF
dispatch_block_t block = ^{
if (flag)
config |= kPreferIPv6; //replace by this
else
config |= kIPv6Disabled;
};
......
}
3.GCDAsyncSocket.m
(BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr;
//add codes blow
...
if (address6) {
[self setIPv4PreferredOverIPv6:NO];
}
BOOL preferIPv6 = (config & kPreferIPv6) ? YES : NO;
...
(NSMutableArray *)lookupHost:(NSString *)host port:(uint16_t)port error:(NSError **)errPtr; find else if (res->ai_family == AF_INET6) branch, then replace by blow:
struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)res->ai_addr;
in_port_t *portPtr = &sockaddr->sin6_port;
if ((portPtr != NULL) && (*portPtr == 0)) {
*portPtr = htons(port);
}
NSData *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen];
[addresses addObject:address6];
上方的这里都是在原码基础里改的。
不会修改的小白可以参见:demo:https://github.com/mrzhao12/IPv6GCDAsyncSocket