#pragma mark - 三. 社交分享
˜
#pragma mark 1. 自带分享
1. 判断服务类型是否可用
2. 创建分享控制器 --> 设置文字/图片/网址
3. 模态视图弹出
#pragma mark 2. 友盟分享
1. 按文档集成
#pragma mark 3. SSO授权 - 手机有安装对应的第三方应用程序才能实现此功能
SSO指单点登录,当用户安装了对应第三方客户端且登录时,可以在登录时免去输入账号密码的过程
一. OAuth2.0 跟SSO 授权的流程区别
OAuth2.0 : 当前程序内加载一个网页 --> 网页中输入账号密码 --> 点击授权 --> 可以分享
SSO : 会跳转到对应的第三方程序 --> 点击授权 --> 可以分享
大平台一般会支持SSO授权, 因为用的人多. 其他的中小平台, 一般只有OAuth2.0授权
二. SSO授权的优势:
1. 方便 --> 账号密码不用输入 --> (密码太长, 输入错误, 遗忘密码)
2. 保护信息安全 --> 防止手机号, 或者常用密码泄露
˜
#pragma mark 1. 自带分享
1. 判断服务类型是否可用
2. 创建分享控制器 --> 设置文字/图片/网址
3. 模态视图弹出
#pragma mark 2. 友盟分享
1. 按文档集成
#pragma mark 3. SSO授权 - 手机有安装对应的第三方应用程序才能实现此功能
SSO指单点登录,当用户安装了对应第三方客户端且登录时,可以在登录时免去输入账号密码的过程
一. OAuth2.0 跟SSO 授权的流程区别
OAuth2.0 : 当前程序内加载一个网页 --> 网页中输入账号密码 --> 点击授权 --> 可以分享
SSO : 会跳转到对应的第三方程序 --> 点击授权 --> 可以分享
大平台一般会支持SSO授权, 因为用的人多. 其他的中小平台, 一般只有OAuth2.0授权
二. SSO授权的优势:
1. 方便 --> 账号密码不用输入 --> (密码太长, 输入错误, 遗忘密码)
2. 保护信息安全 --> 防止手机号, 或者常用密码泄露
3. 避免在任一环节的用户流失率 --> 产品经理非常喜欢
三. 应用场景
1. 分享
2. 第三方登录 --> 应该将用户数据注册成用户, 然后用户数据保存在服务器上
第三方登录主要用于简化用户登录流程,通过用户拥有的微博、QQ、微信等第三方账号进行登录并且构建APP自己的登录账号体系。
1. 分享
2. 第三方登录 --> 应该将用户数据注册成用户, 然后用户数据保存在服务器上
第三方登录主要用于简化用户登录流程,通过用户拥有的微博、QQ、微信等第三方账号进行登录并且构建APP自己的登录账号体系。
//1. 判断服务类型是否可用
if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) {
NSLog(@"还没有配置账号, 需要到设置中添加账号");
return;
};
//2. 创建分享控制器
SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
//2.1 文字
[composeVC setInitialText:@"世界上有10种人, 一种是懂二进制的, 一种是不懂二进制的"];
//2.2 图片
[composeVC addImage:[UIImage imageNamed:@"danshengou"]];
//2.3 网址
[composeVC addURL:[NSURL URLWithString:@"https://www.baidu.com"]];
//3. 模态视图弹出
if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) {
NSLog(@"还没有配置账号, 需要到设置中添加账号");
return;
};
//2. 创建分享控制器
SLComposeViewController *composeVC = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeSinaWeibo];
//2.1 文字
[composeVC setInitialText:@"世界上有10种人, 一种是懂二进制的, 一种是不懂二进制的"];
//2.2 图片
[composeVC addImage:[UIImage imageNamed:@"danshengou"]];
//2.3 网址
[composeVC addURL:[NSURL URLWithString:@"https://www.baidu.com"]];
//3. 模态视图弹出
[self presentViewController:composeVC animated:YES completion:nil];
友盟分享
社会化分享 —> SDK集成与下载 —>苹果 —> 最新的版本
查看Demo —>社会化分享 —> 点击检测
判断是否安装了微信客户端
1、在.m文件中到入头文件:#import "WXApi.h"
2、调用是否安装了微信的方法isWXAppInstalled:
if ([WXApi isWXAppInstalled]) {
NSLog(@"安装了");
}
依此类推其他的
(PS:此处的WXApi直接写就好,并不是通过WXApi创建的对象或者什么的)
我的产品 —> 添加 ——> 提交并获取Appkey
SSO授权
#pragma mark 点击屏幕进行分享
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//如何让程序最下面的角标显示成自己的应用程序名, 以及点击后会跳到自己的网址
//1. 需要到对应的第三方平台注册开发者, 并且提交应用审核
//2. 审核成功后, 应该来到友盟的后台 (找到自己的程序,左侧的列表--> 社会化分享 --> 设置--> 填入对应的信息即可)
//注意:分享到微信好友、微信朋友圈、微信收藏、QQ空间、QQ好友、来往好友、来往朋友圈、易信好友、易信朋友圈、Facebook、Twitter、Instagram等平台需要参考各自的集成方法
[UMSocialSnsService presentSnsIconSheetView:self
appKey:@"563b01e867e58ef979001f0f"
shareText:@"刀哥, 我用了你的账号, 我错了"
shareImage:[UIImage imageNamed:@"icon.png"]
shareToSnsNames:[NSArray arrayWithObjects:UMShareToSina,UMShareToWechatSession,UMShareToQQ,UMShareToDouban, UMShareToEmail, UMShareToFacebook,nil]
delegate:nil];
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//如何让程序最下面的角标显示成自己的应用程序名, 以及点击后会跳到自己的网址
//1. 需要到对应的第三方平台注册开发者, 并且提交应用审核
//2. 审核成功后, 应该来到友盟的后台 (找到自己的程序,左侧的列表--> 社会化分享 --> 设置--> 填入对应的信息即可)
//注意:分享到微信好友、微信朋友圈、微信收藏、QQ空间、QQ好友、来往好友、来往朋友圈、易信好友、易信朋友圈、Facebook、Twitter、Instagram等平台需要参考各自的集成方法
[UMSocialSnsService presentSnsIconSheetView:self
appKey:@"563b01e867e58ef979001f0f"
shareText:@"刀哥, 我用了你的账号, 我错了"
shareImage:[UIImage imageNamed:@"icon.png"]
shareToSnsNames:[NSArray arrayWithObjects:UMShareToSina,UMShareToWechatSession,UMShareToQQ,UMShareToDouban, UMShareToEmail, UMShareToFacebook,nil]
delegate:nil];
}
#pragma mark 模拟新浪微博登录按钮
- (IBAction)loginClick:(id)sender {
UMSocialSnsPlatform *snsPlatform = [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToSina];
snsPlatform.loginClickHandler(self,[UMSocialControllerService defaultControllerService],YES,^(UMSocialResponseEntity *response){
// 获取微博用户名、uid、token等
if (response.responseCode == UMSResponseCodeSuccess) {
UMSocialAccountEntity *snsAccount = [[UMSocialAccountManager socialAccountDictionary] valueForKey:UMShareToSina];
NSLog(@"username is %@, uid is %@, token is %@ url is %@",snsAccount.userName,snsAccount.usid,snsAccount.accessToken,snsAccount.iconURL);
//可以在这里调用自己服务器的注册接口, 将获取到得信息注册成新用户
}});
}
#pragma mark 第三方登录成功后, 可以获取用户的相信信息
- (IBAction)onGetUserDataClick:(id)sender {
//获取accestoken以及新浪用户信息,得到的数据在回调Block对象形参respone的data属性
[[UMSocialDataService defaultDataService] requestSnsInformation:UMShareToSina completion:^(UMSocialResponseEntity *response){
NSLog(@"SnsInformation is %@",response.data);
}];
- (IBAction)loginClick:(id)sender {
UMSocialSnsPlatform *snsPlatform = [UMSocialSnsPlatformManager getSocialPlatformWithName:UMShareToSina];
snsPlatform.loginClickHandler(self,[UMSocialControllerService defaultControllerService],YES,^(UMSocialResponseEntity *response){
// 获取微博用户名、uid、token等
if (response.responseCode == UMSResponseCodeSuccess) {
UMSocialAccountEntity *snsAccount = [[UMSocialAccountManager socialAccountDictionary] valueForKey:UMShareToSina];
NSLog(@"username is %@, uid is %@, token is %@ url is %@",snsAccount.userName,snsAccount.usid,snsAccount.accessToken,snsAccount.iconURL);
//可以在这里调用自己服务器的注册接口, 将获取到得信息注册成新用户
}});
}
#pragma mark 第三方登录成功后, 可以获取用户的相信信息
- (IBAction)onGetUserDataClick:(id)sender {
//获取accestoken以及新浪用户信息,得到的数据在回调Block对象形参respone的data属性
[[UMSocialDataService defaultDataService] requestSnsInformation:UMShareToSina completion:^(UMSocialResponseEntity *response){
NSLog(@"SnsInformation is %@",response.data);
}];
}
第三方账号申请及绑定
#pragma mark - 四. 应用间跳转
#pragma mark 1. 普通跳转(A应用跳转B应用)iOS9发生了变化
1. openURL / canOpenURL 方法跳转的时候, 增加了弹框, 提示用户, 要跳转到哪一个程序
2. canOpenURL方法, 增加了限制, 需要提前写好信任白名单LSApplicationQueriesSchemes Array , 添加键值. 最多可以添加50个白名单
Info —>
#pragma mark 点击屏幕跳转到微信
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// iOS9新增变化
/**
1. openURL / canOpenURL 方法跳转的时候, 增加了弹框, 提示用户, 要跳转到哪一个程序
2. canOpenURL方法, 增加了限制, 需要提前写好信任白名单LSApplicationQueriesSchemes Array , 添加键值. 最多可以添加50个白名单
*/
/**
URL
协议头: http:// https:// ftp:// file://
路径: www.itcast.cn
*/
//06-新闻 想要打开 "07-微信" 这里根微信不是一个程序
//标准写法: 先判断能否打开, 如果能就跳转
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://1234"]];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
// iOS9新增变化
/**
1. openURL / canOpenURL 方法跳转的时候, 增加了弹框, 提示用户, 要跳转到哪一个程序
2. canOpenURL方法, 增加了限制, 需要提前写好信任白名单LSApplicationQueriesSchemes Array , 添加键值. 最多可以添加50个白名单
*/
/**
URL
协议头: http:// https:// ftp:// file://
路径: www.itcast.cn
*/
//06-新闻 想要打开 "07-微信" 这里根微信不是一个程序
//标准写法: 先判断能否打开, 如果能就跳转
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"weixin://"]]) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"weixin://1234"]];
}
}
#pragma mark 2. 跳转到指定页面(A应用跳转B应用指定页面)
1. A新闻程序中拼接不同的网址
2. 微信程序中, 实现openURL方法, 然后判断是否包含了自定的字符串, 然后自己处理跳转到哪一个界面
1. A新闻程序中拼接不同的网址
2. 微信程序中, 实现openURL方法, 然后判断是否包含了自定的字符串, 然后自己处理跳转到哪一个界面
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options NS_AVAILABLE_IOS(9_0)
{
//是否包含指定的关键字 URL字符串, 然后跳转到指定界面
//1. 获取根控制器 --> nav
UINavigationController *nav = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController;
//2. 获取主控制器
UIViewController *mainVC = nav.childViewControllers[0];
//3. 回到根控制器
[nav popToRootViewControllerAnimated:YES];
//4. 根据字符串来跳转
if ([url.absoluteString containsString:@"session"]) {
//跳转到好友列表
[mainVC performSegueWithIdentifier:@"session" sender:nil];
} else if ([url.absoluteString containsString:@"timeline"]) {
[mainVC performSegueWithIdentifier:@"timeline" sender:nil];
}
return YES;
{
//是否包含指定的关键字 URL字符串, 然后跳转到指定界面
//1. 获取根控制器 --> nav
UINavigationController *nav = (UINavigationController *)[UIApplication sharedApplication].keyWindow.rootViewController;
//2. 获取主控制器
UIViewController *mainVC = nav.childViewControllers[0];
//3. 回到根控制器
[nav popToRootViewControllerAnimated:YES];
//4. 根据字符串来跳转
if ([url.absoluteString containsString:@"session"]) {
//跳转到好友列表
[mainVC performSegueWithIdentifier:@"session" sender:nil];
} else if ([url.absoluteString containsString:@"timeline"]) {
[mainVC performSegueWithIdentifier:@"timeline" sender:nil];
}
return YES;
}
#pragma mark 3. 应用程序互相跳转(A应用跳转B应用,再跳转A应用)
1. 想要循环跳转, 不能使用canOpenURL方法
原因:
iOS 9 新特性介绍
一、 UIStackView
新控件:UIstackView 栈视图,类似AppleWatch的Group
父类:UIView
特点:
- 只能垂直或水平散列,因此不能完全取代Autolayout
- 能够快速的按顺序获取到子控件
- 批量修改间距加快
- 批量修改对其方式更快
内部的控件不需要进行约束,只有最外层的stackView需要约束
应用场景
1.水平 — 标签 / 自定义Tabar
2.垂直 — 设置菜单