iOS小技能: 社会化分享(代理商展业二维码)

946 阅读10分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

引言

需求背景:

  1. 业务员通过iOS APP生成展业二维码(二维码中含有业务员和代理商信息),用户通过扫码注册的商户自动归到该业务员下。
  2. 用户通过微信扫描展业二维码,跳转到商户注册小程序(此处跳转需在微信平台进行配置),填写注册信息(注册成为企业)。

本文以友盟的SDK为例子,U-Share为开发者提供了不同种类的分享样式,分享目前支持的类型有:

  1. 网页链接(网页H5链接)

  2. 小程序(包括微信小程序和QQ小程序两种)

  3. 图片

  4. 纯文本

  5. 图文(包含一张图片和一段文本)

  6. 视频(只支持视频URL、缩略图及描述)

  7. 音乐(只支持音乐URL、缩略图及描述)

  8. 表情(GIF图片,即Emotion类型,只有微信支持)

I 集成社会化分享

U-Share: 集成微信(完整版14.4M); pod 'UMShare/Social/WeChat'

developer.umeng.com/docs/128606…

1.1 U-Share SDK 集成步骤

  1. 创建应用,获取Appkey;

集成友盟+ U-Share SDK之前,您首先需要到 【友盟+】官网注册一个新应用,获得Appkey。

  1. 手动下载U-Share SDK 集成 / 自动集成(pods、maven)请看接入指南

  2. 接入SDK:

    pod 'UMCommon'    //必须集成,由原来的UMCCommon变为了UMCommon
    pod 'UMDevice'       //必须集成
# U-Share SDK UI模块(分享面板,建议添加)
    pod 'UMShare/UI'               //由原来的UMCShare/UI变为了UMShare/UI

#集成微信(完整版14.4M)
    pod 'UMShare/Social/WeChat'

#该命令只安装新添加的库,已更新的库忽略

pod install --verbose --no-repo-update


#只更新指定的库,其它库忽略
pod update 库名 --verbose --no-repo-update 只更新指定的库,其它库忽略

pod update UMCommon --verbose --repo-update  

cocoapods 小技能:只安装新添加的库,已更新的库忽略 (pod install --verbose --no-repo-update) https://blog.csdn.net/z929118967/article/details/103830017

  1. 分享设置:android接入指南iOS接入指南 / 授权登录设置:android接入指南iOS接入指南

1.2 第三方平台配置

在第三方平台创建应用并提交审核,创建应用后,分享、登录操作时显示的应用icon、名称和对应开放平台设置有关,必须要创建应用的平台为:微信、QQ、新浪、钉钉、企业微信、支付宝、Facebook、Kakao、LinkeIn、Twitter。

developer.umeng.com/docs/128606…

登录微信开放平台,填写相关应用信息,审核通过后获取到微信AppID及AppSecret,如果需要微信登录功能,需要申请微信登录权限,注意微信登录有效期为一年,需要按时在微信平台认证

从2020年6月1日起该旧版本SDK会被微信限制使用正常分享功能(分享时会显示“未验证应用”)。因此U-Share已下线微信iOS精简版,且后续不再提供。

建议已使用微信iOS精简版的客户,后续使用微信iOS完整版,可以体验更多高级功能。

1.3 配置SSO白名单

如果你的应用使用了如SSO授权登录或跳转到第三方分享功能,在iOS9/10下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes,否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。

在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开(plist具体设置在Build Setting -> Packaging -> Info.plist File可获取plist路径)请根据选择的平台对以下配置进行裁剪:

<key>LSApplicationQueriesSchemes</key>
<array>
<!--微信 URL Scheme白名单-->
<string>wechat</string>
<string>weixin</string>
<string>weixinULAPI</string>
</array>


注意 iOS 15限制了配置的URL Scheme不可以超过50个

1.4 配置URL Scheme

URL Scheme是通过系统找到并跳转对应app的一类设置,通过向项目中的info.plist文件中加入URL types可使用第三方平台所注册的appkey信息向系统注册你的app,当跳转到第三方应用授权或分享后,可直接跳转回你的app。

