今天接到一个任务,需要做接入iOS的分享功能,于是我就去找方法,还真的给我找到了一些方法,于是我先调了一个最简单的给老大看,老大说行,有微信分享就可以,于是动手就是开干!
这里用的系统原生 UIActivityViewController分享,非常的简单,只需要调用一个接口,就可以打开分享界面,而且还支持多平台分享,一般是可以标题、图片还有链接,不过微信分享不支持图片和链接同时分享,具体情况可以查看这篇文章iOS 社会化分享方案总结,先看看图示:
说一下思路,因为这个是iOS源生分享,所以这个必然是要creator里js调用xCode的oc代码,详情可以看一下这里js与oc互相调用。然后oc那边代码也要先写好(者先确定好写在哪里),因为js调用oc需要确定调用代码所在类的名称以及自己的名称,参数。
下面就上代码吧!
我先把js调用oc的代码写好:
if (cc.sys.isNative&&cc.sys.os==cc.sys.OS_IOS) {//判断是否是源生平台并且是否是iOS平台
//调用APPController类中的Share方法,并且传递参数
jsb.reflection.callStaticMethod("AppController","Share:title:","title","message");
}
js这边就这样写好啦,接下来把项目打包成xCode项目,在xCode项目中的AppController.h中写入静态方法:
#import <UIKit/UIKit.h>
@class RootViewController;
@interface AppController : NSObject <UIApplicationDelegate>
{
}
+(BOOL)Share:(NSString *)str title:(NSString *)tit;
@property(nonatomic, readonly) RootViewController* viewController;
@end
在AppController.mm中实现:
+(NSString *)Share:(NSString *)str title:(NSString *)tit{
NSString *textToShare = str;
NSURL *urlToShare = tit;
//分享图片的话就可以加上下面两句,记得补充参数
//UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"];
//NSArray *activityItems = @[textToShare, imageToShare, urlToShare];
NSArray *activityItems = @[textToShare, imageToShare, urlToShare];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
//这里可能有个坑,下面说
[self presentViewController:activityVC animated:YES completion:nil];
}
好啦,这样就应该走通啦!诶那个坑好像有条黄线!什么,居然没有presentViewController这个方法,这个博客是骗人的吧!于是我走遍各大博客,发现都是这样写的,到底是为什么没有用呢?难道这个AppController是个假的!我要去cocos creator找人理论去!于是就果然就找到了一个大佬用这个方法(评论很长,请使用ctrl+f查找):
哦~原来是这样,那我也把我的self改一下:
//解决了这个坑!
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityVC animated:YES completion:nil];
运行之后,大功告成,可以开心正常的分享啦~
诶,等等,老大说这些东西挡住了我微信分享,我不想要前面的那些,而且还有分享的状态我也不知道呀!行吧,我们那接着写,这里有些不想要的平台,也可以删除,分享状态,也可以通过回调判断,那我就放上最终代码啦:
+(NSString *)Share:(NSString *)str title:(NSString *)tit{
NSString *textToShare = str;
NSURL *urlToShare = tit;
//分享图片的话就可以加上下面两句,记得补充参数
//UIImage *imageToShare = [UIImage imageNamed:@"iosshare.jpg"];
//NSArray *activityItems = @[textToShare, imageToShare, urlToShare];
NSArray *activityItems = @[textToShare, imageToShare, urlToShare];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:activityItems applicationActivities:nil];
//不显示的放在这里
activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard,UIActivityTypeAssignToContact,UIActivityTypeSaveToCameraRoll];
//解决了这个坑!
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityVC animated:YES completion:nil];
// 分享之后的回调
activityVC.completionWithItemsHandler = ^(UIActivityType _Nullable activityType, BOOL completed, NSArray * _Nullable returnedItems, NSError * _Nullable activityError) {
if (completed) {
//分享成功
NSLog(@"成功啦~");
} else {
//分享取消
NSLog(@"失败惹...");
}
};
很开心,不过还是不知道那个坑的原理,可能cocoscreator对这个AppController做了手脚吧,所以只能通过应用获取到当前的Controller,这里只是猜测,原理不知道,先卸下来。
如果有大佬知道,可以指教一下~