编程

当前位置:永利皇宫463登录 > 编程 > 享用SDK分享技能内容施行与与原理分析

享用SDK分享技能内容施行与与原理分析

来源:http://www.makebuLuo.com 作者:永利皇宫463登录 时间:2019-09-12 14:29

最近公司开始新项目,我的工作就是完成社交分享这一部分功能。原本我是去各个开发者平台下载SDK然后查看Demo然后开始写功能的,可是老大要求不要用SDK,因为SDK有些时候太大了不太适合。于是我就硬着头皮去研究...好在已经有人这么干过了而且也写出了一个框架-----OpenShare。可是我们的项目是用swift写的而OpenShare是用oc写的,虽然说swift和oc混写是没有关系的但是感觉还是不舒服于是就开始仔细看了OpenShare并且自己写了一些Demo,终于还是有点收获的。下面就进入正题。

Android APP开发必然绕不开分享这个话题,如何通过微博,微信等圈子给应用导流,相信分享功能一定是一个重要渠道。

- (IBAction)touchReadButton:(id)sender {

    NSData *jsonData = [[NSData alloc] initWithContentsOfFile:JSON_PATH];
    NSError *error = nil;
    id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error;];

    if (jsonObject != nil && error == nil){
        NSLog(@"Successfully deserialized...");
        if ([jsonObject isKindOfClass:[NSDictionary class]]){
            NSDictionary *deserializedDictionary = (NSDictionary *)jsonObject;
            NSLog(@"Dersialized JSON Dictionary = %@", deserializedDictionary);
        } else if ([jsonObject isKindOfClass:[NSArray class]]){
            NSArray *deserializedArray = (NSArray *)jsonObject;
            NSLog(@"Dersialized JSON Array = %@", deserializedArray);
        } else {
            NSLog(@"An error happened while deserializing the JSON data.");
        }
    }
}
//该片段来自于http://outofmemory.cn

其实要实现像SDK提供一样的功能有主要的两点需要解决:

App 分享主要来源

1.系统分享2.SDK分享

  1. app之间的转跳
  2. app之间的数据传输
系统分享介绍

1.系统分享

图片 17B0561F6-114E-494F-91DB-0375911B0913.png

下面就对这两点分开解释:

原理:

1.系统相册和系统视频源分享主要通过系统隐式意图实现。

 <intent-filter android:label="@string/story_sys_share"> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> </intent-filter>

系统分享会调用"android.intent.action.SEND" 隐式意图通知监听的应mimeType 用来设置接受多媒体类型。android:label 用来标识系统分享的标签(类似 微信 ,朋友圈,微博)

app之间转跳

相信很多人都知道怎么在应用中打开网页链接,就是用UIApplication.shareApplication().openURL。其实在应用之间打开也是使用URL的,只是每个应用的url不同。比如QQ的url是"mqqapi://" , 微信的url是"weixin://" 等,那么这些url是怎么定义的呢?答案是这些url是定义在项目的info.plist中的URL type 中 URL Scheme 的如图定义了readtext为url

图片 2infoplist.png

这样别的应用可以用readtext://的url来转跳到这个应用当然在URL Scheme下面可以有很多个URL 当然iOS也提供了UIApplication.sharedApplication().canOpenURL来测试是否可以打开一个url,也就是说可以用这个来测试是否安装了某个应用。

既然是url那么就一定可以带参数的比如"mqqapi://share/to_fri?thirdAppDisplayName=Demo"而QQ等这些应用也正是这样解析传进来的url,当使用url打开一个app的时候在appDelegate中的application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?)的参数option中可以拿到需要的url,因为option是一个字典。这样就可以解析url知道需要做什么事情。

结构设计

图片 30FDBD47E-D2E7-4C80-B016-0CCB9D48C53B.png

由于分享需要登录模块验证所以设计了一个DispatchActivity 用来分发分享来的URI请求。目的是解耦合,将登录与业务模块解耦。

app之间数据传输

在上一部分的url打开app的技术中当然可以通过在url后面写入参数然后在app中解析来达到数据的传输,但是url中的数据传输也是很小量的数据可以这么做,比如申请到得appid等

那么想要实现大一点的数据传输怎么办呢?大家在使用iPhone的时候是否有注意到你在一个应用里面所复制的东西可以在另一个应用里面黏贴出来。这就是答案,SDK就是应用了黏贴板实现了app间的数据传输。我们可以将图片等数据写入黏贴板然后再另一个app内通过对黏贴板的读取对图片进行分享。

当然在iOS中黏贴板类UIPasteboard向开发者提供了相关的读写的接口其中UIPasteboard.generalPasteboard().setData(data, forPasteboardType: key)方法是向黏贴板中写入data并且以key作为标志,这样就可以防止各个应用之间的数据的错误问题。所以在SDK中是有已经约定好的key。

以上就是我的一些小小的分享,希望大家多多的提意见!写的不好。

接收分享后的处理

主要思路有两个:1.根据系统uri直接获取文件路径,然后给发布器2.根据uri获取文件输入流,通过读流的方式拷贝一份分享源(其间可以做写文件大小控制,且注意异步操作)下面主要是第一种方法实现中通过uri获取文件路径的方法

import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.provider.MediaStore;import android.text.TextUtils;import java.io.File;import java.net.URISyntaxException;/** * Created by steven_xu on 2017/7/24. */public class MediaUtils { public static String getPath(Context context, Uri uri) { if(uri == null || context == null) { return null; } if ("content".equalsIgnoreCase(uri.getScheme { String[] projection = { MediaStore.MediaColumns.DATA }; Cursor cursor = null; try { cursor = context.getContentResolver().query(uri, projection, null, null, null); if (cursor != null) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); if (cursor.moveToFirst { return cursor.getString(column_index); } } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } } else if ("file".equalsIgnoreCase(uri.getScheme { return uri.getPath(); } return null; }}

获取到文件路径就可以预览和其他相关操作。系统分享的坑:冷启动时候,intent中的type会丢失(解决这种问题的办法,通过调试发现intent 分享路径还是有的,那我的思路就是更具路径做白名单过滤[有更好的办法可以评论哈])

 Uri uriMedia = intent.getParcelableExtra(Intent.EXTRA_STREAM); String path = MediaUtils.getPath(this, uriMedia);

public class PicUtils { public static boolean isPic(String sourcePath) { if (TextUtils.isEmpty(sourcePath)) { return false; } return sourcePath.toLowerCase().endsWith || sourcePath.toLowerCase().endsWith || sourcePath.toLowerCase().endsWith || sourcePath.toLowerCase().endsWith || sourcePath.toLowerCase().endsWith; }}
SDK分享介绍

SDK 分享思路其实也差不多只是某些app 为其他app提供分享sdk给其他厂商集成罢了,比如微信,微博都给第三方提供分享sdk。其中原理:无外乎定义访问协议。SDK通过某种方式起来应用某发布界面,并传递来相关数据。应用处理完后,将处理信息回馈给SDK,SKD负责和集成他的app交互。

如果觉得我原创的文章不错,就给点打赏鼓励下吧。有什么问题都可以在回复中交流。如果想看互联网相关发展机会可以将简历发送到3528187224@qq.com邮箱。

图片 4CC325596-95A5-4CB0-9DD8-EA41AC29ECA4.png

本文由永利皇宫463登录发布于编程,转载请注明出处:享用SDK分享技能内容施行与与原理分析

关键词:

上一篇:没有了

下一篇:没有了