自己尝试做了个公交app 需要用到分享及导航功能 归纳整理一下脑子里的东西
一. 地图定位
1. 地图导航
- 创建CLGeocoder对象
- 调用地理编码方法
- 防错处理
- 获取CL地标对象 暂取最后一个
- 创建MKPlacemark对象
- 创建一个MKMapItem
- 调用open类方法, 打开导航 (MKMapItem open方法可以导航)
2. 地图画线
前提: 要实现位置管理器授权
1. 前几步跟导航一样, 但这里额外要获取 起点位置
2. 创建一个方向请求对象 –> 相当于拼接网址 –> 需要传入参数: 起点和终点
3. 创建方向对象 –> 创建一个请求对象
4. 计算路径 –> 处理网络请求的结果
5. 遍历数组, 获取数据 : polyline : 多段线
6. 添加到地图上 :addOverlay 遮盖物
—代理方法—-
7. rendererForOverlay: 此方法中
1. 创建一个折线渲染物对象
2. 设置线条颜色 –> 必须设置, 否则看不见
3. 设置线条宽度
二. 百度地图
1. 集成百度地图
参考官方文档 –> 申请秘钥 –> 配置开发环境 –> Hello BaiduMap –> 注意事项
–> 注意Bundle ID(官方文档没有提示)
2. 百度地图的POI检索
参考官方文档 –> POI注意一下延时调用即可
demo百度地图的简单集成代码
#import "ViewController.h"
#import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件
#import <BaiduMapAPI_Map/BMKMapComponent.h>//引入地图功能所有的头文件
#import <BaiduMapAPI_Search/BMKSearchComponent.h>//引入检索功能所有的头文件
#import <BaiduMapAPI_Cloud/BMKCloudSearchComponent.h>//引入云检索功能所有的头文件
#import <BaiduMapAPI_Location/BMKLocationComponent.h>//引入定位功能所有的头文件
#import <BaiduMapAPI_Utils/BMKUtilsComponent.h>//引入计算工具所有的头文件
#import <BaiduMapAPI_Radar/BMKRadarComponent.h>//引入周边雷达功能所有的头文件
#import <BaiduMapAPI_Map/BMKMapView.h>//只引入所需的单个头文件
@interface ViewController ()<BMKMapViewDelegate, BMKPoiSearchDelegate>
{
BMKMapView *_mapView;
BMKPoiSearch *_searcher;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1. 创建百度地图
_mapView = [[BMKMapView alloc]init];
self.view = _mapView;
//2. 切换为卫星图
//[_mapView setMapType:BMKMapTypeSatellite];
//3. 添加一个PointAnnotation
BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
CLLocationCoordinate2D coor;
coor.latitude = 39.915;
coor.longitude = 116.404;
annotation.coordinate = coor;
annotation.title = @"这里是北京";
[_mapView addAnnotation:annotation];
//4.POI检索代码
[self performSelector:@selector(poiSearch) withObject:nil afterDelay:2];
//5.设置地图显示层级 3最大, 20最小
[_mapView setZoomLevel:16];
}
#pragma mark POI检索代码
- (void)poiSearch
{
//1. 初始化检索对象
_searcher =[[BMKPoiSearch alloc]init];
_searcher.delegate = self;
//2. 发起检索 --> 拼接参数
BMKNearbySearchOption *option = [[BMKNearbySearchOption alloc]init];
//分页索引,可选,默认为0
option.pageIndex = 0;
//分页数量,可选,默认为10,最多为50
option.pageCapacity = 10;
option.location = CLLocationCoordinate2DMake(39.915, 116.404);
option.keyword = @"小吃";
BOOL flag = [_searcher poiSearchNearBy:option];
if(flag)
{
NSLog(@"周边检索发送成功");
}
else
{
NSLog(@"周边检索发送失败");
}
}
//实现PoiSearchDeleage处理回调结果
- (void)onGetPoiResult:(BMKPoiSearch*)searcher result:(BMKPoiResult*)poiResultList errorCode:(BMKSearchErrorCode)error
{
if (error == BMK_SEARCH_NO_ERROR) {
//在此处理正常结果
// 添加大头针 / 显示一个列表给用户
for (BMKPoiInfo *poiInfo in poiResultList.poiInfoList) {
BMKPointAnnotation* annotation = [[BMKPointAnnotation alloc]init];
annotation.coordinate = poiInfo.pt;
annotation.title = poiInfo.name;
[_mapView addAnnotation:annotation];
}
}
else if (error == BMK_SEARCH_AMBIGUOUS_KEYWORD){
//当在设置城市未找到结果,但在其他城市找到结果时,回调建议检索城市列表
// result.cityList;
NSLog(@"起始点有歧义");
} else {
NSLog(@"error: %zd",error);
NSLog(@"抱歉,未找到结果");
}
}
- (void)viewWillAppear:(BOOL)animated
{
[_mapView viewWillAppear];
_mapView.delegate = self; // 此处记得不用的时候需要置nil,否则影响内存的释放
}
- (void)viewWillDisappear:(BOOL)animated
{
[_mapView viewWillDisappear];
_mapView.delegate = nil; // 不用时,置nil
_searcher.delegate = nil; //不使用时将delegate设置为 nil
}
@end
三. 社交分享
1. 自带分享
- 判断系统服务是否可用
- 创建分享控制器 –> 还可以设置预设文字/图像/网址
- 模态弹出
2. 友盟分享
- 需要注册平台开发者, 创建应用, 获取AppKey (主百度不一样, 不需要绑定Bundle ID)
- 程序中导入框架, 并按照文档配置(system…)
demo 模拟分享到微博 并获取微博数据
#import "ViewController.h"
#import "UMSocial.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor blueColor];
}
#pragma mark 点击屏幕开始分享
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//注意:分享到微信好友、微信朋友圈、微信收藏、QQ空间、QQ好友、来往好友、来往朋友圈、易信好友、易信朋友圈、Facebook、Twitter、Instagram等平台需要参考各自的集成方法
[UMSocialSnsService presentSnsIconSheetView:self appKey:@"566bd24067e58edfe800960e" shareText:@"你要分享的文字"
shareImage:[UIImage imageNamed:@"icon.png"]
shareToSnsNames:[NSArray arrayWithObjects:UMShareToSina,UMShareToWechatSession,UMShareToQQ,UMShareToDouban, UMShareToEmail,nil]
delegate:nil];
}
#pragma mark 微博登录--> 第三方登录 --> SSO授权登录
- (IBAction)weiboLoninClick:(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)onGetUserInfoClick:(id)sender {
//获取accestoken以及新浪用户信息,得到的数据在回调Block对象形参respone的data属性
[[UMSocialDataService defaultDataService] requestSnsInformation:UMShareToSina completion:^(UMSocialResponseEntity *response){
NSLog(@"SnsInformation is %@",response.data);
}];
// 在此方法中, 我们可以获取微博用户的部分信息, 我么可以将信息获取出来, 然后悄悄的执行注册接口, 自家的后台数据就有了这个账号
//将来公司有注册接口: 比如说要传入UID Uname image
}
@end
- AppDelegate.m 中进行授权
- 在需要分享功能的代码中, 拷贝官方分享代码片段并进行修改即可
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//进行分享、授权操作需要在第三方平台创建应用并提交审核,友盟默认提供了大多数平台的测试账号,但如果需要将分享、授权来源、分享到QQ、Qzone的icon更改为自己APP的应用,就需要自己申请第三方账号。
// 授权过程
[UMSocialData setAppKey:@"友盟APPKEY"];
//打开新浪微博的SSO开关,设置新浪微博回调地址,这里必须要和你在新浪微博后台设置的回调地址一致。若在新浪后台设置我们的回调地址,“http://sns.whalecloud.com/sina2/callback”,这里可以传nil
[UMSocialSinaHandler openSSOWithRedirectURL:@"http://sns.whalecloud.com/sina2/callback"];
return YES;
}
#pragma mark 此方法用于处理应用间的跳转
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
BOOL result = [UMSocialSnsService handleOpenURL:url];
if (result == FALSE) {
//调用其他SDK,例如支付宝SDK等
}
return result;
}
3. SSO授权 - 分享
SSO授权的前提: 必须有对应的第三方程序
SSO指单点登录,当用户安装了对应第三方客户端且登录时,可以在登录时免去输入账号密码的过程
1. 导入对应的文件夹
2. 配置URL schemes : 格式为“sina.”+友盟appkey
3. PPdelegate中集成新浪微博开关
4. APPdelegate中实现回调方法
4. SSO授权 - 登录
第三方登录主要用于简化用户登录流程,通过用户拥有的微博、QQ、微信等第三方账号进行登录并且构建APP自己的登录账号体系。
1. 在新浪微博登录按钮中实现指定的方法
2. 如果想获取详细信息, 可以继续调用友盟的接口
3. 如果自己的服务器希望保存用户的数据, 那么应该自行执行注册用户的接口
5. SSO授权优势
一. 流程对比:
OAuth: 当前程序 —> 网页为载体 —> 发请求, 用户输入账号和密码, 自己处理获取Access_token
SSO: 必须有第三方的应用程序 —> 在第三方应用程序完成授权 —> 一键授权(如果已经登录)
二. SSO优势:
- 节省用户时间(账号密码超长, 输错, 忘记密码)
- 保护用户信息安全 —> 完全不用输入账号密码
- 减少用户在任何一个环节的流失率 —> 约简单越好
四. 应用间跳转
1. 普通跳转(A应用跳转B应用)iOS9发生了变化
- A跳B –> B中设置URL Sheme A中实现openURL (iOS9以前为了逻辑严谨, 会加canOpenURL, canOpenURL还可以检测用户是否安装了对应的程序,可以实现推送广告的目的, iOS9最多可以设置50个白名单)
- 如果你的应用使用了如SSO授权登录或跳转分享功能,在iOS9下就需要增加一个可跳转的白名单,指定对应跳转App的URL Scheme,否则将在第三方平台判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。
- iOS9适配 A中增加白名单列表
–可以友盟官网查看
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
</array>
2. 跳转到指定页面(A应用跳转B应用指定页面)
- A跳转B制定页面: A跳转方法中URL后面拼接参数
- B中截取URL, 然后判断是否包含制定的字符串, 然后自行处理跳转逻辑
3. 应用程序互相跳转(A应用跳转B应用,再跳转A应用)
- 给URL后面继续拼接当前程序的Scheme 即可
- 第二个程序需要自行判断, 根据特殊来截取 “.” “/”
最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧
github地址: https://github.com/FuThD