我们在第一部分的文章中详细讲解了创建一个通知中心插件的整体过程。我们成功的在通知中心里面显示了新闻列表。但是截止到目前,我们还不能从通知中心的列表中查看新闻的详细内容。在这次的教程中,我们就以上次的教程为基础,继续将我们的通知中心插件的功能改进完善。如果您没有看过第一部分的教程,就请先参看教程的 第一部分

新闻阅读界面

我们在上一篇教程中,已经完成了通知中心插件的新闻列表显示,但是我们点击这个新闻列表中的新闻条目,是没有任何反应的。所以我们在这里需要一个详细页面来显示这个新闻列表。

回到我们的 主应用中,进入 ViewController.swift 类:

import Foundation
import UIKit class ViewController: UIViewController { var webView:UIWebView? var newsUrl:String? override func viewDidLoad() { self.webView = UIWebView(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height))
self.view.addSubview(self.webView!) if(newsUrl != nil){ self.webView?.loadRequest(NSURLRequest(URL: NSURL(string: newsUrl!)!)) } } }

这个控制器中,我们创建了一个 UIWebView ,用来显示新闻的内容页面,并加载显示出来。

有了显示视图,我们下一步就要考虑如何从通知中心里面打开这个视图了。

首先我们需要为我们的 App 注册一个 OpenURL,如果你对 OpenURL 陌生的话,可以查看这篇介绍 http://appurl.org/docs/ios

进入应用设置的 Info 选项中,在里面找打 URL Types 这一项 然后点击下面的加号:

我们按照下图中所示的内容,填写好相关的信息:

我们这里的OpenURL的名称叫做 newsapp。

我们设置好这些信息后,就可以安装我们的 app 了。安装好之后,我们在手机端的 Safari 浏览器中输入这个地址:

newsapp://

然后点击确认按钮,你就会发现,系统会识别这个URL类型,并且跳转到我们的 App 中。

跳转到->

这样我们的 OpenURL 跳转流程就完成了。大家可能会发现了,跳转到我们的 app 之后,显示的是一个空白界面。

这是因为我们还没有将新闻的URL地址传递进来。这也是我们接下来要做的。

向 OpenURL 传递参数

我们在刚才,成功的从 Safari 浏览器中通过 OpenURL 跳转到我们的 App 中。那么接下来我们需要将这个跳转操作转移到我们的应用扩展中。

大家如果之前熟悉 App 开发的话,肯定会想到用这个方法来处理 OpenURL:

UIApplication.sharedApplication().openURL("url")

这是 iOS 原生为我们提供的处理 OpenURL 的方法。但在 Extension 中我们不能使用它。而是用一个叫做 extensionContext 的属性来处理 OpenURL相关的操作。每一个 Extension 的控制器,都会有这样一个属性 self.extensionContext ,我们使用它来进行 OpenURL 相关的操作。

回到我们 Extension 中的 TodayViewController.swift 中,我们在 tableView:didSelectRowAtIndexPath 方法中加入如下的代码:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        tableView.deselectRowAtIndexPath(indexPath, animated: false)
self.extensionContext?.openURL(NSURL(string: "newsapp://")!, completionHandler: nil) }

这样,我们在每次在通知中心点击新闻列表的条目后,就会打开我们的主应用。

这个流程就基本完成啦,我们只差最后一部啦。就是我们现在打开的主应用依然是一个空白界面。这是因为我们没有把新闻的URL传递进来。这就是我们接下来要做的工作了。

要传递 OpenURL 的参数,我们只需要对上面的openURL调用方法稍加修改:

        var urlString:NSString = NSString(format: "newsapp://?link=%@",link!.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!)
self.extensionContext?.openURL(NSURL(string: urlString)!, completionHandler: nil)

我们看到,为OpenURL 传递参数的过程,和URL参数的方式基本一样,我们指定了一个参数名为 link 的 URL 参数,将我们的新闻的URL地址作为这个参数的值,并对他用stringByAddingPercentEscapesUsingEncoding方法进行URL编码,然后传递给我们的主应用。

现在参数的传递过程就完成了。接下来我们要在我们的主应用中接收这个参数,并用打开它传递进来的URL地址。

现在回到我们主应用的 ViewController.swift 文件中,添加一个 reloadUrl(url:String) 方法:

    func reloadUrl(url:String){

        self.webView?.loadRequest(NSURLRequest(URL: NSURL(string: url)!))

    }

这个方法用于刷新 UIWebView 的内容,通过传递进来的 URL 参数来刷新。

最后我们来到具体处理 OpenURL 的地方 AppDelegate.swift 中,我们要添加一个方法 application(application: UIApplication, handleOpenURL url: NSURL) -> Bool , 这个方法用来接收传递进来的 OpenURL

    func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool {

        var link:String?
if(url.query!.hasPrefix("link=")){ link = url.query?.stringByReplacingOccurrencesOfString("link=", withString: "", options: nil, range: nil)
link = link?.stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding) } (window?.rootViewController as ViewController).reloadUrl(link!) return true

我们看到,这个方法的 url 参数,它就是用来接收我们从 Extension 中传递进来的 OpenURL 的。我们这个方法里用了比较简单的字符串操作来取出这个参数(在实际的开发中应该需要更加完善的方式来完成),首先我们用 if(url.query!.hasPrefix("link=")) 来判断 link 参数是否存在。然后将这个参数名从字符串中删除掉 url.query?.stringByReplacingOccurrencesOfString("link=", withString: "", options: nil, range: nil),这样删除后的字符串就是我们传递进来的新闻URL地址了。由于这个URL地址是进行过 URL编码的,所以我们还需要用 stringByReplacingPercentEscapesUsingEncoding 方法将它转换回来。

