1.前言

在公司参与了多个应用三方平台的开发,涉及微信、微博、QQ、Facebook、meetup等,总结一下一般的接入三方平台SDK方法。

2.接入三方SDK

任何应用要接入三方平台,都需要在该平台上填写应用相关信息,创建应用。比如,bundle等。

I)微博
1)创建应用

创建好微博应用之后,就可以获得微博的App Key和App Secret,需要设置回调页面的可以到高级设置中设置。
创建完应用之后,还要上传应用图标以及宣传海报。宣传海报比较蛋疼,一定要体现应用和微博的关系,否则不会过审,但App Key是可以用的,AppKey主要是用于应用中的scheme打开微博,同样,其他平台的App Key的作用也是如此。

2)下载SDK

接入微博,可以下载SDK,利用SDK中提供的方法集成分享
https://github.com/sinaweibosdk/weibo_ios_sdk
也可以用微博提供的API http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI 进行数据交互
直接用API相对麻烦点,所以还是SDK吧少年。
下载完SDK就可以直接拖进项目了。我的习惯是,在项目文件夹中创建一个新的文件目录存放SDK,然后在项目中add进去。这样的好处是,你不用担心link的path出问题,而且Xcode会自动添加这些文件到项目的bundle中,避免出现各种architecture的错误。

3)添加URL TYPE

可以在Targets->Info->URL Types中添加微博的scheme,也可以到info.plist中修改,open as source code打开,修改plist的xml 。

补充:plist是键值对的形式,其中URL Types的key为CFBundleURLTypes,值得类型为数组。例如下面的XML

<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>weixin</string>
<key>CFBundleURLSchemes</key>
<array>
<string>微信的app ID</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>com.weibo</string>
<key>CFBundleURLSchemes</key>
<array>
<string>wb微博的App key</string>
</array>
</dict>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>tencent</string>
<key>CFBundleURLSchemes</key>
<array>
<string>tencentQQ的 App ID</string>
</array>
</dict>
</array>

这里,补充一下,微博的scheme的URL形式是 wb+微博的App key;微信的URL的scheme就是  微信的AppID;QQ的URL的scheme为 tencent+QQ的App ID。

4)适配iOS9

升级iOS 9之后,苹果为了保证用户的隐私安全,采用了安全传输协议,所以,要在info.plist设置一些属性。具体如下。

 <!-- URL 白名单 -->
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
<string>sinaweibohd</string>
<string>sinaweibo</string>
<string>sinaweibosso</string>
<string>weibosdk</string>
<string>weibosdk2.5</string>
<string>mqqapi</string>
<string>mqq</string>
<string>mqqOpensdkSSoLogin</string>
<string>mqqconnect</string>
<string>mqqopensdkdataline</string>
<string>mqqopensdkgrouptribeshare</string>
<string>mqqopensdkfriend</string>
<string>mqqopensdkapi</string>
<string>mqqopensdkapiV2</string>
<string>mqqopensdkapiV3</string>
<string>mqzoneopensdk</string>
<string>wtloginmqq</string>
<string>wtloginmqq2</string>
<string>mqqwpa</string>
<string>mqzone</string>
<string>mqzonev2</string>
<string>mqzoneshare</string>
<string>wtloginqzone</string>
<string>mqzonewx</string>
<string>mqzoneopensdkapiV2</string>
<string>mqzoneopensdkapi19</string>
<string>mqzoneopensdkapi</string>
<string>mqzoneopensdk</string>
<string>alipay</string>
<string>alipayshare</string>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
<!-- http请求 -->
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sina.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sina.com.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sinaimg.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>sinajs.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>weibo.cn</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>weibo.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>

5)引入framework

三方平台的sdk中需要苹果的基本框架,为避免报错直接引入。以下是整理的微博、微信、QQ等需要引入的framework。

在Targets->Build Phases->Link Binary With Libraries中添加QuartzCore.framework、ImageIO.framework、SystemConfiguration.framework、
Security.framework、CoreTelephony.framework、CoreText.framework、 UIKit.framework、Foundation.framework、CoreGraphics.framework 、libz.dylib、 libsqlite3.dylib、SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib,libc++.dylib,
”Security.framework”, “libiconv.dylib”,“SystemConfiguration.framework”,“CoreGraphics.Framework”、“libsqlite3.dylib”、“CoreTelephony.framework”、“libstdc++.dylib”、“libz.dylib”。

