iOS 8今日扩展在设备上无法工作

11
当我在模拟器上运行我的Today Extension时,一切正常,并且按预期显示如下所示:

enter image description here

但是当我在我的设备(iPod touch和iPhone 5s)上运行它时,主体不会显示(请忽略标题和图标,已更改)。 我连接了调试器到我的扩展程序,然后得到了这个:

enter image description here

我不知道所有这些的含义...... 我删除了所有针对Today Extension的代码来检查是否存在代码问题,但什么都没有改变,因此我怀疑我的代码不存在问题。 如何解决此问题的任何建议将不胜感激。 (我启用了应用程序组,如果这有任何意义)

你好,我遇到了同样的问题,你找到解决方案了吗?谢谢。 - estemendoza
我遇到了Xcode告诉我可执行文件签名具有无效权利的问题。为此,我更改了今天扩展的方案,并在可执行文件下拉菜单中设置“启动时询问”。然后在设备上执行扩展程序并选择Xcode告诉您的第一个选项。 - estemendoza
嗨@estemendoza,我还没有找到解决方案,但如果我找到了,我会告诉你。我不太确定你在第二条评论中说的是什么...你是说你的扩展现在正在工作还是没有? - Jarryd Baillie
@estemendoza 哦,好的,我还没有遇到这个问题...你启用了应用组吗?如果是这样,请确保您正在使用的配置文件支持应用程序组服务。那可能就是问题所在。 - Jarryd Baillie
不行,还是出现了错误"The entitlements specified in your application’s Code Signing Entitlements file do not match those specified in your provisioning profile. (0xE8008016)." 我甚至尝试使用与应用程序扩展配置相同的捆绑标识符创建新的预配配置文件。 - estemendoza
显示剩余4条评论
8个回答

12

确保扩展目标版本

请确保您的扩展目标版本正确。默认情况下,Xcode会为您提供最高版本,例如8.3,如果您的iOS版本低于此,则Xcode会导致崩溃。


1
哦,太感谢了。我已经为此苦思冥想了好几个小时。 - atulkhatri

5

我发现我用了错误的suitename来访问我的应用组。请确保你使用"group.something.something"而不是"something.something"来访问应用组。


@estemendoza,我的扩展现在可以工作了,但是我认为我的解决方案可能不会有帮助,因为你说你没有启用应用程序组。我能建议的就是注释掉代码片段,直到你找到一个出问题的代码块。这就是我发现问题的方法。 - Jarryd Baillie

4
我找到了解决方案。我只需要在小部件目标中指定arm64作为有效架构即可。
在小部件目标上:
构建设置>有效架构
我只有armv7和armv7s。我添加了arm64后,在我的5s设备上就可以完美运行了。

我的客户使用的供应商库仅支持armv7,迫使我们的主要目标也必须是armv7,以便应用程序可以编译。我一直在尝试让小部件工作,但一直没有成功,直到我看到了这个。这节省了我很多时间,可惜在供应商升级他们的系统之前,我无能为力。所以无论如何,感谢您在这里发布您的经验! - user2325031
这个帮了我很大的忙,谢谢!把arm64添加到两个目标中引起了我的问题。我一直在更改两个目标的架构,但我只需要将arm64添加到widget目标中才能使它工作。再次感谢! - JKo

1

使用应用程序扩展时需要记住的几点:

  • 目标扩展的Bundle标识符应为com.companyName.AppName.ExtensionName

  • 您需要为目标扩展拥有单独的AppID,标识符指定为com.companyName.AppName.ExtensionName并创建具有此AppID的配置文件。

  • 此外,创建的appGroupID应嵌入到两个AppIDs中(用于应用程序和扩展程序)。


这对我来说是解决方案,谢谢。我不得不取消扩展的常规设置中的“自动管理签名”选项,然后在我首次创建了AppID之后使用手动创建的开发和发布配置文件。这可能是因为项目中的主要应用程序正在使用这种现在“废弃”的签名方法... - Christopher King

0
我在使用自定义ViewController时遇到了一个问题,我的Share Extension资源受到限制,所以当我的Extension生成缩略图时,因为使用了太多的后台线程而导致崩溃。将缩略图生成数量减少到一次一个解决了这个问题。
令人困惑的是,在模拟器上没有看到这个限制,只有在真实设备上才能看到。

0

由于您没有分享任何代码片段,我无法提供具体的答案。请尝试使用以下步骤调试您的小部件:调试->附加到进程->(从菜单中选择您的小部件),并调试您的viewdidloadviewwillappear- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler方法。希望能有所帮助。


3
今天我尝试使用Xcode 6.0.1,在设备上运行时出现了与设备的连接丢失的提示。您是否能够在设备上运行该扩展?谢谢。 - estemendoza

0

我的问题来源:

  • 在模拟器上,每次都会调用viewDidLoad方法,但在设备上,视图只加载一次,只有viewWillAppear方法被调用。
  • 小部件无法接收核心数据更改通知。
  • 不要从widgetPerformUpdateWithCompletionHandler方法中调用NCWidgetController.widgetController().setHasContent方法。最好的地方(大多数情况下)是在包含应用程序中使用它,而不是在小部件本身中使用。

希望这能帮助到某些人。


0
在我的情况下,我设置了首选内容大小,并且它已经开始在设备上工作。
self.preferredContentSize = CGSizeMake(UIScreen.mainScreen().nativeBounds.width, 100.0)

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