当前位置: 首页 > news >正文

IOS开发学习日记(十七)

简单的第三方登录和分享功能

第三方登录系统

·URL Scheme:App间的跳转及通信

·App间跳转场景

·登陆系统:

        ·跨平台,跨App

        ·标记用户,个性化的推送

        ·使用第三方登录(减少注册成本 / 无须维护敏感信息)

        ·微信 / QQ / 微博 / facebook / Twitter

·登录系统通用技术

        ·framework的使用和集成

        ·常用的第三方认证和账户体系

        ·业务逻辑的设计和实现

静态库 & 动态库

        ·库Library

                ·代码共享 / 保护核心代码

                ·提高编译速度 / 减少代码提及(系统)

        ·静态库

                ·.a文件

                ·编译时期拷贝

                ·增大代码提及 / 不可改变

        ·动态库

                ·.dylib

                ·编译时期只存储引用,运行时加载到内存

                ·无须拷贝减少体积 / 性能损失 / 安全性

 IOS中静态库的创建和使用

·Framework

        ·资源的打包方式

        ·支持静态库 / 动态库

        ·系统的Framework都是动态库

        ·支持Extension共享 - Embedded framework

静态库的制作:

        ·创建static Library实现业务逻辑

        ·设置需要暴露的头文件

        ·模拟器 / 设备分别编译 / 设置Settings

        ·合并静态库lipo - create ***.a ***.a -output ***.a

·静态库(.a)本身是二进制文件

·需要手动引入头文件使用

·一般需要设置Other Linker Flags等

IOS中Framework的制作和使用

·创建framework实现业务逻辑

·设置public的头文件

·模拟器 / 设备 / 分别编译 / 设置Settings

·合并framework

·引入framework 即包含头文件

·头文件的引入

·一般需要设置Other Linker Flags等

OAuth & OpenID 

OAuth授权

        ·第三方登录使用用户名 / 密码(安全 / 用户成本)

        ·开放协议,标准的方式去访问需要用户授权的API服务

OpenID

        ·明文的安全性 / 不同的业务,无法隔离

        ·隐藏明文 / 每个App独立的openID

集成QQ SDK实现登录和分享功能

首先下载TencentOpenApi,在podfile中添加:

# pod TencentOpenAPI
pod 'TencentOpenAPI', :git => 'https://github.com/everfire130/TencentOpenAPI.git'

或者在腾讯开放平台中下载SDK:SDK下载 — QQ互联WIKI 

