2016-08-03 16 views
0

Я пытаюсь интегрировать чат SendBird SDK с Rubymotion (через его CocoaPod).SendBird chat SDK Rubymotion integration

Начальные шаги работают нормально, и я смог добавить pod в мой Rakefile (используя motion-cocoapods) и скомпилировать без проблем, войти в систему и создать канал обмена сообщениями. Однако обработчик событий меня насторожил.

Эти шаги, я смог перевести из SendBird документы:

Initialize в приложение делегата

SendBird Objective C:

#import <SendBirdSDK/SendBirdSDK.h> 
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // ... 
    NSString *APP_ID = @"<YOUR_APP_ID>"; // You could get it from SendBird Dashboard. 
    [SendBird initAppId:APP_ID]; 
    // ... 
    return YES; 
} 

Rubymotion:

APP_ID = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" 
SendBird.initAppId(APP_ID) 

Войти в SendBird при подписании в/регистрации в мое приложение

SendBird Objective C:

- (void)viewDidLoad 
{  
    // other setup code 
    [SendBird loginWithUserId:USER_ID andUserName:USER_NICKNAME]; 
} 

Rubymotion:

(I хранится информация о пользователях в Auth.current_user хэша после входа в)

SendBird.loginWithUserId(Auth.current_user["id"],andUserName:Auth.current_user["name"]) 

Создание канала обмена сообщениями и настройка обработчика событий

SendBird Objective C:

[SendBird startMessagingWithUserId:targetUserId]; // 1 on 1 channel 