得到了新闻的 URL 之后,我们就可以用这个 URL 来刷新 UIWebView 的显示了,这就用到了我们刚才创建的 reloadUrl 方法:

(window?.rootViewController as ViewController).reloadUrl(link!)

最后调用 return true 来告诉系统我们自己已经处理了这个 OpenURL 的响应了。

大功告成,现在我们可以运行我们的项目了。 成功运行后我们点击通知中心任意一个新闻条目,就会跳转到我们的主应用,并且加载出相应的页面了:

是不是可以庆祝一下啦

使用 Swift 制作一个新闻通知中心插件(2)的更多相关文章

  1. Swift 制作一个新闻通知中心插件1

    使用 Swift 制作一个新闻通知中心插件(1) 随着 iOS 8 的发布,苹果为开发者们开放了很多新的 API,而在这些开放的接口中 通知中心插件 无疑是最显眼的一个.通知中心就不用过多介绍了,相信 ...

  2. 使用 Swift 制作一个新闻通知中心插件(1)

    input[type="date"].form-control,.input-group-sm>input[type="date"].input-grou ...

  3. 手把手制作一个简单的IDEA插件(环境搭建Demo篇)

    新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...

  4. 制作一个简洁的jquery插件

    原文:http://mp.weixin.qq.com/s?__biz=MzAxMzgwNDU3Mg==&mid=401571467&idx=1&sn=08cb00963e6ef ...

  5. Swift - 制作一个在线流媒体音乐播放器(使用StreamingKit库)

    在之前的文章中,我介绍了如何使用 AVPlayer 制作一个简单的音乐播放器(点击查看1.点击查看2).虽然这个播放器也可以播放网络音频,但其实际上是将音频文件下载到本地后再播放的. 本文演示如何使用 ...

  6. Swift - 制作一个录音机(声音的录制与播放)

    1,技术介绍 (1)AVFoundation.framework框架提供了AVAudioRecorder类.它可以实现录音功能. (2)而使用该框架的AVAudioPlayer类,可以实现声音的播放. ...

  7. 用 Swift 制作一个漂亮的汉堡按钮过渡动画

    汉堡按钮在界面设计中已经是老生常谈了,但是当我在dribbble看到这个漂亮的过渡动画时,我决定试试用代码实现它.   这是 CreativeDash team 的原型图: 你可能已经注意到了,汉堡顶 ...

  8. 【前端】制作一个handlebars的jQuery插件

    (function($) { var compiled = {}; $.fn.handlebars = function($srcNode, data) { // 取出模版内容 var src = $ ...

  9. ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能

    本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...

随机推荐

  1. 农村的“无为教育” (FW)

    农村的“无为教育” 发布时间:2009年11月5日 11时33分 “以孩子影响孩子”,准确地说,是以偏远乡村贫困家庭的进取孩子,影响城市有相当收入的“问题孩子”.有两点值得注意,一是农村孩子影响城市孩 ...

  2. 操作系统学习笔记 对称多处理(SMP)

    SMP:一种通过复用处理器提高程序执行并行性的方式. 根据SMP,计算机系统可以分为以下四类: 单指令单数据流(SISD):一个单处理器执行一个单指令流,对保存在一个存储器中的数据进程进行操作. 单指 ...

  3. Aster及其它遥感数据下载地址

    免费下载TM,ETM的网址,速度还行,本人下载过, http://glcfapp.umiacs.umd.edu 还有一个是下载其他数据的,也可以去看看免费下载·遥感数据http://daac.gsfc ...

  4. 【MySQL】MySQL事务回滚脚本

    MySQL自己的 mysqlbinlog | mysql 回滚不好用,自己写个简单脚本试试: 想法是用mysqlbinlog把需要回滚的事务区域从mysql-bin.file中找到,然后通过脚本再插入 ...

  5. 在centos上安装mysql5.7的三种方法

    带OS信息的是已编译的二进制文件,不带OS信息的是源码包 mysql-5.7.14-linux-glibc2.5-x86_64.tar.gz 二进制包 mysql-5.5.51.tar.gz 源码包 ...

  6. C# 反射操作方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  7. SQL2005中使用identity_insert向自动增量字段中写入内

    摘自: http://www.aspbc.com/tech/showtech.asp?id=1117 SQL2005以前的数据库是不允许向自动增量字段中写入内容的,ACCESS也不行,但在SQL200 ...

  8. Oracle 11g 客户端 下载地址

    摘自: http://blog.csdn.net/davidhsing/article/details/8271845 Oracle Database Instant Client 11g 11.2. ...

  9. 浅谈JavaScript的事件响应

    原文出处: Christian Heilmann   译文出处:Chajn Science 每当猴子们问我JavaScript和DOM里啥东西最牛逼时,我都会一巴掌打回去:卧槽还用问么当然是事件响应了 ...

  10. 003Linux网络配置

    基于VMware中的Linux系统: 1.VMware提供了三种网络工作模式: (1)bridged(桥接模式) 桥接模式,顾名思义,得有桥,谁充当桥呢?当然是主机,安装了虚拟机的主机,充当的是虚拟机 ...