//
//  GSCLogin.h
//  GSCApp1
//
//  Created by gsc on 2024/6/22.
//#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGINtypedef void(^GSCLoginFinishBlock)(BOOL isLogin);@interface GSCLogin : NSObject@property(nonatomic,strong,readonly)NSString *nick;
@property(nonatomic,strong,readonly)NSString *address;
@property(nonatomic,strong,readonly)NSString *avatarUrl;+(instancetype)sharedLogin;#pragma - mark - 登录-(BOOL)isLogin;
-(void)loginWithFinishBlock:(GSCLoginFinishBlock)finishBlock;
-(void)logOut;#pragma - mark - 分享
-(void)shareToQQWithArticleUrl:(NSURL *)articleUrl;//
//  GSCLogin.m
//  GSCApp1
//
//  Created by gsc on 2024/6/22.
//#import "GSCLogin.h"
#import "TencentOpenAPI/QQApiInterface.h"
#import "TencentOpenAPI/TencentOAuth.h"@interface GSCLogin () <TencentSessionDelegate>@property (nonatomic, strong, readwrite) TencentOAuth *oauth;
@property (nonatomic, copy, readwrite) GSCLoginFinishBlock finishBlock;
@property (nonatomic, assign, readwrite) BOOL isLogin;@end@implementation GSCLogin+(instancetype)sharedLogin{static GSCLogin *login;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{login = [[GSCLogin alloc] init];});return login;
}-(instancetype)init{self = [super init];if(self){_isLogin = NO;_oauth = [[TencentOAuth alloc] initWithAppId:@"123456" andDelegate:self];}return self;
}
#pragma - mark - 登录-(BOOL)isLogin{return _isLogin;
}
-(void)loginWithFinishBlock:(GSCLoginFinishBlock)finishBlock{_finishBlock = [finishBlock copy];_oauth.authMode = kAuthModeClientSideToken;[_oauth authorize:@[kOPEN_PERMISSION_GET_USER_INFO,kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,kOPEN_PERMISSION_ADD_ALBUM,kOPEN_PERMISSION_ADD_TOPIC,kOPEN_PERMISSION_CHECK_PAGE_FANS,kOPEN_PERMISSION_GET_INFO,kOPEN_PERMISSION_GET_OTHER_INFO,kOPEN_PERMISSION_LIST_ALBUM,kOPEN_PERMISSION_UPLOAD_PIC,kOPEN_PERMISSION_GET_VIP_INFO,kOPEN_PERMISSION_GET_VIP_RICH_INFO]];}
-(void)logOut{[_oauth logout:self];_isLogin = NO;
}#pragma mark - delegate-(void)tencentDidLogin{_isLogin = YES;[_oauth getUserInfo];
}-(void)tencentDidNotLogin:(BOOL)cancelled{if(_finishBlock){_finishBlock(NO);}
}-(void)tencentDidNotNetWork{}-(void)tencentDidLogout{}-(void)getUserInfoResponse:(APIResponse *)response{NSDictionary *userInfo = response.jsonResponse;_nick = userInfo[@"nickname"];_address = userInfo[@"city"];_avatarUrl = userInfo[@"figureurl_qq_2"];if(_finishBlock){_finishBlock(YES);}
}
#pragma - mark - 分享
-(void)shareToQQWithArticleUrl:(NSURL *)articleUrl{QQApiNewsObject *newsObj = [QQApiNewsObject objectWithURL:articleUrl title:@"ios" description:@"iosDevLearn" previewImageURL:nil];SendMessageToQQReq *req = [SendMessageToQQReq reqWithContent:newsObj];__unused QQApiSendResultCode sent = [QQApiInterface SendReqToQZone:req];
}@end@endNS_ASSUME_NONNULL_END
//
//  GSCMineViewController.m
//  GSCApp1
//
//  Created by gsc on 2024/6/22.
//#import "GSCMineViewController.h"
#import "GSCLogin.h"
#import "SDWebImage/SDWebImage.h"@interface GSCMineViewController ()<UITableViewDelegate, UITableViewDataSource>@property (nonatomic, strong, readwrite) UITableView *tableView;
@property (nonatomic, strong, readwrite) UIView *tableViewHeaderView;
@property (nonatomic, strong, readwrite) UIImageView *headerImageView;@end@implementation GSCMineViewController-(instancetype)init{self = [super init];if(self){self.tabBarItem.title = @"我的";self.tabBarItem.image = [UIImage imageNamed:@"icon.bundle/home@2x.png"];self.tabBarItem.selectedImage = [UIImage imageNamed:@"icon.bundle/home_selected@2x.png"];}return self;
}- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor whiteColor];[self.view addSubview:({_tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];_tableView.delegate = self;_tableView.dataSource = self;_tableView;})];
}#pragma mark - Navigation-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{return 2;
}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mineTableViewCell"];if(!cell){cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"mineTableView"];}return cell;
}-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{return 60;
}-(nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{if(!_tableViewHeaderView){_tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 30, self.view.frame.size.width, self.view.frame.size.height)];_tableViewHeaderView.backgroundColor = [UIColor whiteColor];[_tableViewHeaderView addSubview:({_headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 30, self.view.frame.size.width, self.view.frame.size.height)];_headerImageView.backgroundColor = [UIColor whiteColor];_headerImageView.contentMode = UIViewContentModeScaleAspectFit;_headerImageView.clipsToBounds = YES;_headerImageView.userInteractionEnabled = YES;_headerImageView;})];[_tableViewHeaderView addGestureRecognizer:({UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_tapImage)];tapGesture;})];}return _tableViewHeaderView;
}-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{return 200;
}-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(nonnull UIView *)view forSection:(NSInteger)section{if(![[GSCLogin sharedLogin] isLogin]){[_headerImageView setImage:[UIImage imageNamed:@"icon.bundle/prettydog.png"]];}else{[self.headerImageView sd_setImageWithURL:[NSURL URLWithString:[GSCLogin sharedLogin].avatarUrl]];}
}-(void)tableView:(UITableView *)tableView willDisplayCell:(nonnull UITableViewCell *)cell forRowAtIndexPath:(nonnull NSIndexPath *)indexPath{if(indexPath.row == 0){cell.textLabel.text = [[GSCLogin sharedLogin] isLogin] ? [GSCLogin sharedLogin].nick: @"昵称";}else{cell.textLabel.text = [[GSCLogin sharedLogin] isLogin] ? [GSCLogin sharedLogin].address:@"地区";}}#pragma mark --(void)_tapImage{__weak typeof(self) weakSelf = self;if(![[GSCLogin sharedLogin] isLogin]){// 如果未登录则拉起登录[[GSCLogin sharedLogin] loginWithFinishBlock:^(BOOL isLogin){__strong typeof(self) strongSelf = self;if(isLogin){[strongSelf.tableView reloadData];}}];}else{// 已登录则退出登录[[GSCLogin sharedLogin] logOut];[self.tableView reloadData];}
}@end

