iPhone桌面快捷电话的实现原理

众所周知,Safari有一个“添加至主屏幕”的功能,其实就是在桌面添加了一个网页书签,本文讲述的是如何利用此功能实现桌面快捷电话。

 

一,主要用到的技术知识有以下几个(当然iPhone程序开发技能自然不可少)

1. JavaScript

2. Data URI Schema

3. Socket基本知识

4. Base64编码

 

二,基本原理

 程序内部创建一个简单的Web站点,通过这个站点调用Safari,站点将自定义的Html页面返回给Safari,此时利用Safari的“添加至主屏幕”功能,将自定义的Html制作成桌面书签,当用户点击桌面图标时,则运行自定义的Javascript脚本拨打电话。

 

三,实现方法

1. 创建一个简易的Web站点,代码如下:

- (void) startServer { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int socketfd; socklen_t length; static struct sockaddr_in cli_addr; static struct sockaddr_in serv_addr; // Set up socket if((listenfd = socket(AF_INET, SOCK_STREAM,0)) <0) { isServing = NO; return; } // Serve to a random port serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = 0; // Bind if(bind(listenfd, (struct sockaddr *)&serv_addr,sizeof(serv_addr)) <0) { isServing = NO; return; } // Find out what port number was chosen. int namelen = sizeof(serv_addr); if (getsockname(listenfd, (struct sockaddr *)&serv_addr, (void *) &namelen) < 0) { close(listenfd); isServing = NO; return; } chosenPort = ntohs(serv_addr.sin_port); // Listen if(listen(listenfd, 64) < 0) { isServing = NO; return; } // Respond to requests until the service shuts down while (isServing) { length = sizeof(cli_addr); if((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0) { isServing = NO; return; } [self handleWebRequest:[NSNumber numberWithInt:socketfd]]; } [pool release]; } - (void) handleWebRequest:(NSNumber *)fdNum { int fd = [fdNum intValue]; NSLog(@"handleWebRequest: %@", fdNum); }  

 

2. 制作Html页面模板,代码如下,请注意代码中$XXX$标识串,主要在程序中将其替换成实际内容

$TITLE$

 

 

3. 程序调用Safari

  (1) 使用[[UIApplication sharedApplication]openURL:]方法,url地址为自定义的web站点,如http://localhost:端口号。

      (2) 在Web站点中的handleWebRequest方法中,将自定义的html内容发送给safari

 

 

4. 程序在info.plist中注册自定义schema,此处主要解决浏览器拨打时会弹出确认对话框,所以先打开我们的程序,通过程序去拨打电话,代码如下:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if ([[url scheme] isEqualToString:@"quickdial"]) { NSString *hostName = [url host]; if ([hostName isEqualToString:@"tel"]) { NSString *phoneNo = [url query]; [[UIApplication sharedApplication]openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", phoneNo]]]; } } return NO; } 

 

 

 

你可能感兴趣的:(iphone开发)