以上的framework加入工程之后,微信、微博、QQ等平台不会报错。

6)设置link flags

程序 Target->Buid Settings->Linking 下 Other Linker Flags 项添加-ObjC。
II)微信SDK接入 III)QQ SDK接入 暂不赘述。参照微博。

微信的开放平台: https://open.weixin.qq.com

微博的开放平台:http://open.weibo.com

QQ的开放平台:http://open.qq.com/

切记,任何三方平台都需要先在该平台创建应用,填写相关信息,上传应用图标。

3.分享的通用单例

I)创建通用分享单例

创建新的Objective-C文件,在头文件中设置分享平台类型,三方平台应用相关宏定义,具体如下。

#import "NYShareObject.h"

/**
* 分享类型:微信、朋友圈、微博、QQ
*/
typedef NS_ENUM(NSInteger, NYShareType) {
NYShareTypeQQ, /**< QQ */
NYShareTypeWeChatSession, /**< 微信好友对话 */
NYShareTypeWeChatMomemts, /**< 微信朋友圈 */
NYShareTypeWeibo, /**< 新浪微博 */
};
/**
* 错误码类型
**/
typedef NS_ENUM(NSInteger, NYErrorCode) {
NYErrorCodeShareWeibo,
NYErrorCodeShareWeChatMoments,
NYErrorCodeShareWeChatSession,
}; typedef void(^NYShareComletion)(NSError *error, id response);/**< 回调 */
/**
* 出错域
**/
#define ERROR_DOMAIN_SHARE_WEIBO @"WEIBO_SHARE"
#define ERROR_DOMAIN_SHARE_WECHAT_MOMENTS @"WECHAT_MOMENTS"
#define ERROR_DOMAIN_SHARE_WECHAT_SESSION @"WECHAT_SESSION" //三方平台注册应用 ///--- 微信 ---
#define WX_APP_ID @"微信应用的App ID"
#define WX_APP_SECRET @"微信应用的App Secret" ///--- 微博 ---
#define WB_APP_KEY @"微博应用的App Key"
#define WB_APP_SECRET @"微博应用的App Secret"
#define WB_REDIRECT_URL @"微博应用的回调接口" //QQ 创友
#define QQ_APP_ID @"QQ的App ID"
#define QQ_APP_KEY @"QQ的App Key" /**
* 三方分享类
**/
@interface NYShareEngine : NSObject <WBHttpRequestDelegate, WeiboSDKDelegate, WXApiDelegate> @property (strong, nonatomic) NSString *WeiboToken; /**< weibo token*/
@property (strong, nonatomic) NSString *WeChatToken;/**< wechat */
@property (strong, nonatomic) NSString *WeChatRefreshToken;/**< wechat */ @end

解释:

a)以上代码中NYShareType用于区分分享的类型;

b)出错域以及出错码用于自定义NSError对象,方便查找错误。

c)NYShareComletion用于回调方法。

d)单例须要遵从微信微博的协议,以便对请求和响应、应用代理做数据处理。

e)NYShareObject 是用于分享的数据模型,比如同样是由标题、内容、图片等信息,分享到不同平台具体的分享的对象形式不一样,在这个文件中集成。在这个文件中,引入了需要的SDK头文件,如

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "WeiboSDK.h"
#import "WXApi.h"
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/QQApiInterfaceObject.h>
#import <TencentOpenAPI/TencentOAuthObject.h>
#import <TencentOpenAPI/TencentOAuth.h>

II)公有方法

在共享单例的头文件中加入以下代码

+ (instancetype)sharedEngine;/**< 单例 */
- (void)registerApp;/**< 注册应用 */
/**
* 分享统一方法
* @param shareType 分享类型,包括QQ、微信好友、微信朋友圈、微博 @see NYShareType
* @param object 分享的图文对象
* @param completion 回调函数
**/
- (void)shareWithShareType:(NYShareType)shareType object:(NYShareObject *)object completion:(NYShareComletion)completion; #pragma mark - delegate
/**
* 分享打开三方应用代理回调方法
**/
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url;
/**
* 分享打开三方应用代理回调方法
**/
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation;

III)单例方法

如果做通用分享的业务功能,可以创建单例,不仅可以降低内存损耗,也能统一进行不同平台的分享操作,减少代码量,也使项目结构更清晰。

+ (instancetype)sharedEngine {
static NYShareEngine *share = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
share = [[self alloc] init];
});
return share;
}

