我为我的应用程序+报价实现了一个Today小部件,它在这些Apple Docs的帮助下在通知中心显示当天的报价.我想要完成的是打开Containing App,在这种情况下是+ Quotes,当用户在他们的Today通知视图中点击+ Quotes小部件时,并不完全确定要调用它的内容,因为Calendar会在今天看.我已经尝试在标签上覆盖一个按钮,该按钮会调用
-(void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler
它,然后打开我声明要打开Containing App的自定义URL方案.问题是它没有打开Containing App.

-(IBAction)myButton:(id)sender {
NSURL *customURL = [NSURL URLWithString:@"PositiveQuotes://"];
[self openURL:customURL completionHandler:nil];
}
Run Code Online (Sandbox Code Playgroud) 是否可以像在原始应用程序中那样在swift的今天扩展中使用我的CoreData模型?如果是,我该如何创建NSManagedObjectContext?
我真的不知道,除了group-identifier之外,但不幸的是我不知道如何获取上下文..
过去我创建的应用程序在开头检查我想要使用CoreData然后我得到了managedObjectContext通过我的AppDelegate ..但我怎么能在扩展中做那样的想法?Apple不提供相关信息..
我在AppDelegate中编辑了这一行:
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"HTWcampus.sqlite"];
Run Code Online (Sandbox Code Playgroud)
对此(在将组包括在两个目标之后):
NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.BenchR.TodayExtensionSharingDefaults"];
storeURL = [storeURL URLByAppendingPathComponent:@"HTWcampus.sqlite"];
NSLog(@"StoreURL2: %@", storeURL);
Run Code Online (Sandbox Code Playgroud)
有了这个,我的应用程序中的现有数据库就消失了(这很棒,因为我认为将数据库放在共享段中是有效的).
但是如何在扩展中创建我的上下文实例?我怎样才能访问我的NSManagedObject-subclasses?
在扩展中,我有这个代码到目前为止:
var context: NSManagedObjectContext!
override func viewDidLoad() {
super.viewDidLoad()
var storeURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier("group.BenchR.TodayExtensionSharingDefaults")
storeURL = storeURL?.URLByAppendingPathComponent("HTWcampus.sqlite")
let modelURL = NSBundle.mainBundle().URLForResource("HTWcampus", withExtension: "momd")
let model = NSManagedObjectModel(contentsOfURL: modelURL)
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)
coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: nil)
context = NSManagedObjectContext()
context.persistentStoreCoordinator = coordinator
}
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?如果是的话,我怎样才能获得我的NSManagedObject-Subclasses?我是否必须将momd文件添加到扩展目标?如果是的话,我该怎么做?
我正在使用动态大小的表格进行今日扩展.我已经能够使用以下内容来调整内容的大小:
self.preferredContentSize = accountsTable.contentSize
Run Code Online (Sandbox Code Playgroud)
但是,我发现即使我可以告诉表格contentSize更大,它也不会比某个尺寸(568像素)更高.
我不清楚这是否是一个内置限制,或者是否有办法解决这个问题.似乎一些先前的扩展(Stocks小部件)能够变得更大.
其他人遇到同样的行为.任何人都知道是否可以立即使扩展显示更大或使用像Stock小部件一样的"全部显示"按钮?
由于今天扩展程序以一个独立的进程运行,我确信它们不会记录任何崩溃的开箱即用.我假设我们需要分别在小部件上初始化Crashlytics.例如在viewDidLoad方法中TodayViewController.
ios crashlytics osx-extensions today-extension ios-extensions
我有一个今天的小部件包含两件事:
UILabelUITableView在我的viewWillAppear设置标签是可见的,我的tableView被隐藏,我将标签文本设置为"正在加载".见下图.

