ipv6被拒(更新版)

ipv6被拒(更新版)

这篇文章是对上一篇文章的后续更新,不懂的的请看第一章节:ipv6被拒

上一篇文章是iOS原生socket(c语言)的网络通讯:

ipv6被拒(更新版)_第1张图片
c语言socket

这篇文章用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失败

ipv6被拒(更新版)_第2张图片
每一次打包Build:的版本就要+1
ipv6被拒(更新版)_第3张图片
每一次打包Build:的版本就要+1

1.1.2:TARGETS->Build Settings->搜索Code Signing,下全部改为:iOS Distribution

ipv6被拒(更新版)_第4张图片
Code Signing

1.1.2:PROJECT->Build Settings->搜索Code Signing下也是做相对的操作

ipv6被拒(更新版)_第5张图片
PROJECT->Build Settings->搜索Code Signing

1.1.4:TARGETS->Edit Scheme->Run->Info->Build configuration->Release

ipv6被拒(更新版)_第6张图片
Edit Scheme
ipv6被拒(更新版)_第7张图片
Run->Info->Build configuration->Release

1.1.5:TARGETS->General->Signing下,一定要重新勾选Automatically manage signing

并选中你的开发Team

ipv6被拒(更新版)_第8张图片

1.1.6:Clean一下

ipv6被拒(更新版)_第9张图片
无错误就开始打包

1.1.7:TARGETS->Generic iOS Device一定要选中锤子(或者选中你的真机)然后在Product->Archive(点击就可以打包了)Archive的意思就是存档打包的意思。

ipv6被拒(更新版)_第10张图片

1.1.8:一定要选中Export,导出到桌面,然后用Application loader上传到app store

ipv6被拒(更新版)_第11张图片
Export

用Application Loader上传到app store

ipv6被拒(更新版)_第12张图片
Application Loader
ipv6被拒(更新版)_第13张图片

点击选中你的桌面的ipa包上传

二:接下来说下在官网的操作:

2.1.1:更新版本的时候选平台或版本(红色箭头),进行新的构建版本,选中后会把版本1的信息直接复制过来,只需要添加自己的新内容就是,官网下方的build也要改为你刚才打包的build1.0.0

这是和第一次上架所不同的地方

ipv6被拒(更新版)_第14张图片
选平台或版本(红色箭头)

关于上架的详细的证书配置:参见: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

你可能感兴趣的:(ipv6被拒(更新版))