Demo 地址:https://github.com/YUJINHAI2015/AppExtension
《今日扩展》--widget(窗口小部件)。该扩展可以将今日发生的简短消息放到消息中心“今日”里面。就是下面红框内这两个东东。我们现在来实现一下这个功能。
理解扩展:
app扩展是如何工作的,
app扩展和app是怎样的关系,
app extension (app扩展),containing app(容器应用),host app(宿主应用)
1)app extension 只是containing app功能的扩充,并不能当做一个app或者插件来对待,他只能依赖于containing app,app extension 不能单独存在,没有containing app就没有app extension 。
2)你不能上传一个空白的containing app+app extension ,会审核不过的,containing app一定要一些基础的功能。
3)containing app和app extension虽然在一起,但是他们并不是在同一个线程中运行,每个单独的app extension都会在单独的进程中。
4)每一个app extension是以二进制形式封装的,他与containing app的二进制是分开的,每一个app extension都是一个单独的Target,都有自己的Bundle ID.
5)app extension的声明周期是由 host app 决定的。
6)如图,containing app并不能和host app直接通讯,app extension相当于代理的作用。这里我们要明白一点, extension app和 host app可以直接通讯,但是extension app和containing app 却不能直接通讯,只能通过Open URL或者数据共享。
7)iOS8允许containing app 和extension app的target之间通过嵌入式框架访问同一份代码。
一、开始项目,添加Alamofire
1、新建一个项目Weather
2、切换到当前目录文件夹下面:
在命令行中输入:
git submodule add https://github.com/Alamofire/Alamofire.git
3、把Alamofire作为子项目,选中Almofire.xcodeproj拖到Weather里面:
4、然后在 build Phases 里面的 Target Dependencies 添加Almofire
5、添加一个New Copy Files Phase
6、然后重命名为Copy Frameworks ,选择Destination为Frameworks,并添加Alamofire
7、如果要移除Alamofire
在命令行中输入:
git rm -f Alamofire
rm -rf .git/modules/Alamofire
然后在项目中把报红的Alamofire文件夹删除即可。
二、做一个简单的请求天气的接口
1、搭建一个简单的界面
2、建一个全局文件Global.swif,做一下简单的网络请求,只是DEMO使用
3、在viewController中请求数据
三、添加扩展Widget
1、xcode8 在这里面添加widget,我们选择Today Extension.
添加成功后看到是这个结果
2、添加资源文件(自己去找一些icon)
我们在Assets.xcassets里面添加一些icon和一个小按钮。
这些资源是放在Weather Target里面的,Widget是无法访问的。
在Target Membership里面选中Widget选项,这时代表勾上的都可以访问Assets.xcassets里面的资源。
3、我们在WeatherWidget里面
在MainInterface.Storyboard上添加一个简单的界面
然后每个label连线,按钮添加一个点击事件refresh()
4、容器app和扩展app的界面都搭建完成了,那么他们是通过什么方式共享数据的呢?
我们现在用NSUserDefaults来存储数据,但是容器app和扩展app是两个单独的app,并不能直接去访问。苹果推出了应用程序组(App Group)只要在同一个程序组里面的app,就可以访问彼此的共享数据。
你要拥有一个开发者账号,分别在Weather和WeatherWidget的App Groups里面添加相同的Key.
5、我们在Global.swif文件中添加下面一些代码
6、把ViewController.swift文件保存方法修改一下
7、在TodayViewController.swift里面添加代码
完结!