在Swift中调用SignalR方法(SwiftR)

时间:2017-01-20 09:04:51

标签: ios swift signalr swiftr

我想在我的项目中使用SignalR,我对swift中使用signalR一无所知,我安装了SwiftR pod,但我不知道如何调用webService方法,将参数传递给webService从webService获取JSON结果,我有简单的代码连接到webService并开始连接,但一切都是错误的,连接不成功。 这是网址:http://s.ne *** y.ir/ 这是应该调用的方法:  Authentication_Code_Request(字符串Mobile,byte方法) 方法是10或20 我应该得到这样的答复: 信息 Method Code Sender

有我的代码:

var autHub: Hub!
    var connection: SignalR!
    //var name: String!

@IBAction func sendRequest(_ sender: Any) {

         connection = SignalR("http://s.ne***y.ir/")
        connection.signalRVersion = .v2_2_0

        print(connection.baseUrl)

        var methodString: String?
        methodString = "10"
        chatHub = Hub("autHub")
        chatHub.on("Authentication_Code_Request") { [weak self] args in
            if let mobile = args?[0] as? String, let method = args?[1] as? String, let mobiletext = self?.chatTextView.text, let mehodText = methodString {
                print(method)
                print(mobiletext)
                print(mehodText)
                print(mobile)
            }
        }
        connection.addHub(chatHub)

        connection.starting = { [weak self] in

            self?.button.tintColor = #colorLiteral(red: 0.2745098174, green: 0.4862745106, blue: 0.1411764771, alpha: 1)
        }

    }

1 个答案:

答案 0 :(得分:2)

这是使用Bridging-Header

在Swift中使用的SignalR目标C.

首先,安装Pods

pod' SignalR-ObjC'

=============================================== ======

添加Objective C类名称SignalRClassViewController.h和SignalRClassViewController.m

=============================================== ========     SignalRClassViewController.h

#import <UIKit/UIKit.h>
#import <SignalR_ObjC/SRClientTransportInterface.h>
#import <SignalR_ObjC/SRHubProxy.h>
#import <SignalR_ObjC/SRHubConnection.h>
#import <SignalR_ObjC/SRConnection.h>
#import <SignalR_ObjC/SRHubConnectionInterface.h>

@interface SignalRClassViewController : UIViewController<SRConnectionDelegate, SRHubConnectionInterface, SRClientTransportInterface>


// This method is used to have Single Instance. In the whole app, Life cycle makes sure you are using only one Instance of SignalR Class because of it one to one connection so we need listeners which continue to listen each time. 


+(SignalRClassViewController *)getInstance;


-(void)SignalRConnection;
-(void)SignalRStopCoonection;


// Write your Own Methods
-(void)assignUser;
-(void)GetWebActiveClients;
@end

=============================================== ======== SignalRClassViewController.m

#import "SignalRClassViewController.h"
@interface SignalRClassViewController ()
{
    NSMutableArray *array ;
}
@end

static SRHubProxy *chat = nil;
static SRHubConnection *hubConnection = nil;

@implementation SignalRClassViewController

static SignalRClassViewController *instance = nil;


+(SignalRClassViewController *)getInstance
{
    @synchronized(self)
    {
        if(instance==nil)
        {
            instance= [SignalRClassViewController new];
            [instance iniHUB];

        }else{
            [instance iniHUB];
        }
    }
    return instance;
}



-(void) iniHUB{


    if(hubConnection == nil){
        NSDictionary *parameters;



        parameters = @{ @"UserId": @"121",
                        @"UserToken": @"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJNeUhhc2giOiIyYzg5ODVmZC1jZDkyLTRjNzItOWNmYi01MWIyMWY1Y2FjZGQiLCIyYzg5ODVmZC1jZDkyLTRjNzItOWNmYi01MWIyMWY1Y2FjZGQiOjEyMX0.bDnuuroAmXvh-kifWN5jpJaSJVnMipuMD4QXon2lB-w"
                        };
        hubConnection = [SRHubConnection connectionWithURLString:@"http://web.abc.......xyz.it" queryString:parameters];
        // parameters if you want to authenticate connection
        else  use  hubConnection = [SRHubConnection connectionWithURLString:@"http://web.abc.......xyz.it"];

        [hubConnection setDelegate:self];

        chat = [hubConnection createHubProxy:@"yourHubName"];

      // Add event for which you want to active your listener when server trigger it
        [chat on:@"ResponseAssignUserDevice" perform:self selector:@selector(responseAssignUserDevice:)];

        [chat on:@"GetWebActiveClients" perform:self selector:@selector(ResponseGetWebActiveClients:)];

        [hubConnection start];
        // Start Connection
    }
}



- (void)viewDidLoad {
    [super viewDidLoad];
}

#pragma mark SRConnection Delegate

- (void)SRConnectionDidClose:(id<SRConnectionInterface>)connection{
    NSLog(@"Connection close");
    [self removeChatObserver];
    [self iniHUB];

}

-(void) removeChatObserver{
    if(chat!=nil){
        chat=nil;
        hubConnection=nil;
    }
}

- (void)SRConnectionDidSlow:(id<SRConnectionInterface>)connection{
    NSLog(@"Reconnect Slow");

}
- (void)SRConnectionWillReconnect:(id<SRConnectionInterface>)connection{
    NSLog(@"Reconnected");
}

-(void)SignalRStopCoonection{
    // Start the connection
    if(hubConnection!= nil){
        [hubConnection stop];
        [self removeChatObserver];
    }

}


-(void)SRConnectionDidOpen:(SRHubConnection*)connection{
    NSLog(@"SR Conection open");
    // When Connection is open call AssignUser
    [self assignUser];


}


-(void)assignUser{

    NSDictionary *parameters;
    parameters = @{ @"UserId": @"121",
                    @"DeviceType": @"Mobile",
                    @"WebToken" : @"NA",
                    @"DeviceOS" : @"iPhone",
                    @"BrowserName" : @"NA"
                    };


    array = [[NSMutableArray alloc]init];
    [array addObject:parameters];
    [chat invoke:@"AssignUserDevice" withArgs:array];
    // This will  invoke  AssignUserDevice which is on server and you have added it selector when server will reponse on this name responseAssignUserDevice



}

- (void)responseAssignUserDevice:(NSString *)message {
    // Print the message when it comes in
    NSLog(@"SR msg %@",message);
}


-(void)GetWebActiveClients{
    array = [[NSMutableArray alloc]init];
    [array addObject:[NSString stringWithFormat:@"121"]];
    [chat invoke:@"GetWebActiveClients" withArgs:array];

}

- (void)ResponseGetWebActiveClients:(NSString *)message
{
    // Print the message when it comes in
    NSLog(@"SR msg responseGetArticleByDate  %@",message);
}




@end

=============================================== ======

ViewController.Swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func assignUser(_ sender: Any) {
      SignalRClassViewController.getInstance().assignUser()
    }

    @IBAction func GetWebActiveClients(_ sender: Any) {
       SignalRClassViewController.getInstance().getWebActiveClients()
    }
}

请检查code here