使用Twilio API/SDK在iOS上创建基本的手机应用程序

使用Twilio API/SDK在iOS上创建基本的手机应用程序,ios,twilio,Ios,Twilio,Twilio文档表明,可以创建一个简单的iOS应用程序来拨打和接听电话。甚至还有一个示例项目。名为MonkeyPhone的示例项目包含ARC错误,因此拒绝运行 更广泛的问题是,Twilio是否是在ios或android应用程序上拨打和接听电话的最佳API/平台?为此,您可以使用TCConnectionDelegate方法。它会自动处理您的呼叫过程 这里是你必须遵循的几个步骤 1.>您需要首先创建一个twilio帐户,并获取帐户sid和身份验证令牌 2.>之后进入开发工具->TWIML应用程序

Twilio文档表明,可以创建一个简单的iOS应用程序来拨打和接听电话。甚至还有一个示例项目。名为MonkeyPhone的示例项目包含ARC错误,因此拒绝运行


更广泛的问题是,Twilio是否是在ios或android应用程序上拨打和接听电话的最佳API/平台?

为此,您可以使用TCConnectionDelegate方法。它会自动处理您的呼叫过程

这里是你必须遵循的几个步骤

1.>您需要首先创建一个twilio帐户,并获取帐户sid和身份验证令牌

2.>之后进入开发工具->TWIML应用程序

创建一个新的twiml应用程序并创建

请提及您将传递电话号码的语音请求URL

3.>将您的电话号码传递给TCConnectionDelegate connect方法

   YourTwilioDeviceClass *phone = appDelegate.phone;
   [phone connect:self.textFieldPhoneNumber.text];
4.>现在通过将accountSid、authToken、appId传递到服务器上的auth.php文件来获取身份验证令牌

    #pragma mark -
    #pragma mark TCDevice Capability Token

    -(NSString*)getCapabilityToken:(NSError**)error
    {
        //Creates a new capability token from the auth.php file on server
        NSString *capabilityToken = nil;

        NSString *accountSid = [[NSUserDefaults standardUserDefaults] objectForKey:@"accountSid"];
        NSString *authToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"authToken"];
        NSString *appId = [[NSUserDefaults standardUserDefaults] objectForKey:@"appId"];

        //Make the URL Connection to your server

        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.yourauthfilepath.com/twillo/auth.php?accountSid=%@&authToken=%@&appSid=%@",accountSid,authToken,appId]];
        NSURLResponse *response = nil;
        NSData *data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url]
                                             returningResponse:&response error:error];
        if (data)
        {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

            if (httpResponse.statusCode==200)
            {
                capabilityToken = [[[NSString alloc] initWithData:data
                                                         encoding:NSUTF8StringEncoding] autorelease];
            }
            else
            {
                //*error = [ConferencePhone errorFromHTTPResponse:httpResponse domain:@"CapabilityTokenDomain"];
            }
        }
        // else there is likely an error which got assigned to the incoming error pointer.

        return capabilityToken;
    }

    -(BOOL)capabilityTokenValid
    {
        //Check TCDevice's capability token to see if it is still valid
        BOOL isValid = NO;
       // NSLog(@"_device.capabilities %@",_device.capabilities);
        NSNumber *expirationTimeObject = [_device.capabilities objectForKey:@"expiration"];
        long long expirationTimeValue = [expirationTimeObject longLongValue];
        long long currentTimeValue = (long long)[[NSDate date] timeIntervalSince1970];

        if ((expirationTimeValue-currentTimeValue)>0)
            isValid = YES;

        return isValid;
    }

    #pragma mark -
    #pragma mark Device Network connect and disconnect

    -(void)connect:(NSString*)phoneNumber
    {
        // first check to see if the token we have is valid, and if not, refresh it.
        // Your own client may ask the user to re-authenticate to obtain a new token depending on
        // your security requirements.

        HelloMonkeyAppDelegate *appDelegate=(HelloMonkeyAppDelegate*)[[UIApplication sharedApplication]delegate];

        if (![self capabilityTokenValid] || (!appDelegate.isTokenGet))
        {
            //Capability token is not valid, so create a new one and update device
            [self login];
        }



        if (![self reachabiltyCheck])
        {
            NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"5", nil] forKeys:[NSArray arrayWithObjects:CPLoginDidFailWithError, nil]];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];

            HelloMonkeyAppDelegate *appDelegate=(HelloMonkeyAppDelegate*)[[UIApplication sharedApplication]delegate];
            appDelegate.isTokenGet=FALSE;
        }
        else
        {
            NSDictionary* parameters = nil;
            if ( [phoneNumber length] > 0 )
            {
                parameters = [NSDictionary dictionaryWithObject:phoneNumber forKey:@"PhoneNumber"];
            }

            NSLog(@"parameters ===%@",parameters);
            _connection = [_device connect:parameters delegate:self];
            [_connection retain];
        }


    }

    -(void)disconnect
    {
        [_connection disconnect];
        [_connection release];
        _connection = nil;

        [[NSNotificationCenter defaultCenter] postNotificationName:@"hideCallingView" object:nil];
    }

    #pragma mark -
    #pragma mark - TCConnection Delegate Methods

    -(void)connectionDidDisconnect:(TCConnection*)connection
    {
        NSLog(@"Call disconnected");

        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"4", nil] forKeys:[NSArray arrayWithObjects:@"Disconnected", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];

    }

    -(void)connection:(TCConnection*)connection didFailWithError:(NSError*)error
    {
        NSLog(@"Failed %@",[error description]);
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"3", nil] forKeys:[NSArray arrayWithObjects:@"Error", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];
    }

    -(void)connectionDidStartConnecting:(TCConnection*)connection
    {
        NSLog(@"Calling..");
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1", nil] forKeys:[NSArray arrayWithObjects:@"Calling", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];
    }

    -(void)connectionDidConnect:(TCConnection*)connection
    {
        NSLog(@"In call..");

        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"2", nil] forKeys:[NSArray arrayWithObjects:@"In call", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];
    }

    -(void)dealloc
    {
        [_device release];
        [_connection release];

        [super dealloc];
    }
