GithubHelp home page GithubHelp logo

100apps / openshare Goto Github PK

View Code? Open in Web Editor NEW
3.6K 151.0 663.0 4.35 MB

不用官方SDK,利用社交软件移动客户端(微信/QQ/微博/人人/支付宝)分享/登录/支付。

Home Page: http://www.gfzj.us/series/openshare/

License: GNU General Public License v3.0

Objective-C 87.99% Ruby 5.69% PHP 6.31%
openshare

openshare's Introduction

OpenShare 的功能就是替代官方的 SDK 向各个平台的移动客户端(比如 QQ)发起请求(分享、OAuth),然后接收返回结果。

OpenShare 非常小,目前支持 QQ、微信、微博、人人,只有几百行代码。即使你不在项目中使用 OpenShare,也可以 clone 下来研究一下 App 和客户端之间的通信机制,所以给个 star 是值得的。

注:为方便书写,如无特殊说明,下文中的「客户端」指的是 QQ、微信、微博这样的社交软件官方开发的客户端;「App」特指我们自己开发的应用。

预览

示例

把项目 clone 下来以后,直接 open OpenShareDemo/openshare.xcodeproj 就可以运行了。注意 sina 微博的 key 没有通过 sina 的审核,直接分享会提示错误,可以替换成自己的 key。

简介

楼主做 iOS 开发的过程中遇到这样的问题:自己 App 中的信息需要分享到 QQ、微信、微博等社交网络。现在的客户端越做越强大,直接集成了分享功能,比如用户手机上安装了微信,只需要 App 调起微信,并且给微信传入相应的参数就可以了,完全不需要自己操作 REST API。这样如果实现分享,一般情况下要去官方下载 SDK,然后按照官方翔一样的 Demo 代码和文档来改造自己的程序。这样做不仅增大了代码量(想象一下引入的官方类库,有时候,光这些第三方的 SDK 都要比我自己的 App 还大),而且使用还很繁琐(SDK 一般没有源代码,想象 Apple 强制 App 支持 64 位的时候)。所以楼主调试了一下各个平台的 SDK,研究了各个厂商实现的应用程序间通信的规则,把功能封装成了 OpenShare。

设计思路

比如分享功能,OpenShare 有一个 OSMessage 类,保存 OpenShare 向客户端发送的消息。分享的消息基本上有以下几种情况:

  1. 纯文本
  2. 图片
  3. 链接
  4. 其他格式多媒体(声音、视频、文件等)

这样对应 OSMessage 中的属性:

@property NSString* title;
@property NSString* desc;
@property NSString* link;
@property NSData* image;
@property NSData* thumbnail;
@property OSMultimediaType multimediaType;
// for 微信
@property NSString* extInfo;
@property NSString* mediaDataUrl;
@property NSString* fileExt;

比如一个文本消息,可以只设置 title,其他不管;发送一个图片,只需要设置 image / thumbnail / title / desc,其他不用设置。对于其他多媒体消息,可以用 multimediaType 来标示。所以 OSMessage 可以封装所有 App 向客户端发的各类分享请求。

另外,还需要解决的是,客户端分享完成以后回调 App 的功能。我们熟悉的是 block 方法。而不是每个平台都到 application:openURL:sourceApplication:annotation: 中判断。比如最好是这样的:

OSMessage *msg=[[OSMessage alloc] init];
msg.title=@"Hello World";
// 分享到微信
[OpenShare shareToWeixinSession:msg Success:^(OSMessage *message) {
	ULog(@"微信分享到会话成功:\n%@",message);
} Fail:^(OSMessage *message, NSError *error) {
	ULog(@"微信分享到会话失败:\n%@\n%@",error,message);
}];
// 分享到QQ
[OpenShare shareToQQFriends:msg Success:^(OSMessage *message) {
	ULog(@"分享到QQ好友成功:%@",msg);
} Fail:^(OSMessage *message, NSError *error) {
	ULog(@"分享到QQ好友失败:%@\n%@",msg,error);
}];

基于以上考虑,楼主用 category 实现了 OpenShare。

如何使用

1. 快速集成

OpenShare 已经支持 CocoaPods。所以您可以用:

pod 'OpenShare'