添加URL Types可工程设置面板设置

在这里插入图片描述

配置第三方平台URL Scheme

平台格式举例备注
微信微信appKeywxdc1e388c3822c80b

1.5 配置Universal link

集成完整版的微信、QQ和微博必须要配置Universal link。

微信对Universal Links配置有以下要求:

  1. Universal Links必须支持https

  2. Universal Links配置的paths不能带query参数

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

推荐使用友盟的U-Link,2021年6月3日起,U-Link后台上线了Universal link免费生成及重定向功能,免去开发者自行配置。

Domains里必须以applinks:为前缀,并且不需要输入https://字符 。否则无法回调APP,也就是无法完成分享,直接跳回原app。

+       <key>com.apple.developer.associated-domains</key>
+       <array>
+               <string>applinks:xxx.umindex.com</string>
+       </array>

developer.apple.com/documentati…

检查Universal link是否能够唤起App:如不能请查看Universal link配置方法文档,检查能否在浏览器内直接访问apple-app-site-association文件。

Universal link配置并不是立即生效的,App第一次启动时,iOS系统去官网下载配置的associate文件(拉取这个时间是不可控的,最多会有两三天的延迟)。以后除非App更新或重新安装,否则不会在每次打开时请求apple-app-site-association

配置Universal link:https://developer.umeng.com/docs/191212/detail/191260#h1--universal-link6

1.6 如使用友盟官方生成Universal link功能

developer.umeng.com/docs/191212… 在这里插入图片描述

  1. TeamID:苹果开发者的标识,需要去苹果开发者官网上查看,登录之后,打开Account,点击左侧菜单中的MemberShip,就能看到teamID了,
  2. BundleID:iOS应用的唯一标识

填写完这两个参数,再填写完此页面的其他必填参数,点击页面下方的保存按钮,友盟服务端就会自动生成一个Universal link链接,并且直接填充到了输入框中。

II 初始化

2.1 基础组件库

/** 初始化友盟所有组件产品
 @param appKey 开发者在友盟官网申请的appkey.
 @param channel 渠道标识,可设置nil表示"App Store".
 */
+(void)initWithAppkey:(NSString*)appKey channel:(NSString*)channel;

#import <UMCommon/UMCommon.h>

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[UMConfigure initWithAppkey:@"Your appkey" channel:@"App Store"];
}

2.2 U-Share初始化工作

#import <UMShare/UMShare.h>

// U-Share 平台设置
[self confitUShareSettings];
[self configUSharePlatforms];

-(void)confitUShareSettings
{
/*
     * 打开图片水印
     */
//[UMSocialGlobal shareInstance].isUsingWaterMark = YES;

/*
     * 关闭强制验证https,可允许http图片分享,但需要在info.plist设置安全域名
     <key>NSAppTransportSecurity</key>
     <dict>
     <key>NSAllowsArbitraryLoads</key>
     <true/>
     </dict>
     */
//[UMSocialGlobal shareInstance].isUsingHttpsWhenShareContent = NO;
}

   //配置微信Universal Link需注意 universalLinkDic的key是rawInt类型,不是枚举类型 ,即为 UMSocialPlatformType.wechatSession.rawInt
[UMSocialGlobal shareInstance].universalLinkDic =@{@(UMSocialPlatformType_WechatSession):@"https://umplus-sdk-download.oss-cn-shanghai.aliyuncs.com/",
@(UMSocialPlatformType_QQ):@"https://umplus-sdk-download.oss-cn-shanghai.aliyuncs.com/qq_conn/101830139",
 @(UMSocialPlatformType_Sina):@"https://umplus-sdk-download.oss-cn-shanghai.aliyuncs.com/"};

//extraInitDic,企业微信增加了corpid和agentid,故在UMSocialGlobal的全局配置里面增加extraInitDic来存储额外的初始化参数。extraInitDic的key:corpId和agentId为固定值
[UMSocialGlobal shareInstance].extraInitDic =@{
@(UMSocialPlatformType_WechatWork):@{@"corpId":@"wwac6ffb259ff6f66a",@"agentId":@"1000002"}
};


}

