Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在另一个框架内添加框架(伞形框架)_Ios_Frameworks - Fatal编程技术网

Ios 如何在另一个框架内添加框架(伞形框架)

Ios 如何在另一个框架内添加框架(伞形框架),ios,frameworks,Ios,Frameworks,我已经使用构建了一个框架 我还得到了框架 我试图在我的内部实现第二个框架,根据我在苹果文档中读到的内容,生成的框架被称为“伞形框架” 我使用拖放功能在框架中添加了第二个框架,并验证它是否位于“链接二进制库”中 在我尝试在我的框架的一个类中进行下一次导入之后: #import <CrashReporter/CrashReporter.h> #导入 我收到一个错误,因为导入的框架不可见 我还看到了stackoverflow post: 更新 是否有人试图提取iOS的PLCrashR

我已经使用构建了一个框架

我还得到了框架

我试图在我的内部实现第二个框架,根据我在苹果文档中读到的内容,生成的框架被称为“伞形框架”

我使用拖放功能在框架中添加了第二个框架,并验证它是否位于“链接二进制库”中

在我尝试在我的框架的一个类中进行下一次导入之后:

#import <CrashReporter/CrashReporter.h>
#导入
我收到一个错误,因为导入的框架不可见

我还看到了stackoverflow post:

更新 是否有人试图提取iOS的PLCrashReporter类并将其集成到项目中


您可以找到我的尝试。

分发另一个框架的诱惑是可以理解的,但非常不鼓励。我将尝试解释为什么会这样(用论点),并提供一些对您的案例有帮助的很好的替代方案

伞形框架是供使用的,只有当您是这两个框架的分发者时,您才能完全控制它们,并且它们将一起分发

关于这个话题,苹果公司有一句流行的话,他们说他们不鼓励伞形框架

不要创建伞式框架

虽然可以使用Xcode创建伞形框架,但是 因此,对于大多数开发人员来说,这是不必要的,不推荐使用。苹果 使用伞形框架来掩盖 操作系统中的库。在几乎所有情况下,你都应该 能够将代码包含在单个标准框架包中。 或者,如果您的代码足够模块化,您可以创建 多个框架,但在这种情况下 模块将是最小的或不存在的,并且不应保证 为他们创造一把伞

首先,这里是大多数开发人员在这种情况下所做的,因为有许多框架依赖于其他框架

通知用户您的框架需要使用另一个第三方框架。这是完全标准的,在大多数情况下是预期的。然后在系统级链接到它。就这么简单。您的框架将找到第三方并正常运行,就像使用本机框架一样。以
UIKit
为例。要链接到第三方,请遵循下一节中的步骤。这当然可以用标准的方式完成,但是使用CocoaPods这样的工具会使项目更容易维护

要完全回答您的问题,请使用为您添加第三方框架,而不是以通常的方式添加第三方框架,因为您可能会遇到问题和复杂情况。通过这种方式,您消除了可能出现的问题,并且还获得了CocoaPods为您提供所需第三方的确切版本的额外好处

这是一个名为“CrashTest”的应用程序的CocoaPods播客文件

只是澄清一下,当您开发框架时,它仍然会添加到您的项目中并可见。这里最大的区别是,它将与您的框架分开分发,最终用户必须将这两个组件都添加到他们的项目中,才能使它们正常工作

以下是这样做的原因

例如,您希望在框架中包括
PLCrashReporter
。假设另一个框架供应商也希望将其包括在他们的框架中。使用这两个框架的应用程序将包含两次
PLCrashReporter
(作为每个伞形框架的一部分)。甚至可能是它的不同版本。这可能导致用户应用程序内部出现严重问题。如前一节所述,如果两个伞形框架都链接到PLCrashReporter,则完全可以避免此问题

我在上面提到的另一点是版本控制。分发伞式框架时,您需要能够控制所有相关框架的版本,并且您无法控制第三方框架。这将再次导致与上述问题类似的问题


我知道这种方法并不能直接回答这个问题,但它试图阻止一种不好的做法,同时指出了行业标准的做法。

苹果公司不鼓励你创建一个伞形框架,但仍然说它是可能的,所以我将重点关注如何实际做到这一点

