iOS - XMPP 빠른 로그인
XMPP
연결을 구축해야 할 때 총 6개의 데이터 패키지를 Openfire
서버에 보냅니다.먼저 살펴보겠습니다.17:22:41.357 -[XMPPManager xmppStreamWillConnect:] socket ...
17:22:42.100 -[XMPPManager xmppStream:socketDidConnect:] socket ...
17:22:42.102 ①、SEND:
17:22:42.103 ②、SEND:
17:22:43.085 RECV: PLAIN
17:22:43.086 -[XMPPManager xmppStreamDidConnect:] [Line 198] xmpp , ......
17:22:43.087 ③、SEND: APINT4ANBTYg6IJ
APINT4ANBTYg6IJ iOS_V1.0
17:22:43.534 RECV:
17:22:43.534 ④、SEND:
17:22:43.870 RECV:
17:22:43.871 ⑤、SEND: iOS_V1.0
17:22:44.261 RECV: [email protected]/iOS_V1.0
17:22:44.262 ⑥、SEND:
17:22:44.669 RECV:
17:22:44.670 -[XMPPManager xmppStreamDidAuthenticate:] [Line 208] xmpp 。
이런 데이터 패키지를 봐도 아무런 문제가 발견되지 않지만 제품이 온라인으로 오랫동안 운행된 데다가 사용자 양이 일정한 규모에 이르렀을 때 데이터 모니터링을 통해
XMPP
연결 성공률이 높지 않다는 것을 알 수 있다.그래서 기술부 몇몇 동료들은 회의를 열어 이 지표를 어떻게 향상시킬 것인가를 토론했다.전후단 연결을 통해 연결을 구축할 때 클라이언트가 그렇게 많은 데이터 패키지를 보낼 필요가 없다는 것을 발견했다. 몇 가지 조작은 클라이언트에서 할 필요가 없다. 서버에서 조작하는 것이 더욱 편리할 뿐만 아니라 대역폭을 절약하고 서버의 압력을 낮출 수 있다. 클라이언트가 데이터를 보낼 때마다 서버에 압력을 증가시킨다.그래서 새로운 명사가 생겼다. 우리는 이번 최적화된 로그인을 빠른 로그인이라고 부른다.주요 방법은 다음과 같습니다.
stream:stream
패키지는 필수이며, 이전 버전을 구별하기 위해 필드를 하나 더 추가v=‘1.0’
auth
는 매우 중요하고 감권에 쓰인다.여기에 수정을 해서 resource
서브노드를 auth
노드의 속성으로 하고 구 버전을 호환하기 위해 이곳의 자원은 구 버전과 다르다. 서버 측은 이것에 따라 신구 버전을 판단하고 리소스의 값을 iOS_로 변경한다.FL_V1.0 11:52:24:022 SEND:
11:52:24:030 RECV:
11:52:24:031 RECV: PLAIN
11:52:24:044 SEND: APINT4ANBTYg6IJ
11:52:24:054 RECV:
클라이언트가 2개의 데이터 패키지만 보내면 빠른 로그인을 할 수 있으니 간결하지 않겠습니까?클라이언트가 많은 패키지를 보내야만 로그인할 수 있다면, 그 동안 네트워크 때문에 패키지가 발송되지 않았거나, 서버가 되돌아온 패키지를 받을 수 없어서 로그인할 수 없을 수도 있습니다.빠른 로그인은 불필요한 데이터 패키지를 줄이고 로그인 성공률을 높이기 위한 것이다.
빠른 로그인을 위해 원본 코드를 수정하는 방법을 설명합니다.물론 가장 중요한 종류
XMPPStream
는 위의 방법에 따라 한 걸음 한 걸음if (![self didStartNegotiation])
{//TCP connection was just opened - We need to include the opening XML stanza NSString*s1 = @ "; NSData *outgoingData = [s1 dataUsingEncoding:NSUTF8StringEncoding];
XMPPLogSend(@"SEND: %@", s1);
numberOfBytesSent += [outgoingData length];
[asyncSocket writeData:outgoingData
withTimeout:TIMEOUT_XMPP_WRITE
tag:TAG_XMPP_WRITE_START];
[self setDidStartNegotiation:YES];
}
- (void)sendOpeningNegotiation;
이 방법, if(myJID_setByClient) {//수정여기s2 = [NSStringstringWithFormat:"", xmlns, xmlns_stream, [myJID_setByClient domain]]];}else if ([hostName length] > 0) { temp = @""; s2 = [NSString stringWithFormat:temp, xmlns, xmlns_stream, hostName]; } else { temp = @""; s2 = [NSString stringWithFormat:temp, xmlns, xmlns_stream]; } - (void)sendOpeningNegotiation;
패키지의 내용은 약간 복잡하다. auth
연결이 되면 Socket
이 에이전트 리셋에서 - (void)xmppStreamDidConnect:(XMPPStream *)sender;
모니터링 로그인을 한다.이 방법을 따라 들어가면 저희 앱에서 로그인하면 - (BOOL)authenticateWithPassword:(NSString *)inPassword error:(NSError **)errPtr;
, else if ([self supportsPlainAuthentication])
클래스에 들어가서 XMPPPlainAuthentication
패키지의 내용을 수정해야 합니다. auth
이 방법을 찾으면 다음과 같이 수정할 수 있습니다.NSXMLElement *auth = [NSXMLElement elementWithName:@"auth"xmlns:@"urn:ietf:params:xml:ns:xmpp-sasl"]; [auth addAttributeWithName:@"mechanism"stringValue:@"PLAIN"]; [auth addAttributeWithName:@"res"stringValue:@"iOS_FL_V1.0"]; [auth setStringValue:base64]; ...... - (BOOL)start:(NSError **)errPtr;
패키지를 보낸 후에 성공하면 서버 측은 auth
패키지를 되돌려 success
클래스XMPPStream
에서 처리합니다.이 방법의 실현은 좀 이상하다. 분명히 감권에 성공했는데 왜 가방- (void)handleAuth:(NSXMLElement *)authResponse;
을 보내야 하는지 백엔드와 연결을 통해 재발급할 필요가 없다는 것을 발견하고 판단을 내렸다. stream
이 변수를 shouldRenegotiate
로 쓰면 된다. 그러면 발송하지 않을 것이다NO
연결 로그인은 지금까지 갱도가 비교적 많아서 사용자 수가 일정한 규모에 도달해야만 나타날 수 있다. 일부 사람들을 면접한 적이 있다. 그들도 XMPP
에 대해 알고 관련 프로젝트를 한 적이 있지만 연결에 관한 질문을 할 때 기본적으로 어떤 문제도 만나지 않았다고 한다.이것은 사실 그들의 문제가 아니다.IM 제품으로서 정상적인 채팅을 할 수 없다면 어떻게 IM이라고 말할 수 있겠는가.점심 먹었는데...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.