今日扩展无法继承CoreMedia权限

70

我正在尝试在Objective-C应用中使用Swift添加Today Extension。在我的调试日志中,我一直收到这条消息:Failed to inherit CoreMedia permissions from 3005: (null)。其中的数字3005每次都不同。我从小部件内部读取NSUserDefaults,但我在应用程序本身中进行读取/写入。我的TodayViewController中唯一的代码如下:

override func viewDidLoad() {
    super.viewDidLoad()

    let formatter = NSNumberFormatter()
    formatter.numberStyle = .CurrencyStyle
    totalLabel.text = formatter.stringFromNumber(0)
    coinsLabel.text = formatter.stringFromNumber(0)

    formatter.maximumFractionDigits = 0
    billsLabel.text = formatter.stringFromNumber(0)

}

func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {
    return UIEdgeInsetsMake(8.0, 16.0, 8.0, 16.0)
}

func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) {
    // Perform any setup necessary in order to update the view.

    // If an error is encountered, use NCUpdateResult.Failed
    // If there's no update required, use NCUpdateResult.NoData
    // If there's an update, use NCUpdateResult.NewData

    completionHandler(NCUpdateResult.NewData)
}

2
我遇到了同样的问题。我还注意到,在此之后,我的小部件消耗的内存几乎达到了1GB,这真的很奇怪,因为我只执行了一个简单的网络请求,甚至都没有被执行。 - Afonso Tsukamoto
我也有同样的问题。但是我根本没有使用Swift,对我来说,当访问我的NSManagedObject子类之一的方法时,它就会出现(实际上似乎被解释为NSManagedObject,这本身就很奇怪)。 - flohei
我已经使用Xcode 6.1 Beta进行了检查,该消息仍然存在。我的扩展程序没有任何运行时问题,调试器也没有明确指出这是一个警告。希望在提交审核时,苹果不会拒绝该应用程序。 - Shan
1
我遇到了类似的问题。如果你移除 "widgetMarginInsetsForProposedMarginInsets",错误可能会消失。(当我使用 "preferredContentSize" 时也出现了相同的错误)。但是我还没有找到如何解决这个问题。 - Pandafox
1
我正在开发自定义键盘,有时会遇到这个消息。我发现,如果我在目标设置的“常规”选项卡中为我的包含应用程序目标和扩展目标都设置“团队”为“无”(并在此更改后进行清理),则不会出现此日志消息。我相信这是iOS中的错误。 - vbezhenar
显示剩余2条评论
15个回答

54
我认为“无法继承NNNN的CoreMedia权限”警告与创建应用程序扩展时的App Groups有关。您的容器应用程序和应用程序扩展都需要打开App Groups功能,并使用相同的应用程序组容器ID(例如:group.com.yourdomain.yourappname)。App Groups用于允许多个应用程序访问共享容器,并允许应用程序之间进行额外的进程间通信。

Capabilities should look like this