5.>最后使用TCConnectionDelegate方法

    #pragma mark -
    #pragma mark TCDevice Capability Token

    -(NSString*)getCapabilityToken:(NSError**)error
    {
        //Creates a new capability token from the auth.php file on server
        NSString *capabilityToken = nil;

        NSString *accountSid = [[NSUserDefaults standardUserDefaults] objectForKey:@"accountSid"];
        NSString *authToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"authToken"];
        NSString *appId = [[NSUserDefaults standardUserDefaults] objectForKey:@"appId"];

        //Make the URL Connection to your server

        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.e-home.com/twillo/auth.php?accountSid=%@&authToken=%@&appSid=%@",accountSid,authToken,appId]];
        NSURLResponse *response = nil;
        NSData *data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:url]
                                             returningResponse:&response error:error];
        if (data)
        {
            NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;

            if (httpResponse.statusCode==200)
            {
                capabilityToken = [[[NSString alloc] initWithData:data
                                                         encoding:NSUTF8StringEncoding] autorelease];
            }
            else
            {
                //*error = [ConferencePhone errorFromHTTPResponse:httpResponse domain:@"CapabilityTokenDomain"];
            }
        }
        // else there is likely an error which got assigned to the incoming error pointer.

        return capabilityToken;
    }

    -(BOOL)capabilityTokenValid
    {
        //Check TCDevice's capability token to see if it is still valid
        BOOL isValid = NO;
       // NSLog(@"_device.capabilities %@",_device.capabilities);
        NSNumber *expirationTimeObject = [_device.capabilities objectForKey:@"expiration"];
        long long expirationTimeValue = [expirationTimeObject longLongValue];
        long long currentTimeValue = (long long)[[NSDate date] timeIntervalSince1970];

        if ((expirationTimeValue-currentTimeValue)>0)
            isValid = YES;

        return isValid;
    }

    #pragma mark -
    #pragma mark Device Network connect and disconnect

    -(void)connect:(NSString*)phoneNumber
    {
        // first check to see if the token we have is valid, and if not, refresh it.
        // Your own client may ask the user to re-authenticate to obtain a new token depending on
        // your security requirements.

        HelloMonkeyAppDelegate *appDelegate=(HelloMonkeyAppDelegate*)[[UIApplication sharedApplication]delegate];

        if (![self capabilityTokenValid] || (!appDelegate.isTokenGet))
        {
            //Capability token is not valid, so create a new one and update device
            [self login];
        }



        if (![self reachabiltyCheck])
        {
            NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"5", nil] forKeys:[NSArray arrayWithObjects:CPLoginDidFailWithError, nil]];
            [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];

            HelloMonkeyAppDelegate *appDelegate=(HelloMonkeyAppDelegate*)[[UIApplication sharedApplication]delegate];
            appDelegate.isTokenGet=FALSE;
        }
        else
        {
            NSDictionary* parameters = nil;
            if ( [phoneNumber length] > 0 )
            {
                parameters = [NSDictionary dictionaryWithObject:phoneNumber forKey:@"PhoneNumber"];
            }

            NSLog(@"parameters ===%@",parameters);
            _connection = [_device connect:parameters delegate:self];
            [_connection retain];
        }


    }

    -(void)disconnect
    {
        [_connection disconnect];
        [_connection release];
        _connection = nil;

        [[NSNotificationCenter defaultCenter] postNotificationName:@"hideCallingView" object:nil];
    }

    #pragma mark -
    #pragma mark - TCConnection Delegate Methods

    -(void)connectionDidDisconnect:(TCConnection*)connection
    {
        NSLog(@"Call disconnected");

        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"4", nil] forKeys:[NSArray arrayWithObjects:@"Disconnected", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];

    }

    -(void)connection:(TCConnection*)connection didFailWithError:(NSError*)error
    {
        NSLog(@"Failed %@",[error description]);
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"3", nil] forKeys:[NSArray arrayWithObjects:@"Error", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];
    }

    -(void)connectionDidStartConnecting:(TCConnection*)connection
    {
        NSLog(@"Calling..");
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"1", nil] forKeys:[NSArray arrayWithObjects:@"Calling", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];
    }

    -(void)connectionDidConnect:(TCConnection*)connection
    {
        NSLog(@"In call..");

        NSDictionary *dict = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:@"2", nil] forKeys:[NSArray arrayWithObjects:@"In call", nil]];
        [[NSNotificationCenter defaultCenter] postNotificationName:@"showCallingStatusView" object:nil userInfo:dict];
    }

    -(void)dealloc
    {
        [_device release];
        [_connection release];

        [super dealloc];
    }

我希望它能帮助你。如果您获取任何问题,请告诉我。

我的ios应用程序项目也使用了twilio Api。它工作正常。.您是否能够使用twilio提供的HelloMonkey示例?由于我们必须拨打的电话号码是twilio生成的号码或其他任何电话,因此未调用连接委托方法号码。