引入 OpenShare。

第零步: 修改 Info.plist 添加 URLSchemes,让客户端可以回调 App:

<!--  OpenShare添加回调urlschemes  -->
<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>OpenShare</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <!--      微信          -->
            <string>wxd930ea5d5a258f4f</string>
            <!--       QQ         -->
            <string>tencent1103194207</string>
            <string>tencent1103194207.content</string>
            <string>QQ41C1685F</string>
            <!--微博-->
            <string>wb402180334</string>
            <!--人人-->
            <string>renrenshare228525</string>
            <!--facebook-->
            <string>fb776442542471056</string>

        </array>
    </dict>
</array>

第一步:到 AppDelegate 中的 application:didFinishLaunchingWithOptions: 中全局注册 AppId / AppKey:

// 全局注册appId,别忘了#import "OpenShareHeader.h"
[OpenShare connectQQWithAppId:@"1103194207"];
[OpenShare connectWeiboWithAppKey:@"402180334"];
[OpenShare connectWeixinWithAppId:@"wxd930ea5d5a258f4f"];
[OpenShare connectRenrenWithAppId:@"228525" AndAppKey:@"1dd8cba4215d4d4ab96a49d3058c1d7f"];

第二步:到AppDelegate中application:openURL:sourceApplication:annotation:中添加整体回调:

// 如果OpenShare能处理这个回调,就调用block中的方法,如果不能处理,就交给其他(比如支付宝)。
if ([OpenShare handleOpenURL:url]) {
	return YES;
}

第三步:在需要分享、OAuth 的地方调用:

// 比如微信登录,其他登录可以参考文档或者代码,或者让Xcode自动提示。
[OpenShare WeixinAuth:@"snsapi_userinfo" Success:^(NSDictionary *message) {
	ULog(@"微信登录成功:\n%@",message);
} Fail:^(NSDictionary *message, NSError *error) {
	ULog(@"微信登录失败:\n%@\n%@",message,error);
}];
//分享纯文本消息到微信朋友圈,其他类型可以参考示例代码
OSMessage *msg=[[OSMessage alloc]init];
msg.title=@"Hello msg.title";
[OpenShare shareToWeixinTimeline:msg Success:^(OSMessage *message) {
	ULog(@"微信分享到朋友圈成功:\n%@",message);
} Fail:^(OSMessage *message, NSError *error) {
	ULog(@"微信分享到朋友圈失败:\n%@\n%@",error,message);
}];

2. 扩展支持更多平台

现在的社交网络各种各样,如何把这些平台集成到 OpenShare 中呢?就像插件一样,可以把自己实现的 OpenShare+foobar.hOpenShare+foobar.m 添加进来就可以了。这里 提供了一个模板工具,只需要输入你想扩展的平台的名称,就会自动生成 .h.m 文件,然后基于这个模板修改即可。

未完成

  1. 没有安装客户端情况下的 fallback
  2. 支付宝和微信支付
  3. Facebook 和 twitter 等国外社交平台的支持
  4. ReadMe 国际化

其它

由于每个厂商的通信协议都不一样,所以 hack 的时候还是走了一些弯路,如果想了解整个实现过程,可以看看我的博客:http://www.gfzj.us/series/openshare/

现在行业急需要像 OAuth 一样的标准,来实现 App 和客户端之间的分享,登录。这样就不用为每一个客户端实现一遍了。比如这个协议标准就叫做「OpenShare」(大言不惭、捂脸中)。客户端只需要声明支持 OpenShare 的某个版本,App 就能很简单的调用了。如果您对实现 OpenShare 标准有任何想法,欢迎交流。

联系

在 OpenShare 使用过程中有任何问题,都可以添加一个 issues,我会及时解决。如果您想贡献代码,欢迎 Pull Requests。其他任何问题可以在下面留言,或者通过邮箱 [email protected] 联系我。

协议

OpenShare 基于 GPLv3 协议进行分发和使用,更多信息参见协议文件。

openshare's People

Contributors

100apps avatar bryant1410 avatar damonvvong avatar dwarven avatar eyrefree avatar guojiubo avatar xdongdan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openshare's Issues

怎么获取QQ用户信息

