我看了一下用于构建移动应用程序的问题.是否有可能在一个颤动的应用程序中创建Widgets(而不是颤动小部件,但App Widgets(Android)和Today Extensions(iOS))?我想这不能用dart完成,但是有没有办法在Java/Swift中实现它们原生并将它们包含在flutter-app中?
谢谢!
我想在今天的扩展程序(Widget)中管理包含app的一些操作.
完整描述:在我的包含应用程序中,执行一些操作(如播放/暂停音频).并希望从今天的扩展(小部件)管理该操作.动作也继续在后台状态下执行.
在今天的扩展中,将执行相同的操作.因此,如果在主要包含应用程序中已经启动操作并将其发送到后台状态,则用户可以暂停窗口小部件的操作.并且用户还可以随时从小部件(今天的扩展)开始/暂停操作.
为了实现这个目标,我使用UserDefault和app Group功能并存储一个布尔值.当小部件出现时,它检查布尔值并设置按钮状态播放/暂停.它设置正确,但当我按下扩展按钮时,操作无法在主机应用程序中执行.
码:
在主要包含应用程序代码
override func viewDidLoad() {
super.viewDidLoad()
let objUserDefault = UserDefaults(suiteName:"group.test.TodayExtensionSharingDefaults")
let objTemp = objUserDefault?.object(forKey: "value")
self.btnValue.isSelected = objTemp
NotificationCenter.default.addObserver(self, selector: #selector(self.userDefaultsDidChange), name: UserDefaults.didChangeNotification, object: nil)
}
func userDefaultsDidChange(_ notification: Notification) {
let objUserDefault = UserDefaults(suiteName: "group.test.TodayExtensionSharingDefaults")
objUserDefault?.synchronize()
let objTemp = objUserDefault?.object(forKey: "value")
self.btnValue.isSelected = objTemp
}
Run Code Online (Sandbox Code Playgroud)
在扩展类中:
@IBAction func onPlayPause(_ sender: UIButton) {
DispatchQueue.main.async {
let sharedDefaults = UserDefaults(suiteName: "group.test.TodayExtensionSharingDefaults")
if let isPlaying = sharedDefaults?.bool(forKey: "isPlaing") {
sharedDefaults?.set(!isPlaying, forKey: "isPlaying")
}else{
sharedDefaults?.set(false, forKey: "isPlaying") …Run Code Online (Sandbox Code Playgroud) 我一直在制作今天的扩展程序,从Feed中下载文章并显示最新的文章.整个过程在iOS 8上运行良好,仍在iOS 8.1上运行,然后是iOS 8.1.2,我们开始抱怨今天的扩展程序不再起作用了.我尝试在iOS 8.1.2设备上进行调试,在扩展甚至启动之前,它崩溃了这个错误:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <__NSConcreteUUID 0x174027280> 5AFB07AB-5DCD-46FE-8D07-44DE0F3789F2)'
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这篇关于开发今天扩展时发生的频繁错误的帖子:http://www.atomicbird.com/blog/ios-app-extension-tip
Tom Harrington在帖子中说:
在iOS 8(以及其他最新版本)中,在Xcode的构建设置中启用模块意味着您无需明确列出要使用的所有框架.他们会自动找到.
但是今天扩展使用的NotificationCenter.framework不是这种情况.如果从构建设置中删除它,则不会收到任何构建警告或错误.但是当您尝试加载扩展时,您将从libextension.dylib中获得异常,并且您的扩展名将无法加载.异常消息没有启发性:
2014-08-16 12:06:53.793 TodayTestExtension [41313:6111763] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'* setObjectForKey:object不能为nil(key:<__ NSConcreteUUID 0x7fd729422390> ED3B42F8-66CD-4CB0- BCD5-F3DBA6F34DB5)'如果您正在进行今天的扩展,只需将该框架保留在构建设置中即可.它不应该在那里,但确实如此.
我的扩展程序在其构建设置中包含NotificationCenter.framework,但我怀疑我的问题可能在某种程度上类似.
有人遇到过类似的问题吗?知道怎么解决吗?
所以我有一个需要订阅的应用程序(通过IAP),它提供了一个Today Widget.在窗口小部件(以及应用程序内)中,我使用RMStore检查捆绑包中的App Receipt是否有活动订阅.它在沙盒中工作正常,包括通过TestFlight安装时.但是今天,该应用程序已获得Apple批准,一旦我测试了实时店内版本,当主应用程序看到用户在应用收据中购买时,今日扩展程序没有读取应用程序收据,因此没有订阅!
Today Extension和主应用程序都使用完全相同的代码来阅读应用收据并查找订阅信息.为什么它会在主应用程序中工作而不是扩展?这是一个已知的问题?它与RMStore而不是StoreKit本身有什么关系?我有什么聪明/不同的事情吗?
我想也许问题可能与收据验证有关 - 例如,捆绑标识符在沙盒中与扩展的App Store不同吗?
这真是令人沮丧,因为我没有办法测试任何可能的解决方案而不重新提交到App Store,然后在发布后对其进行测试,如果它被破坏则将其从商店中拉出来,否则我会让用户付费他们实际上没有得到的东西.
in-app-purchase ios rmstore ios8-today-widget today-extension
我正在开发一个带有Today Extension的iPhone应用程序.该应用程序有一个模型模块,可以加载/保存到NSUserDefaults.由于我希望主要应用和扩展程序都可以使用此信息,因此我使用了一个应用程序组:
let storage = NSUserDefaults(suiteName: "group.etc.etc.etc...")
Run Code Online (Sandbox Code Playgroud)
应用程序和扩展程序都可以毫无问题地访问信息.
主应用程序偶尔可能会创建一个本地通知以呈现给用户.该通知有两个与之关联的操作(UIUserNotificationAction).其中一个操作会触发一些代码在主应用程序的后台运行.该代码更改NSUserDefaults信息并触发同步.我的代码是这样的:
func application(application: UIApplication, handleActionWithIdentifier id: String?, forLocalNotification not: UILocalNotification, completionHandler: () -> ()) {
// Interact with model here
// New information gets saved to NSUserDefaults
userDefaultsStorage.synchronize()
completionHandler()
}
Run Code Online (Sandbox Code Playgroud)
现在,在今天外线.我自然会观察对信息所做的任何更改,NSUserDefaults以便我可以在窗口小部件上重新加载界面:
override func viewDidLoad() {
super.viewDidLoad()
// ...
NSNotificationCenter.defaultCenter().addObserverForName(NSUserDefaultsDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
self.reload()
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这是我的问题:
主应用程序安排UILocalNotification.我打开今天的视图,看看我今天的小部件.
当通知触发时,屏幕顶部会出现一个横幅.
我在那个横幅上向下滑动以显示这两个动作,然后我选择我之前提到的那个动作(今天的小部件仍在现场和屏幕上).
我知道这个动作在后台运行正常,并且正在对信息进行更改NSUserDefaults.
但是,即使今天的窗口小部件一直处于活动状态并始终显示在屏幕上,也不会触发重新加载操作.经过进一步调查,我可以证实,NSUserDefaultsDidChangeNotification …
我有一个包含多个应用目标的项目(大约25个).
我将为这些应用程序制作今日扩展,但我不想使用相同的代码和配置创建大约25个扩展.
是否可以只创建一个我分配给25个应用程序的今日扩展?
这是一种分析仪器中其他目标的方法吗?我试图在那里分析我的小部件目标,但是仪器继续显示一个对话框,说"请采取适当的行动来启动com.appId.widget".
有任何想法吗?
有没有人知道如何从应用扩展程序的视图控制器启动父应用程序?
我只想从其应用扩展程序启动主应用程序.
在应用程序中,我可以在设置中选择应使用哪种语言.如果未选择任何内容,则会检测并选择iPhone语言为英语,法语或德语.如果这些语言都不是iPhone语言,则设置为使用英语.手动更改设置中的语言可以正常工作.现在我添加了一个今天的扩展,它运行得很好但我需要访问settings-bundle来获取语言的NSUserDefaults(如果手动更改).在这两个目标中,我激活了App-Groups
group.com.companyname.appname
Run Code Online (Sandbox Code Playgroud)
并选择它.
在应用程序中我得到了语言
NSString *manualLanguageSet = [[NSUserDefaults standardUserDefaults] valueForKey:SPRACHWAHL];
Run Code Online (Sandbox Code Playgroud)
在今天的扩展中,我试图通过:
NSString *manualLanguageSet = [[[NSUserDefaults alloc] initWithSuiteName:@"group.com.companyname.appname"] valueForKey:SPRACHWAHL];
Run Code Online (Sandbox Code Playgroud)
对于NSLog(@"Settings-Sprache: %@", manualLanguageSet);运行today-extension时的结果是(无论是否在设置中选择了哪种语言)
2014-09-13 16:48:36.331 HdB今日[3734:284836]设置 - Sprache:(null)
我该怎么做才能更正/如何访问设置(settings.bundle)?
我正在构建一个iOS Today小部件,在测试iOS 10时,我看到小部件标题右上角的"显示更多"/"显示更少"按钮.如何删除此按钮?我正在使用Objective-C.
today-extension ×10
ios ×9
ios8 ×2
objective-c ×2
swift ×2
widget ×2
dart ×1
flutter ×1
instruments ×1
rmstore ×1
swift3 ×1
targets ×1