标签: ios-extensions

如何使用Frameworks,Extensions和CocoaPods构建Xcode项目

注意:这是一个更抽象和简化的问题子集.

随着Touch Frameworks的加入,ExtensionsApple Watch Xcode 6项目和工作区变得越来越复杂.

如果你将CocoaPods添加到这个组合中,事情开始变得几乎无法管理.

如何构建具有以下目标和依赖性的Xcode项目/工作区?(假设:我正在为所有组件使用Git,我使用CocoaPods用于所有第三方代码,我正在使用Xcode 6).

  • MyCoolApp
    • 通过CocoaPods的几个第三方UI库
    • MyCoolNetworking.framework,我作为Git子模块创建的框架(项目)
      • 通过CocoaPods进行AFNetworking
      • 其他数据处理代码通过CocoaPods
    • MyCoolAppBusinessLogic.framework,由app和所有扩展程序使用(如下)
      • 包括来自CocoaPods的一些常见于app和扩展的代码
    • MyCoolToadyView,一个TodayView扩展目标
    • MyCoolWatch,Apple Watch扩展目标

如您所见,这是一个复杂的结构,包括几个CocoaPods实例.有关如何解决任何或所有这些问题的任何建议都会有所帮助.

(我的计划是写下我自己的一些想法,然后综合其他人的答案,这无疑将是一份活文件).

ios-frameworks cocoapods xcode6 ios-extensions

47
推荐指数
1
解决办法
1617
查看次数

