iOS开发 如何创建快捷方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发 如何创建快捷方式相关的知识,希望对你有一定的参考价值。
做的app中需要把某个功能拉出来作为一个快捷方式创建在桌面
点击创建的快捷方式后执行某个功能
一、运用基本技术点
javascript
Data URI Schema
Socket基本知识
Base64编码
二、基本原理
程序内部创建一个简单的Web站点,通过这个站点调用Safari,站点将自定义的html页面返回给Safari,此时利用Safari的“添加至主屏幕”功能,将自定义的Html制作成桌面书签,当用户点击桌面图标时,则运行自定义的Javascript来进行跳转至App。
三、什么是 data URI scheme?
假设你有以下的图像:
A .png
把它在网页上显示出来的标准方法是:
这 种取得资料的方法称为 http URI scheme ,同样的效果使用 data URI scheme 可以写成:
换句话说我们把图像档案的内容内置在 HTML 档案中,节省了一个 HTTP 请求。
网页优化的一大首要任务是减少HTTP 请求 (http request) 的次数,例如通过合并多个JS文件,合并CSS样式文件。除此之外,还有一个data URL 的密技,让我们直接把图像的内容崁入网页里面,这个密技的官方名称是 data URI schema 。
Data URI scheme 的语法
我们来分析一下这句 img 标签的语法:
它包含以下部分:
data – 取得数据的协定名称
image/png – 数据类型名称
base64 – 数据的编码方法
iVBOR…. – 编码后的数据
: , ; – data URI scheme 指定的分隔符号
四、什么是 Base64 编码?
简单地说它把一些 8-bit 数据翻译成标准 ASCII 字符,网上有很多免费的 base64 编码和解码的工具。
五、Socket基本知识
自行脑补,这里我用了ios中很棒的一个HttpServer第三方框架CocoaHttpServer。
六、实现
上面基本知识介绍完毕,下面开始撸代码。
iOS 的代码很简单,我们使用CocoaHttpServer创建一个本地的站点即可。
点击事件
- (IBAction)action:(id)sender
[DDLog addLogger:[DDTTYLogger sharedInstance]];
_httpServer = [[HTTPServer alloc] init];
[_httpServer setType:@"_http._tcp."];
NSString *webPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Web"];
DDLogInfo(@"Setting document root: %@", webPath);
[_httpServer setDocumentRoot:webPath];
[self startServer];
创建HttpServer
- (void)startServer
// Start the server (and check for problems)
NSError *error;
if([_httpServer start:&error])
DDLogInfo(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
// open the url.
NSString *urlStrWithPort = [NSString stringWithFormat:@"http://localhost:%d",[_httpServer listeningPort]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStrWithPort]];
else
DDLogError(@"Error starting HTTP Server: %@", error);
ok。核心代码来了…
创建一个index.html文件,里面内容如下:
什么意思呢?
页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面跟的是时间(单位秒),把这句话加到指定网页的里一般也用在实时性很强的应用中,需要定期刷新。
这个文件放在文件夹WEB目录下,切记这个文件在工程中是实体文件夹,folder references。
接下来我们会再创建一个content.html的文件,但是这个文件不会放在WEB文件夹内,而是转换成data URI schema 放在上面的重定向到指定网页的位置。
以下是我demo的content.html文件的内容:
相信稍微做过前端开发的同学们都看懂是什么意思了,我这里大概讲一下。
上面这那几个meta标签其实就是为了设置样式,更多详情请看苹果官方文档关于这部分的介绍。
下面这个link就是快捷方式的启动图标,这个图片是经过Base64编码的。
再下面的title就是快捷方式的名称。
接下来body标签中的超链接就是我demo的URL Schemes,通过URL Schemes来跳转进我们的App。下面的span标签用来占位,我们使用JS代码来控制它的显示内容。
这段JS代码的意思就是检测iOS WebApp是否运行在全屏模式。
iOS上的Safari浏览器可以让Web应用程序全屏显示,以取得类似本地应用的显示效果。但是这需要用户把Web应用程序的图标添加到主屏幕才可以。作为开发者,为了更好的显示效果,我们可能希望自己开发的Web应用程序在非全屏状态下运行时提示用户把Web应用程序的图标添加到主屏幕。要检测Web应用程序当前是否运行在全屏状态,只要检测window.navigator.standalone是否为true就可以了,如果这个属性为true则表示Web应用程序当前运行在全屏状态,否则运行在非全屏状态。检测到Web应用程序运行在非全屏状态时就可以提示用户把Web应用程序的图标添加到主屏幕。
最后再把content.html里的这段代码通过这个网站转换成data URI schema 放在index.html中,就完成了。追问
有没有demo给我看一下。 js这边的代码我不怎么会 企鹅273648504
参考技术A 参考如下- (id)init
if(self = [super init])
//启动本地httpSever和服务器首页页面
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = paths[0];
self.webRootDir = [documentsPath stringByAppendingPathComponent:@"web"];
BOOL isDirectory = YES;
BOOL exsit = [[NSFileManager defaultManager] fileExistsAtPath:_webRootDir isDirectory:&isDirectory];
if(!exsit)
[[NSFileManager defaultManager] createDirectoryAtPath:_webRootDir withIntermediateDirectories:YES attributes:nil error:nil];
self.mainPage = [NSString stringWithFormat:@"%@/web/index.html",documentsPath];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
_httpServer = [[HTTPServer alloc] init];
[_httpServer setType:@"_http._tcp."];
[_httpServer setDocumentRoot:_webRootDir];
NSError *error;
if([_httpServer start:&error])
DDLogInfo(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
else
DDLogError(@"Error starting HTTP Server: %@", error);
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
return self;
- (void)applicationDidEnterBackground:(UIApplication *)application
if([[UIDevice currentDevice].systemVersion integerValue] >= 6.0)
sleep(1);
else
sleep(2);
[_httpServer stop];
- (void)applicationWillEnterForeground:(UIApplication *)application
NSError *error;
if(![_httpServer isRunning])
if([_httpServer start:&error])
DDLogInfo(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
else
DDLogError(@"Error starting HTTP Server: %@", error);
- (void)createLinkWithDict:(NSDictionary *)dict desktopLinkType:(SyDesktopLinkType)linkType;
NSString *title = [dict objectForKey:deskLinkTitle];
NSString *urlScheme = [dict objectForKey:deskLinkUrlScheme];
NSString *moduleID = [dict objectForKey:deskLinkModuleTag];
NSString *imageName = [dict objectForKey:deskLinkIconName];
NSMutableString *htmlStr = [[NSMutableString alloc] init];
[htmlStr appendString:@"<html><head>"];
[htmlStr appendString:@"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"];
NSMutableString *taragerUrl = [NSMutableString stringWithFormat:@"0;url=data:text/html;charset=UTF-8,<html><head><meta content=\"yes\" name=\"apple-mobile-web-app-capable\" /><meta content=\"text/html; charset=UTF-8\" http-equiv=\"Content-Type\" /><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\" /><title>%@</title></head><body bgcolor=\"#ffffff\">",title];
NSString *htmlUrlScheme = [NSString stringWithFormat:@"<a href=\"%@",urlScheme];
NSString *dataUrlStr = nil;
if(linkType == SyDesktopLinkType_One)
dataUrlStr = [NSString stringWithFormat:@"%@=%@&%@=%@\" id=\"qbt\" style=\"display: none;\"></a>",deskLinkModuleTag,moduleID,deskLinkType,[NSString stringWithInt:linkType]];
else if (linkType == SyDesktopLinkType_Two)
//业务生成器功能
else if(linkType == SyDesktopLinkType_Three)
UIImage *image = [UIImage imageNamed:imageName];
NSData *imageData = UIImagePNGRepresentation(image);
NSString *base6ImageStr = [imageData base64Encoding];
// 转码
// dataUrlStr = [dataUrlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *imageUrlStr = [NSString stringWithFormat:@"<span id=\"msg\"></span></body><script>if (window.navigator.standalone == true) var lnk = document.getElementById(\"qbt\"); var evt = document.createEvent('MouseEvent'); evt.initMouseEvent('click'); lnk.dispatchEvent(evt);else var addObj=document.createElement(\"link\"); addObj.setAttribute('rel','apple-touch-icon-precomposed'); addObj.setAttribute('href','data:image/png;base64,%@');",base6ImageStr];
NSString *lastHtmlStr = @"document.getElementsByTagName(\"head\")[0].appendChild(addObj); document.getElementById(\"msg\").innerHTML='<div style=\"font-size:12px;\">点击页面下方的 + 或 <img id=\"i\" src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTU1NEJDMzMwQTBFMTFFM0FDQTA4REMyNUE4RkExNkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTU1NEJDMzQwQTBFMTFFM0FDQTA4REMyNUE4RkExNkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5NTU0QkMzMTBBMEUxMUUzQUNBMDhEQzI1QThGQTE2QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5NTU0QkMzMjBBMEUxMUUzQUNBMDhEQzI1QThGQTE2QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlMy2ugAAAAbUExUReXy/yaS/4nE/67W//n8/+n0/0yl/wB//////1m3cVcAAAAJdFJOU///////////AFNPeBIAAABDSURBVHjaxNA7DgAgCAPQoiLc/8T+EgV1p0ubxwb0E+xR8SBICBcyJUnEHktW0VwOykivvSaus6kA1CD0sZ+3aQIMAJIgC+S9X9jmAAAAAElFTkSuQmCC\"> 按钮,在弹出的菜单中选择[添加至主屏幕],即可将选定的功能添加到主屏幕作为快捷方式。</div>';</script></html>";
[taragerUrl appendString:htmlUrlScheme];
[taragerUrl appendString:dataUrlStr];
NSString *dataUrlEncode = [taragerUrl urlUTF8Encoded];
NSString *imageUrlEncode = [imageUrlStr urlUTF8Encoded];
NSString *lastHtmlStrEncode = [lastHtmlStr urlCFEncoded];
[htmlStr appendFormat:@"<meta http-equiv=\"REFRESH\" content=\"%@%@%@\">",dataUrlEncode,imageUrlEncode,lastHtmlStrEncode];
[htmlStr appendString:@"</head></html>"];
NSData *data = [htmlStr dataUsingEncoding:NSUTF8StringEncoding];
[data writeToFile:_mainPage atomically:YES];
NSString *urlStrWithPort = [NSString stringWithFormat:@"//127.0.0.1:%d",[_httpServer listeningPort]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlStrWithPort]];
追问
这段代码我看过了。然后你有没有demo给我发一份 企鹅273648504
如何快速制作快捷方式? [关闭]
【中文标题】如何快速制作快捷方式? [关闭]【英文标题】:How can I make shortcut in swift? [closed] 【发布时间】:2019-09-14 06:25:05 【问题描述】:我有一个按钮。点击时如何在我的 iPhone 主页上添加快捷方式???
当再次点击该图标时,应用程序将再次打开 就像 Safari 添加到主屏幕一样
【问题讨论】:
【参考方案1】:无法像 Windows
或 Anroid
那样创建快捷方式。
【讨论】:
我想在ios上创建快捷方式 @soroush 没办法。 对不起,我还有一个问题。你知道如何在 webkitview 中获取页面标题以上是关于iOS开发 如何创建快捷方式的主要内容,如果未能解决你的问题,请参考以下文章