以上是单例方法,然后重写init方法,这样在创建单例的时候会被调用。

- (instancetype)init {
self = [super init];
if (self) { }
return self;
}

IV)注册应用

如果要使用三方平台的SDK方法,第一步要做的就是注册应用,具体如下。

- (void)registerApp {
[WeiboSDK registerApp:WB_APP_KEY];
[WeiboSDK enableDebugMode:NO];
[WXApi registerApp:WX_APP_ID];
[[TencentOAuth alloc] initWithAppId:QQ_APP_ID andDelegate:nil]; }

V)通用分享方法

- (void)shareWithShareType:(NYShareType)shareType object:(NYShareObject *)object completion:(NYShareComletion)completion {
self.completion = completion;
self.shareType = shareType;
self.shareObject = object;
[self shareRequest:shareType];
} - (void)shareRequest:(NYShareType)shareType {
switch (shareType) {
case NYShareTypeQQ: {
SendMessageToQQReq *request = [SendMessageToQQReq reqWithContent:[self.shareObject QQNewsObject]];
[QQApiInterface sendReq:request];
break;
}
case NYShareTypeWeChatSession:
case NYShareTypeWeChatMomemts: { SendMessageToWXReq *req = [[SendMessageToWXReq alloc] init];
req.bText = NO;
req.message = [self.shareObject WeChatMessageObject];
req.scene = (self.shareType == NYShareTypeWeChatSession)?WXSceneSession:WXSceneTimeline;
[WXApi sendReq:req]; break;
}
case NYShareTypeWeibo: {
WBAuthorizeRequest *request = [[WBAuthorizeRequest alloc] init];
request.redirectURI = WB_REDIRECT_URL;
request.scope = @"all";
WBSendMessageToWeiboRequest *sendMsg = [WBSendMessageToWeiboRequest requestWithMessage:[self.shareObject WeiboMessageObject] authInfo:request access_token:self.WeiboToken];
[WeiboSDK sendRequest:sendMsg];
break;
}
default:
break;
}
}

解释:

a)- (void)shareWithShareType:(NYShareType)shareType object:(NYShareObject *)object completion:(NYShareComletion)completion方法是通用分享方法,设置分享单例的具体分享类型、分享的对象以及分享后的回调函数。

b)- (void)shareRequest:(NYShareType)shareType方法调用SDK分享方法,整合在一个方法中,私有方法。

VI)微博、微信响应及请求的协议方法

#pragma mark - weibo delegate
- (void)didReceiveWeiboRequest:(WBBaseRequest *)request { } - (void)didReceiveWeiboResponse:(WBBaseResponse *)response {
if ([response isKindOfClass:[WBAuthorizeResponse class]]) {
//获得授权响应
WBAuthorizeResponse *autorize = (WBAuthorizeResponse *)response;
self.WeiboToken = autorize.accessToken;
if (self.WeiboToken.length != ) {
//获得认证口令
if (self.completion != nil) {
self.completion(nil, nil);
}
} else {
NSError *fail = [NSError errorWithDomain:ERROR_DOMAIN_SHARE_WEIBO code:NYErrorCodeShareWeibo userInfo:@{NSLocalizedDescriptionKey: @"获得授权失败!"}];
if (self.completion != nil) {
self.completion(fail, nil);
}
}
} else if ([response isKindOfClass:[WBSendMessageToWeiboResponse class]]) { }
} #pragma mark - wechat delegate - (void)onReq:(BaseReq *)req { } - (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[SendMessageToWXResp class]]) {
//微信响应的方法
} }

VII)appdelegate的代理方法

#pragma mark - application delegate 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
BOOL result = NO;
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"wb%@", WB_APP_KEY]]) {
//微博
result = [WeiboSDK handleOpenURL:url delegate:self];
} else if ([url.scheme isEqualToString:[NSString stringWithFormat:@"%@", WX_APP_ID]]) {
result = [WXApi handleOpenURL:url delegate:self];
} else if ([url.scheme isEqualToString:[NSString stringWithFormat:@"tencent%@", QQ_APP_ID]]) {
result = [TencentOAuth HandleOpenURL:url];
}
return result;
} - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
BOOL result = NO;
if ([url.scheme isEqualToString:[NSString stringWithFormat:@"wb%@", WB_APP_KEY]]) {
//微博
result = [WeiboSDK handleOpenURL:url delegate:self];
} else if ([url.scheme isEqualToString:[NSString stringWithFormat:@"%@", WX_APP_ID]]) {
result = [WXApi handleOpenURL:url delegate:self];
} else if ([url.scheme isEqualToString:[NSString stringWithFormat:@"tencent%@", QQ_APP_ID]]) {
result = [TencentOAuth HandleOpenURL:url];
}
return result;
}