-(void)configUSharePlatforms
{
/* 设置微信的appKey和appSecret */
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:@"wxdc1e388c3822c80b" appSecret:@"3baf1193c85774b3fd9d18447d76cab0" redirectURL:@"http://mobile.umeng.com/social"];
/*设置小程序回调app的回调*/
[[UMSocialManager defaultManager] setLauchFromPlatform:(UMSocialPlatformType_WechatSession) completion:^(id userInfoResponse,NSError*error){
NSLog(@"setLauchFromPlatform:userInfoResponse:%@",userInfoResponse);
}];
/*
     * 移除相应平台的分享,如微信收藏
     */
//[[UMSocialManager defaultManager] removePlatformProviderWithPlatformTypes:@[@(UMSocialPlatformType_WechatFavorite)]];

/* 设置分享到QQ互联的appID,
     * U-Share SDK为了兼容大部分平台命名,统一用appKey和appSecret进行参数设置,而QQ平台仅需将appID作为U-Share的appKey参数传进即可。
    */



}

2.3 设置系统回调

// 支持所有iOS系统
/**
 注:此方法在swift4.1(Xcode 9.3)已废弃,Objective-C项目不影响。 新浪平台外的其他平台可在swift项目中使用下面两种回调方法。
 -(BOOL)application:(UIApplication*)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options

 -(BOOL)application:(UIApplication*)application handleOpenURL:(NSURL *)url

*/
-(BOOL)application:(UIApplication*)application openURL:(NSURL *)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
//6.3的新的API调用,是为了兼容国外平台(例如:新版facebookSDK,VK等)的调用[如果用6.2的api调用会没有回调],对国内平台没有影响
    BOOL result =[[UMSocialManager defaultManager] handleOpenURL:url sourceApplication:sourceApplication annotation:annotation];
if(!result){
// 其他如支付等SDK的回调
}
return result;
}

设置Universal Links系统回调

-(BOOL)application:(UIApplication*)application continueUserActivity:(NSUserActivity*)userActivity restorationHandler:(void(^)(NSArray* __nullable restorableObjects))restorationHandler
{
if(![[UMSocialManager defaultManager] handleUniversalLink:userActivity options:nil]){
// 其他SDK的回调
}
return YES;
}

III 调用分享面板

U-Share为开发者提供了免费的分享面板功能,开发者可以免去自己配置分享面板的步骤。当然您也可以不使用U-Share的分享面板功能,开发者可以自己写分享按钮或者触发时间,然后调用U-Share的分享方法进行分享。

#import <UShareUI/UShareUI.h>

    [UMSocialUIManager setPreDefinePlatforms:@[@(UMSocialPlatformType_WechatSession),
                                                  @(UMSocialPlatformType_QQ),
                                               @(UMSocialPlatformType_Sina)]];
    


//shareScrollView背景色为红色
[UMSocialShareUIConfig shareInstance].sharePageScrollViewConfig.shareScrollViewBackgroundColor =[UIColor redColor];
//每页的背景颜色为黄色
[UMSocialShareUIConfig shareInstance].sharePageScrollViewConfig.shareScrollViewPageBGColor =[UIColor yellowColor];
//去掉毛玻璃效果
[UMSocialShareUIConfig shareInstance].shareContainerConfig.isShareContainerHaveGradient = NO;

//显示分享面板
[UMSocialUIManager showShareMenuViewInWindowWithPlatformSelectionBlock:^(UMSocialPlatformType platformType,NSDictionary*userInfo){
// 根据获取的platformType确定所选平台进行下一步操作
}];

IV 分享样式设置

developer.umeng.com/docs/128606…

4.1 小程序

  1. 程序新版本的预览图二进制数据,6.5.9及以上版本微信客户端支持 限制大小不超过128KB,自定义图片建议长宽比是 5:4。

  1. 小程序的页面路径,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"

