分享 UI 业务包

更新时间:2024-06-12 10:23:26

分享 UI 业务包支持三方分享能力,用户可以将信息通过微信、QQ、短信、邮箱等渠道分享给其他好友。

接入组件

在工程的 Podfile 文件中添加分享业务包组件,并执行 pod update 命令:

source 'https://github.com/tuya/tuya-pod-specs.git'
source 'https://cdn.cocoapods.org/'
platform :ios, '11.0'

target 'your_target_name' do

	# 微信分享需引入(可选)
	pod 'TYSocialWeChat', '0.2.5'

	# QQ 分享需引入(可选)
	pod 'TYSocialQQ', '0.3.2'

	# 添加分享业务包(必选)
	pod 'TuyaSmartShareBizBundle'
end

服务协议

分享业务包实现 TYSocialProtocol 协议以提供服务。您可以在 TYModuleServices 组件中查看 TYSocialProtocol.h 的协议文件内容:

@class TYSocialShareModel;

typedef NS_ENUM(NSUInteger, TYSocialType) {
    TYSocialWechat          = 0,
    TYSocialWechatMoment    = 1,   //微信朋友圈
    TYSocialQQ              = 2,
    TYSocialQQSpace         = 3,   //qq 空间
    TYSocialEmail           = 7,
    TYSocialSMS             = 8,
    TYSocialMore            = 11,
};

typedef NS_ENUM(NSUInteger, TYSocialShareContentType) {
    TYSocialShareContentText,       //未使用
    TYSocialShareContenttImage,     //单图分享
    TYSocialShareContentH5,         //web 分享
    TYSocialShareContentImageUrl,   //单图 URL 分享
};

typedef void (^TYSuccessHandler)(void);
typedef void (^TYFailureHandler)(void);

@protocol TYSocialProtocol <NSObject>

@optional

// 注册
- (void)registerWithType:(TYSocialType)type appKey:(NSString *)appKey appSecret:(NSString *)appSecret;
- (void)registerWithType:(TYSocialType)type appKey:(NSString *)appKey appSecret:(NSString *)appSecret universalLink:(NSString *)universalLink;

// 分享
- (void)shareTo:(TYSocialType)type shareModel:(TYSocialShareModel *)shareModel success:(TYSuccessHandler)success failure:(TYFailureHandler)failure;

// 是否初始化&&已安装
- (BOOL)avaliableForType:(TYSocialType)type;

// 重定向
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options;

// Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRestoring>> * __nullable restorableObjects))restorationHandler;

@end

使用指南

注意事项

调用任何接口之前,务必确认用户已登录。

注册服务

如果使用微信分享、QQ 分享,您需要到微信和 QQ 官方平台进行注册,申请 appKeyappSecret

Objective-C 示例

#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSocialProtocol.h>

id<TYSocialProtocol> impl = [[TuyaSmartBizCore sharedInstance] serviceOfProtocol:@protocol(TYSocialProtocol)];
[impl registerWithType:TYSocialWechat appKey:@"<#appKey#>" appSecret:@"<#appSecret#>" universalLink:@"<#universalLink#>"];
[impl registerWithType:TYSocialQQ appKey:@"<#appKey#>" appSecret:@"<#appSecret#>" universalLink:@"<#universalLink#>"];

Swfit 示例

let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol
impl?.register?(with: TYSocialType.wechat, appKey: "<#appKey#>", appSecret: "<#appSecret#>", universalLink:"<#universalLink#>")
impl?.register?(with: TYSocialType.QQ, appKey: "<#appKey#>", appSecret: "<#appSecret#>", universalLink:"<#universalLink#>")

重写 AppDelegate 的 continueUserActivity 和 openURL 方法

如果使用微信分享、QQ 分享,需要重写 AppDelegate 的 continueUserActivityopenURL 方法。

Objective-C 示例

#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSocialProtocol.h>

- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
    id<TYSocialProtocol> impl = [[TuyaSmartBizCore sharedInstance] serviceOfProtocol:@protocol(TYSocialProtocol)];
    [impl application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
    return YES;
}

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    if ([[url scheme] hasPrefix:@"wx"]) {
        id<TYSocialProtocol> impl = [[TuyaSmartBizCore sharedInstance] serviceOfProtocol:@protocol(TYSocialProtocol)];
        return [impl application:app openURL:url options:options];
    }
    return YES;
}

Swift 示例

func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol
    let _ = impl?.application?(application, continue: userActivity, restorationHandler: restorationHandler)
    return true
}

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    let newOptions: [String: Any] = options.reduce(into: [:]) { (result, tmp) in
        result[tmp.key.rawValue] = tmp.value
    }

    if url.scheme?.hasPrefix("wx") == true {
        let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol
        return (impl?.application?(app, open: url, options: newOptions))!
    }
    return true
}

微信分享

Objective-C 示例

#import <TuyaSmartBizCore/TuyaSmartBizCore.h>
#import <TYModuleServices/TYSocialProtocol.h>

id<TYSocialProtocol> impl = [[TuyaSmartBizCore sharedInstance] serviceOfProtocol:@protocol(TYSocialProtocol)];

/// 分享文本
if ([impl avaliableForType:TYSocialWechat]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialWechat];
    shareModel.content = @"<#content#>";
    shareModel.mediaType = TYSocialShareContentText;
    [impl shareTo:TYSocialWechat shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享图片
if ([impl avaliableForType:TYSocialWechat]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialWechat];
    shareModel.image = [UIImage imageNamed:@"<#imageName#>"];
    shareModel.mediaType = TYSocialShareContenttImage;
    [impl shareTo:TYSocialWechat shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享链接
if ([impl avaliableForType:TYSocialWechat]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialWechat];
    shareModel.title = @"<#title#>";
    shareModel.content = @"<#content#>";
    shareModel.url = @"<#url#>";
    shareModel.mediaType = TYSocialShareContentH5;
    [impl shareTo:TYSocialWechat shareModel:shareModel success:^{

    } failure:^{

    }];
}

Swift 示例

let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol

/// 分享文本
if impl?.avaliable?(for: TYSocialType.wechat) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.wechat)!
    shareModel.content = "<#content#>"
    shareModel.mediaType = TYSocialShareContentType.contentText
    impl?.share?(to:TYSocialType.wechat, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享图片
if impl?.avaliable?(for: TYSocialType.wechat) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.wechat)!
    shareModel.image = UIImage(named: "<#imageName#>")
    shareModel.mediaType = TYSocialShareContentType.contenttImage
    impl?.share?(to:TYSocialType.wechat, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享链接
if impl?.avaliable?(for: TYSocialType.wechat) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.wechat)!
    shareModel.title = "<#title#>"
    shareModel.content = "<#content#>"
    shareModel.url = "<#url#>"
    shareModel.mediaType = TYSocialShareContentType.contentH5
    impl?.share?(to:TYSocialType.wechat, shareModel: shareModel, success: {

    }, failure: {

    })
}

QQ 分享

Objective-C 示例

/// 分享文本
if ([impl avaliableForType:TYSocialQQ]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialQQ];
    shareModel.content = @"<#content#>";
    shareModel.mediaType = TYSocialShareContentText;
    [impl shareTo:TYSocialQQ shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享图片
if ([impl avaliableForType:TYSocialQQ]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialQQ];
    shareModel.image = [UIImage imageNamed:@"<#imageName#>"];
    shareModel.mediaType = TYSocialShareContenttImage;
    [impl shareTo:TYSocialQQ shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享链接
if ([impl avaliableForType:TYSocialQQ]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialQQ];
    shareModel.content = @"<#content#>";
    shareModel.title = @"<#title#>";
    shareModel.url = @"<#url#>";
    shareModel.mediaType = TYSocialShareContentH5;
    [impl shareTo:TYSocialQQ shareModel:shareModel success:^{

    } failure:^{

    }];
}

Swift 示例

let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol

/// 分享文本
if impl?.avaliable?(for: TYSocialType.QQ) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.QQ)!
    shareModel.content = "<#content#>"
    shareModel.mediaType = TYSocialShareContentType.contentText
    impl?.share?(to:TYSocialType.QQ, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享图片
if impl?.avaliable?(for: TYSocialType.QQ) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.QQ)!
    shareModel.image = UIImage(named: "<#imageName#>")
    shareModel.mediaType = TYSocialShareContentType.contenttImage
    impl?.share?(to:TYSocialType.QQ, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享链接
if impl?.avaliable?(for: TYSocialType.QQ) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.QQ)!
    shareModel.title = "<#title#>"
    shareModel.content = "<#content#>"
    shareModel.url = "<#url#>"
    shareModel.mediaType = TYSocialShareContentType.contentH5
    impl?.share?(to:TYSocialType.QQ, shareModel: shareModel, success: {

    }, failure: {

    })
}