然后我得到一个位置,当这个完成后,我调用另一个方法和
成功完成后,我有一个如下所示的tableView:
.
我现在的问题.
当我打开今天的小部件并点击时viewWillAppear,我并不总是设置我的标签,我得到的唯一结果就是这个
.
所以会发生的事情是我只能在tableView中显示我之前的一些结果.
偶尔会发生这种情况,似乎tableView冻结,我无法更新初始视图,隐藏tableView并显示标签.即使屏幕像这样冻结,一切都在运行,我设法更新tableView和视图.
唯一的问题是当我打开窗口小部件时,屏幕冻结如下:
有时而不是显示我的标签.它的大小原因,是因为我设置了preferredContentSize = CGSizeMake(0, 30).否则我打赌它会显示整个前一个tableView.
有关如何解决此问题的任何想法,以便在我点击时始终更新视图viewWillAppear?
更新
开始另一个赏金,看看是否有关于此问题的其他输入.
我正在构建一个iOS Today小部件,在测试iOS 10时,我注意到所有小部件现在都被赋予相同的高度(之前的版本允许开发人员设置高度).什么是理想高度/处理这个新限制的最佳做法是什么?我很快,我没有使用autolayout fyi.提前致谢!
创建Today小部件,我UserDefaults(suiteName:)用来保存一些数据.在我正在使用的主要应用程序中UserDefaults.standard().这是扩展无法读取(或可以吗?),这就是我使用suiteName:构造函数的原因.
用户UserDefaults.standard()在主应用中持久保存的数据需要在扩展中可用.
在这个时候,我坚持两者,以便可以共享价值观
UserDefaults.standard().set:...forKey:...
UserDefaults(suiteName:...)().set:...forKey:...
...
Run Code Online (Sandbox Code Playgroud)
问题是我应该UserDefaults.standard()放在一起,只是UserDefaults(suiteName:)在我的应用程序中使用,或者这是不好的做法,如果是这样,为什么?
编辑:我正在使用App组容器.为了澄清我要问我应该在我的项目中用suiteName替换standard()吗?
无法为紧凑模式设置今日小部件视图模式的高度.无论我设定什么价值.它将窗口小部件的高度设置为默认值.扩展模式工作正常,值正确设置并反映在窗口小部件中.我已经在viewDidLoad()方法中添加了这一行.
self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
Run Code Online (Sandbox Code Playgroud)
这是代码.maxSize的值不能像常量那样改变.
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
//self.preferredContentSize = (activeDisplayMode == .compact) ? maxSize : CGSize(width: maxSize.width, height: 300)
if activeDisplayMode == NCWidgetDisplayMode.compact
{
self.preferredContentSize = CGSize(width: maxSize.width, height: 300)
}
else
{
self.preferredContentSize = CGSize(width: maxSize.width, height: 560)
}
}
Run Code Online (Sandbox Code Playgroud) 我试图找出如何计算今日扩展主视图中的左边距,以将内容与今日视图标签的其余部分对齐.
这是一个使用Today扩展的干净Xcode项目的示例(我已经为视图背景添加了颜色并绘制了一条红色虚线,以说明我想要对齐Hello World的位置UILabel).
iPhone 6 Plus模拟器(左侧横向,右侧纵向)的结果可以从下图中找到:

在图像中,请注意绿色主视图左边界的位置与应用程序名称UILabel"testi2"的位置不同.看起来红线 - 主视图左边界对齐在每个设备中都有所不同:iPhone 5x,iPhone 6和iPad.
可以使用干净的Xcode项目(我正在使用Xcode 6.1.1,iOS 8.1和Swift)重现该行为:
UILabel背景为红色:

如何将Hello World UILabel(红色背景)与虚线对齐?或者如何将主视图(绿色背景)与虚线对齐?
我看了一下用于构建移动应用程序的问题.是否有可能在一个颤动的应用程序中创建Widgets(而不是颤动小部件,但App Widgets(Android)和Today Extensions(iOS))?我想这不能用dart完成,但是有没有办法在Java/Swift中实现它们原生并将它们包含在flutter-app中?
谢谢!
today-extension ×10
ios ×8
swift ×6
ios8 ×4
core-data ×1
crashlytics ×1
dart ×1
flutter ×1
ios10 ×1
ipad ×1
iphone ×1
objective-c ×1
tableview ×1
userdefaults ×1
widget ×1
xcode ×1