以极光为例 从ios角度谈自己写服务器需要做什么:
开发维护部分:
1. 需要写服务器,iOS,android,完成服务器和APNs的对接。
2.如果更换了手机, 需要维护device token
3.推送部分,jpush是通过web portal网页直接推送,也可以调用jpush的http协议api来完成,可以给开发减少很多的工作量。
运营部分:
4.一次推送,同时向Android, iOS, WinPhone(微软的手机操作系统), 统一APi, 统一推送界面
5.提供了标签,别名绑定机制,以及提供用户分群方式,简单,直观。 (如果没有这些,就只能给deviceToken发送,如果给用户绑定了别名,就可以给用户按 指定别名做到唯一发送;如果绑定了标签,根据标签,批量下发消息;reg id ,设备的唯一标识,给设备发送消息。)
应用内推送部分:
6.除了使用APNs推送, 也提供应用内推送(服务器和 客户端,建立的连接)。应用内推送和 APNs推送的对比:
极光推送做了一个很好的长连接,来更方便的处理推送,具体如下:
概念:JPush SDK内部和手机的APP之间有个长连接, 可以做到应用内推送。
具体使用场景: 在app打开时,与JPush建立连接,直接由JPush下发到手机;否则,其他的情况仍然使用APNs服务器发送,由JPush服务器发送到APNs服务器,再发到手机。
具体使用: 这个消息直接由JPush下发,如果用户在线立即收到,否则就保存为离线,默认保留一天,保留5条消息。
JPush提供的接口:networkDidReceiveMessage
第三方服务的网址: mdsa.51cto.com
包含一些接口,一些服务器 ,提供api, 通过api获取数据。 免费和收费的。
百度搜索极光推送,
1. 新建立一个xcode项目, 改bundleid和申请的证书的appid一致(或者打开原有项目,保证bundleid和证书一致0),加入http设置在plist,加入支持这个功能的xcode官方的框架,导入极光包;
2. 双击新建立的证书,导出p12;
3. 在极光推送官网, 登陆 , 创建应用,填入项目名字,图标,导入生成的证书的p12.
4.xcode项目里面, 首先在appdelegate里面,在不同的ios版本要求下, 写不同的注册推送功能功能方法;
5.xcode项目里面, 配置appkey.(这个appkey就是在极光推送网址创建程序生成的appkey)。 channel的意思就是应用程序包是 从什么渠道下载的,一般就填写app store, apsForProduction,这里就是是不是生产发布环境,一般写yes,如果是开发调试环境,就要写false.
6.xcode项目里面, 把获取的devicetoken上传给极光服务器。
7.xcode项目里面, 实现接收到远程通知方法的两个方法。做到监听。写这个方法,必须要勾选后台模式。
- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:
(void(^)(UIBackgroundFetchResult))completionHandler;
8.xcode项目里面,实现一个如果监听通知失败的方法, 方便调试。
8.现在到极光推送里面, 要我们自己的服务器给苹果服务器发送通知,我们集成了极光, 在极光的应用配置之后, 到极光的推送里面,
运行xcode程序。 点击同意接收通知。
在极光推送平台,填写推送内容,然后,选择ios开发环境,所有人。 点击立即发送按钮。
7.0以上不需要关闭bitCode.
新版本,不能在plist配置appkey, 需要使用代码配置,代码setupWithOption
http://mdsa.51cto.com/services/4
极光推送实际在项目里面的代码:
1. 注册2. 授权.3.上传devicetoken 4.监听推送 5.勾选后台模式,勾选推送 6. 保证bundleid 一致
1. 注册2. 授权.
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
//注册
// 3.0.0及以后版本注册
JPUSHRegisterEntity * entity = [[JPUSHRegisterEntity alloc] init];
if(@available(iOS 12.0, *)) {
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound|JPAuthorizationOptionProvidesAppNotificationSettings;
}else{
entity.types = JPAuthorizationOptionAlert|JPAuthorizationOptionBadge|JPAuthorizationOptionSound;
}
[JPUSHService registerForRemoteNotificationConfig:entity delegate:self];
// [JPUSHService registerLbsGeofenceDelegate:self withLaunchOptions:launchOptions];
//授权
//如不需要使用IDFA,advertisingIdentifier 可为nil
[JPUSHService setupWithOption:launchOptions appKey:@"f32360cefed071cef410196b"
channel:@"app store"
apsForProduction:false
advertisingIdentifier:nil];
3.上传devicetoken
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{ [JPUSHService registerDeviceToken:deviceToken];
}
4.监听推送
- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:(void(^)(UIBackgroundFetchResultresult))completionHandler {
NSLog(@"接收到远程通知");
[JPUSHService handleRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
5. 勾选后台模式,勾选推送
6. 保证bundleid 一致
过程中出现的问题:
1. 集成极光推送出现:Undefined symbols for architecture arm64: "_dns_parse_resource_record", referenced from:?解决办法:
添加libresolv.tbd库,即可解决问题
2.还有一个是改到ios10.0就可以了。
网友评论