草庐IT

iOS - Today 扩展小部件随时间清除

coder 2023-07-16 原文

理应如此

我们有一个今天的小部件,它最多显示 6 个按钮,具体取决于相应应用中的数据集。此数据使用应用程序组共享。如果至少配置了一个按钮,它将如上图所示显示。如果用户未登录,或者没有配置任何按钮,它将显示一条消息,如下图所示。

问题

几个小时后(大约 4 到 7 小时)没有打开应用程序,小部件恢复到“未配置按钮” View 。

到目前为止的分析

从应用程序组加载数据的方式是使用如下所示的代码完成的。 ( gist for full code ) 按照我编写的方式,可以显示“未配置按钮” View 的唯一方法是 buttons 数组实际存在但长度为零。

我预计会发生缓存清除或后台服务停止之类的事情,但据我所知,应该更早地捕获异常:

  • 如果无法连接到应用程序组数据,userDefaults 应该为 nil,因此它应该显示“未登录 View ”。
  • 如果从未定义按钮,buttons 应该为 nil,因此它应该再次显示“未登录 View ”

考虑到应用程序在后台不执行任何操作,应用程序本身不能更改按钮。

我尝试在连接调试器的同时重现此问题,但问题不会重现。

有没有人知道如何解决这个问题或如何开始调试这个问题?

相关文件:

相关代码:

private struct sharedData {
        static var baseUrl: String?
        static var token: String?
        static var phoneDeviceId: String?
        static var buttons: Array<Button>?
    }

func loadData() {
        let groupIdentifier = "group." + NSBundle.mainBundle().bundleIdentifier!
        var groupIdArray = groupIdentifier.componentsSeparatedByString(".")
        groupIdArray.removeAtIndex(groupIdArray.count - 1)
        let appGroupIdentifier = groupIdArray.joinWithSeparator(".");

        let userDefaults = NSUserDefaults.init(suiteName: appGroupIdentifier)
        if (userDefaults == nil) {
            print("Error in user defaults")
            setButtonTitle("Not logged in. Open Triggi to continue.")
            return false
        }
        sharedData.baseUrl = userDefaults?.valueForKey("baseUrl") as? String
        sharedData.token = userDefaults?.valueForKey("token") as? String
        sharedData.phoneDeviceId = userDefaults?.valueForKey("phoneDeviceId") as? String
        let buttons = userDefaults?.valueForKey("buttons") as? NSArray

        if (sharedData.baseUrl == nil || sharedData.token == nil || sharedData.phoneDeviceId == nil || buttons == nil) {
            print("Missing data")
            setButtonTitle("Not logged in. Open Triggi to continue.")
            return false
        }

        if (buttons?.count == 0) {
            print("No buttons configured")
            setButtonTitle("No buttons configured. Open Triggi to continue.")
            return false;
        }

    // More things are done with the data here
}

最佳答案

Today Extension Controller 是一个 UIViewController,因此遵循与 UIViewController 相同的生命周期。因此,每次加载 widget 时都会调用生命周期方法 viewDidLoad()

此外,widgetPerformUpdateWithCompletionHandler 被调用:

  1. 当小部件在后台更新时
  2. 在获取小部件快照之前

因此,除了在 widgetPerformUpdateWithCompletionHandler 中调用 loadData() 之外,还可以从 viewDidLoad() 中调用它。

此外,您在哪里编写了从 superview 添加/删除 UIButtons 以及在代码中显示“未配置按钮”的代码?

关于iOS - Today 扩展小部件随时间清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44434018/

有关iOS - Today 扩展小部件随时间清除的更多相关文章

  1. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  2. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  5. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. c - mkmf 在编译 C 扩展时忽略子文件夹中的文件 - 2

    我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

随机推荐