iOS导航及分享归纳与整理

自己尝试做了个公交app 需要用到分享及导航功能 归纳整理一下脑子里的东西

一. 地图定位

1. 地图导航
  1. 创建CLGeocoder对象
  2. 调用地理编码方法
  3. 防错处理
  4. 获取CL地标对象 暂取最后一个
  5. 创建MKPlacemark对象
  6. 创建一个MKMapItem
  7. 调用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. 自带分享
  1. 判断系统服务是否可用
  2. 创建分享控制器 –> 还可以设置预设文字/图像/网址
  3. 模态弹出
2. 友盟分享
  1. 需要注册平台开发者, 创建应用, 获取AppKey (主百度不一样, 不需要绑定Bundle ID)
  2. 程序中导入框架, 并按照文档配置(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
  1. AppDelegate.m 中进行授权
  2. 在需要分享功能的代码中, 拷贝官方分享代码片段并进行修改即可

- (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. 节省用户时间(账号密码超长, 输错, 忘记密码)
  2. 保护用户信息安全 —> 完全不用输入账号密码
  3. 减少用户在任何一个环节的流失率 —> 约简单越好

四. 应用间跳转

1. 普通跳转(A应用跳转B应用)iOS9发生了变化
  1. A跳B –> B中设置URL Sheme A中实现openURL (iOS9以前为了逻辑严谨, 会加canOpenURL, canOpenURL还可以检测用户是否安装了对应的程序,可以实现推送广告的目的, iOS9最多可以设置50个白名单)
  2. 如果你的应用使用了如SSO授权登录或跳转分享功能,在iOS9下就需要增加一个可跳转的白名单,指定对应跳转App的URL Scheme,否则将在第三方平台判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。
  3. iOS9适配 A中增加白名单列表
    –可以友盟官网查看
<key>LSApplicationQueriesSchemes</key>
<array>
<string>wechat</string>
<string>weixin</string>
</array>
2. 跳转到指定页面(A应用跳转B应用指定页面)
  1. A跳转B制定页面: A跳转方法中URL后面拼接参数
  2. B中截取URL, 然后判断是否包含制定的字符串, 然后自行处理跳转逻辑
3. 应用程序互相跳转(A应用跳转B应用,再跳转A应用)
  1. 给URL后面继续拼接当前程序的Scheme 即可
  2. 第二个程序需要自行判断, 根据特殊来截取 “.” “/”

最近才开始往github上放东西 在公司写的又不能放= = 大家姑且看看吧

github地址: https://github.com/FuThD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值