跳到主要内容

4 篇博文 含有标签「微微」

查看所有标签

· 阅读需 4 分钟
q-org

什么使微微成为PWA?

信息

微微 采用构建 Web 应用的新理念。

Web应用更加易于发现:相比于安装应用,访问一个网站显然更加容易和迅速。还可以通过链接来分享 Web 应用。

原生应用 与操作系统可以更加完美的整合,也因此为用户提供了无缝的用户体验。你可以通过安装应用使得它在离线的状态下也可以运行;相较于使用浏览器访问,用户也更喜欢通过点击主页上的图标来访问它们喜爱的应用。

信息

微微 同时拥有以上两种应用优势的能力。

设计原则

  • 响应式(Responsive), 在任何具有屏幕和浏览器的设备上可以正常使用——包括电脑、手机、笔记本、平板、投影仪等。

  • 可发现(Discoverable), 可以通过搜索引擎发现。

  • 可安装(Installable), 可以出现在设备的主屏幕。

  • 可链接(Linkable), 可以简单地通过 URL 分享。

  • 独立于网络(Network independent), 可以在离线状态或者是在网速很差的情况下运行。

  • 渐进式(Progressive), 在老版本的浏览器仍旧可以使用,在新版本的浏览器上可以使用全部功能。

  • 可重入(Re-engageable), 无论何时有新的内容,都可以发送通知。

  • 安全(Safe), 在用户、应用和服务器之间的连接是安全的,第三方无法访问你的敏感数据。

这么做值得吗?

当然值得!只需要相对较小的代价就可以实现 PWA 的核心特性,而优势却是巨大的。

例如:

  • 减少应用安装后的加载时间,通过 Service Workers 来进行缓存,以此来节省带宽和时间。
  • 当应用有可用的更新时,可以只更新发生改变的那部分内容。相比之下,对于一个原生应用而言,即便是最微小的改动也需要强制用户去再次下载整个应用。
  • 外观和使用感受与原生平台更加融为一体——应用图标被放置在主屏幕上,应用可以全屏运行等。
  • 凭借系统通知和推送消息与用户保持连接,对用户产生更多的吸引力,并且提高转换效率。

欢迎关注我的公众号“Doocs”,原创技术文章第一时间推送。

· 阅读需 7 分钟
q-org

可重用

信息

通过通知推送提高微微 的可重用。

以本地缓存实现离线应用是一个强大的特性。允许用户在主屏幕上安装 Web 应用程序则显得更了不起。但除了单纯依赖用户手动打开应用之外,我们还可以走得更远,利用通知和消息推送提高用户参与度,并且随时提供新的内容。

两个API一个目标

推送 API和通知 API是两个相互独立的 API,但在提高用户参与度这件事上,它们可以配合得很好。推送 API 可以用来从服务端推送新的内容而无需客户端介入,它是由应用的 Service Worker 来实现的;通知功能则可以通过 Service Worker 来向用户展示一些新信息,或者至少提醒用户应用已经更新了某些功能。

跟 Service Worker 一样,这些工作是在浏览器外部实现的,所以即使应用被隐藏到后台甚至被关闭了,我们仍然能够推送更新或者通知给用户。

通知

让我们先从通知 API 开始,它能够脱离推送 API 单独工作,但两者结合起来会非常的有用,我们先看看它单独能做什么。

请求授权

为了能够显示通知,我们需要先请求用户的授权。最佳的实践经验告诉我们,不应该直接请求授权,而应该引导用户点击一个按钮,然后才弹出授权窗口:

var button = document.getElementById("notifications");
button.addEventListener('click', function(e) {
Notification.requestPermission().then(function(result) {
if(result === 'granted') {
randomNotification();
}
});
});
提示

通过系统的通知服务显示一个授权窗口:

当用户确定接收通知,应用就可以获得推送通知的功能。用户的授权的结果有三种,default(默认)、granted(允许)或者 denied(拒绝),当用户没有做出选择的时候,授权结果会返回 default,另外两种结果分别在用户选择了允许或者拒绝的时候返回。

创建一个通知

我们的示例应用通过可用的数据来创建通知。随机选择一个游戏数据来填充通知的主体:用游戏的名称来作为通知的标题,通知的主体会提及游戏的作者,用游戏的图片来作为通知的图标:

function randomNotification() {
var randomItem = Math.floor(Math.random()*games.length);
var notifTitle = games[randomItem].name;
var notifBody = 'Created by '+games[randomItem].author+'.';
var notifImg = 'data/img/'+games[randomItem].slug+'.jpg';
var options = {
body: notifBody,
icon: notifImg
}
var notif = new Notification(notifTitle, options);
setTimeout(randomNotification, 30000);
}
提示

通过系统的通知服务显示一个授权窗口:

上述代码每隔三十秒会创建一个通知,直到用户觉得通知有点烦人并手动关闭掉它为止。一个真正的 App,对通知的频率必须进行严格的控制,通知内容也要更加有用才行。通知 API 的优势在于它使用了操作系统的通知功能,这意味着即使用户当前并没有在使用我们的应用,我们的通知也能够展示,它看起来跟一个原生应用发出的通知差不多。

推送

推送比通知要复杂一些,我们需要从服务端订阅一个服务,之后服务端会推送数据到客户端应用。应用的 Service Worker 将会接收到从服务端推送的数据,这些数据可以用来做通知推送,或者实现其他的需求。

这个技术还处在非常初级的阶段,一些可用示例使用了谷歌云的消息推送平台,但它们正在被重写以支持 VAPID (Voluntary Application Identification),它能为您的应用提供一层额外的安全防护。您可以看一下 Service Workers Cookbook 里的一些例子,尝试用 Firebase 配置一个消息推送服务,或者构建自己的推送服务(例如使用 Node.js)。

之前提到,为了接收到推送的消息,您需要有一个 Service Worker,这部分的基础知识我们已经在文章通过 Service workers 让 PWA 离线工作 (en-US)里面解释过。在 Service Worker 内部,存在一个消息推送服务订阅机制。

registration.pushManager.getSubscription() .then( /* ... */ );

App 会从服务器请求一个公钥并且把响应结果转化成文本,最后它还需要转化成一个 Uint8Array(为了兼容 Chrome)。如果你想学习更多关于 VAPID 的内容可以阅读 Sending VAPID identified WebPush Notifications via Mozilla’s Push Service 这篇文章。

App 现在可以使用 PushManager 来订阅新用户。这个方法支持传递两个参数:

  • userVisibleOnly:true,意思是发送给用户的所有通知对他们都是可见的,
  • applicationServerKey,这个参数包含我们之前从服务端取得并转化的 VAPID key。

· 阅读需 3 分钟
q-org

This is the summary of a very long blog post,

Use a <!-- truncate --> comment to limit blog post size in the list view.

· 阅读需 1 分钟
q-org

Docusaurus blogging features are powered by the blog plugin.

Simply add Markdown files (or folders) to the blog directory.

Regular blog authors can be added to authors.yml.

The blog post date can be extracted from filenames, such as:

  • 2019-05-30-welcome.md
  • 2019-05-30-welcome/index.md

A blog post folder can be convenient to co-locate blog post images:

Docusaurus Plushie

The blog supports tags as well!

And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.