OpenShare实现(3):implement

我们已经知道如何和官方客户端通信了,通过hook也知道通信格式了。下面就是对这些平台进行封装。有一些基本要求:

  1. 因为我们并不知道OpenShare到底要支持多少平台,所以必须提供扩展机制。
  2. 必须有全局的保存appKey等变量的地方,可以考虑单例模式或类变量。
  3. 分享、登录完成以后,要方便回调,可以考虑block。

对于objc基本上有两种思路:继承(subclass)和类别(category)

用继承的话,就是做一个OpenShare的基类,然后各个平台的调用用子类实现,但是这样的话,调用的地方需要先实例化,然后调用对象方法,或者需要调用不同的类的类方法,略有不便。最后我选择了用category,每个平台都去扩展OpenShare的类方法,这样OpenShare就变得越来越完善,支持的平台越来越多。

另外,还需要封装OpenShare和官方客户端通信的message,也就是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);
}];

如何使用

第零步: 修改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 connecRenrenWithAppId:@"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);
}];

扩展支持更多平台

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

时间: 2024-10-03 08:49:56

OpenShare实现(3):implement的相关文章

Use Java to implement the UBB future.

ubb UBB & JAVA    ----Use Java to implement the UBB future. [Author] pizer.chen -- iceant -- 陈鹏[email ] iceant@21cn.com[icq   ] 77777369 These days,I write some publish system,just like BBS/news etc.The client asked me ,whether they can insert the im

重写-must override or implement a supertype method 问题

问题描述 must override or implement a supertype method 问题 The method Call() of type CellPhone must override or implement a supertype method,我把注释override删除了也不行 解决方案 把你的telephone类贴出来看看. 看看下面2点存不存在 一. 因为你的Compiler 是jdk1.5,只要把它改为 1.6 方法: 1. window ->preferen

OpenShare实现(4): more

开源虽易,让别人用就很难. 比如我做了一个openshare,自己感觉很好用,想让更多的人使用,顺便骗一些star,如果不推广,扔到Github上不管,估计一年以后也没人用,想想自己辛辛苦苦,前前后后用了半个月的晚上时间来做,还是希望能得到一些star来填补强烈的虚荣满足感的.开源也是一个圈子,是需要「混」的,iOS圈里面的「明星」还是少数,他们随便扔一个项目,都能star超过1k,像我这种无名小卒,没有follower,不推广,star很难超过两位数.所以这里就记录一下openshare的推广

algorithm-关于leetcode上的Implement Strstr()的一个疑问

问题描述 关于leetcode上的Implement Strstr()的一个疑问 问题 : https://oj.leetcode.com/problems/implement-strstr/ 我的解答: int strStr(char *haystack, char *needle) { if (!*needle) return 0; if (!*haystack) return -1; char* ph, *pn; ph = haystack; for (int i = 0;*ph; ++i

继承-JAVA 实现接口方法时报错 implement a supertype method

问题描述 JAVA 实现接口方法时报错 implement a supertype method public interface MultimediaControl { public void play(); public void stop(); public void previous(); public void next(); } public class AudioPlayer extends Product implements MultimediaControl { String

OpenShare实现(2): how

我们自己的app中集成的官方SDK需要和官方客户端通信,在iOS中,调起其他app,基本上都是用: [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin:"]];//app中调起微信 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.baidu.com"]];//app中调

LeetCode 28 Implement strStr()(实现strStr()函数)

翻译 实现strStr()函数. 返回针(needle)在草垛/针垛(haystack)上第一次出现的索引, 如果不存在其中则返回-1. 其实也就是说字符串str2在字符串str1中第一次出现的索引而已. 原文 Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 代码 class Solution

OpenShare实现(1):why

开发喜地iOS版的时候,商品需要分享到微信.QQ.微博之类的社交网络.按照传统的方法,去各个官方平台的开发者网站,下载SDK,然后集成进去.这样做会导致最后打包的app体积增大不少,而且每个平台API使用方法都不统一,研究每个平台分享.登录功能,也浪费了不少时间. 于是为什么不封装一下呢?就像iOS Social framework.默认已经封装了下面几种社交网络: #SLServiceTypes.h SOCIAL_EXTERN NSString *const SLServiceTypeTwit

[LeetCode]28.Implement strStr()

[题目] Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. [题意] 实现strStr()功能. [分析] 暴力算法代码如下.更高效的的算法有 KMP 算法.Boyer-Mooer 算法和Rabin-Karp 算法.面试中暴力算法足够了. 具体参考:KMP字符串模式匹配详解 [代码] /***