根据URL的scheme判断是打开的哪个应用,并返回BOOL值

4.分享对象的内容类

I)头文件

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "WeiboSDK.h"
#import "WXApi.h"
#import <TencentOpenAPI/QQApiInterface.h>
#import <TencentOpenAPI/QQApiInterfaceObject.h>
#import <TencentOpenAPI/TencentOAuthObject.h>
#import <TencentOpenAPI/TencentOAuth.h> #define SHARE_BASE_URL @""
/**
* 分享对象类型
**/
typedef NS_ENUM(NSInteger, NYShareObjectType) {
NYShareObjectTypeProject,/**< 分享HTM项目 */
NYShareObjectTypeActivity,/**< 分享HTM活动 */
NYShareObjectTypeInvestor,/**< 分享HTM投资人 */
};
/**
* 分享的对象
* @description 分享类型:项目、活动、投资人;
**/
@interface NYShareObject : NSObject
@property (strong, nonatomic) NSString *title; /**< 分享的标题[项目名称|活动名称|投资人姓名] */
@property (strong, nonatomic) NSString *content; /**< 分享的内容[项目简介|活动地点-时间|投资人简介] */
@property (strong, nonatomic) NSString *shareImageURL; /**< 分享的图片URL */
@property (strong, nonatomic) UIImage *shareImage; /**< 分享的图片对象[项目Logo|活动Logo|投资人头像] */
@property (strong, nonatomic) NSString *shareURL; /**< 分享的网页URL */
@property (assign, nonatomic) NYShareObjectType objectType;/**< 分享内容的类型[项目、活动、投资人] */
@property (strong, nonatomic) NSNumber *shareID; /**< URL的ID */
@property (strong, nonatomic) NSString *location; /**< 活动地点 */
@property (strong, nonatomic) NSString *date; /**< 活动时间 */
- (WBMessageObject *)WeiboMessageObject;/**< 获得微博分享的对象 */
- (WXMediaMessage *)WeChatMessageObject;/**< 获得分享到微信的对象 */
- (QQApiNewsObject *)QQNewsObject; /**< 分享QQ新闻链接 */
@end

解释:

a)NYShareObjectType是自定义分享对象的类型,视具体项目而定。我负责的项目中,需要分享项目、投资人以及活动资讯等内容,因此这样定义。自己创建可作调整。

II)具体实现

#import "NYShareObject.h"

@implementation NYShareObject

@synthesize objectType = _objectType;

- (void)setObjectType:(NYShareObjectType)objectType {
switch (objectType) {
case NYShareObjectTypeProject: {
self.title = [NSString stringWithFormat:@"合投猫推荐项目[%@]", _title];
self.content = [NSString stringWithFormat:@"%@", _content];
self.shareURL = [NSString stringWithFormat:@"%@/share/proj?id=%@&from=appshare", SHARE_BASE_URL, _shareID];
self.shareImage = _shareImage; break;
}
case NYShareObjectTypeActivity: {
self.title = [NSString stringWithFormat:@"合投猫活动[%@]", _title];
self.content = [NSString stringWithFormat:@"%@ %@", _location, _date];
self.shareURL = [NSString stringWithFormat:@"%@/act/act_details/?id=%@&from=appshare", SHARE_BASE_URL, _shareID];
self.shareImage = _shareImage;
break;
}
case NYShareObjectTypeInvestor: {
self.title = [NSString stringWithFormat:@"合投猫推荐投资人[%@]", _title];
self.content = [NSString stringWithFormat:@"%@", _content];
self.shareURL = [NSString stringWithFormat:@"%@/share/invester?id=%@&from=appshare", SHARE_BASE_URL, _shareID];
self.shareImage = _shareImage;
break;
}
default:
break;
}
} - (WBMessageObject *)WeiboMessageObject {
//!!!判断为空等情况
WBImageObject *imageObj = [WBImageObject object];
imageObj.imageData = UIImageJPEGRepresentation(self.shareImage, ); WBMessageObject *message = [WBMessageObject message];
message.text = [NSString stringWithFormat:@"%@:%@。分享链接:%@", self.title, self.content, self.shareURL];
message.imageObject = imageObj; return message;
} - (WXMediaMessage *)WeChatMessageObject {
WXMediaMessage *message = [WXMediaMessage message];
message.title = [NSString stringWithFormat:@"%@", self.title];
message.description = (self.content.length > )?[self.content substringToIndex:]:self.content; if (self.shareImage != nil) {
//!!!需要压缩
NSData *imgData = UIImageJPEGRepresentation(self.shareImage, );
UIImage *smallImage = [UIImage imageWithData:imgData];
[message setThumbImage:smallImage];
} WXWebpageObject *ext = [WXWebpageObject object];
ext.webpageUrl = [NSString stringWithFormat:@"%@", self.shareURL];
message.mediaObject = ext;
return message;
} - (QQApiNewsObject *)QQNewsObject {
NSURL *previewURL = [NSURL URLWithString:self.shareImageURL];
NSURL *url = [NSURL URLWithString:self.shareURL]; QQApiNewsObject *obj = [QQApiNewsObject objectWithURL:url title:self.title description:self.content previewImageURL:previewURL];
return obj;
} @end