// In your event handler 
[SendBird setEventHandlerConnectBlock:^(SendBirdChannel *channel) { 
    // Callback for [SendBird connectWithTS:] or [SendBird connect:] 
} errorBlock:^(NSInteger code) { 
    // Error occured due to bad APP_ID (or other unknown reason) 
} channelLeftBlock:^(SendBirdChannel *channel) { 
    // Callback for [SendBird leaveChannel:] 
} messageReceivedBlock:^(SendBirdMessage *message) { 
    // Received a regular chat message 
} fileReceivedBlock:^(SendBirdFileLink *fileLink) { 
    // Received a file 
} messagingStartedBlock:^(SendBirdMessagingChannel *channel) { 
    // Callback for [SendBird startMessagingWithUserId:] or [SendBird inviteMessagingWithChannelUrl:] 
} messagingUpdatedBlock:^(SendBirdMessagingChannel *channel) { 
    // Callback for [SendBird inviteMessagingWithChannelUrl:] 
} messagingEndedBlock:^(SendBirdMessagingChannel *channel) { 
    // Callback for [SendBird endMessagingWithChannelUrl:] 
} allMessagingEndedBlock:^ { 
    // Callback for [SendBird endAllMessaging:] 
} readReceivedBlock:^(SendBirdReadStatus *status) { 
    // When ReadStatus has been received 
} messageDeliveryBlock:^(BOOL send, NSString *message, NSString *data, NSString *tempId{ 
    // To determine the message has been successfully sent. 
} mutedMessagesReceivedBlock:^(SendBirdMessage *message) { 
    // When soft-muted messages have been received 
} mutedFileReceivedBlock:^(SendBirdFileLink *message) { 
    // When soft-muted files have been received 
}]; 

Rubymotion:

Здесь я попасть в беду. Я могу создать канал обмена сообщениями, но я не знаю, как написать этот обработчик событий Objective-C в Rubymotion. Онлайн-переводчик на http://objc2rubymotion.herokuapp.com/ терпит неудачу из-за синтаксиса^и *. Любая помощь приветствуется.

SendBird.startMessagingWithUserId(id_of_target_user) 

#Event Handler 

EDIT:

Друг, который знает больше Rubymotion, чем я указал мне в правильном направлении, и теперь у меня есть следующий обработчик события:

SendBird.startMessagingWithUserId(2) 

SendBird.setEventHandlerConnectBlock(
    -> (channel) { 
      # handle connect 
    }, 
    messagingStartedBlock: -> (channel) { 
     mp "channel created:" + channel.to_s 
    }) 

Однако это терпит неудачу с NoMethodError:

2016-08-03 19:48:58.711 faces_ios_v1[75673:798798] chat_screen.rb:24:in `on_load': undefined method `setEventHandlerConnectBlock:messagingStartedBlock:' for SendBird:Class (NoMethodError) 
    from screen_module.rb:39:in `view_did_load' 
    from view_controller.rb:15:in `viewDidLoad' 
2016-08-03 19:48:58.723 faces_ios_v1[75673:798798] *** Terminating app due to uncaught exception 'NoMethodError', reason: 'chat_screen.rb:24:in `on_load': undefined method `setEventHandlerConnectBlock:messagingStartedBlock:' for SendBird:Class (NoMethodError) 
    from screen_module.rb:39:in `view_did_load' 
    from view_controller.rb:15:in `viewDidLoad' 

I е я не включаю messagingStartedBlock в обработчике событий я получаю следующее сообщение об ошибке:

2016-08-03 19:35:20.120 faces_ios_v1[74958:793380] chat_screen.rb:14:in `on_load': undefined method `setEventHandlerConnectBlock' for SendBird:Class (NoMethodError) 
    from screen_module.rb:39:in `view_did_load' 
    from view_controller.rb:15:in `viewDidLoad' 
2016-08-03 19:35:20.132 faces_ios_v1[74958:793380] *** Terminating app due to uncaught exception 'NoMethodError', reason: 'chat_screen.rb:14:in `on_load': undefined method `setEventHandlerConnectBlock' for SendBird:Class (NoMethodError) 
    from screen_module.rb:39:in `view_did_load' 
    from view_controller.rb:15:in `viewDidLoad' 

Это не имеет никакого смысла, так как setEventHandlerConnectBlock должны четко представлять собой метод класса SendBird.

Соответствующая документация SendBird SDK можно найти здесь:

https://docs.sendbird.com/ios#messaging_channel

ответ

0

Хорошо это была решена после того, как много помощи от друга.

Оказалось, что методу обработчика событий SendBird необходимо передать ВСЕ блоки событий или он не будет работать. Так что это будет работать:

SendBird.startMessagingWithUserId(2) 

    SendBird.setEventHandlerConnectBlock(
    -> (channel) { }, 
    errorBlock: -> (code) { }, 
    channelLeftBlock: -> (channel) { }, 
    messageReceivedBlock: -> (message) { }, 
    systemMessageReceivedBlock: -> (message) { }, 
    broadcastMessageReceivedBlock: -> (message) { }, 
    fileReceivedBlock: -> (file_link) { }, 
    messagingStartedBlock: -> (channel) { 
    mp "Messaging started" 
    mp channel 
    }, 
    messagingUpdatedBlock: -> (channel) { }, 
    messagingEndedBlock: -> (channel) { }, 
    allMessagingEndedBlock: -> { }, 
    messagingHiddenBlock: -> (channel) { }, 
    allMessagingHiddenBlock: -> { }, 
    readReceivedBlock: -> (status) { }, 
    typeStartReceivedBlock: -> (status) { }, 
    typeEndReceivedBlock: -> (status) { }, 
    allDataReceivedBlock: -> (sendBirdDataType, count) { }, 
    messageDeliveryBlock: -> (send, message, data, temp_id) { }, 
    mutedMessagesReceivedBlock: -> (message) { }, 
    mutedFileReceivedBlock: -> (message) { } 
) 

и выведет на экран:

"Messaging started" 
#<SendBirdMessagingChannel:0x10f9bcdc0> 

После того, как я получаю эту интеграционную работу, я буду загружать проект учебник/GitHub.

Я отправлю ответную ссылку в виде комментария, если это будет сделано