什么是Widget?就是下面这个。
嗯,确认过截图,是个花里胡哨的功能,怎么用?
一步一步来。
一、在项目中先创建一个Widget。
1.项目中新建一个Target。
2.选择Today Extens。
3.起个名字创建完毕。
二、Widget部分
1.可以使用两种方式进行Widget的展示部分布局。
1.1 在MainInterface.storyboard中有相应的xib布局,可以直接进行界面布局。
1.2 如果想要使用纯代码进行布局,要修改Target对应的info.plist中的NSExtensionPointIdentifier,对应的值改为$(PRODUCT_NAME).TodayViewController。
2.在对应的点击方法中实现打开APP的操作,并可以带着相关参数。
@IBAction func oneAction(_ sender: UIButton) {
//chartDemo为原项目中设置的URL Schemes
let url : URL = URL.init(string: "chartDemo://open")!
self.extensionContext?.open(url, completionHandler: {(isSucces) in
print(isSucces);
})
}
三、原项目部分
使用Widget进行操作后,会通过URL Schemes的唤起APP,我们需要做的有两点。
1.给APP一个URL Schemes。
2.在AppDelegate中相应并处理相关回调。
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
if url.absoluteString.hasPrefix("chartDemo") {
let alertController = UIAlertController.init(title: "测试", message: "成功", preferredStyle: .alert);
let cancelAction = UIAlertAction.init(title: "取消", style: .cancel, handler: nil);
alertController.addAction(cancelAction);
UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil);
}
return true;
}
四、数据共享
Widget和APP都做好了,运行之后展示也是可以了,但是Widget在系统看来相当于一个单独的APP,所以如何让我们的APP和Widget的数据能够传输呢?
把它俩拉个群聊嘛!
这里就用到了,Group。
1.在开发者后台创立一个Group。
2.在Xcode中将APP和Widget加入同一个Group。
3.在URL Types中加入identity
4.下面就可以进行数据共享了,有两种方式。
4.1 userdefault suite
//App写入数据
let userDefault = UserDefaults.init(suiteName: "group.com.chunqi.widgetDemo")
userDefault?.set(textField.text, forKey: "widgetString")
userDefault?.synchronize()
//Widget读取数据
self.actionLabel.text = UserDefaults.init(suiteName: "group.com.chunqi.widgetDemo")?.object(forKey: "widgetString") as! String?
4.2 filemanager
//App写入数据
var url : URL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.chunqi.widgetDemo")!
url = url.appendingPathComponent("Library/Caches/widget", isDirectory: true)
let str : String? = self.textField.text
do{
_ = try str?.write(to: url, atomically: true, encoding: String.Encoding.utf8)
} catch let error {
print(error)
}
//Widget读取数据
var url = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.chunqi.widgetDemo")
url = url?.appendingPathComponent("Library/Caches/widget", isDirectory: true)
var str = ""
do {
str = try String.init(contentsOf: url!, encoding: String.Encoding.utf8)
} catch let error {
print(error)
}
五、没什么写的了,那就这样吧!