iOS开发日记-Widget控件的简单使用

什么是Widget?就是下面这个。


系统控件栏

软件的3DTouch显示

嗯,确认过截图,是个花里胡哨的功能,怎么用?
一步一步来。

一、在项目中先创建一个Widget。
1.项目中新建一个Target。


新建Target

2.选择Today Extens。


iOS开发日记-Widget控件的简单使用_第1张图片
选择Today Extension

3.起个名字创建完毕。
iOS开发日记-Widget控件的简单使用_第2张图片
创建好的目录

二、Widget部分
1.可以使用两种方式进行Widget的展示部分布局。
1.1 在MainInterface.storyboard中有相应的xib布局,可以直接进行界面布局。


iOS开发日记-Widget控件的简单使用_第3张图片
直接进行布局

1.2 如果想要使用纯代码进行布局,要修改Target对应的info.plist中的NSExtensionPointIdentifier,对应的值改为$(PRODUCT_NAME).TodayViewController。


iOS开发日记-Widget控件的简单使用_第4张图片
修改这里

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。


iOS开发日记-Widget控件的简单使用_第5张图片
设置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。


iOS开发日记-Widget控件的简单使用_第6张图片
创建Group

2.在Xcode中将APP和Widget加入同一个Group。


iOS开发日记-Widget控件的简单使用_第7张图片
Xcode

3.在URL Types中加入identity
iOS开发日记-Widget控件的简单使用_第8张图片
与在开发者后台创建的保持一致

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)
}    

五、没什么写的了,那就这样吧!

你可能感兴趣的:(iOS开发日记-Widget控件的简单使用)