注意:这是一个更抽象和简化的问题子集.
随着Touch Frameworks的加入,Extensions和Apple Watch Xcode 6项目和工作区变得越来越复杂.
如果你将CocoaPods添加到这个组合中,事情开始变得几乎无法管理.
如何构建具有以下目标和依赖性的Xcode项目/工作区?(假设:我正在为所有组件使用Git,我使用CocoaPods用于所有第三方代码,我正在使用Xcode 6).
如您所见,这是一个复杂的结构,包括几个CocoaPods实例.有关如何解决任何或所有这些问题的任何建议都会有所帮助.
(我的计划是写下我自己的一些想法,然后综合其他人的答案,这无疑将是一份活文件).
我有一个在iOS应用程序和扩展程序之间共享的动态框架.该框架中有一些代码引用UIApplication,当然,这些代码在扩展中不可用.这些电话是完全孤立的,所以我并不担心它们会导致我的分机出现问题.
由于警告消息中没有指定标志,可能无法执行此操作,但在构建项目时如何抑制 warning: linking against dylib not safe for use in application extensions?
尝试上传二进制文件,其中包括一个手表应用程序.我得到的错误(我几天前没有得到的)是LC_VERSION_MIN_IPHONEOS为watchkit扩展提供的值是8.2,它大于允许的最大值10.3 ...显然8.2> 10.3?
我更新到最新的XCode,8.3,没有解决问题.尝试更改手表应用和扩展程序的iOS部署目标,对消息没有明显影响.
由于今天扩展程序以一个独立的进程运行,我确信它们不会记录任何崩溃的开箱即用.我假设我们需要分别在小部件上初始化Crashlytics.例如在viewDidLoad方法中TodayViewController.
ios crashlytics osx-extensions today-extension ios-extensions
TLDR:是否可以在iOS App和它的Extension之间发送实时消息或通知?
我正在编写一个iOS应用程序,其扩展名是相同的,App Group并共享相同的CoreData(SQLite数据库).我可以使用App中的CoreData读取和写入数据库,并且从扩展程序中,它们共享相同的内容.
我的问题是:是否可以在应用程序和扩展程序之间发送消息或通知,以便在必要时通知对方更新?
我尝试发送通知,NSNotificationCenter但不会"退出"应用程序/扩展,如果我尝试写入共享的组NSUserDefaults并听取相同的问题NSUserDefaultsDidChangeNotification.这适用于应用程序,但扩展程序没有收到任何东西(当我知道它已启动并且它共享相同NSUserDefaults).知道如何让事情保持同步吗?
为了有效地提出我的问题,我们首先考虑一下我面临的确切情况:
常规设置
导致问题的事件顺序
用户启动主机应用程序.它开始从远程API资源获取数据.核心数据模型对象基于API响应创建,并"upserted"到主机应用程序的托管对象上下文中.每个API实体都有一个uniqueID,用于在远程API后端中标识它.通过"upsert",我的意思是,对于每个API实体,主机应用程序仅在无法找到给定唯一ID的现有条目时在Core Data中创建新条目.
同时,用户还启动了一个主机应用程序的扩展.它也可以从同一个远程API执行某种提取.它还尝试在解析API响应时执行"upsert".
问题:如果主机应用程序和扩展程序同时尝试为同一API实体插入Core Data条目,会发生什么?要了解这是如何产生的,让我们看看upsert的事件序列:
核心数据Upsert序列:
uniqueID等于已解析的唯一ID.uniqueID属性设置为已解析的uniqueID.问题详情
假设主机应用程序和扩展程序同时独立地解析同一API实体的API响应.如果主机应用程序和扩展程序在它们中的任何一个完成步骤4之前到达步骤3,则它们都将尝试为相同的唯一ID插入新的核心数据条目.当他们到达步骤4并调用save:他们各自的托管对象上下文时,Core Data将很乐意创建重复的条目.
据我所知,Core Data没有任何方法可以将属性标记为唯一.我需要一个等同于SQLite INSERT OR IGNORE+ UPDATE组合的核心数据..或者我需要一种方法来"锁定"持久存储的SQLite后备存储,这听起来像是一个麻烦的方法.
对iOS 8扩展引入的这个相当新颖的问题有一个已知的方法吗?
我有一个Swift类,它与几个具有不同部署目标的目标相关联,主项目具有iOS 7最低要求,并且有一个iOS 8目标扩展.
现在当我编译项目时,编译器会在这行代码上抛出警告:
if #available(iOS 8.0, *) { ... }
Run Code Online (Sandbox Code Playgroud)
"对'iOSApplicationExtension'进行不必要的检查;最小部署目标确保后卫始终为真"
我检查了构建设置选项,发现没有切换来杀死swift警告.
我试图通过这一行单独定义iOSApplicationExtension版本目标,但没有成功:
if #available(iOS 8.0, iOSApplicationExtension 8.0, *) { ... }
Run Code Online (Sandbox Code Playgroud)
有没有办法压制这个烦人的消息?
我试图实现新的Notification Service Extension,但我遇到了问题.
在我的NotificationService.swift文件中,我有这样的代码:
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
print(bestAttemptContent.body)
contentHandler(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver …Run Code Online (Sandbox Code Playgroud) 我的应用程序的iOS Share Extension出了问题.我在共享扩展中有以下代码Info.plist.
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsWebPageWithMaxCount</key>
<integer>1</integer>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.share-services</string>
</dict>
Run Code Online (Sandbox Code Playgroud)
主要问题是Google Chrome,NYTimes,WSJ和许多其他应用中都没有显示扩展程序.所有这些都应该提供Web页面或Web URL.
我在某处读到了我必须将以下内容添加到NSExtensionActivationRule dict中.
<key>NSExtensionActivationSupportsText</key>
<true/>
Run Code Online (Sandbox Code Playgroud)
如果我添加,则共享扩展名会出现在上面列出的应用中,但只会将字符串返回到我的扩展程序.例如,如果我进入apple.com谷歌浏览器并使用我的共享扩展程序,它只是Apple作为我的扩展程序提供的字符串,我的应用程序并不真正支持.它应该提供某种类型的URL或类似的东西.在NYTimes应用程序中,它只会将文章的标题发送到扩展名.
扩展在Safari中完美运行.只是不确定第三方应用程序.
以下是在我的扩展程序的swift文件中接收URL的主要代码.
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
if let itemProvider = item.attachments?.first as? NSItemProvider {
if itemProvider.hasItemConformingToTypeIdentifier("public.url") {
itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: { (url, error) -> Void in
if let shareURL = url as? NSURL {
print (shareURL.absoluteString!)
Run Code Online (Sandbox Code Playgroud)
从那里我处理URL作为我的应用程序应该.
当我加入了NSExtensionActivationSupportsText选项我改变了上面的代码略有 …
Apple引入了新的扩展名"UNNotificationServiceExtension",但是如何从推送通知中启动它?
我读到服务扩展为有效负载提供端到端加密.
设置推送通知的有效负载需要哪个密钥?
如何识别有效负载以及如何从推送通知启动服务扩展?
ios-extensions ×10
ios ×9
swift ×4
core-data ×2
ios10 ×2
watchkit ×2
apple-watch ×1
cocoapods ×1
crashlytics ×1
sqlite ×1
swift2 ×1
xcode6 ×1