Utilice Cocoapods con una extensión de aplicación

83

Estoy tratando de crear una extensión de aplicación de fotos en Xcode 6 Beta-6 que use bibliotecas cocoapods. El encabezado puente que crea Xcode para la extensión de la foto no puede ver nada de cocoapods.

Por ejemplo: #import <GPUImage/GPUImage.h>da como resultado el error "GPUImage/GPUImage.h" file not found.

Probé todas las rutas imaginables para la importación (con corchetes y comillas) y casi no tuve éxito. La excepción es que para vainas simples como SVProgressHUD, el siguiente truco horrible fea funciona: #import "../Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h".

Pero para GPUImage, entra en el GPUImage.hencabezado y decide que de repente no puede ver a GPUImageContext.hpesar de no tener ningún problema cuando se importa con el encabezado de puente para el código swift normal que no es parte de la extensión de la aplicación.

¿Cuál es la diferencia en la compilación de extensiones de aplicación que impide que el encabezado de puente se comporte de manera sensata?

Nota: He leído todas las posibles modificaciones de este tutorial y no es aplicable de inmediato, por si alguien piensa que ha encontrado la respuesta allí.

Además, el problema descrito en esta pregunta SO puede estar relacionado, pero hice esta pregunta de todos modos en caso de que mi problema sea específico de las extensiones de la aplicación.

DanBlakemore
fuente
esta es la solución adecuada para mí [Cocopoads también para widgets (u objetivos)] [1] [1]: stackoverflow.com/a/17850444/1415713
kurtanamo

Respuestas:

65

La forma correcta de hacer esto es actualizar su podfile para agregar solo 1 línea:

link_with 'yourApp', 'yourAppExtension'

y una actualización de pod debería resolver el problema.

LeChatNoir
fuente
3
¡Correcto! No puedo creer que no encontré esto.
DanBlakemore
1
¿Qué es la parte 'youAppExtension'?
Nate Uni
6
¿En qué parte del archivo de pod debo agregar esas líneas?
Dekel Maman
7
Como dijo @Sti, esto ya no funciona y devuelve el mensaje de error " PodfileArchivo no válido : [!] La especificación de link_withen el Podfile ahora no es compatible, utilice bloques de destino en su lugar ..."
Ryan
2
La especificación de link_withen el Podfile ahora no es compatible. Utilice bloques de destino en su lugar. Esta solución está obsoleta.
Mehul
85

EDITAR (2015/03/10)

Ver nueva respuesta aceptada. Lo probé en un nuevo proyecto y funcionó, aunque mis pods de prueba usaban sharedApplication, que no está permitida en las extensiones. El hecho de que hayan mostrado esos errores significa que está vinculado correctamente. ¡Así se hace @LeChatNoir!


Éxito.

La solución es la siguiente: una vez que tenga la extensión de su aplicación y su encabezado puente en un proyecto que use cocoapods y desee usar una de esas bibliotecas de cocoapods, intentar incluir la vaina como #import <GPUImage/GPUImage.h>fallará file not found.

Primero, asegúrese de decirle a la extensión de la aplicación (haga clic en el archivo de su proyecto, luego en el destino de la extensión) para vincular libPods.a, al igual que su destino de la aplicación.

A continuación, en su proyecto real (haga clic en el archivo de su proyecto, luego en el archivo del proyecto nuevamente en la sección "Proyecto" de la barra lateral interna) en la pestaña Información, establezca la configuración de la extensión para Debug, Release e Inhouse para usar la configuración de "Pods" del menú desplegable. Pod Install no hará esto por usted, por lo que deberá hacerlo usted mismo.

Por último, asegúrese de que tanto los objetivos del proyecto Pods como los objetivos de su proyecto tengan todas las arquitecturas que necesita para construir en la variable Arquitecturas válidas o obtendrá el siempre divertido error de símbolos indefinidos.

Esto debería funcionar y permitirle importar los pods de su elección como de costumbre.


EDITAR (2014/10/14): como un aparte, dado que también puede incluir archivos Objective-C desde su propio código de proyecto en la extensión Swift, debe asegurarse de que todos los .marchivos que coloque en el encabezado de puente también estén compilados por el destino de la extensión. Puede hacer esto desde el menú de fuentes de compilación para el destino o en el .mpropio archivo usando la sección "Membresía de destino" de la barra lateral derecha en Xcode.

DanBlakemore
fuente
He implementado sobre todos los pasos ... pero tengo un problema ... Símbolos indefinidos para la arquitectura armv7: "_OBJC_CLASS _ $ _ Location", referenciada desde: objc-class-ref en TodayViewController.o por favor ayúdenme. cómo resolverlo
Urmi
Tengo el archivo de importación "Location.h" y uso el método de clase + en la extensión de hoy ... entonces obtendré el problema anterior.
Urmi
1
¿Se aseguró de que el archivo también sea miembro del destino de la extensión? También verifique que está construyendo para la arquitectura correcta.
DanBlakemore
He comprobado que la arquitectura es correcta. pero archivo si no es miembro del destino de la extensión. pero ¿no puedo usar archivos que ya están en la aplicación?
Urmi
3
También tuve que poner $ (heredado) para OTHER_LD_FLAGS en la configuración de compilación de la extensión.
TWilly
70

Las respuestas anteriores funcionarán, pero solo quería un par de pods en mi extensión, así que hice lo siguiente en mi Podfile:

target '[Main App Target Name]' do
        pod ...
        pod ...
        pod ...
end

target '[Extension Target Name]' do
        pod ...
end

¡Y luego pod installlo haré!

julianwyz
fuente
2
La mejor respuesta. De esta manera no sobrecargo mi extensión de iOS con Pods innecesarios
marcelosalloum
¡Increíble! ¡Gracias!
user3427013
Esta es la respuesta perfecta. debido al error de xcode: la especificación de link_withen el Podfile ahora no es compatible, use bloques de destino en su lugar ..
Mehul
3

ingrese la descripción de la imagen aquí

link_with, ya no lo usarás.

PodfileArchivo no válido : [!] La especificación de link_withen el Podfile ahora no es compatible, utilice bloques de destino en su lugar ..

A continuación se muestra la respuesta perfecta, también probada.

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ‘9.0’
use_frameworks!
inhibit_all_warnings!

target 'DemoTodayWidget' do
    pod 'Reachability',                         '~> 3.2'
end

target 'My Widget' do
    pod 'Reachability',                         '~> 3.2'
end
Mehul
fuente