短信分享

Objective-C 示例

/// 分享文本 & 图片 & 链接
if ([impl avaliableForType:TYSocialSMS]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialSMS];
    shareModel.content = @"<#content#>";
    shareModel.image = [UIImage imageNamed:@"<#imageName#>"];
    shareModel.url = @"<#url#>";
    shareModel.recipients = @[@"<#phoneNumber#>"];
    [impl shareTo:TYSocialSMS shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享图片链接
if ([impl avaliableForType:TYSocialSMS]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialSMS];
    shareModel.content = @"<#content#>";
    shareModel.recipients = @[@"<#phoneNumber#>"];
    shareModel.imageUrl = @"<#imageUrl#>";
    shareModel.mediaType = TYSocialShareContentImageUrl;
    [impl shareTo:TYSocialSMS shareModel:shareModel success:^{

    } failure:^{

    }];
}

Swift 示例

let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol

/// 分享文本 & 图片 & 链接
if impl?.avaliable?(for: TYSocialType.SMS) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.SMS)!
    shareModel.content = "<#content#>"
    shareModel.image = UIImage(named: "<#imageName#>")
    shareModel.url = "<#url#>"
    shareModel.recipients = ["<#phoneNumber#>"]
    impl?.share?(to:TYSocialType.SMS, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享图片链接
if impl?.avaliable?(for: TYSocialType.SMS) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.SMS)!
    shareModel.content = "<#content#>"
    shareModel.recipients = ["<#phoneNumber#>"]
    shareModel.imageUrl = "<#imageUrl#>"
    shareModel.mediaType = TYSocialShareContentType.contentImageUrl
    impl?.share?(to:TYSocialType.SMS, shareModel: shareModel, success: {

    }, failure: {

    })
}

邮箱分享

Objective-C 示例

/// 分享文本 & 图片 & 链接
if ([impl avaliableForType:TYSocialEmail]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialEmail];
    shareModel.title = @"<#title#>";
    shareModel.content = @"<#content#>";
    shareModel.url = @"<#url#>";
    shareModel.image = [UIImage imageNamed:@"<#imageName#>"];
    shareModel.recipients = @[@"<#email#>"];
    shareModel.ccRecipients = @[@"<#email#>"];
    shareModel.bccRecipients = @[@"<#email#>"];
    [impl shareTo:TYSocialEmail shareModel:shareModel success:^{

    } failure:^{

    }];
}

Swift 示例

let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol

/// 分享文本 & 图片 & 链接
if impl?.avaliable?(for: TYSocialType.email) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.email)!
    shareModel.title = "<#title#>"
    shareModel.content = "<#content#>"
    shareModel.url = "<#url#>"
    shareModel.image =  UIImage(named: "<#imageName#>")
    shareModel.recipients = ["<#email#>"]
    shareModel.ccRecipients = ["<#email#>"]
    shareModel.bccRecipients = ["<#email#>"]
    impl?.share?(to:TYSocialType.email, shareModel: shareModel, success: {

    }, failure: {

    })
}

更多分享

Objective-C 示例