5.使用方法。

I)在appdelegate的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法或者试图控制器的

- (void)viewDidLoad方法中调用注册应用方法

两者都可,但一定要调用,否则SDK方法不能被调用

[[NYShareEngine sharedEngine] registerApp];

II)创建分享对象。

如在

- (void)viewDidLoad方法中创建

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. [[NYShareEngine sharedEngine] registerApp];
self.shareObject = [[NYShareObject alloc] init];
self.shareObject.title = @"我是好人";
self.shareObject.shareImage = [UIImage imageNamed:@"a.jpg"];
self.shareObject.shareImageURL = @"http://p2.wmpic.me/article/2015/03/16/1426483393_yCesCgkT.jpeg";
self.shareObject.shareID = @;
self.shareObject.content = @"自己给自己发好人卡~";
self.shareObject.location = @"上海市浦东新区商城路";
self.shareObject.date = @"2015-12-12";
self.shareObject.objectType = NYShareObjectTypeActivity; }

III)创建Button关联时间方法

- (IBAction)wechatPay:(id)sender {

    [[NYPaymentManager defaultManager] payForType:NYPaymentTypeWeChat paymentObject:self.paymentObject completion:^(NSError *error, id requestObject, id responseObject) {
if (error != nil) {
NSLog(@"Domain:%@\n Description:%@\n request:%@\n", error.domain, error.description, requestObject); } else {
NSLog(@"%@", responseObject);
}
}]; } - (IBAction)shareToWeibo:(id)sender {
[[NYShareEngine sharedEngine] shareWithShareType:NYShareTypeWeibo object:self.shareObject completion:^(NSError *error, id response) { }]; } - (IBAction)shareToQQ:(id)sender {
[[NYShareEngine sharedEngine] shareWithShareType:NYShareTypeQQ object:self.shareObject completion:nil];
} - (IBAction)shareToWeChatMoments:(id)sender { [[NYShareEngine sharedEngine] shareWithShareType:NYShareTypeWeChatMomemts object:self.shareObject completion:^(NSError *error, id response) {
if (error != nil) { } else { }
}]; }
- (IBAction)shareToWeChatSession:(id)sender {
[[NYShareEngine sharedEngine] shareWithShareType:NYShareTypeWeChatSession object:self.shareObject completion:^(NSError *error, id response) {
if (error != nil) { } else { }
}];
}

6.具体项目地址

https://github.com/leo90821/NYLib

7.总结

1)一开始做三方平台的分享、登录、支付功能会觉得很头大,根本原因是不看开发文档,或者说不仔细看官方开发文档导致的。心态很重要。

2)若文中有错误,望批评指正,我的QQ 1034586012,欢迎交流.

3)下一篇将介绍微信支付的开发方法

