【问题标题】:conference call iOS/android?电话会议iOS / android?
【发布时间】:2016-01-20 09:49:01
【问题描述】:

我没有来自 twilio 支持的合适答案,所以我来了。

此时,我们在应用中使用 voip 产品(一对一),但我们需要一对多。

我想知道是否可以使用 twilio 会议产品在移动设备 (iOS/android) 上进行电话会议,是否可以将其与 twilio 客户端一起使用,或者我们是否必须向自己做服务器?

或者有什么线索?

按照此处的要求,用于 1 - 1 的代码(仅限 iOS,android 不是我做的) 在这里我得到了令牌。

+ (BOOL)getTwilioToken{

    if(![self isCapabilityTokenValid]){
        if([APP_DELEGATE currentUser].firstName && [APP_DELEGATE currentUser].lastName){
            NSString *fullName = [NSString stringWithFormat:@"%@%@",[APP_DELEGATE currentUser].firstName,[APP_DELEGATE currentUser].lastName];
            NSString *urlString = [NSString stringWithFormat:@"%@%@%@",TWILIO_BASE_URL,TWILIO_TOKEN_URL, fullName];
            NSURL *url = [NSURL URLWithString:urlString];
            NSString *token = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];

            [[NSUserDefaults standardUserDefaults] setObject:token forKey:@"capabilityToken"];
            [[NSUserDefaults standardUserDefaults] synchronize];

            return true;

        }else{
            return false;
        }
    }else{
        return true;
    }

}

以下代码用于处理 voip

- (void)setTwilioToken{

    NSString* token = [[NSUserDefaults standardUserDefaults] objectForKey:@"capabilityToken"];

    if(token){
        self.phone = [[TCDevice alloc] initWithCapabilityToken:token delegate:self];
    }

}

-(IBAction)callPressed:(id)sender{

    //[self callResponder:sender];

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

    //responder full name for twilio, client is required for twilio
    NSString *responderFullName = [NSString stringWithFormat:@"client:%@%@",[[self.responders objectAtIndex:indexPath.row] firstName],[[self.responders objectAtIndex:indexPath.row] lastName]];

    NSDictionary *params = @{@"To": responderFullName};

    //Check to see if we can make an outgoing call and attempt a connection if so
    NSNumber* hasOutgoing = [self.phone.capabilities objectForKey:TCDeviceCapabilityOutgoingKey];

    if ( [hasOutgoing boolValue] == YES ){
        //Disconnect if we've already got a connection in progress
        if(self.connection){
            [self.connection disconnect];
        }

        self.connection = [self.phone connect:params delegate:self];
        [self closeNoddersView:nil];
    }


}
- (void)connectionDidConnect:(TCConnection *)connection{
    NSLog(@"Twilio connectionDidConnect");

    NSError *errorAudio;
    BOOL success = [[AVAudioSession sharedInstance]setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&errorAudio];
    [[AVAudioSession sharedInstance]setMode:AVAudioSessionModeVoiceChat error:nil];


    [[AVAudioSession sharedInstance] setActive:YES error:nil];
    isSpeaker = success;
    if(!success){
        NSLog(@" error Audio %@", [errorAudio debugDescription]);
    }
}

-(void)connection:(TCConnection*)connection didFailWithError:(NSError*)error
{
    //Connection failed to responder failed
    NSLog(@" %@", [error  debugDescription]);
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
                                                    message:@"We can't reach your responder"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
    [alert release];
    [self.connection disconnect];
}

【问题讨论】:

  • 您能否分享一下您现在用来拨打 1 对 1 电话的代码,我会看看是否可以建议您如何更新以进行电话会议。
  • @philnash 完成,感谢您的帮助
  • 感谢@Bryan D,很抱歉让您感到痛苦,您能否分享一下您用来设置呼叫的 TwiML,这在这种情况下更有用。谢谢!
  • @philnash 现在我很抱歉,我对 twilio 很陌生,所以你能更准确吗?你需要服务器端代码吗(我们按照 python 快速入门),你需要“url”吗?
  • 啊,好的,你已经使用了 Python 快速入门,这应该足够我继续了!答案马上来了。

标签: java android ios objective-c twilio


【解决方案1】:

这里是 Twilio 开发者宣传员。

正如我们在 cmets 中所做的那样,您正在使用具有 Python 服务器的 iOS 客户端快速入门。如果您一直遵循快速入门,您将知道,当您发送一个电话号码 To 参数时,您的应用程序将呼叫该号码,并且当您发送一个以开头的字符串 To 参数时"client:" 那么你的应用程序将调用另一个基于客户端的应用程序。这一切都在服务器by these lines上控制。

发生的情况是,当您从应用程序拨出时,Twilio 会使用您设置的参数调用您的 Python 服务器,以了解下一步该做什么。服务器返回 TwiML(XML 的一个子集)和指令。目前它返回各种形式的<Dial>,使用<Client> 拨到另一个客户端,或者只是输入一个号码,拨出到电话网络。

我们想要的是拨入电话会议。

我们可以扩展 Python 服务器来做到这一点。您将需要使用以下内容更新您的 Python 服务器:

@app.route('/call', methods=['GET', 'POST'])
def call():
  resp = twilio.twiml.Response()
  from_value = request.values.get('From')
  to = request.values.get('To')
  if not (from_value and to):
    return str(resp.say("Invalid request"))
  from_client = from_value.startswith('client')
  caller_id = os.environ.get("CALLER_ID", CALLER_ID)
  if not from_client:
    # PSTN -> client
    resp.dial(callerId=from_value).client(CLIENT)
  elif to.startswith("client:"):
    # client -> client
    resp.dial(callerId=from_value).client(to[7:])
  elif to.startswith("conference:"):
    # client -> conference
    resp.dial(callerId=from_value).conference(to[11:])
  else:
    # client -> PSTN
    resp.dial(to, callerId=caller_id)
  return str(resp)

我添加了以下几行:

  elif to.startswith("conference:"):
    # client -> conference
    resp.dial(callerId=from_value).conference(to[11:])

这允许您指定一个类似于“conference:CONF_NAME”的To 参数。如果服务器收到此消息,它将返回如下所示的 TwiML:

<Response>
  <Dial>
    <Conference>CONF_NAME</Conference>
  </Dial>
</Response>

这将使呼叫者进入名为 CONF_NAME 的会议。其他呼叫者可以通过提供相同的姓名拨入同一会议。

这是对快速入门的扩展,但希望您能看到如何使用它来创建您的会议。

如果这有帮助,请告诉我。

【讨论】:

  • 最后我在服务器上设置了修改,看起来效果很好,我们可以通过我们的python代码加入会议,现在我们有点粘,因为没有关于审核部分的指南/教程。你比我更喜欢创建一个新问题还是我可以在这里向你寻求关于审核部分的帮助(静音、排除、获取会议名称等)
  • 查看有关主持会议的教程:twilio.com/docs/tutorials/walkthrough/conference-broadcast/java/…。希望这是一个帮助,如果没有,最好提出一个新问题,我们团队中的一个人会找到它。
  • 很高兴听到您的应用正在运行!您介意接受我的回答,以便其他人可以看到它有帮助吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多