iOS SocketIO使用上の注意

序章

最近、プロジェクトを Socketio に切り替える必要があります。以前に一度変更しました。メモを取らなかったため、情報や問題解決方法を探すのに多くの時間を費やしました。もう一度確認しなければならず、記録しなければなりませんそれ!使用中の踏み込みや穴埋めの記録は、将来の検索に便利です。

文章

現在、socketio の iOS バージョンは存在しないため、あるのは Swift バージョンのみです。

いくつかの疑問があります:

1. OC プロジェクトによって参照されるフレームワーク Socket.io-client-Swift (ミラー アドレス)、( GitHub アドレス)をインポートします

2. OC言語とSwift言語の間の橋渡し

3. 注意すべき点

1.socket.io-client-swiftをインポートする

ココポッドインポートを使用することをお勧めします!

純粋なコードを使用して何か間違ったものをインポートしていますが、それを解決する方法がわかりません。怠惰で時間を無駄にしています。

ココポッドの使用方法については多くのチュートリアルがありますが、ここでは繰り返します。

ココポッドを構成したプロジェクトから直接始めてみましょう。

ps: ターミナル内でプロファイルファイルをコンパイルする手間が嫌いで、操作手順が面倒です。

  • まずプロジェクトでpodfileを開き、この行を直接追加します。
pod 'Socket.IO-Client-Swift'
  • ターミナルを開きます --> プロジェクトフォルダーに移動します
cd /Users/q/Desktop/项目 
  • プロファイルのインポートを更新する
pod install

 更新が完了すると、socketio 関連の SDK がプロジェクトにインポートされます。

 2. OC と Swift ブリッジング

SocketIO は Swift フレームワークを使用するため、ブリッジを確立する必要があります

  • まず Swift ファイルを作成します。初めて作成するときにブリッジ ファイルを作成するかどうかを尋ねるメッセージが表示されます。

  •  プロジェクトが作成されると、図に示すように、さらに 2 つのファイルが作成されます。

 3.使用する

  • SocketIO フレームワークをブリッジ ファイルにインポートする
@import SocketIO;
  •  使用する必要があるファイルにブリッジング ファイルのヘッダー ファイルをインポートします
#import "项目-Bridging-Header.h"
#import "项目-Swift.h" //编译文件
  •  プロジェクトで使用するこのパラメータ比較表は非常に重要であり、使用すると非常に役立ちます。比較表の添付ソース
 /**

     log 是否打印日志
     forceNew      这个参数设为NO从后台恢复到前台时总是重连,暂不清楚原因
     forcePolling  是否强制使用轮询
     reconnectAttempts 重连次数,-1表示一直重连
     reconnectWait 重连间隔时间
     connectParams 参数
     forceWebsockets 是否强制使用websocket, 解释The reason it uses polling first is because some firewalls/proxies block websockets. So polling lets socket.io work behind those.
     
**/

    NSURL* url = [[NSURL alloc] initWithString:IP_URL];
    SSLSecurity *SSLSecu = [[SSLSecurity alloc]initWithUsePublicKeys:YES];
    self.manager = [[SocketManager alloc]initWithSocketURL:url config:@{@"log": @YES, @"selfSigned":@YES,@"securty":SSLSecu,@"forceNew" : @YES, @"forcePolling": @NO, @"reconnectAttempts":@(-1), @"reconnectWait" : @1, @"connectParams": @{@"userId" : token}, @"forceWebsockets" : @NO}];
    SocketIOClient *socket = self.manager.defaultSocket;
  •  一部のメソッドとイベントハンドラの「識別」
// socket 连接服务器
	[socket on:@"connect" callback:^(NSArray* data, SocketAckEmitter* ack) {
	    NSLog(@"socket connected ");
	            [weakSelf.socket handleEvent:@"authenticated" data:data isInternalMessage:NO withAck:1]; // 添加接收鉴权的方法
	}];
	[socket connect];
// socket 鉴权 看情况使用
    [socket on:@"authenticated" callback:^(NSArray * data, SocketAckEmitter * ack) {
        if (data.count > 0) {
            NSLog(@"socket 鉴权结果 - %@",data);
        }
    }];
// 心跳包 具体情况看服务端发送和接收方式
    [socket on:@"ping" callback:^(NSArray * _Nonnull data, SocketAckEmitter * _Nonnull ack) {
        NSLog(@"socket - 心跳包");
        // 查看socket 连接状态
        NSLog(@"connect manager status  : %ld",(long)weakSelf.manager.status);
    }];
  // socket 断开连接
    [socket on:@"disconnect" callback:^(NSArray* data, SocketAckEmitter* ack) {
        // 断开连接
        NSLog(@"socket.io disconnect   断开连接");
        // 添加条件判断 超过5次断开连接
        if (weakSelf.connectCount > 5) {
            [weakSelf closeSocket];
        }
    }];
    
    [socket on:@"reconnect" callback:^(NSArray *data, SocketAckEmitter *ack) {
        NSLog(@"重连中...");
        if (data.count > 0) {
        // 连接成功
            weakSelf.connectCount = 0;
        }else
        {
	        // 连接失败
            weakSelf.connectCount++;
        }
        if (weakSelf.connectCount > 5) {
            [weakSelf closeSocket];
        }
        
    }];
    //连接出错了
    [_socket on:@"error" callback:^(NSArray * data, SocketAckEmitter * ack) {
        NSLog(@"socket.io error %@",data);
    }];

// 关闭socket
-(void)closeSocket{
    if (_socket) { // 如果socket 存在 再关闭 
        self.connectCount = 0;
        // 发送关闭socket 请求
        [_socket emit:@"disconnect_request" with:@[]]; 
        [_socket disconnect];
        _socket = nil;
    }
}

以上!

おすすめ

転載: blog.csdn.net/hezhi66327/article/details/128557944