允许 iOS 应用程序用户通过 Twilio 号码、Parse 后端相互拨打电话和发短信

Allow iOS app users to place calls and texts to each other through Twilio numbers, Parse backend

编辑:这个问题对于 Twilio 代理的推出非常没有实际意义!请检查一下。它基本上完成了我想做的事情,但做得更好,而且我自己的手动组织更少。

我正在构建一个应用程序,该应用程序具有一项功能,可以让您给与您匹配的其他用户打电话或发短信。但是,我不想泄露用户的信息,所以我试图用我通过 Twilio 获得的号码来掩盖用户的号码。

我使用 Parse 作为我的后端,它允许我在他们的服务器上 运行 云代码和托管文件。每个匹配都是临时的,所以数字不必永久分配,例如 this example 似乎存储所有用户的地图,每个用户最多有 100 个连接,一对只需要有一个连接, 并且只在需要建立连接的时候。

我想我要为每个用户在他们的 Parse User 对象上存储 phone 数字字符串,当用户点击按钮呼叫另一个用户时,让它将该字符串设置为按钮按用户的 numberToCall 属性。然后,我将使用 saveInBackgroundWithBlock 调用保存当前用户,并在该块内提示对我的 twilio 号码的呼叫。我将请求 URL 更改为 [MyApp].parseapps.com/[MyFunction]。在那里,我将执行解析查询以确定传入呼叫属于哪个用户,并将呼叫转发到他们的 numberToCall 属性。

我已经能够设置 [MyApp].parseapps.com/[MyFunction] 在使用以下代码呼叫我的 Twilio 号码时播放 [Message]:

    // Include Cloud Code module dependencies
var express = require('express'),
twilio = require('twilio');

// Create an Express web app (more info: http://expressjs.com/)
var app = express();

// Create a route that will respond to am HTTP GET request with some
// simple TwiML instructions
app.get('/hello', function(request, response) {

        // Create a TwiML response generator object
        var twiml = new twilio.TwimlResponse();

        // add some instructions
        twiml.say('Hello there! Isn\'t Parse cool?', {
                  voice:'woman'
                  });

        // Render the TwiML XML document
        response.type('text/xml');
        response.send(twiml.toString());
        });

// Start the Express app
app.listen();

我已经执行了解析查询,所以我有格式为“+1XXXXXXXXXX”的数字字符串。现在我只需要弄清楚如何连接这两个用户。我曾尝试搜索 Twilio 的 API 文档,但未能找到相关信息。如果有人能指出我正确的方向,我将不胜感激。

刚刚在历史记录中看到这个问题,有人收藏了它,所以我想分享我的答案。

我的 Twilio 号码配置有请求 URL“https://[MY APP NAME].parseapp.com/calls" and "https://[MY APP NAME].parseapp.com/texts” 在我的 Parse 云代码文件中,我包含了以下内容:

// Include Cloud Code module dependencies
var express = require('express'),
twilio = require('twilio');

// Create an Express web app (more info: http://expressjs.com/)
var app = express();
app.get
('/calls', function(request, response)
{
    // Create a TwiML response generator object
    var twiml = new twilio.TwimlResponse();
    var query1 = new Parse.Query(ActiveJob); //query1 will look to see if a customer made this call
    var twilioNumber = request.param('To');
    var fromNumber = request.param('From');
    query1.equalTo("customerNumber", fromNumber);
    query1.equalTo("customerTwilioNumber", twilioNumber);
    query1.first
    ({
        success: function(result)
        {   //Forward call to the provider that the customer was trying to reach
            var Job = result;
            var receiverNumber = Job.get("providerNumber");
            var receiverTwilioNumber = Job.get("providerTwilioNumber");
            twiml.dial({callerId:receiverTwilioNumber}, receiverNumber);
            response.type('text/xml');
            response.send(twiml.toString(''));

        },
        error: function(error)
        {   //No customer made this call. See if a provider made the call with query2
            var query2 = new Parse.Query(ActiveJob);
            query2.equalTo("providerNumber", fromNumber);
            query2.equalTo("providerTwilioNumber", twilioNumber);
            query2.first
            ({
                success: function(result)
                {   //Forward the call to the customer the provider was trying to call
                    var Job = result;
                    var receiverNumber = Job.get("customerNumber");
                    var receiverTwilioNumber = Job.get("customerTwilioNumber");
                    twiml.dial({callerId:receiverTwilioNumber}, receiverNumber);
                    response.type('text/xml');
                    response.send(twiml.toString(''));
                },
                error: function(error)
                {   //The phone number used to make this call has not been assigned to this Twilio
                    //number as a customer nor a provider
                    response.error("This number has not been assigned to a Job for the current user");
                    twiml.say('Connection failed. Users must use their Lawn Guru verified number for communication.', {voice:'woman'});
                }
            });
        }
    });
    //Since queries are ran in background, this will play while/before the call is connected
    twiml.say('Connecting.', {voice:'woman'});
});

基本上,每个 ActiveJob 都有一个客户的 phone 编号、供应商的 phone 编号,以及每个人将与工作相关联的 twilio 编号。当用户根据他们的号码拨打我的 twilio 号码时,我只能做一件事,所以我找到他们是客户或提供商的活动工作,并且他们与该工作关联的号码是他们拨打的 twilio 号码.然后,我拨出给与该工作相关联的其他用户,来电显示是第二个用户与该工作相关联的号码。这意味着,如果客户呼叫供应商,但他们挂断了电话,供应商可以拨打他们接听电话的同一号码,并连接到客户。我对短信做了类似的事情,这样用户就可以通过他们的消息应用程序无缝地互相发短信。

这样做的一个缺点是,随着工作的完成和新工作的创建,用户将在新工作中重复使用相同的旧 twilio 数字,因此 1) 我限制了用户可以拥有的活跃工作数量关于我拥有的 twilio 用户数量,以及 2) 如果用户在工作结束后尝试从旧提供者拨打电话,他们可能会连接到与当前工作不同的提供者。

希望这对某人有所帮助。