iOS开发 如何创建快捷方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发 如何创建快捷方式相关的知识,希望对你有一定的参考价值。

做的app中需要把某个功能拉出来作为一个快捷方式创建在桌面
点击创建的快捷方式后执行某个功能

Safari有一个“添加至屏幕”的功能,其实就是在桌面上添加了一个网页书签,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】:

无法像 WindowsAnroid 那样创建快捷方式。

【讨论】:

我想在ios上创建快捷方式 @soroush 没办法。 对不起,我还有一个问题。你知道如何在 webkitview 中获取页面标题

以上是关于iOS开发 如何创建快捷方式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 js 以编程方式为 android/ios 上的网站创建桌面快捷方式?

iOS 实现桌面快捷方式-快速打开App功能页

如何在Mac上创建桌面快捷方式

如何快速制作快捷方式? [关闭]

桌面快捷方式如何创建 如何创建桌面快捷方式

如何在 WIX 中为所有用户创建桌面快捷方式