[OpenShare QQAuth:@"get_user_info" Success:^( 貌似目前只能获取用户的openid 至于用户的 昵称头像获取不到啊

“get_user_info”也获取不到

QQ分享返回的Url的Prefix不应该是tencent吗?

QQ分享返回的Url的Prefix不应该是tencent吗?不知道是不是因为Info文件中没有加入<string>QQ41C1685F</string>类似的一行的原因。因为我不知道你的这个字符是从哪里取的~似乎我没有

分享给微信好友,在好友列表界面点击返回(取消分享)走Success分支

分享给微信好友,在好友列表界面点击返回(相当于取消分享)走Success分支
没有一个值判断是成功还是取消分享
[OpenShare shareToWeixinSession:msg Success:^(OSMessage *message) {
NSLog(@"微信分享到会话成功:\n%@",message);
[KSToastView ks_showToast:@"分享成功"]; //没有一个值判断是成功还是取消分享
} Fail:^(OSMessage *message, NSError *error) {
}];

微信分享图片,名字30.dat

微信分享了图片,点击图片,导航栏上的名字是 如下 格式: 30.dat,我看这个content内容是从剪切板拷贝的,这个显示的名字可以自己定义一下吗

IOS8

好像有些方法是IOS8里面得。。IOS8以下的得改改。。。

分享到支付宝

支付宝钱包SDK可以支持iOS9以上,如果不用SDK的话,是否可以向下兼容?可以加入TODO哦。

分享到QQ和QQ空间没有回调

不知道为啥,分享到微信好友和朋友圈都有回调,QQ的都没有,不管成功还是取消分享,都没有回调。

分享到QQ空间偶发性失败

使用OpenShare分享到QQ空间时,有时候会失败,“重新发送”几次后才成功。而在同一网络下,使用其他的接入了QQ原生SDK的APP分享到QQ空间,总会成功。
下面是一些现场,希望能有帮助
1、分享到QQ空间
image
2、分享失败
image
3、分享失败时的包
image
4、点了几次“重新发送”后,发送成功了,add_share_pic:
image

未安装 QQ 客户端的情况

Demo 中的例子在未安装 QQ 客户端时,点击没反应,能否做到未安装客户端的情况,跳转到网页登录呢?

定向分享数据线来分享文件是否未实现?

今天使用openshare,将app中的zip文件 定向分享到QQ我的电脑。用openshare里面的数据线功能。但似乎并未实现,(图片是可以定向分享的,这个本人试过,但是文件类型的,如zip似乎不起作用,)还是本人操作错误?求问一下

qq空间分享文本信息报错--"分享失败 系统繁忙,请稍后重试"

你好,非常喜欢这个lib,感谢作者!

我在使用这个lib的时候,不论是 sample project还是我自己的project,在qq空间分享文本信息都会出现
"分享失败 系统繁忙,请稍后重试"的报错。看上去像是腾讯报的错。图片分享和其他分享正常运行,不知道是什么原因?

谢谢!

请教一些基础问题

  1. 里面的一些url参数拼接,大牛是怎么知道的? 以后他万一变了?
  2. 里面的一些url schema 在哪里找到的?

求大牛解释下,谢谢!!!

分享Gif到微信,图片不会动

如题,同样一张gif图片分享到QQ好友是正常的,但是分享到微信好友,打开图片浏览是 (.dat)格式,其他的图片分享也是这个格式,gif图片无法正常播放

Bug Report: 微信 6.3.7 修改了分享后的行为

@100apps 昨天微信自动升级到 6.3.7,升级后从应用分享链接到微信不再自动跳回原应用。

不知道是微信修改了分享逻辑,还是连协议一块改了。导致 OpenShare shareToWeixinTimeline:msg 的回调无法被调用。

UPDATE: 确认是微信改协议了……

修正gif无法正常在微信显示问题

需要把
//gif
dic[@"fileData"]= msg.file;
dic[@"thumbData"]=msg.thumbnail ? [self dataWithImage:msg.thumbnail] : [self dataWithImage:msg.image scale:CGSizeMake(100, 100)];
dic[@"objectType"]=@"8";

objectType 设置成 8,gif才会正常生效.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.