资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

ios开发原生分享,iOS应用分享

iOS的Share Extension分享机制

在最近参与的项目过程中,我发现一个有趣的现象。国内的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里去做分享内容编辑。

微信和QQ为什么取消iOS原生分享功能

因为原生分享功能太少,不强大,不能自定义,所以放弃使用,自己开发一套分享,想怎么定义怎么定义,扩展性强。

ios 第三方分享组件 哪个最好

网络通信

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分享到第三方应用方法整理

在iOS应用内将内容分享到Facebook,可通过接入Facebook SDK实现。官方网站:

接入Facebook SDK这里不做介绍。

可分享的内容为链接、图片、视频、多媒体(图片+视频),还可为分享的视频添加话题。

每一种分享内容都有对应的shareContent类型,并通过shareDialog分享到Facebook

分享内容到WhatsApp,只能通过openURL和原生系统分享的方式,官方网站:

分享图片只能使用iOS的系统分享,采用UIDocumentInteractionController

分享图片通过存入相册再分享

分享视频到Instagram,必须通过相册URL

在iOS应用内分享内容到VK,由VKsdk支持,sdk支持分享链接、文字和图片,通过VKShareDialogController进行交互,官方网站:

而本地视频只能通过系统原生分享的方式,传入相册视频url进行分享

如何使用友盟 Cocos2d-x 分享组件实现 Android/iOS 分享功能

首先我简单介绍一下组件压缩包的组成

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 ***************************

集成到这一步就完成了,如果没有异常,应该会出现下面的界面,这说明你已经成功实现了集成工作。


文章名称:ios开发原生分享,iOS应用分享
网页路径:http://cdkjz.cn/article/hoeedo.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220