¿Cómo agregar la API de WeChat a un proyecto Swift?

Estoy intentando agregar la funcionalidad de compartir WeChat a mi proyecto. Sin embargo, los files SDK , la documentation , las guías de desarrollo y el proyecto de ejemplo están todos en Objective-C. Estoy escribiendo mi proyecto en Swift.

Lo que he probado

Agregué los siguientes files SDK a mi proyecto

libWeChatSDK.a WechatAuthSDK.h WXApi.h WXApiObject.h 

Intenté seguir el consejo sobre esta respuesta para usar un encabezado de puenteo.

MyProject-Bridging-Header.h

 #import "WXApi.h" 

Errores

Sin embargo, todavía no puedo usar la API de WeChat en mi código. Estoy recibiendo los siguientes errores:

WXApiObject.h

 - (void) setThumbImage:(UIImage *)image; // Expected a type 

WXApi.h

 +(BOOL) sendAuthReq:(SendAuthReq*) req viewController : (UIViewController*) viewController delegate:(id<WXApiDelegate>) delegate; // Expected a type 

Y

 <unknown>:0: error: failed to import bridging header '[my path]/MyProject-Bridging-Header.h' 

Pregunta

¿Alguien ha tenido éxito en el uso de la API WeChat con un proyecto Swift? Me encantaría ver una breve list de pasos o algunos ejemplos de código. No me importa si hay enlaces suplementarios para los resources chinos.

Vea la respuesta de @ chengsam para las actualizaciones más recientes de este process.

Cómo usar el SDK de WeChat en su proyecto Swift

Las instrucciones oficiales de los desarrolladores de WeChat en inglés parecen estar desactualizadas e incompletas. Las instrucciones en chino son mejores, pero solo tratan con Objective-C. Los pasos a continuación muestran cómo agregar el SDK WeChat (weixin 微 信) a su proyecto.

Solicite una ID de la aplicación WeChat

El sitio en inglés es dev.wechat.com . Sin embargo, nunca pude registrarme exitosamente en el sitio en inglés. Terminé usando el sitio chino: open.weixin.qq.com . Cómo hacerlo está más allá del scope de esta respuesta, pero si no sabes chino, Google Translate puede ayudarte. Tenga en count que probablemente también necesite un número de teléfono en China.

Una vez que se atesting su aplicación (solo tiene que describir su aplicación, no es necesario proporcionar un código binary o fuente), obtendrá una ID de la aplicación, que utilizará en su código.

Descargue el SDK de WeChat

Puede intentar usar el SDK desde el sitio en inglés, pero como las cosas parecen ser más actuales al momento de escribir esto en el sitio chino, ahí es donde descargué el SDK para estas instrucciones.

Descargué el SDK de esta página y el enlace para WeChat SDK versión 1.6.2 está aquí . Probablemente, querrás usar la versión más reciente, sea lo que sea que sea en el futuro.

Copie los files SDK en su proyecto Xcode

Por el bien de la organización, coloqué todos los files en el mismo grupo en mi browser de proyecto. (Los files reales aún se encuentran en la carpeta raíz del proyecto).

introduzca la descripción de la imagen aquí

Arreglo del fallo:

En el SDK 1.6.2, el problema descrito en la pregunta aparece y es resuelto por la respuesta de @ Anbu.Karthik . Simplemente agregue #import <UIKit/UIKit.h> a WXApiObject.h . (En realidad, puede replace #import <Foundation/Foundation.h> con él). Si está utilizando alguna versión de SDK después de 1.6.2, esto ya no puede ser un problema, por lo que quizás desee completar los demás pasos antes de modificar el Archivos SDK

Agregar un encabezado de puenteo

Tenga en count que varios de los files SDK son de cabecera Objective-C (.h). Para utilizarlos en su proyecto Swift, debe agregar un file de Encabezado de puente a su proyecto. Agregue un file nuevo (Archivo> Nuevo> Archivo …> iOS> Fuente> Archivo de encabezado) y YourProjectName-Bridging-Header.h .

Agregue la siguiente línea a este file.

 #import "WXApi.h" 

En mi proyecto, esta es la única línea en mi file de encabezado de puente porque es la única línea que necesita para el SDK de WeChat. (Hubo otras líneas de código generadas automáticamente cuando creé el file de encabezado, pero acabo de comentarlas porque no sabía qué hicieron. Volveré y editaré esta respuesta más adelante si descubrí que son útiles. )

Vea aquí , aquí , y aquí para get más ayuda con la adición de un encabezado de puenteo.

No es necesario importar ninguno de los files WeChat SDK en sus files de código Swift ahora.

Agregue los frameworks y bibliotecas necesarios

Vaya a la pestaña General de su proyecto y desplácese hasta Marcos y Bibliotecas Vinculadas . Haga clic en el button más (+) para agregar los frameworks y bibliotecas siguientes.

  • libc ++. tbd
  • CoreTelephony.framework
  • libsqlite3.tbd
  • libz.tbd
  • SystemConfiguration.framework
  • libWeChatSDK.a (Este debería estar allí si lo ha copydo en su proyecto).