我必须提到,如果您控制一个或多个框架,那么将它们捆绑到一个框架中并不是一个坏主意,可以帮助最终开发人员

现在在最新的Xcode(7及以上)上创建伞式框架非常简单

下面是如何做到这一点

首先创建一个框架:

#import <CrashReporter/CrashReporter.h>

CrashReporter.framework
拖动到伞形框架项目:

确保两个框架都正常工作的示例代码:

雨伞。h:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

@interface Umbrella : NSObject

+(void)sayHelloFromUmbrella;

@end
#import "Umbrella.h"
#import <CrashReporter/CrashReporter.h>

@implementation Umbrella

+(void)sayHelloFromUmbrella
{
    NSLog(@"Hey from Umbrella");
    PLCrashReporter *crashObject = [[PLCrashReporter alloc]initWithConfiguration:nil];
    NSLog(@"crashObject: %@",crashObject);
}

@end
将输出以下内容:

Hey from Umbrella 
crashObject: <PLCrashReporter: 0x7fb441d5c650>
嘿,雨伞
crashObject:

这告诉我们两个框架都在工作。

我试着按照@Segev的建议去做,但我一直收到一个错误,即嵌入的框架文件丢失了

然而,做一些额外的配置,我设法使它工作

以下是我所做的:

  • 在伞形框架项目中添加嵌入式框架头文件
  • 在伞形标题中添加:导入“EmbeddedFramework.h”
  • 然后将伞形框架导入到所需的项目中,您将不会得到更多错误
  • 您将看到伞形框架“Headers”文件夹将包含“EmbeddedFramework.h”文件

    您可以在此处看到一个示例项目:

    • 总括框架:
    • 示例应用程序:

    希望这有帮助这里有一个演示项目:

    所有答案都在这一行下
    Hey from Umbrella 
    crashObject: <PLCrashReporter: 0x7fb441d5c650>
    
    APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
    find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
    do
    FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
    FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
    BUNDLE_IN_ROOT="$APP_PATH/${FRAMEWORK_EXECUTABLE_NAME}.bundle"
    if [[ -e "$FRAMEWORK_EXECUTABLE_PATH" ]]; then
      FRAMEWORK_MACH_O="$(otool -a "$FRAMEWORK_EXECUTABLE_PATH" | head -n 1)"
      FRAMEWORK_FAT_ARCH="$(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")"
    else
      FRAMEWORK_MACH_O="NO EXIST"
      FRAMEWORK_FAT_ARCH="NO EXIST"
    fi
    echo "FRAMEWORK_EXECUTABLE_NAME is $FRAMEWORK_EXECUTABLE_NAME"
    echo "FRAMEWORK_EXECUTABLE_PATH is $FRAMEWORK_EXECUTABLE_PATH"
    echo "FRAMEWORK_MACH_O is $FRAMEWORK_MACH_O"
    echo "FRAMEWORK_FAT_ARCH is $FRAMEWORK_FAT_ARCH"
    echo "BUNDLE_IN_ROOT is $BUNDLE_IN_ROOT"
    if [[ "$FRAMEWORK_MACH_O" =~ "Archive :" ]]; then
      echo "Rmove Static-Mach-O is $FRAMEWORK_EXECUTABLE_PATH"
      rm "$FRAMEWORK_EXECUTABLE_PATH"
      defaults write "$FRAMEWORK/Info.plist" CFBundlePackageType "BNDL"
      defaults delete "$FRAMEWORK/Info.plist" CFBundleExecutable
      if [[ -d "$BUNDLE_IN_ROOT" ]]; then
        rm -rf "$BUNDLE_IN_ROOT"
      fi
      mv -f "$FRAMEWORK" "$BUNDLE_IN_ROOT"
    elif [[ "$FRAMEWORK_FAT_ARCH" =~ "Architectures in the fat file" ]]; then
      #statements
      EXTRACTED_ARCHS=()
      for ARCH in $ARCHS
      do
        echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
        lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
        EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
      done
      echo "Merging extracted architectures: ${ARCHS}"
      lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
      rm "${EXTRACTED_ARCHS[@]}"
      echo "Replacing original executable with thinned version"
      rm "$FRAMEWORK_EXECUTABLE_PATH"
      mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
    fi
    done