集成SDK实现登录与分享:

        ·申请接入,获取appid和apikey

        ·集成SDK设置对应的settings及URL Scheme

        ·业务逻辑的基础UI和交互(登录 / 分享 ...)

        ·通过用户登录验证和授权,获取Access Token

        ·通过Access Token获取用户的OpenID

        ·通过OpenAPI请求访问或修改用户授权的资源

        ·客户端保存相应用户信息,按需展示

        ·调用其它API实现分享等逻辑

相关文章:

IOS开发学习日记(十七)

简单的第三方登录和分享功能 第三方登录系统 URL Scheme&#xff1a;App间的跳转及通信 App间跳转场景 登陆系统&#xff1a; 跨平台&#xff0c;跨App 标记用户&#xff0c;个性化的推送 使用第三方登录&#xff08;减少注册成本 / 无须维护敏感信息&#xff09; 微信 / Q…...

【ARMv8/ARMv9 硬件加速系列 2 -- ARM NEON 加速运算介绍】

文章目录 ARM NEONNEON 向量寄存器NEON 寄存器使用方式NEON 寄存器的视图NEON 寄存器别名NEON 寄存器的用途ARM NEON 在ARMv8架构中,引入了一组新的寄存器,称为向量寄存器(Vector Registers),用于支持高效的向量和浮点计算。这些寄存器是SIMD(Single Instruction, Multi…...

LayoutSystem布局系统

简介: LayoutSystem,是UGUI中由CanvasUpdateSystem发起(m_LayoutRebuildQueue中大部分都是LayoutRebuilder)的关于布局排列的处理系统。 类图: 布局过程 核心代码讲解: LayoutRebuilder...

滚球游戏笔记

1、准备工作 (1) 创建地面&#xff1a;3D Object-Plane&#xff0c;命名为Ground (2) 创建小球&#xff1a;3D Object-sphere&#xff0c;命名为Player&#xff0c;PositionY 0.5。添加Rigidbody组件 (3) 创建文件夹&#xff1a;Create-Foder&#xff0c;分别命名为Material…...

Mysql8死锁排查

Mysql8死锁排查 Mysql8 查询死锁的表 -- 查询死锁表select * from performance_schema.data_locks;-- 查询死锁等待时间select * from performance_schema.data_lock_waits;Mysql8之前的版本 查询死锁的表 -- 查询死锁表SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;-- 查询…...

程序猿成长之路之数据挖掘篇——决策树分类算法(1)——信息熵和信息增益

决策树不仅在人工智能领域发挥着他的作用&#xff0c;而且在数据挖掘中也在分类领域中独占鳌头。了解决策树的思想是学习数据挖掘中的分类算法的关键&#xff0c;也是学习分类算法的基础。 什么是决策树 用术语来说&#xff0c;决策树&#xff08;Decision Tree&#xff09;是…...

数据通信与网络(五)

交换机功能&#xff1a; 地址学习&#xff08;端口/MAC地址映射表&#xff09; 通信过滤&#xff08;基于端口/MAC地址映射表&#xff09; 生成树协议&#xff08;断开环路&#xff09; 隔离冲突域 生成树协议 隔离冲突域 交换机配置模式(用不同级别的命令对交换机进行配置) 普…...

数据中心容灾考题

abc cd abc c为啥...

win10远程桌面连接端口,远Win10远程桌面连接端口修改及无法连接解决方案

一、Win10远程桌面连接端口概述 Win10远程桌面连接功能允许用户从远程位置访问和控制另一台计算机。远程桌面连接默认使用TCP 3389端口&#xff0c;但出于安全或其他需求&#xff0c;用户可能希望修改此端口。 二、Win10远程桌面连接端口修改方法 要修改Win10远程桌面连接的…...

基于AT89C52单片机的温度报警系统

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/89456321?spm=1001.2014.3001.5503 仿真构造:AT89C52+DS18B20温度模块+三按键+蜂鸣器+四位数码管显示+电源模块。 压缩包构造:源码+仿真图+设计文档+原理图+开题文档+元件…...

[保姆级教程]uniapp配置vueX

文章目录 注意新建文件简单的使用 注意 uniapp是支持vueX的只需配置一下就好 新建文件 在src文件中&#xff0c;新建一个store&#xff08;如果有的话跳过&#xff09; 在store中新建一个js文件&#xff0c;修改js文件名称和选择模板为default 在 uni-app 项目根目录下&…...

第二次IAG

IAG in NanJing City 我与南京奥体的初次相遇&#xff0c;也可能是最后一次&#xff01; 对我来说,IAG 演唱会圆满结束啦! 做了两场充满爱[em]e400624[/em]的美梦 3.30号合肥站&#xff0c;6.21号南京站[em]e400947[/em] 其实&#xff0c;没想到昨天回去看呀!(lack of money […...

智慧校园综合管理系统的优点有哪些

在当今这个信息化飞速发展的时代&#xff0c;智慧校园综合管理系统正逐步成为教育领域的一股革新力量&#xff0c;它悄然改变着我们对传统校园管理的认知。这套系统如同一个无形的桥梁&#xff0c;将先进的信息技术与学校的日常运作紧密相连&#xff0c;展现出多维度的优势。 …...

如何跳出认知偏差,个人认知能力升级

一、教程描述 什么是认知力&#xff1f;认知力&#xff08;cognitive ability&#xff09;&#xff0c;实际上就是指一个人的认知能力&#xff0c;是指人的大脑加工、储存和提取信息的能力&#xff0c;或者主观对非主观的事物的反映能力&#xff0c;如果变成大白话&#xff0c…...

Scala中的map函数

Scala中的map函数 在 Scala 中&#xff0c;map 是一种常见的高阶函数&#xff0c;用于对集合中的每个元素应用一个函数&#xff0c;并返回应用了该函数后的新集合&#xff0c;保持原始集合的结构不变。它的主要作用有以下几点&#xff1a; 1. 遍历集合&#xff1a; map 可以遍历…...

linux安装conda环境实践

Conda介绍 conda 是一个开源的软件包管理系统和环境管理软件&#xff0c;用于安装多个版本的软件包及其依赖关系&#xff0c;并在它们之间轻松切换。 conda 分为 anaconda 和 miniconda&#xff0c;anaconda 是一个包含了许多常用库的集合版本&#xff0c;miniconda 是精简版…...

Flutter-实现头像叠加动画效果

实现头像叠加动画效果 在这篇文章中&#xff0c;我们将介绍如何使用 Flutter 实现一个带有透明度渐变效果和过渡动画的头像叠加列表。通过这种效果&#xff0c;可以在图片切换时实现平滑的动画&#xff0c;使 UI 更加生动和吸引人。 需求 我们的目标是实现一个头像叠加列表&…...

MSPM0G3507——特殊的串口0

在烧录器中有串口0&#xff0c;默认也是串口0通过烧录线给电脑发数据。 如果要改变&#xff0c;需要变一下LP上的跳线帽。 需要更改如下位置的跳线帽...

如何选择合适的大模型框架:LangChain、LlamaIndex、Haystack 还是 Hugging Face

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…...

TCP 协议详解:三次握手与四次挥手

在网络通信中&#xff0c;确保数据准确无误地传递是至关重要的。TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;作为一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;在网络数据传输中起到了核心作用。本文将详细解析 TCP 的基本…...

Matlab 单目相机标定(内置函数,棋盘格)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 具体的标定原理可以参阅之前的博客Matlab 单目相机标定(内置函数),这里实现对棋盘格数据的标定过程。 二、实现代码 getCameraCorners.m function [camCorners, usedImIdx, imCheckerboard] = getCameraCorners(…...

C语言第17篇:预处理详解

1、预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用。预定义符号也是在预处理期间处理的。 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI…...

用 Git 玩转版本控制

前言 Git&#xff0c;作为当今最流行的版本控制系统&#xff0c;不仅深受程序员们的青睐&#xff0c;也逐渐成为非开发人员管理文档版本的强大工具。本文将从实用主义的角度出发&#xff0c;深入浅出地介绍 Git 的常用命令&#xff0c;并带领大家探索 Git 的高级功能&#xff…...

AJAX中get和post的区别

在AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;中&#xff0c;GET 和 POST 是两种常用的HTTP请求方法&#xff0c;它们之间存在一些关键的区别。以下是这些区别的主要点&#xff1a; 请求的目的&#xff1a; GET&#xff1a;通常用于从服务器检索&#xff08;…...

软件测试笔记

一、介绍 软件测试是为了尽可能多地发现软件系统中的错误而不是证明软件的正确性。 1、软件缺陷是什么&#xff1f; 软件在使用过程中存在的任何问题都叫软件的缺陷&#xff0c;简称bug。 缺陷的判定标准 软件未实现需求说明书中明确要求的功能——少功能 软件出现了需求说…...

Elasticseach RestClient Api

Elasticsearch RestclientApi基础用法 查询 索引库 初始化 添加依赖 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency>创建链接 package com…...

【网络安全学习】漏洞扫描:-04- ZAP漏洞扫描工具

**ZAP(Zed Attack Proxy)**是一款由OWASP组织开发的免费且开源的安全测试工具。 ZAP支持认证、AJAX爬取、自动化扫描、强制浏览和动态SSL证书等功能。 1️⃣ 安装zap工具 现在的kali版本不一定会预装zap&#xff0c;我们可以自行安装&#xff0c;安装也十分简单。 apt-get …...

fffdddd

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;entity GJL isport(clk, reset: in std_logic;btn_green, btn_red: in std_logic; -- 新增控制按键r1, r2, y1, y2, g1, g2: out std_logic;ledag: out std_logic_…...

SpringSecurity实战入门——授权

权限系统的作用 例如一个学校图书馆的管理系统,如果是普通学生登录就能看到借书还书相关的功能,不可能让他看到并且去使用添加书籍信息,删除书籍信息等功能。但是如果是一个图书馆管理员的账号登录了,应该就能看到并使用添加书籍信息,删除书籍信息等功能。 总结起来就是…...

Linux 网络请求工具:curl

文章目录 Linux 网络请求&#xff1a;curl1. 安装2. 常规用法3. 传输速率4. FTP5. 代理 Linux 网络请求&#xff1a;curl 1. 安装 若系统没有 curl 命令&#xff0c;可以直接通过 yum 或者 dnf 安装&#xff1a; yum -y install curl # 查看版本&#xff0c;确认安装结果 cu…...

建设银行客户端官方网站/正规seo排名外包

计算科学导论论文摘要&#xff1a;在计算科学与导论这门课程中&#xff0c;我们了解到了计算机科学是研制并且利用计算机完成数据处理任务的理论、方法和技术的学科。计算机的根本功能是数据处理。现代计算机体系在冯诺依曼模式上建立&#xff0c;包括硬件系统和软件系统两大部…...

网络规划是干什么的/seo的作用

大家都知道&#xff0c;用document.getElementById(‘element).style.xxx可以获取元素的样式信息&#xff0c;可是它获取的只是DOM元素style属性里的样式规则&#xff0c;对于通过class属性引用的外部样式表&#xff0c;就拿不到我们要的信息了。 DOM标准里有个全局方法getComp…...

引擎网站推广法怎么做/网站推广和优化的原因网络营销

使用Git Gui的查看中文代码的时候&#xff0c;会出现乱码&#xff0c;如下&#xff1a; 解决方法&#xff1a; 1、在乱码的区域点击鼠标右键&#xff0c;选择Encoding&#xff0c;然后选择Unicode&#xff08;UTF-8&#xff09; 2、最终乱码问题解决&#xff0c;如下图&#x…...

网站建设合同附加协议/百度西安分公司地址

1.Configuration有什么用&#xff1f; configuration 2.Spring是如何获取Bean的定义的&#xff1f; 1&#xff09;&#xff1a;通过启动一个AnnotationConfigApplicationContext 来引导这个Configuration 注解的类&#xff0c;比如&#xff1a; AnnotationConfigApplicationCo…...

手机网站制作得多少钱啊/寄生虫seo教程

以下测试例子以SQL 2008备份&#xff0c;在SQL2014还原,造成索引被禁用. --备份环境&#xff08;SQL Server 2008 R2&#xff09; /* MicrosoftSQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Data Center Edition…...

怎样做手机网站建设/网站营销软文

php mysql数据库操作分页类2021-01-23 15:35:484复制代码 代码如下:/**mysql数据库分页类*packagepagelist*authoryytcpt(无影)*version2008-03-27*copyrigthhttp://www.d5s.cn/*//**分页样式.page{float:left;font:11pxArial,Helvetica,sans-serif;padding:6px0;margin:0px10%…...