如何抑制`警告:链接对dylib不安全,无法在应用程序扩展中使用?

我有一个在iOS应用程序和扩展程序之间共享的动态框架.该框架中有一些代码引用UIApplication,当然,这些代码在扩展中不可用.这些电话是完全孤立的,所以我并不担心它们会导致我的分机出现问题.

由于警告消息中没有指定标志,可能无法执行此操作,但在构建项目时如何抑制 warning: linking against dylib not safe for use in application extensions

linker-warning ios ios-frameworks ios-extensions

38
推荐指数
4
解决办法
1万
查看次数

错误ITMS-90512:无效的sdk值... 8.2高于允许的最大值10.3?

尝试上传二进制文件,其中包括一个手表应用程序.我得到的错误(我几天前没有得到的)是LC_VERSION_MIN_IPHONEOS为watchkit扩展提供的值是8.2,它大于允许的最大值10.3 ...显然8.2> 10.3?

我更新到最新的XCode,8.3,没有解决问题.尝试更改手表应用和扩展程序的iOS部署目标,对消息没有明显影响.

ios apple-watch watchkit ios-extensions

38
推荐指数
2
解决办法
2697
查看次数

如何使用Crashlytics与iOS/OS X今天查看扩展?

由于今天扩展程序以一个独立的进程运行,我确信它们不会记录任何崩溃的开箱即用.我假设我们需要分别在小部件上初始化Crashlytics.例如在viewDidLoad方法中TodayViewController.

  • 是否有人在任何iOS/OS X扩展中使用Crashlytics?如果是这样,你是如何实现它的?
  • 我也想知道在Crashlytics中为扩展创建一个单独的应用程序是否有意义.

ios crashlytics osx-extensions today-extension ios-extensions

26
推荐指数
4
解决办法
7191
查看次数

如何在iOS App包含扩展和扩展(不是主机应用程序)之间进行通信

TLDR:是否可以在iOS App和它的Extension之间发送实时消息或通知?

我正在编写一个iOS应用程序,其扩展名是相同的,App Group并共享相同的CoreData(SQLite数据库).我可以使用App中的CoreData读取和写入数据库,并且从扩展程序中,它们共享相同的内容.

我的问题是:是否可以在应用程序和扩展程序之间发送消息或通知,以便在必要时通知对方更新?

我尝试发送通知,NSNotificationCenter但不会"退出"应用程序/扩展,如果我尝试写入共享的组NSUserDefaults并听取相同的问题NSUserDefaultsDidChangeNotification.这适用于应用程序,但扩展程序没有收到任何东西(当我知道它已启动并且它共享相同NSUserDefaults).知道如何让事情保持同步吗?

core-data nsnotificationcenter ios swift ios-extensions

23
推荐指数
3
解决办法
6711
查看次数

如何保证主机应用程序和扩展程序使用的共享应用程序容器中的Core Data存储中的唯一条目?

为了有效地提出我的问题,我们首先考虑一下我面临的确切情况:

常规设置

  • 主机iOS 8应用程序.
  • 与主机应用程序捆绑在一起的一个或多个iOS 8扩展(WatchKit,Share等).
  • 主机应用程序和所有扩展程序在共享应用程序组容器中共享相同的Core Data SQLite存储.
  • 每个app/extension都有自己的NSPersistentStoreCoordinator和NSManagedObjectContext.
  • 每个持久性存储协调器使用持久性存储,该存储在组容器中与所有其他持久性存储共享相同的SQLite资源.
  • 应用程序和所有扩展使用公共代码库来同步Internet上远程API资源的内容.

导致问题的事件顺序

  1. 用户启动主机应用程序.它开始从远程API资源获取数据.核心数据模型对象基于API响应创建,并"upserted"到主机应用程序的托管对象上下文中.每个API实体都有一个uniqueID,用于在远程API后端中标识它.通过"upsert",我的意思是,对于每个API实体,主机应用程序仅在无法找到给定唯一ID的现有条目时在Core Data中创建新条目.

  2. 同时,用户还启动了一个主机应用程序的扩展.它也可以从同一个远程API执行某种提取.它还尝试在解析API响应时执行"upsert".

  3. 问题:如果主机应用程序和扩展程序同时尝试为同一API实体插入Core Data条目,会发生什么?要了解这是如何产生的,让我们看看upsert的事件序列:

核心数据Upsert序列:

  1. API解析代码解析给定API实体的uniqueID.
  2. 解析器为与谓词匹配的任何条目执行核心数据提取,其中谓词uniqueID等于已解析的唯一ID.
  3. 如果找不到现有条目,则解析器会为此API实体插入新的Core Data条目,将其uniqueID属性设置为已解析的uniqueID.
  4. 解析器保存托管对象上下文,该上下文将新条目数据下推到SQLite后备存储.

问题详情

假设主机应用程序和扩展程序同时独立地解析同一API实体的API响应.如果主机应用程序和扩展程序在它们中的任何一个完成步骤4之前到达步骤3,则它们都将尝试为相同的唯一ID插入新的核心数据条目.当他们到达步骤4并调用save:他们各自的托管对象上下文时,Core Data将很乐意创建重复的条目.

据我所知,Core Data没有任何方法可以将属性标记为唯一.我需要一个等同于SQLite INSERT OR IGNORE+ UPDATE组合的核心数据..或者我需要一种方法来"锁定"持久存储的SQLite后备存储,这听起来像是一个麻烦的方法.

对iOS 8扩展引入的这个相当新颖的问题有一个已知的方法吗?

sqlite core-data ios watchkit ios-extensions

18
推荐指数
2
解决办法
3032
查看次数

警告:不必要的检查最低部署目标

我有一个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)

有没有办法压制这个烦人的消息?

suppress-warnings ios swift ios-extensions swift2

15
推荐指数
1
解决办法
4441
查看次数

iOS 10不会调用Notification Service Extension

我试图实现新的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 swift ios-extensions ios10

14
推荐指数
5
解决办法
9459
查看次数

iOS Share Extension未显示/无法接收URL

我的应用程序的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选项我改变了上面的代码略有 …

ios swift ios-extensions

12
推荐指数
1
解决办法
1724
查看次数

如何在iOS10中使用UNNotification的通知服务扩展

Apple引入了新的扩展名"UNNotificationServiceExtension",但是如何从推送通知中启动它?

我读到服务扩展为有效负载提供端到端加密.

设置推送通知的有效负载需要哪个密钥?

如何识别有效负载以及如何从推送通知启动服务扩展?

push-notification ios ios-extensions ios10

11
推荐指数
1
解决办法
1万
查看次数