2017-01-20 10 views
1

Я хочу использовать SignalR в своем проекте, я ничего не знаю о работе с signalR в swift, я устанавливаю SwiftR pod, но я не знаю, как вызвать метод webService, передать параметр webService и получить результат JSON от webService, есть мой простой код для подключения к webService и запускающего соединения, но все не так, и соединение не увенчалось успехом. это URL:  http://s.ne *** y.ir/ это метод, который должен вызвать: Authentication_Code_Request (строка Mobile, метод байт) Метод 10 или 20 я должен получить этот ответ:  сообщение Method Code SenderМетод вызова SignalR в Swift (SwiftR)

есть мой код:

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) 
     } 

    } 
+0

Я работал с SignalR, Я могу помочь с O bъективный процесс C. Not Swift –

+0

@AbhishekSharma без проблем может помочь. спасибо – ava

+0

Подождите, я создаю быстрое приложение для вас и быстро отправлю. –

ответ

2

это SignalR цель C используется в Swift, используя Bridging-заголовок

Во-первых, установить Бобы

стручок 'SignalR-ObjC'

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

Добавить Объективные Классы 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

+0

Где указаны параметры, которые должны быть отправлены при вызове метода клиента? – ava

+1

Когда вы вызываете клиентский метод с сервера в это время, вы можете отправить его через сообщение String, которое будет представлять собой словарь или массив. Просто возьмите его как String и преобразуйте в необходимый словарь или массив. –

+0

@ava Это работает для вас или нет? –