如何将微信API添加到Swift项目中?
How to add the WeChat API to a Swift project?
我正在尝试添加 WeChat sharing functionality to my project. However the SDK files, documentation, development guides, and sample project 都在 Objective-C 中。我正在 Swift 中编写我的项目。
我试过的
我在我的项目中添加了以下SDK文件
libWeChatSDK.a
WechatAuthSDK.h
WXApi.h
WXApiObject.h
我尝试按照 this answer 上的建议使用桥接头。
MyProject-桥接-Header.h
#import "WXApi.h"
错误
但是,我的代码中仍然无法使用微信API。我收到以下错误:
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
和
<unknown>:0: error: failed to import bridging header '[my path]/MyProject-Bridging-Header.h'
问题
有没有人在Swift项目中成功使用微信API?我很想看到一个简短的步骤列表或一些示例代码。我不介意是否有中文资源的补充链接。
Expected a type --> for this error , check once the Apple Documentation for UIImage it's in UIKit
, not Foundation
. The docs are now all targeted at Swift.
@import UIKit;
在objective-c.
#import <UIKit/UIKit.h>
您需要在文件顶部(也不需要 Foundation 导入)。
failed to import bridging header --> you were made the small Mistake see this link, it helps you
请参阅 @chengsam's answer 了解此过程的最新更新。
如何在你的Swift项目中使用微信SDK
official WeChat developer English instructions seem to be out of date and incomplete. The Chinese instructions 更好,但只处理 Objective-C。下面的步骤展示了如何将微信 (weixin 微信) SDK 添加到您的项目中。
申请微信App ID
英文网站是dev.wechat.com. I was never able to successfully register on the English site, though. I ended up using the Chinese site: open.weixin.qq.com。如何做到这一点超出了这个答案的范围,但如果你不懂中文,Google 翻译会有所帮助。请注意,在中国您可能还需要一个 phone 号码。
您的应用通过审核后(您只需描述您的应用,无需提供二进制文件或源代码),您将获得一个应用 ID,您将在代码中使用该 ID。
下载微信SDK
您可以尝试使用英文站点上的 SDK,但由于在撰写本文时中文站点上的内容似乎更新,所以我从那里下载了这些说明的 SDK。
我从 this page and the link for WeChat SDK version 1.6.2 is here 下载了 SDK。不过,您可能希望使用最新版本,无论将来是什么版本。
将 SDK 文件复制到您的 Xcode 项目中
为了组织起见,我将所有文件放在项目导航器中的同一组中。 (实际文件仍在项目的根文件夹中。)
错误修复:
在 SDK 1.6.2 中,问题中描述的问题出现并由 @Anbu.Karthik's answer 解决。只需将 #import <UIKit/UIKit.h>
添加到 WXApiObject.h
。 (您实际上可以用它替换 #import <Foundation/Foundation.h>
。)如果您使用的是 1.6.2 之后的某些 SDK 版本,这可能不再是问题,因此您可能只想在修改 SDK 文件之前完成其他步骤。
添加桥接Header
请注意,有几个 SDK 文件是 Objective-C header (.h) 文件。为了在您的 Swift 项目中使用它们,您需要将桥接 Header 文件添加到您的项目中。添加一个新文件 (File > New > File... > iOS > Source > Header File ) 并将其命名为 YourProjectName-Bridging-Header.h
.
将以下行添加到此文件。
#import "WXApi.h"
在我的项目中,这是桥接 header 文件中唯一的一行,因为这是微信 SDK 所需的唯一一行。 (当我创建 header 文件时,还有一些其他自动生成的代码行,但我只是将它们注释掉,因为我不知道它们做了什么。如果我发现了,我会稍后回来编辑这个答案它们很有用。)
有关添加桥接的更多帮助,请参阅 here, here, and here。
现在您的Swift代码文件中无需导入任何WeChat SDK文件。
添加所需的框架和库
转到项目的常规 选项卡并向下滚动到链接框架和库。单击加号 (+) 按钮添加以下所需的框架和库。
- libc++.tbd
- CoreTelephony.framework
- libsqlite3.tbd
- libz.tbd
- SystemConfiguration.framework
- libWeChatSDK.a(如果你已经将它复制到你的项目中,这个应该已经存在了。)
现在应该是这样的:
自述文件中提到了CoreTelephony
,在线SDK安装说明中提到了libc++
,反之则不然。为了安全起见,我只是将它们都添加了。如果实际上不需要其中任何一个,请随时发表评论。
添加URL方案
转到项目的 Info 选项卡并展开 URL Types 项。
添加一个类型,identifier为weixin
,URL Schemes为微信注册成功后应该得到的AppID
编辑 AppDelegate
编辑您的 AppDelegate.swift 文件以包含以下函数。请务必使用您的 AppID 而不是示例 AppID。除此之外,您几乎可以复制和粘贴。
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
}
// ...
}
请参阅示例演示应用,了解您可以在 onReq
和 onResp
中执行的可选操作。 (目前的link是here,如果那个link坏了,那就去微信官方开发者文档找Sample Demo吧。)
编辑Info.plist
右键单击 Info.plist 并选择“打开方式”>“源代码”。然后在最后的</dict>
:
前添加如下两个key
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
根据 SDK 附带的自述文件,这是必要的,因为 iOS 9 限制了 http 访问。
使用微信API
此时您应该可以在您的 Swift 代码中开始使用微信 API。稍后我可能会添加更多 API 个示例,但以下是概念证明。
发送短信
let message = SendMessageToWXReq()
message.text = "Hello WeChat"
message.bText = true
message.scene = Int32(WXSceneSession.rawValue) // WXSceneSession
WXApi.sendReq(message)
我无法使用 Objective-C 定义的枚举 WXSceneSession
,所以我只使用了它的整数值。可能有更好的解决方案,但目前有效。
上面的解决方案是用 Xcode 7.2 和 iOS 9.2 测试的
Suragch's answer 详细介绍了如何将微信 API 添加到您的应用程序。但是在实施之后,我发现现在的过程可以更简单。下面我将重点介绍与该答案相比的一些变化。您可以参考该答案了解更多详情。
下载SDK
使用 CocoaPods
pod 'WechatOpenSDK'
手动
从 Resource Page 下载 SDK。在撰写本文时有两个版本,第一个包含支付功能,第二个不包含。根据您的需要选择一个。下载后,将文件复制到您的项目中。根据该答案添加所需的框架和库。如果您使用 CocoaPods 安装,则不需要此步骤。
添加桥接header
由于WXApi
写在Objective-C中,我们必须创建一个桥接header才能在Swift项目中使用它。请参阅 this link 了解如何添加桥接 header。
创建桥接 header 后,插入以下行:
#import "WXApi.h"
iOS 9+ 变化
在AppDelegate中,iOS9之前使用了以下两个方法:
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)
}
在iOS9中,以上两种方法已弃用,使用以下一种:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return WXApi.handleOpen(url, delegate: self)
}
编辑Info.plist
在我的例子中,只需要以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
如果它不适合您,请添加以下内容:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
额外
要检查phone上是否安装了微信应用程序,请使用以下代码:
if WXApi.isWXAppInstalled() {
// do something with WeChat...
} else {
// WeChat app is not installed, show error message
}
我正在尝试添加 WeChat sharing functionality to my project. However the SDK files, documentation, development guides, and sample project 都在 Objective-C 中。我正在 Swift 中编写我的项目。
我试过的
我在我的项目中添加了以下SDK文件
libWeChatSDK.a
WechatAuthSDK.h
WXApi.h
WXApiObject.h
我尝试按照 this answer 上的建议使用桥接头。
MyProject-桥接-Header.h
#import "WXApi.h"
错误
但是,我的代码中仍然无法使用微信API。我收到以下错误:
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
和
<unknown>:0: error: failed to import bridging header '[my path]/MyProject-Bridging-Header.h'
问题
有没有人在Swift项目中成功使用微信API?我很想看到一个简短的步骤列表或一些示例代码。我不介意是否有中文资源的补充链接。
Expected a type --> for this error , check once the Apple Documentation for UIImage it's in
UIKit
, notFoundation
. The docs are now all targeted at Swift.
@import UIKit;
在objective-c.
#import <UIKit/UIKit.h>
您需要在文件顶部(也不需要 Foundation 导入)。
failed to import bridging header --> you were made the small Mistake see this link, it helps you
请参阅 @chengsam's answer 了解此过程的最新更新。
如何在你的Swift项目中使用微信SDK
official WeChat developer English instructions seem to be out of date and incomplete. The Chinese instructions 更好,但只处理 Objective-C。下面的步骤展示了如何将微信 (weixin 微信) SDK 添加到您的项目中。
申请微信App ID
英文网站是dev.wechat.com. I was never able to successfully register on the English site, though. I ended up using the Chinese site: open.weixin.qq.com。如何做到这一点超出了这个答案的范围,但如果你不懂中文,Google 翻译会有所帮助。请注意,在中国您可能还需要一个 phone 号码。
您的应用通过审核后(您只需描述您的应用,无需提供二进制文件或源代码),您将获得一个应用 ID,您将在代码中使用该 ID。
下载微信SDK
您可以尝试使用英文站点上的 SDK,但由于在撰写本文时中文站点上的内容似乎更新,所以我从那里下载了这些说明的 SDK。
我从 this page and the link for WeChat SDK version 1.6.2 is here 下载了 SDK。不过,您可能希望使用最新版本,无论将来是什么版本。
将 SDK 文件复制到您的 Xcode 项目中
为了组织起见,我将所有文件放在项目导航器中的同一组中。 (实际文件仍在项目的根文件夹中。)
错误修复:
在 SDK 1.6.2 中,问题中描述的问题出现并由 @Anbu.Karthik's answer 解决。只需将 #import <UIKit/UIKit.h>
添加到 WXApiObject.h
。 (您实际上可以用它替换 #import <Foundation/Foundation.h>
。)如果您使用的是 1.6.2 之后的某些 SDK 版本,这可能不再是问题,因此您可能只想在修改 SDK 文件之前完成其他步骤。
添加桥接Header
请注意,有几个 SDK 文件是 Objective-C header (.h) 文件。为了在您的 Swift 项目中使用它们,您需要将桥接 Header 文件添加到您的项目中。添加一个新文件 (File > New > File... > iOS > Source > Header File ) 并将其命名为 YourProjectName-Bridging-Header.h
.
将以下行添加到此文件。
#import "WXApi.h"
在我的项目中,这是桥接 header 文件中唯一的一行,因为这是微信 SDK 所需的唯一一行。 (当我创建 header 文件时,还有一些其他自动生成的代码行,但我只是将它们注释掉,因为我不知道它们做了什么。如果我发现了,我会稍后回来编辑这个答案它们很有用。)
有关添加桥接的更多帮助,请参阅 here, here, and here。
现在您的Swift代码文件中无需导入任何WeChat SDK文件。
添加所需的框架和库
转到项目的常规 选项卡并向下滚动到链接框架和库。单击加号 (+) 按钮添加以下所需的框架和库。
- libc++.tbd
- CoreTelephony.framework
- libsqlite3.tbd
- libz.tbd
- SystemConfiguration.framework
- libWeChatSDK.a(如果你已经将它复制到你的项目中,这个应该已经存在了。)
现在应该是这样的:
自述文件中提到了CoreTelephony
,在线SDK安装说明中提到了libc++
,反之则不然。为了安全起见,我只是将它们都添加了。如果实际上不需要其中任何一个,请随时发表评论。
添加URL方案
转到项目的 Info 选项卡并展开 URL Types 项。
添加一个类型,identifier为weixin
,URL Schemes为微信注册成功后应该得到的AppID
编辑 AppDelegate
编辑您的 AppDelegate.swift 文件以包含以下函数。请务必使用您的 AppID 而不是示例 AppID。除此之外,您几乎可以复制和粘贴。
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
}
// ...
}
请参阅示例演示应用,了解您可以在 onReq
和 onResp
中执行的可选操作。 (目前的link是here,如果那个link坏了,那就去微信官方开发者文档找Sample Demo吧。)
编辑Info.plist
右键单击 Info.plist 并选择“打开方式”>“源代码”。然后在最后的</dict>
:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
根据 SDK 附带的自述文件,这是必要的,因为 iOS 9 限制了 http 访问。
使用微信API
此时您应该可以在您的 Swift 代码中开始使用微信 API。稍后我可能会添加更多 API 个示例,但以下是概念证明。
发送短信
let message = SendMessageToWXReq()
message.text = "Hello WeChat"
message.bText = true
message.scene = Int32(WXSceneSession.rawValue) // WXSceneSession
WXApi.sendReq(message)
我无法使用 Objective-C 定义的枚举 WXSceneSession
,所以我只使用了它的整数值。可能有更好的解决方案,但目前有效。
上面的解决方案是用 Xcode 7.2 和 iOS 9.2 测试的
Suragch's answer 详细介绍了如何将微信 API 添加到您的应用程序。但是在实施之后,我发现现在的过程可以更简单。下面我将重点介绍与该答案相比的一些变化。您可以参考该答案了解更多详情。
下载SDK
使用 CocoaPods
pod 'WechatOpenSDK'
手动
从 Resource Page 下载 SDK。在撰写本文时有两个版本,第一个包含支付功能,第二个不包含。根据您的需要选择一个。下载后,将文件复制到您的项目中。根据该答案添加所需的框架和库。如果您使用 CocoaPods 安装,则不需要此步骤。
添加桥接header
由于WXApi
写在Objective-C中,我们必须创建一个桥接header才能在Swift项目中使用它。请参阅 this link 了解如何添加桥接 header。
创建桥接 header 后,插入以下行:
#import "WXApi.h"
iOS 9+ 变化
在AppDelegate中,iOS9之前使用了以下两个方法:
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)
}
在iOS9中,以上两种方法已弃用,使用以下一种:
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return WXApi.handleOpen(url, delegate: self)
}
编辑Info.plist
在我的例子中,只需要以下内容:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>weixin</string>
</array>
如果它不适合您,请添加以下内容:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
额外
要检查phone上是否安装了微信应用程序,请使用以下代码:
if WXApi.isWXAppInstalled() {
// do something with WeChat...
} else {
// WeChat app is not installed, show error message
}