/// 分享文本
if ([impl avaliableForType:TYSocialMore]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialMore];
    shareModel.title = @"<#title#>";
    shareModel.content = @"<#content#>";
    shareModel.mediaType = TYSocialShareContentText;
    [impl shareTo:TYSocialMore shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享图片
if ([impl avaliableForType:TYSocialMore]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialMore];
    shareModel.image = [UIImage imageNamed:@"<#imageName#>"];
    shareModel.mediaType = TYSocialShareContenttImage;
    [impl shareTo:TYSocialMore shareModel:shareModel success:^{

    } failure:^{

    }];
}

/// 分享链接
if ([impl avaliableForType:TYSocialMore]) {
    TYSocialShareModel *shareModel = [[TYSocialShareModel alloc] initWithShareType:TYSocialMore];
    shareModel.url = @"<#url#>";
    shareModel.mediaType = TYSocialShareContentH5;
    [impl shareTo:TYSocialMore shareModel:shareModel success:^{

    } failure:^{

    }];
}

Swift 示例

let impl = TuyaSmartBizCore.sharedInstance().service(of: TYSocialProtocol.self) as? TYSocialProtocol

/// 分享文本
if impl?.avaliable?(for: TYSocialType.more) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.more)!
    shareModel.title = "<#title#>"
    shareModel.content = "<#content#>"
    shareModel.mediaType = TYSocialShareContentType.contentText
    impl?.share?(to:TYSocialType.more, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享图片
if impl?.avaliable?(for: TYSocialType.more) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.more)!
    shareModel.image = UIImage(named: "<#imageName#>")
    shareModel.mediaType = TYSocialShareContentType.contenttImage
    impl?.share?(to:TYSocialType.more, shareModel: shareModel, success: {

    }, failure: {

    })
}

/// 分享链接
if impl?.avaliable?(for: TYSocialType.more) == true {
    let shareModel = TYSocialShareModel(share: TYSocialType.more)!
    shareModel.url = "<#url#>"
    shareModel.mediaType = TYSocialShareContentType.contentH5
    impl?.share?(to:TYSocialType.more, shareModel: shareModel, success: {

    }, failure: {

    })
}

微信分享接入步骤

第一步:配置应用的 Universal Links

  1. 根据 苹果官方文档 配置您应用的 Universal Links

    微信对 Universal Links 配置要求:

    • Universal Links 必须支持 https
    • Universal Links 配置的 paths 不能带 query 参数
    • 微信使用 Universal Links 拉起第三方 App 时,会在 Universal Links 末尾拼接路径和参数,因此 App 配置的 paths 必须加上通配符/*

    示例:

    {
    	"appID": "8P7343TG54.com.tencent.xin.SDKSample",
    	"paths": ["/sdksample/*"]
    }
    
  2. 打开 Associated Domains 开关,将 Universal Links 域名加到配置上。

    分享 UI 业务包

  3. 检查确认 App 的 Universal Links 配置成功,通过 SDK 接入成功验证指引 操作。

第二步:注册应用 ID 和 Universal Links

请到 微信开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,您将获得 AppID,用于开发。但根据微信平台的规定,应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。

第三步:搭建开发环境

  1. 在 Xcode 中,选择您的工程设置项。

  2. 选中 TARGETS 一栏,在 info 标签栏的 URL type,添加 URL Scheme 为您所注册的应用程序 ID。

    分享 UI 业务包

  3. 在 Xcode 中,选择您的工程设置项,选中 TARGETS 一栏,在 info 标签栏的 LSApplicationQueriesSchemes,添加 weixinweixinULAPI

    分享 UI 业务包

    更多信息,请参考 微信官方文档

QQ 分享接入步骤

第一步:配置 URL Scheme

  1. 在 XCode 中,选择您的工程设置项。

  2. 选中 TARGETS 一栏。

  3. info 标签栏的 URL type,添加一条新的 URL scheme

    新的 URL Scheme 为 tencent + appid,如下所示:

    分享 UI 业务包

第二步:配置 LSApplicationQueriesSchemes

如下图对照 SDK Demo 的配置,进行填写。

分享 UI 业务包

更多信息,请参考 QQ 官方文档