Ahora debería verse así:

introduzca la descripción de la imagen aquí

El CoreTelephony se mencionó en el readme y el libc++ se mencionó en las instrucciones de installation del SDK en línea, pero no al revés. Acabo de agregarlos a ambos para estar seguro. Siéntase libre de dejar un comentario si alguno de estos no es realmente requerido.

Agregar esquema de URL

Vaya a la pestaña Información de su proyecto y expanda el elemento Tipos de URL .

Agregue un tipo en el que el identificador sea weixin y los Esquemas de URL sea el AppID que debería haber obtenido después de registrar su aplicación con WeChat.

introduzca la descripción de la imagen aquí

Editar AppDelegate

Edite su file AppDelegate.swift para que contenga las siguientes funciones. Asegúrese de usar su AppID en lugar del ejemplo uno. Aparte de eso, puedes copyr y pegar.

 import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, WXApiDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // WeChat: replace with your AppID WXApi.registerApp("wx68aa08d12b601234") return true } func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool { return WXApi.handleOpenURL(url, delegate: self) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return WXApi.handleOpenURL(url, delegate: self) } func onReq(req: BaseReq!) { // do optional stuff } func onResp(resp: BaseResp!) { // do optional stuff } // ... } 

Vea la aplicación de ejemplo de demostración para las cosas opcionales que puede hacer en onReq y onResp . (El enlace actual está aquí, pero si ese enlace está roto, busque la demo de ejemplo en los documentos oficiales del desarrollador de WeChat).

Editar Info.plist

Haga clic derecho en Info.plist y elija Abrir como> Código fuente. Luego agregue las siguientes dos keys antes del final </dict> :

 <key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> </array> <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

Según el léame incluido con el SDK, esto es necesario porque iOS 9 limita el acceso http.

Usa la API de WeChat

En este punto, debería poder comenzar a usar la API WeChat dentro de su código Swift. Posiblemente agregue un par de ejemplos API más tarde, pero lo siguiente es una testing de concepto.

Enviar un post de text

 let message = SendMessageToWXReq() message.text = "Hello WeChat" message.bText = true message.scene = 0 // WXSceneSession WXApi.sendReq(message) 

No pude usar el WXSceneSession definido por Objective-C, así que solo usé su valor integer. Probablemente haya una mejor solución, pero esto funciona por ahora.


Esta solución anterior fue probada con Xcode 7.2 e iOS 9.2.

Se esperaba un tipo -> para este error, compruebe una vez que la Documentación de Apple para UIImage está en UIKit , no Foundation . Los documentos ahora están dirigidos a Swift.

 @import UIKit; 

En el objective c.

 #import <UIKit/UIKit.h> 

que necesita en la parte superior de su file (tampoco es necesario importar la Fundación).

no se pudo importar el encabezado de puente -> se te hizo el pequeño error ve este enlace, te ayuda

La respuesta de Suragch describe cómo agregar WeChat API a su aplicación en detalle. Pero después de mi implementación, me di count de que el procedimiento puede ser más simple ahora. A continuación destacaré algunos de los cambios en comparación con esa respuesta. Puede consultar esa respuesta para get más detalles.

Descargue el SDK

Usando CocoaPods

 pod 'WechatOpenSDK' 

Manual

Descargue el SDK desde la página de resources . Hay dos versiones en el momento de la networkingacción, la primera incluye la function de pago y la segunda no. Elija el según su necesidad. Después de download, copie los files en su proyecto. Agregue los frameworks y bibliotecas requeridos de acuerdo con esa respuesta. Este paso no es necesario si instala usando CocoaPods.

Agregar encabezado de puente

Como WXApi está escrito en Objective-C, tenemos que crear un encabezado de puente para usarlo en proyectos Swift. Vea este enlace sobre cómo agregar un encabezado de puenteo.

Después de crear el encabezado de puenteo, inserte la siguiente línea:

 #import "WXApi.h" 

iOS 9 + cambios

En AppDelegate, los siguientes dos methods se utilizan antes de iOS 9:

 func application(application: UIApplication, handleOpenURL url: NSURL) -> Bool { return WXApi.handleOpenURL(url, delegate: self) } func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool { return WXApi.handleOpenURL(url, delegate: self) } 

En iOS 9, los dos methods anteriores están en desuso y se usa el siguiente:

 func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { return WXApi.handleOpen(url, delegate: self) } 

Editar Info.plist

En mi caso, solo se necesita lo siguiente:

 <key>LSApplicationQueriesSchemes</key> <array> <string>weixin</string> </array> 

Si no te funciona, agrega también lo siguiente:

 <key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

Extra

Para verificar si la aplicación WeChat está instalada en el teléfono, use el siguiente código:

 if WXApi.isWXAppInstalled() { // do something with WeChat... } else { // WeChat app is not installed, show error message }