重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在最近参与的项目过程中,我发现一个有趣的现象。国内的App开发者,在设计“分享”这个功能的时候,一般都会根据业务的实际需要,设计一套自定义的解决方案,我们姑且称之为“自定义分享插件”。而相比之下,国外的开发者更倾向于使用iOS提供的系统级的Share Extension,我们姑且称之为“原生分享插件”。那么,这两种方案,各有什么特色和优缺点呢?
成都创新互联公司是一家集网站建设,曲靖企业网站建设,曲靖品牌网站建设,网站定制,曲靖网站建设报价,网络营销,网络优化,曲靖网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
什么是原生分享插件?
我们先来简单看一下什么是苹果的原生分享插件Share Extension。前面说过,由于中国App开发大量使用自定义的分享方式,所以可能很多设计师还不熟悉原生分享的机制。另外,苹果直到去年的iOS8.0才重新定义了iOS的Extension机制,并重新设计了Share Extension,使得她真正变得好用而受到开发者的认可。所以,原生分享插件对于我们来说,其实还挺新的:)
在早先版本里,从iOS5到iOS6,乃至iOS7,分享插件的界面设计进过了几次变更,但是功能上一直十分有限,一开始仅限于系统级和系统原生应用的内容传递,例如发送照片内容到邮件和短信,或者从Safari保存网页等。后来苹果通过与Twitter和Facebook等几家公司签订独立的协议,实现了整合的方案,使内容分享到这些应用的过程更方便。
但是苹果显然也意识到了这一点,即系统和应用,以及应用与应用之间传递内容信息的需求是用户真实存在的需求,需要一个真正系统级的解决方案,就像当年的Push Notification那样,一个方案解决所有App的问题,而不是一家一家地去签协议。
所以,在去年的iOS8发布时,苹果对分享机制做了大刀阔斧的改变,这就是新的Share Extension,原生分享插件。App开发者只需要在开发过程中,为App加入原生分享插件,向系统注册,就可以通过Extension来实现与系统和其他App的内容分享了。原生分享插件就相当于一个中间媒介,可以接受Host App(发送内容的App)提交的内容,转交给想要分享到的Containing App(接受内容的App)。、
举例来说,如果你开发的是一个电商类App,希望鼓励用户把App上的商品分享给他们的朋友或者社交媒体,那么通过挂载和注册原生分享插件,以后用户想要分享App上的内容时,唤出分享界面,就可以把内容分享到系统上的任一(注册了分享插件的)位置。相反,如果你开发的是一个社交App,并鼓励用户从其他内容源分享内容你的App,同样需要注册到分享插件,表明你同意接受由它发送来的内容。
当然,不同形式的内容也不是随便就到处传递的。无论你是发送内容的Host App,还是接受内容的Containing App,都需要向原生分享插件描述清楚,要发送或接受的内容是什么格式,比如图片视频、文本还是链接。这被称为Activation Rules。也就是说,假如用户要分享的是一段文字,那么当他点击分享按钮时,弹出的Share Sheet上,就不会显示Instagram和Pintrest这类App,因为他们只接受图片分享。这也就是说,尽管是同一个原生分享组件,但是在不同的App上,它出现时显示的内容会自动根据要分享出去的内容性质做出变化。
所以,iOS的Share Extension原生分享插件,就像一个巨大的内容中转站,在系统和App,以及App之间建立起关联,方便内容的传递。
那么为什么要采用这样一种集成式的设计思路,而不是鼓励各App之间点对点传输呢?
最大的优势就是安全性和便利性。
iOS上的App被设计在一个“沙盒”里,App与系统间,以及App与另一个App之间的数据传输是受到严格限制的。所以我们经常遇到App在使用相机、相册或者GPS传感器时,都要请求用户同意的场景。这样设计的好处就是苹果的设备安全系数很高,恶意软件和病毒很难入侵。在这种情况下,如果系统允许App随便传递内容信息,肯定是不行的。App们互相之间如果要传递信息,也要先建立信任,也就是授权。所以在没有原生分享插件的时候,每一次分享动作,伴随的都是可能要一次新的授权(如果你自定义分享插件,情况便是如此)。而原生分享插件,就是将这些授权全都集中起来,由系统平台一次完成(App向系统注册时)。这样,iOS通过这种集成的方式,既能保证沙盒机制不被破坏,又实现了系统层面的信息分享。
当App注册了原生分享插件,一方面,它就可以通过插件向系统和其他所有(也注册了分享插件)的App发送内容,只要对方接受内容的形式(图片、文本等)。另一方面,它也同意接受来自插件的相应内容。这意味着,用户在iOS设备上,从任意一个App分享内容到其他任意一个App时,都不用再额外进行一个App之间的授权动作了。分享真正变成系统级别的,无处不在的。
并且,这个方案的系统整合程度很高,意味着,在实际的交互场景中,用户甚至可以不用跳转到他要分享的那个App里去操作,而是直接在当前界面完成分享,然后继续该干嘛干嘛。
讲完了这些,那么问题来了:
既然苹果的这套Share Extension机制这么好,为什么国内的App们还偏要自定义分享插件呢?
最大的问题在于,App的开发者想要分享内容到甲乙丙,而原生分享插件显示的是ABC。
苹果在设计原生分享插件时,是从所有用户的习惯角度出发的,如果用户经常分享内容到Facebook和Pintrest,而不常用Twitter,那么他可以通过Share的Action Sheet上的“更多”按钮,进入一个设置页面,在那里调整分享到App的顺序,甚至把不常用的分享渠道关掉。
这显然不符合国内一些开发者的口味,尤其是BAT这样的大公司。微信就关闭了对原生分享的支持,而选择了大量的自定义,所以我们可以看到微信的Share Sheet上出现了“收藏”、“调整字体”等跟分享毫无关系的功能。淘宝的分享也是自定义的。这类大公司的逻辑更多是让分享内容在自家的生态体系里流动,而不是整个平台。
一个非常有意思的特例是Pintrest。这家公司在自己的App上也使用了自定义的分享插件,为了方便用户把内容分享给App内的好友关系圈。但是如果在自定义的sheet上点击表示“更多”的那个“…”红色按钮,这是App又会调出原生分享插件。真是既满足了自己的小算盘,又照顾到了全平台的用户。而这样做的副作用就是,如果用户在第一个自定义Sheet上点击分享到Facebook,则调用系统分享编辑界面,而如果用户是在第二个原生分享sheet上点击,则会跳转到Facebook App里去做分享内容编辑。
因为原生分享功能太少,不强大,不能自定义,所以放弃使用,自己开发一套分享,想怎么定义怎么定义,扩展性强。
网络通信
1、ASIHTTPRequest
这是一个经典的老库,功能完全而强大,但已经停止更新很久了(iOS5.0停止更新,但是我最近看github上这个项目有新改动)。在不同iOS版本上略微有一些小问题(提醒显示上的),所以用的时候还是稍微修改一下比较好。
下载地址:
2、AFNetworking
轻量级的通讯类库,使用非常简单。
下载地址:
3、MKNetworkKit
最近做的不错的一个通讯类库,具有AFNetworking和ASIHTTPRequest双方的优点,甚至功能更丰富一些,但是本人还没有使用过。
下载地址:
Socket
1、CocoaAsyncSocket
CocoaAsyncSocket是用的最广泛的socket开发库,省略了程序员与CFNetwork接触的时间,延长了程序员寿命。
下载地址:
2、SocketRocket
SocketRocket是Square开发的一个实现webSocket的库,可以轻松的实现即时通信。
下载地址:
数据解析
1、SBJSON
SBJson的解析速度其实是比较慢的,但是不知道为什么它却是用的最广的。
下载地址:
2、JSONKit
JSONKit解析速度上最接近iOS原生解析类,当然iOS5.0才开始支持原生解析,所以选择一个库还是很必要的。
下载地址:
3、TouchJSON
TouchJSON用的也比较广泛.
下载地址:
4、json-framework
没有用过。
下载地址:
5、TBXML
TBXML是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。
下载地址:
6、TouchXML
TouchXML这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。
下载地址:
7、KissXML
KissXML这是一套基于TouchXML的XML解析类库,只不过实现了支持XML的修改。
下载地址:
8、GDataXML
GDataXML是Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。
下载地址:
第三方管理
1、fmdb
fmdb是一个数据库管理库,封装了sqlite相关的sql语句,简化数据库操作。
下载地址:
2、ssziparchive
ssziparchive与sstoolkit是同一个作者,这哥们儿简直是个天才。
3、ZipArchive
ZipArchive同样是minizip的封装。
4、Objective-Zip
Objective-Zip将Zlib和MiniZip用Objective-C进行了封装,使用起来非常简单。
5、zxing
zxing是一个开源Java类库用于解析多种格式的1D/2D条形码。目标是能够对QR编码、DataMatrix、UPC的1D条形码进行解码。 其提供了多种平台下的客户端。
6、ZBar
ZBar 是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图片扫描,支持多平台包括 iPhone 手机。同时 ZBar提供了二维码扫描的 API 开发包。
7、ObjQREncoder
ObjQREncoder 是 Objective-C 的二维码的编码器,用于生成二维码图像。
8、OpenUDID
OpenUDID是iOS禁止使用系统UDID之后的新解决方法。
9、RegexKitLite
RegexKitLite 是一个轻量级的 Objective-C 的正则表达式库,支持 Mac OS X 和 iOS,使用ICU 库开发。
10、STUtils
STUtils是一系列的工具集,包含了很多对于iOS原生类的扩展,当然也包含一个用于安全保存用户密码STKeyChain。
11、scifihifi-iphone
scifihifi-iphone用于安全保存用户密码到keychain中。
12、sskeychain
sskeychain同scifihifi-iphone一样,不过属于轻量级。
13、SDWebImage
SDWebImage调用网站上的图片,跟本地调用内置在应用包里的图片一样简单。操作也很简单。
14、umeng
umeng既有统计分析,也有社会化组件。但是统计分析的用户数似乎明显多于其社会化组件的用户。
第三方UI
1、appirater
appirater是一个可以直接使用到任何iPhone应用中的开源类,用于提醒用户在打开App时,对应用进行评论或打分。
下载地址:
2、FDStatusBarNotifierView
FDStatusBarNotifierView 实现了在状态栏中显示自定义提醒信息的功能。
下载地址:
3、MTStatusBarOverlay
MTStatusBarOverlay 是一个定制的 iOS状态栏,用于覆盖系统默认的状态栏。
下载地址:
4、iCarousel
iCarousel 是一个用来简化在 iOS 上实现旋转木马时的视图切换效果,支持 iPad,提供多种切换效果。
下载地址:
5、MBProgressHUD
MBProgressHUD就不多说了,伟大的菊花。
下载地址:
6、SVProgressHUD
SVProgressHUD是一个轻量级的菊花。
下载地址:
7、MWPhotoBrowser
MWPhotoBrowser 实现了一个照片浏览器类似 iOS自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存。可对图片进行缩放等操作。
下载地址:
8、ShareSDK
ShareSDK支持分享到新浪微博、微信好友、微信朋友圈、QQ好友、腾迅微博、QQ空间、人人网、开心网、豆瓣、搜狐微博、网易微博、短信、邮件、打印、拷贝等。但是由于这个SDK包很大,所以用的时候一定要精简一下。下载地址:
在iOS应用内将内容分享到Facebook,可通过接入Facebook SDK实现。官方网站:
接入Facebook SDK这里不做介绍。
可分享的内容为链接、图片、视频、多媒体(图片+视频),还可为分享的视频添加话题。
每一种分享内容都有对应的shareContent类型,并通过shareDialog分享到Facebook
分享内容到WhatsApp,只能通过openURL和原生系统分享的方式,官方网站:
分享图片只能使用iOS的系统分享,采用UIDocumentInteractionController
分享图片通过存入相册再分享
分享视频到Instagram,必须通过相册URL
在iOS应用内分享内容到VK,由VKsdk支持,sdk支持分享链接、文字和图片,通过VKShareDialogController进行交互,官方网站:
而本地视频只能通过系统原生分享的方式,传入相册视频url进行分享
首先我简单介绍一下组件压缩包的组成
Cocos2dx
实现Cocos2d-x中跨平台分享功能,需拷贝到您项目的Classes文件夹中;
Platforms
原生的Android和iOS社会化组件SDK,需要您将库和资源拷贝到对应平台的项目中;
doc
组件的集成文档;
Umeng_Cocos2dx_Demo_V1.0
Android部分的demo文件,可以安装在手机上看一下简单的分享效果和样式
Cocos2d-x虽然是一个跨平台的引擎,但是对于Android和IOS平台来说,具体的集成方式还是有一定的区别,这里分别介绍Android和IOS平台集成中不同的地方,然后再集中介绍跨平台通用的部分。
Android平台集成步骤:
步骤一:
下载Cocos2d-x组件(下载地址) 并且将jar包添加到build path 路径下,将res资源文件夹加入到你工程对应资源文件下。将Platforms/Android/controller目录下的com文件夹拷贝到您的Cocos2d-x项目Android平台的src目录下,并且在jni/Android.mk中的LOCAL_SRC_FILES下添加如下配置 (注意格式,否则会编译出错) :
../../Classes/Cocos2dx/Android/CCUMSocialController.cpp \
../../Classes/Cocos2dx/ShareButton/UMShareButton.cpp \
../../Classes/Cocos2dx/Common/CCUMSocialSDK.cpp
步骤二:
在Cocos2dxActivity子类的onCreate方法下添加如下代码,用来完成初始化步骤
// this为Cocos2dxActivity类型, 参数2为描述符,可随意修改.
CCUMSocialController.initSocialSDK(this, "com.umeng.social.share");
步骤三:
在代码中覆写Cocos2dxActivity子类的onActivityResult方法,用来实现回调方法。在onActivityResult添加如下代码 :
// 授权回调
CCUMSocialController.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
iOS平台集成步骤:
步骤一:
解压SDK压缩包,将Platforms/iOS文件夹和Cocos2dx文件夹拖入工程目录,并删除Cocos2dx/Android文件夹,添加后应该是这个效果:
步骤二:
添加系统需要的framework
Security.framework //用于系统加密处理
libiconv.dylib //QQ互联的库文件
SystemConfiguration.framework //QQ互联需要的framework
CoreGraphics.framework //QQ互联需要的framework
Social.framework //分享组件需要的framework,如果不使用twitter则不需要
libsqlite3.dylib //QQ互联需要的framework
libstdc++.dylib //C++的库文件
CoreTelephony.framework //QQ互联需要的framework
libz.dylib //QQ互联需要的framework
Accounts.framework //系统需要的framework,如果不使用twitter则不需要
步骤三:
实现系统的回调方法,在Xcode工程中的ios文件夹下的AppController.mm文件中加入下面的代码:
#import "UMSocial.h"
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
return [UMSocialSnsService handleOpenURL:url];
}
完成了上述准备工作之后,就可以开始正式的分享步骤了,友盟提供了多种分享样式,有精力的开发者可以使用底层接口,可以完全自由定制分享界面和样式,不过相信大部分开发者们使用第三方插件的初衷都是为了节省精力,所以这里就只介绍使用默认分享界面的方法,有更多需求的开发者们可以自己探索自定义界面接口部分。
步骤一:加入系统需要的头文件
// 授权回调
#include "Cocos2dx/Common/CCUMSocialSDK.h"
#include "Cocos2dx/ShareButton/UMShareButton.h"
// 使用友盟命令空间
USING_NS_UM_SOCIAL;
// ...... 代码省略
// HelloWorld为cocos2d::CCLayer的子类
bool HelloWorld::init()
{
//////////////////////////////
// 1. super init first
if ( !CCLayer::init() )
{
return false;
}
}
步骤二:分享按钮的创建
// 创建分享按钮, 参数1为按钮正常情况下的图片, 参数2为按钮选中时的图片,参数3为友盟appkey, 参数4为分享回调
UMShareButton *shareButton = UMShareButton::create("shareNormal.png","shareSelected.png", "你的友盟appkey", share_selector(shareCallback)) ;
步骤三:设置分享平台及内容
// 显示在友盟分享面板上的平台
vector
* platforms = new vector
();
platforms-push_back(SINA);
platforms-push_back(RENREN) ;
platforms-push_back(DOUBAN) ;
platforms-push_back(QZONE) ;
platforms-push_back(QQ) ;
// 设置友盟分享面板上显示的平台
shareButton-setPlatforms(platforms);
// 设置文本分享内容
shareButton-setShareContent("umeng social Cocos2d-x sdk.") ;
// 设置要分享的图片, 图片支持本地图片和url图片, 但是url图片必须以http://或者https://开头
shareButton-setShareImage("/sdcard/header.jpeg") ;
// 设置按钮的位置
shareButton-setPosition(ccp(150, 180));
// 然后开发者需要将该按钮添加到游戏场景中
CCMenu* pMenu = CCMenu::create(shareButton, NULL);
pMenu-setPosition(CCPointZero);
this-addChild(pMenu, 1);
// ********************** 设置平台信息 ***************************
// CCUMSocialSDK *sdk = shareButton-getSocialSDK();
// sdk-setQQAppIdAndAppKey("设置QQ的app id", "appkey");
// sdk-setWeiXinAppId("设置微信和朋友圈的app id");
// sdk-setYiXinAppKey("设置易信和易信朋友圈的app id");
// sdk-setLaiwangAppInfo("设置来往和来往动态的app id",
// "设置来往和来往动态的app key", "我的应用名");
// sdk-setFacebookAppId("你的facebook appid");
// 设置用户点击一条图文分享时用户跳转到的目标页面, 一般为app主页或者下载页面
// sdk-setTargetUrl(" ");
// 打开或者关闭log
// sdk-setLogEnable(true) ;
// ********************** END ***************************
集成到这一步就完成了,如果没有异常,应该会出现下面的界面,这说明你已经成功实现了集成工作。