iOS开发总结--三方平台开发之分享的更多相关文章

  1. iOS开发总结--三方平台开发之微信支付

    1.前言 现在很多应用都有支付功能,支付也是开发中比较麻烦的一个部分.其实,最麻烦的部分是商户帐号的审核,如果没有商户帐号,就没有你要给钱的那个对公账户. 2.关于交易 在这个金融类项目的开发中,接触 ...

  2. C#开发微信公众平台开发-微信海报介绍和开发流程

    “让客户发展客户”,微信海报才是微信公众平台最高明的吸粉手段,海报上有粉丝的专属二维码,有粉丝的头像及商户宣传的广告等.新粉丝扫描这个专属二维码会关注公众号,同时分享海报的粉丝会增加积分换取礼品或者优 ...

  3. David Camp 微信公众平台开发官方内容拓展版---PHP版本

    微信公众平台开发(一) 配置接口 微信公众平台开发(二) 微信公众平台示例代码分析 微信公众平台开发(三) 订阅事件(subscribe)处理 微信公众平台开发(四) 简单回复功能开发 微信公众平台开 ...

  4. 微信公众平台开发(57)Emoji表情符号

    微信公众平台开发 微信公众平台开发模式 企业微信公众平台 Emoji表情符号 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/crack-golden-egg ...

  5. 微信公众平台开发(57)Emoji表情符号 【转发】

    微信公众平台开发(57)Emoji表情符号   微信公众平台开发 微信公众平台开发模式 企业微信公众平台 Emoji表情符号 作者:方倍工作室 地址:http://www.cnblogs.com/tx ...

  6. ios开发总结,日常开发:ios开发功能收集,经验分享等等(不断更新中。。。)

    github资料学习和下载地址:https://github.com/niexiaobo/MyDailyDevelopmentNotes ios 学习模块 ios APP 日志管理的重要性: 一个功能 ...

  7. Xamarin For Visual Studio 3.0.54.0 完整离线破解版(C# 开发Android、IOS工具 吾乐吧软件站分享)

    Xamarin For Visual Studio就是原本的Xamarin For Android 以及 Xamarin For iOS,最新版的已经把两个独立的插件合并为一个exe安装包了.为了区分 ...

  8. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  9. iOS 平台开发OpenGL ES程序注意事项

    本人最近从Android平台的OpenGL ES开发转到iOS平台的OpenGL ES开发,由于平台不同,所以开发中会有一些区别,再次列出需要注意的几点. 1.首先需要了解iOS主要开发框架,再次仅介 ...

随机推荐

  1. 13.11.20 jquery 核心 siblings() 获得同类(不包含自己)循环所有,

    jquery 核心1.选择器,2. 创建dom 元素 3. jquery 执行时 4. 延迟执行 5. 循环 6. 计算长度.7.8 获得选择器和所在节点 9. 获得下标 10. 元素存放数据  11 ...

  2. 更新vs2017 15.9.2后,在指定-T v141_xp情况下载编译会报下面warning MSB8051

    更新vs2017 15.9.2后,在指定-T v141_xp情况下载编译会报下面warning: C:\Program Files (x86)\Microsoft Visual Studio\2017 ...

  3. VS2010程序打包操作--超详细

    1.  在vs2010 选择“新建项目”----“其他项目类型”----“Visual Studio Installerà“安装项目”: 命名为:Setup1 . 这是在VS2010中将有三个文件夹, ...

  4. HDU1312 Red and Black(DFS) 2016-07-24 13:49 64人阅读 评论(0) 收藏

    Red and Black Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total ...

  5. hdu1251 && hud 1247 (字典树)

    hdu1251 题目 这道题,主要是在主函数的输入输出上犹豫了. #include<stdio.h> #include<cstring> #include<iostrea ...

  6. hdu 5033 模拟+单调优化

    http://acm.hdu.edu.cn/showproblem.php?pid=5033 平面上有n个建筑,每个建筑由(xi,hi)表示,m组询问在某一个点能看到天空的视角范围大小. 维护一个凸包 ...

  7. MySQL中不允许使用列别名作为查询条件

    在MySQL中有个特殊的规定,即不允许使用列别名作为查询条件.比如有下面一个表: select     ID,     title,     concept,     conceptLength,   ...

  8. Python学习-31.Python中集合的一些操作

    add方法: s = {1,2,3} s.add(4) print(s)# {1, 2, 3, 4} 同list的append方法,若调用s.add(3),则不会有任何影响.这点与C#中的HashSe ...

  9. ABP 基础设施层——集成 NHibernate

    本文翻译自ABP的官方教程<NHibernate Integration>,地址为:http://aspnetboilerplate.com/Pages/Documents/NHibern ...

  10. 程序员MAC必备

    排名不分先后 • iTerm 2 终端工具(建议配合oh-my-zsh使用) • Shadowsocks     ***工具 (可用于FQ) • Foxmail 邮箱工具 (适用于企业邮箱登陆) • ...