developers.weixin.qq.com/doc/oplatfo…

-(void)shareMiniProgramToPlatformType:(UMSocialPlatformType)platformType
{
//创建分享消息对象
UMSocialMessageObject*messageObject =[UMSocialMessageObject messageObject];

UMShareMiniProgramObject*shareObject =[UMShareMiniProgramObject shareObjectWithTitle:@"小程序标题" descr:@"小程序内容描述" thumImage:[UIImage imageNamed:@"icon"]];
    shareObject.webpageUrl =@"兼容微信低版本网页地址";
    shareObject.userName =@"小程序username,如 gh_3ac2059ac66f";
    shareObject.path =@"小程序页面路径,如 pages/page10007/page10007";
    messageObject.shareObject = shareObject;
    shareObject.hdImageData =[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"logo" ofType:@"png"]];
    shareObject.miniProgramType =UShareWXMiniProgramTypeRelease;// 可选体验版和开发板

//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data,NSError*error){
if(error){
UMSocialLogInfo(@"************Share fail with error %@*********",error);
}else{
if([data isKindOfClass:[UMSocialShareResponseclass]]){
UMSocialShareResponse*resp = data;
//分享结果消息
UMSocialLogInfo(@"response message is %@",resp.message);
//第三方原始返回的数据
UMSocialLogInfo(@"response originalResponse data is %@",resp.originalResponse);

}else{
UMSocialLogInfo(@"response data is %@",data);
}
}
[self alertWithError:error];
}];
}

4.2 分享图片

-(void)shareImageToPlatformType:(UMSocialPlatformType)platformType
{
//创建分享消息对象
UMSocialMessageObject*messageObject =[UMSocialMessageObject messageObject];

//创建图片内容对象
UMShareImageObject*shareObject =[[UMShareImageObject alloc] init];
//如果有缩略图,则设置缩略图
    shareObject.thumbImage =[UIImage imageNamed:@"icon"];
[shareObject setShareImage:@"https://mobile.umeng.com/images/pic/home/social/img-1.png"];

//分享消息对象设置分享内容对象
    messageObject.shareObject = shareObject;

//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data,NSError*error){
if(error){
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

4.3 分享纯文本

-(void)shareTextToPlatformType:(UMSocialPlatformType)platformType
{
//创建分享消息对象
UMSocialMessageObject*messageObject =[UMSocialMessageObject messageObject];
//设置文本
    messageObject.text =@"社会化组件UShare将各大社交平台接入您的应用,快速武装App。";

//调用分享接口
[[UMSocialManager defaultManager] shareToPlatform:platformType messageObject:messageObject currentViewController:self completion:^(id data,NSError*error){
if(error){
NSLog(@"************Share fail with error %@*********",error);
}else{
NSLog(@"response data is %@",data);
}
}];
}

V 常见问题

5.1 Universal Links系统回调失败

问题:分享失败,直接跳回原app。

解决方案:Domains里必须以applinks:为前缀,并且不需要输入https://字符 。否则无法回调APP,也就是无法完成分享,

5.2 小程序分享后为什么图片很模糊?

推荐width:500px以上的图片吧。然后保持5:4的比例

5:4,建议500x400

5.3 This app is not allowed to query for scheme weixin

-canOpenURL: failed for URL: "weixin://" - error: "This app is not allowed to query for scheme weixin"
  1. CFBundleURLType:当前APP的scheme记录, 通过schema可在其它App中打开当前App。

  2. LSApplicationQueriesSchemes是从iOS9时被引入的。 用意:当前APP允许访问的APP有哪些,即白名单,需要通信双方均设置为对方的scheme,否则当调用对方App时,系统会告诉你This app is not allowed to query for scheme。

解决方法:配置SSO白名单

<key>LSApplicationQueriesSchemes</key>
<array>
<!--微信 URL Scheme白名单-->
<string>wechat</string>
<string>weixin</string>
<string>weixinULAPI</string>
</array>



see also

公众号:iOS逆向