36
我已经做过了。应用程序组已经在应用程序和扩展目标中启用,并且它们正在使用相同的组。 - Shan
1
不确定。我在创建模板应用程序扩展后收到了警告。我没有添加任何自定义代码。打开App Groups解决了我的问题。你在从NSUserDefaults读取时指定了suiteName吗?例如:var userDefaults = NSUserDefaults(suiteName:“group.com.yourdomain.yourappname”) - Jon
是的Jon,我是。我有另一个示例应用程序(http://www.raywenderlich.com/83809/ios-8-today-extension-tutorial),它完全使用Swift(包含应用程序和扩展),因此我排除了这是由于Obj-C和Swift混合的原因。我提到的示例应用程序使用自定义框架而不是应用组,并且它也在日志中收到该消息。希望这只是Xcode的一个错误。顺便说一下,我正在使用版本6.0.1。 - Shan
1
还有一件事我应该提一下:我创建了一个 App Group 但是命名不正确。我已经在两个目标中取消了未使用的组,但是我找不到删除它的方法。 - Shan
另一个更新:从开发者门户中删除了未使用的应用程序组,但没有运气。 - Shan
3
相同的问题,但只在模拟器中出现,真实设备上正常运行。 - mliu

16

首先,单击Assets.xcassets

首先,点击Assetes.xcassets

其次,点击目标成员,勾选您的应用程序和小部件以允许小部件访问资源。

第二步,点击目标成员

完成上述步骤后,再次运行小部件,它应该正常工作。


山,这似乎是正确的答案,让我们把它置于页面顶部。 - Stu P.
对我来说,问题是我在我的应用程序中从一个类分享信息到我的扩展。当我为该文件选择了两个目标时,问题得到了解决。此致敬礼 - Andres Paladines

14

我也遇到过相同的日志输出。清除 (Cmd + Shift + K) 后问题就解决了。


我在添加应用组后才做到的,所以我不知道它是否有助于这一步骤。但是感谢您提供的解决方案 ;) - Quver
有时候这确实很奇怪! - Maurice
很不幸,有时候问题会重新出现。 - Quver
1
在 Info.plist 中有一个类似于 bundle display name 的条目。 - Maurice

9

请检查今天扩展的mainstoryboard,查看是否启用了具有“Is Initial View Controller”选项的viewcontroller。


9
我也遇到了这个问题,唯一的解决方法是为故事板上的每个单独对象添加垂直和水平约束。

很奇怪,他是对的。我也遇到了同样的错误,尝试了这里的所有方法但都没有用。后来我看到了这个方法,只需选择“今天视图”并选择“添加缺失的约束条件”。然后错误就消失了,今天扩展现在可以运行了。 - William T.
跟进一下,我刚刚解决了限制条件问题,现在又出现了 CoreMedia 权限错误……所以这个错误肯定与限制条件有关。同时确认上文中的 AppGroup 步骤是必需的,如果关闭它,会再次出现错误。 - William T.
1
我添加了所有可能的约束条件...仍然看到这个错误。 - Oren
对我来说也是与约束相关的。我知道我不应该只发表“我也是”的评论,但由于这个答案相当奇怪且显然没有意义,我一直忽略它,尽管那是唯一一个实际对我有用的! - cdf1982
可以确认 - 具体来说,错误只发生在模拟器中。在设备上它运行良好。将约束添加到所有对象中也使其在模拟器中正常工作。我不需要添加或启用应用程序组。 - kiddailey

6

在尝试了这个问题答案中提到的大部分操作后,我仍然在今天的小组件上遇到了错误。但我找到了一些对我有效的方法。

打开你的小组件目标 构建设置,并搜索始终嵌入Swift标准库。选择“是”。

希望如果其他方法都没有帮助到你的话,这个方法能够解决你的问题。


4
非常具有误导性的错误。如上所述,请选择您的视图控制器并添加缺失的约束条件,或自行添加约束条件以解决此问题。 enter image description here

4

我发现,如果你正在使用StoryBoard,你需要进入info.plist并删除属性NSExtensionPrincipalClass。之后,扩展程序就可以正常加载了。


1
当我尝试激活键盘扩展时,我遇到了这个问题,而这个解决方案解决了我的问题。非常感谢,已点赞。 - Gareth Clarke

2
这让我想起了一个问题,因为我的视图控制器中有一个定制的合并init(nibName:bundle:coder:)方法,并且我实现了initWithCoder以满足Swift的要求:

(原始回答)

。现在需要翻译成中文:
required init?(coder aDecoder: NSCoder) {
    self.init(nibName: nil, bundle: nil, coder: aDecoder)
}

通过让该实现调用 super.init(coder:),我解决了这个问题:

required init?(coder aDecoder: NSCoder) {
    // [...setting some variables...]
    super.init(coder: aDecoder)
}

2

我在运行我的扩展时遇到了同样的问题。在我的情况下,通过在真实设备上运行扩展程序来解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接