美文网首页iOSiOS-swift小斑
swift widget 简单使用

swift widget 简单使用

作者: 等这姑娘老在我心里 | 来源:发表于2016-11-17 16:47 被阅读620次

1.先创建一个extension

new a target.png todayExtension.png

创建后多出来一个文件夹 widget

结构图.png

2.给APP 添加一个 URL schemes 用来唤醒

Paste_Image.png

3.上代码 在widgetcontroller里面写好UI

跳转到app逻辑


    func openButtonPressed() -> Void {
        let url : URL = URL.init(string: "widgetDemo://open")!
        self.extensionContext?.open(url, completionHandler: {(isSucces) in
            print("点击了open按钮,来唤醒APP,是否成功 : \(isSucces)")
        })
        
    }

widget 折叠逻辑


    override func viewDidLoad() {
        super.viewDidLoad()
        if ProcessInfo().isOperatingSystemAtLeast(OperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0)) {
            //在ios10 中支持折叠
            self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.expanded
        }
        
        self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 100)
    
        self.actionButton.addTarget(self, action: #selector(openButtonPressed), for: UIControlEvents.touchUpInside)
    }



    //折叠change size
    func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
        print("maxWidth %f maxHeight %f",maxSize.width,maxSize.height)
        
        if activeDisplayMode == NCWidgetDisplayMode.compact {
            self.preferredContentSize = CGSize(width:maxSize.width,height: 110);
        }else{
            self.preferredContentSize = CGSize(width: maxSize.width,height: 200);
        }

    }

4.在Appdelegate 中写好接收widget 的操作


    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.absoluteString.hasPrefix("WidgetDemo") {
            let alert = UIAlertController.init(title: "Tip", message: "点击了open按钮", preferredStyle: UIAlertControllerStyle.alert)
            let tureAction = UIAlertAction.init(title: "Yes", style: UIAlertActionStyle.cancel, handler: { (cancle  ) in
                
            })
            alert.addAction(tureAction)
            UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated:true, completion: {
                
            })
            
        }
        return true
    }

5.数据共享

在ios 看来widget 就是一个单独的APP 所以按照它的沙盒机智用普通的open class var standard: UserDefaults { get } 是行不通的

要把两个APP 加入到一个group中

创建一个group 在开发者账号中

创建group.png

在X code中 把APP和widget 加入到一个group中

注意在development 账户中创建了group后 这里会自动出现 若没有出现请点击刷新

加入到一个group中.png

urltype中加入identifier

identifier.png

至此就可以共享数据了

1).第一种方式 userdefault suite

通过UserDefaults.init(suiteName: "group.com.chunqi.widgetDemo")

  • APP写入数据
//        通过userdefault suite共享数据
        let userDefault = UserDefaults.init(suiteName: "group.com.chunqi.widgetDemo")
            userDefault?.set(textField.text, forKey: "widgetString")
            userDefault?.synchronize()
  • widget读取数据
        //通过userdefault 共享数据
        self.actionLabel.text = UserDefaults.init(suiteName: "group.com.chunqi.widgetDemo")?.object(forKey: "widgetString") as! String?

2).第二种方式 filemanager

  • 写入数据
func shareDataByFileManger() -> Void {
    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)
    }
    
    
}
  • 读取数据
func shareDataByFileManager() -> String {
    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)
    }
    
    return str
    
}

git源码示例 https://github.com/Liuchuqni/demo/tree/master/widgetDemo

相关文章

  • swift widget 简单使用

    1.先创建一个extension 创建后多出来一个文件夹 widget 2.给APP 添加一个 URL sche...

  • Swift中Widget简单使用

    1. widget的认识 widget不支持键盘的输入 官方文档 App Extension Programmin...

  • XCode12 OC调用Swift报错解决方案

    最近项目中做小组件刷新时需要使用到swift代码,于是在oc代码加入swift类,在swift类中调用Widget...

  • iOS 使用Swift开发Widget

    最近玩手机发现了widget这个app外的控件还是蛮有意思的,于是在上网查了一下资料,是iOS 8的系统开始开放的...

  • Swift Widget

    最近玩手机发现了widget这个app外的控件还是蛮有意思的,于是在上网查了一下资料,是iOS 8的系统开始开放的...

  • Swift5.2 - UISearchController的简单

    Swift - UISearchController的简单使用 记录下UISearchController的简单使...

  • 2017-12-31

    SQLite.Swift + Codable 简单使用 SQLite.Swift 在新版本中支持了 Swift4 ...

  • 2022-04-02 -- iOS 14 widget 小组件开

    刷新Widget 刷新widget 的语法只支持 swift。主项目是 OC时, 需要创建桥接文件 然后在 App...

  • SearchView 笔记

    简单的使用 修改样式 获取焦点相关 使用 布局文件: 要注意 android.widget 和 android.s...

  • iOS保存图片到相册

    使用UIImageWriteToSavedPhotosAlbum直接保存 //OC //swift 优点:简单,方...

本文标题:swift widget 简单使用

本文链接:https://www.haomeiwen.com/subject/nnjdpttx.html