问题标签 [ios-extensions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - 如何在iOS App Containing Extension和Extension(不是Host App)之间进行通信
TLDR:是否可以在 iOS 应用程序和它的扩展程序之间发送实时消息或通知?
我正在编写一个带有扩展的 iOS 应用程序,这些应用程序是相同的一部分App Group
并共享相同的 CoreData(SQLite 数据库)。我可以使用应用程序和扩展程序中的 CoreData 读取和写入数据库,它们都共享相同的内容。
我的问题是:是否可以在应用程序和扩展程序之间发送消息或通知以通知对方在必要时进行更新?
我尝试通过发送通知,NSNotificationCenter
但这不会“退出”应用程序/扩展程序,如果我尝试写信给共享组NSUserDefaults
并收听NSUserDefaultsDidChangeNotification
. 这在应用程序内部有效,但扩展程序没有收到任何内容(当我知道它已启动并且共享相同时NSUserDefaults
)。知道如何保持同步吗?
ios - 如何保证主机应用程序和扩展程序都使用的共享应用程序容器中的核心数据存储中的唯一条目?
为了有效地问我的问题,让我们首先考虑一下我面临的确切情况:
常规设置
- 一个主机 iOS 8 应用程序。
- 与主机应用程序捆绑的一个或多个 iOS 8 扩展(WatchKit、Share 等)。
- 宿主应用程序和所有扩展程序在共享应用程序组容器中共享相同的 Core Data SQLite 存储。
- 每个应用/扩展都有自己的 NSPersistentStoreCoordinator 和 NSManagedObjectContext。
- 每个持久存储协调器都使用一个持久存储,该持久存储与所有其他持久存储在组容器中共享相同的 SQLite 资源。
- 该应用程序和所有扩展程序使用一个通用代码库来同步来自 Internet 上的远程 API 资源的内容。
导致问题的事件顺序
用户启动主机应用程序。它开始从远程 API 资源中获取数据。核心数据模型对象是基于 API 响应创建的,并“更新”到主机应用的托管对象上下文中。每个 API 实体都有一个唯一ID,用于在远程 API 后端标识它。“upsert”是指对于每个 API 实体,如果找不到给定 uniqueID 的现有条目,主机应用程序只会在 Core Data 中创建一个新条目。
同时,用户还启动了主机应用程序的扩展之一。它也从同一个远程 API 执行某种获取。它还尝试在解析 API 响应时执行“更新插入”。
问题:如果宿主应用程序和扩展程序都尝试同时为同一个 API 实体更新核心数据条目,会发生什么?要了解这是如何发生的,让我们看一下 upsert 的事件序列:
核心数据更新序列:
- API 解析代码解析给定 API 实体的唯一 ID。
- 解析器对任何匹配谓词的条目执行核心数据提取,其中谓词
uniqueID
等于解析的唯一ID。 - 如果未找到现有条目,则解析器为此 API 实体插入一个新的核心数据条目,将其
uniqueID
属性设置为解析的唯一 ID。 - 解析器保存托管对象上下文,它将新条目数据下推到 SQLite 后备存储。
详细问题
假设主机应用程序和扩展程序同时独立解析同一 API 实体的 API 响应。如果主机应用程序和扩展程序在它们中的任何一个完成第 4 步之前都到达第 3 步,那么它们都将尝试为相同的 uniqueID 插入新的 Core Data 条目。当他们到达第 4 步并调用save:
各自的托管对象上下文时,Core Data 将愉快地创建重复条目。
据我所知,Core Data 没有任何方法可以将属性标记为唯一。我需要一个相当于SQLite INSERT OR IGNORE
+UPDATE
组合的核心数据。. 否则我需要一种方法来“锁定”持久存储的 SQLite 后备存储,这听起来像是一个麻烦的秘诀。
是否有已知的方法来解决 iOS 8 扩展引入的这个相当新颖的问题?
ios - 向 iOS 应用程序添加应用程序组功能
我需要为我的一个应用启用应用组功能。我从 Xcode 创建了一个新组并选择了它,它已自动将组功能添加到我的 App ID 中。但我仍然看到两个错误。
当我在苹果网站上查找我的应用 ID 时,我可以看到应用组已启用,并且相应的组名称也正确。
这些如何解决?
ios - iOS 中的应用组和 iCloud
我熟悉 iCloud 同步,但我是应用程序组的新手。这个问题可能有一个简单的答案,但我还没有找到。基本上,我有一个集成了 iCloud 的应用程序,现在我想尝试添加一个今天的扩展。我目前正在使用 Core Data 作为后端,并希望继续这样做。但是,根据我的阅读,我需要通过定义一个“应用程序组”将我的数据存储移动到共享位置。(http://blog.sam-oakley.co.uk/post/92323630293/sharing-core-data-between-app-and-extension-in-ios-8和访问 iOS 8 扩展中的核心数据 SQL 数据库(共享应用程序和小部件扩展之间的数据)) 我无法确定此位置是否使用 iCloud 同步。或者,因为我正在使用 iCloud,我是否需要一个应用程序组?我感谢任何和所有的帮助/建议。
ios - 键盘扩展中的 UIMenuController
我需要在我的键盘扩展中显示带有 2 个操作的 UIMenuController。它必须在用户单击集合视图单元格上的按钮时出现(代码中的 cell.textButton)
当我试图显示它时,我的键盘视图控制器变为灰色,没有崩溃:
这是一个代码:
有人尝试将 UIMenuController 添加到键盘扩展中吗?谢谢
ios - 如何将 Crashlytics 与 iOS / OS X 今日视图扩展一起使用?
由于今天的扩展作为一个单独的进程运行,我相信他们不会记录任何开箱即用的崩溃。我假设我们需要分别在小部件上初始化 Crashlytics。例如viewDidLoad
在TodayViewController
.
- 是否有人已经在任何 iOS / OS X 扩展中使用 Crashlytics?如果是这样,您是如何实施的?
- 我还想知道在 Crashlytics 中为扩展创建一个单独的应用程序是否有意义。
ios - 在操作扩展中访问 KeychainItems
我正在为我的 iOS 应用程序构建一个操作扩展。但是,我在处理用户数据时遇到了一些真正的困难。在我的应用程序中,我存储用户的用户名和密码,如下所示:
如何从我的操作扩展中访问它?我尝试使用相同的标识符检索它并创建一个共享容器,但这不起作用......
ios - 从今天的扩展中打开包含应用程序时崩溃
我创建了今天的扩展并添加了一个按钮来打开包含应用程序。内部扩展视图控制器:
因此,我还将 URL Scheme 添加到包含应用程序 plist 中:
小部件工作正常,但是当我尝试按下小部件时,我的应用程序在包含应用程序 AppDelegate.swift 的内部崩溃。内部断点application(application: UIApplication, openURL url: NSURL, sourceApplication: String, annotation: AnyObject?)
无法到达。回溯:
如果我myApp://
在 Safari 中打开,应用程序可以正确打开而不会崩溃。
ios - iOS:如何只在不包含应用的扩展中运行框架代码
框架是在包含应用程序和扩展程序之间共享代码的好方法。
有时我希望某些代码仅在目标是包含应用程序而不是扩展程序时运行,反之亦然。
有类似 TARGET_OS_EXTENSION 的东西吗?
ios8 - 我们可以选择可以在 iOS 8 中用于编辑文档的应用程序吗?
我今天正在浏览 iOS8 的 Document Picker & Document Provider Extensions。文档选择器允许我们选择不同应用程序的文档,因为文档提供者帮助我们使用第三方存储。
现在我有一个我被困住的场景,即在我的应用程序中我将有一个文档让我们说一个 word 文档。现在我想在我的应用程序中使用其他应用程序(例如 Microsoft Office)打开此文档,然后我想对此文档执行编辑。编辑后,我应该能够回到我的应用程序。同样,如果我查看此文档,这些更改应该存在。这可以在 iOS 8 中实现而无需复制文档吗?