具体功能包括:
• 支持聊天对话、智能问答
• 拥有笑话、天气、公交等丰富功能
• 支持自然语言处理及语义理解
• 数十亿知识库数据,应有尽有
源码下载:
源码已经传到Git上了, 欢迎下载学习。
下载链接: https://github.com/colin1994/tulingIOS
源码解析:
一、仿微信界面
这个小demo的界面是仿微信的。只不过是简化版的, 包括表情, 语音什么的, 都省略了。
对于界面这一块, 我这里不多做介绍, 因为这并不是本教程主要内容。毕竟, 这个界面到自己实际项目中的时候, 肯定是需要自定义的。
这里简要介绍一下。
该界面分成两部分:
1. UITableView: 显示聊天列表, 其中, 左边的是机器人回答, 右边是自己的提问。
另外, 列表的每个cell, 由头像和文字组成。 这个cell是自定义的, 详细可以自己查看源码。
列表添加:
[objc] view plaincopy 1. //add UItableView 2. self.tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 44, self.view.frame.size.width, self.view.frame.size.height-88) style:UITableViewStylePlain]; 3. [self.tableView registerClass:[ChartCell class] forCellReuseIdentifier:cellIdentifier]; 4. self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone; 5. self.tableView.allowsSelection = NO; 6. self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"chat_bg_default.jpg"]]; 7. self.tableView.dataSource=self; 8. self.tableView.delegate=self; 9. [self.view addSubview:self.tableView];
2. KeyBordVIew: 自定义的UIView, 用来显示自定义的键盘视图。
键盘添加:
[objc] view plaincopy 1. //add keyBorad 2. self.keyBordView=[[KeyBordVIew alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height-44, self.view.frame.size.width, 44)]; 3. self.keyBordView.delegate=self; 4. [self.view addSubview:self.keyBordView];
另外, 键盘涉及弹出和收起操作操作, 这个需要在视图载入之前, 注册通知, 响应相关操作。
1.注册通知
[objc] view plaincopy 1. //注册通知, 键盘收起, 弹出 2. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil]; 3. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil];
2.响应操作
[objc] view plaincopy 1. //键盘弹出响应 2. -(void)keyboardShow:(NSNotification *)note 3. { 4. CGRect keyBoardRect=[note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 5. CGFloat deltaY=keyBoardRect.size.height; 6. 7. [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{ 8. 9. self.view.transform=CGAffineTransformMakeTranslation(0, -deltaY); 10. }]; 11. } 12. 13. //键盘收起响应 14. -(void)keyboardHide:(NSNotification *)note 15. { 16. [UIView animateWithDuration:[note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue] animations:^{ 17. self.view.transform = CGAffineTransformIdentity; 18. }]; 19. }
二、图灵key获取
用过一些第三方API的都知道, 通常我需要先注册成为它的用户, 才能获取对应的key, 以便调用API。
图灵也不例外, 你需要先注册成为图灵用户, 然后有相关教程, 教你如何获取自己的key, 以及正确的URL。这里就不重复了。
三、图灵API的使用
这里使用了第三方网络请求库ASI 和 json格式数据解析库 JsonKit。
在导入ASI的时候, 如果你的项目是ARC, 那么, 请将对应的文件设置成支持ARC即可。 (-fno-objc-arc)
另外, 要导入一些框架
SystemConfiguration.framework
MobileCoreServices.framework
CFNetwork.framework
libz.dylib
接着就能利用ASI调用图灵API,再利用jsonkit解析返回的数据了。
具体实现如下:
1. //每当编辑完问题后 2. //1. 显示自己的问题 messageType=1 3. //2. 调用API,返回结果 4. -(void)KeyBordView:(KeyBordVIew *)keyBoardView textFiledReturn:(UITextField *)textFiled 5. { 6. 7. //显示自己的问题 8. ChartCellFrame *cellFrame=[[ChartCellFrame alloc]init]; 9. ChartMessage *chartMessage=[[ChartMessage alloc]init]; 10. 11. chartMessage.icon=@"icon01.png"; 12. chartMessage.messageType=1; 13. chartMessage.content=textFiled.text; 14. cellFrame.chartMessage=chartMessage; 15. 16. [self.cellFrames addObject:cellFrame]; 17. [self.tableView reloadData]; 18. 19. //滚动到当前行 20. [self tableViewScrollCurrentIndexPath]; 21. 22. //利用用户问题, 查询结果 23. 24. //API请求格式。 具体格式见图灵官网 25. //6c2cfaf7a7f088e843b550b0c5b89c26 替换成你申请的key即可 26. NSString* urlString = [NSString stringWithFormat:@"http://www.tuling123.com/openapi/api?key=6c2cfaf7a7f088e843b550b0c5b89c26&&info=%@", textFiled.text]; 27. 28. //NSUTF8StringEncoding编码。 避免中文错误 29. urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 30. //调用API 31. NSURL *url = [NSURL URLWithString:urlString]; 32. testRequest = [ASIHTTPRequest requestWithURL:url]; 33. [testRequest setDelegate:self]; 34. [testRequest startAsynchronous]; 35. 36. textFiled.text=@""; 37. myTextField = textFiled; 38. } 39. 40. #pragma mark - 返回机器人回答 41. //调用API完毕, 返回图灵回答结果 42. //1. 收起键盘 43. //2. 显示回答内容 44. - (void)requestFinished:(ASIHTTPRequest *)request 45. { 46. 47. //收起键盘 48. [myTextField resignFirstResponder]; 49. 50. // 当以文本形式读取返回内容时用这个方法 51. // 解析返回的json数据 52. NSString *responseString = [request responseString]; 53. self.testDic = [responseString objectFromJSONString]; 54. self.testArr = [testDic objectForKey:@"text"]; 55. 56. 57. //显示回答内容 58. ChartCellFrame *cellFrame=[[ChartCellFrame alloc]init]; 59. ChartMessage *chartMessage=[[ChartMessage alloc]init]; 60. 61. chartMessage.icon=@"icon02.png"; 62. chartMessage.messageType=0; 63. chartMessage.content=[NSString stringWithFormat:@"%@", self.testArr]; 64. cellFrame.chartMessage=chartMessage; 65. 66. [self.cellFrames addObject:cellFrame]; 67. [self.tableView reloadData]; 68. 69. //滚动到当前行 70. [self tableViewScrollCurrentIndexPath]; 71. 72. } 73. 74. // API请求失败 75. - (void)requestFailed:(ASIHTTPRequest *)request 76. { 77. NSError *error = [request error]; 78. NSLog(@"error --- %@",error); 79. 80. UIAlertView *alert_ = [[UIAlertView alloc]initWithTitle:@"提示" message:@"无网络可用,请检查网络状态" delegate:self cancelButtonTitle:@"知道了" otherButtonTitles: nil nil]; 81. [alert_ show]; 82. }