概述个推推送是一个端到端的推送服务,使得服务器端消息能够及时地推送到终端用户手机上,让开发者积极地保持与用户的连接,从而提高用户活跃度、提高应用的留存率。 我们提供了一个SDK开发工具包,包含了iOS SDK的全部所需资源,解压缩后的文件目录结构如图: 其中dist目录包含集成SDK所需的静态库和头文件。 | 注意 libGeTuiSdk-{version}.a (version为具体的sdk版本号)使用libo工具将支持i386、arm64、armv7和armv7s的代码打包到了一起,所以这个库将同时支持simulator和device。 |
项目设置1. 将dist目录拷贝到项目工程目录下导入dist/include/所有的头文件、libGeTuiSdk-{version}.a文件和几个系统库到XCode项目中。 2. 添加头文件搜索目录3. 添加依赖库 (必须,如下图)系统库支持: ibz.dylib libsqlite3.dylib Security.framework SystemConfiguration.framework CFNetwork.framework CoreTelephony.framework CoreLocation.framework AVFoundation.framework 4. SDK后台运行权限设置4.1 Background Fetch 权限:(必选)为了更好支持SDK 推送,APP定期抓取离线数据, 添加Background Fetch 功能。 添加background Fetch 权限:
4.2 Audio and AirPlay 权限:(可选) Audio and AirPlay 权限开启,可以保证SDK后台长时间运行,保证消息实时到达。开发者后台发送透传消息将直接通过GeTuiSdkDidReceivePayload接口送达。 (注:该功能视APP应用具体功能而定,如果App不支持后台多媒体播放,请不要勾选,勾选将有概率通不过AppStore审核!)
5. SDK地理围栏功能:(可选)描述:本功能为使用个推2.0智能标签和个推3.0应景推送的必选功能,建议勾选此功能。 5.1 GPS 定位权限设置(可选)为了适配IOS8及以上系统: Info.plist 中需要添加 NSLocationWhenInUseUsageDescription 或者 NSLocationAlwaysUsageDescription key。 NSLocationWhenInUseUsageDescription 允许App前台获取GPS信息 NSLocationAlwaysUsageDescription 允许App前/后台获取GPS信息 其中NSLocationAlwaysUsageDescription 或者 NSLocationWhenInUseUsageDescription key对应的描述将会出现在请求窗口中,如果不需要描述可以设置value为空。 接入流程1. AppDelegate中启动个推SDK在AppDelegate 中 didFinishLaunchingWithOptions 方法中,通过平台分配的APPID/APPKEY/APPSECRENT 启动个推SDK,并完成注册APNS通知和处理启动时拿到的APNS透传数据。 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self startSdkWith:kAppId appKey:kAppKey appSecret:kAppSecret];
[self registerRemoteNotification];
NSDictionary*message=[launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (message) {
NSString*payloadMsg = [message objectForKey:@ "payload" ];
NSString*record = [NSString stringWithFormat:@ "[APN]%@,%@" ,[NSDate date],payloadMsg];
[_viewController logMsg:record];
}
return YES;
}
|
2. 启动SDK ,并设置后台开关和电子围栏开关- ( void )startSdkWith:(NSString *)appID appKey:(NSString*)appKey appSecret:(NSString *)appSecret
{
NSError *err =nil;
[GeTuiSdk startSdkWithAppId:appID appKey:appKey appSecret:appSecret delegate:self error:&err];
[GeTuiSdk runBackgroundEnable:YES];
[GeTuiSdk lbsLocationEnable:YES andUserVerify:YES];
if (err) {
[_viewController logMsg:[NSString stringWithFormat:@ "%@" , [errlocalizedDescription]]];
}
}
|
3. 当应用进入后台时通知个推SDK进入后台-( void )applicationDidEnterBackground:(UIApplication *)application
{
[GeTuiSdk enterBackground];
}
|
注:原先stopSDK接口。 4. 向服务器注册DeviceToken为 GeTui Server 上报 DeviceToken,免除开发者管理 DeviceToken 的麻烦。并可通过个推开发者平台推送APN消息。 -( void )application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString *token = [[deviceTokendescription]
stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@ "<>" ]];
[_deviceToken release];
deviceToken = [[token stringByReplacingOccurrencesOfString:@ " " withString:@ "" ] retain];
NSLog(@ "deviceToken:%@" ,_deviceToken);
[GeTuiSdk registerDeviceToken:_deviceToken];
}
|
如果获取DeviceToken获取失败,也需要通知个推服务器。 -( void )application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
[GeTuiSdk registerDeviceToken:@ "" ];
}
|
5. Background Fetch 接口回调IOS7.0以后支持APP后台刷新数据,会回调performFetchWithCompletionHandler接口,此处为保证个推数据刷新需调用 [GeTuiSdk resumeBackgroundClient] 接口恢复个推SDK 运行刷新数据。 -( void )application:(UIApplication *)application performFetchWithCompletionHandler:( void (^)(UIBackgroundFetchResult))completionHandler
{
[GeTuiSdk resume];
completionHandler(UIBackgroundFetchResultNewData);
}
|
6. 个推SDK支持用户设置标签个推SDK支持用户设置标签,标示一组标签用户,可以针对标签用户进行推送。 接口:+ (BOOL)setTags:(NSArray *)tags; NSArray *tagNames = [tagName componentsSeparatedByString:@ "tag1,tag2" ];
[GeTuiSdk setTags: tagNames];
|
7. 个推SDK支持绑定别名功能个推SDK支持绑定别名功能,对用户设置别名,可以针对具体别名进行推送。 接口: + (void)bindAlias:(NSString *)alias; //绑定别名 接口: + (void)unbindAlias:(NSString *)alias; //解绑别名 NSString *aAlias = @ "张三" ;
[GeTuiSdk bindAlias:aAlias];
|
8. 设置SDK Delegate 回调,实现GeTuiSdkDelegate各个接口方法8.1 SDK启动成功返回CID接口: - (void) GeTuiSdkDidRegisterClient:(NSString *)clientId; - ( void )GeTuiSdkDidRegisterClient:(NSString *)clientId
{
[_clientId release];
_clientId = [clientId retain];
}
|
8.2 SDK收到透传消息回调接口:-(void)GeTuiSdkDidReceivePayload:(NSString*)payloadId andTaskId:(NSString*) taskId andMessageId:(NSString*)aMsgId fromApplication:(NSString *)appId; -( void )GeTuiSdkDidReceivePayload:(NSString*)payloadIdandTaskId:(NSString*)taskId andMessageId:(NSString *)aMsgId fromApplication:(NSString *)appId
{
[_payloadId release];
_payloadId =[payloadId retain];
NSData *payload = [GeTuiSdk retrivePayloadById:payloadId];
NSString *payloadMsg = nil;
if (payload) {
payloadMsg = [[NSString alloc] initWithBytes:payload.bytes
length:payload.length
encoding:NSUTF8StringEncoding];
}
NSString *record = [NSString stringWithFormat:@ "%d, %@, %@" ,++_lastPaylodIndex, [self formateTime:[NSDate date]], payloadMsg];
NSLog(@ "task id : %@, messageId:%@" , taskId, aMsgId);
[payloadMsg release];
}
|
8.3 SDK收到sendMessage消息回调接口:- (void) GeTuiSdkDidSendMessage:(NSString *)messageId result:(int)result; - ( void )GeTuiSdkDidSendMessage:(NSString *)messageId result:( int )result {
NSString *record = [NSString stringWithFormat:@ "Received sendmessage:%@ result:%d" , messageId, result];
[_viewController logMsg:record];
}
|
8.4 SDK遇到错误回调接口: - (void) GeTuiSdkDidOccurError:(NSError *)error; - ( void )GeTuiSdkDidOccurError:(NSError *)error
{
[_viewController logMsg:[NSString
stringWithFormat:@ ">>>[GexinSdk error]:%@" , [error localizedDescription]]];
}
|
8.5 SDK运行状态通知状态类型 : - SdkStatusStarting // 正在启动
- SdkStatusStarted // 启动
- SdkStatusStoped // 停止
- 接口 :- (void) GeTuiSDkDidNotifySdkState:(SdkStatus)aStatus;
- ( void )GeTuiSDkDidNotifySdkState:(SdkStatus)aStatus {
_sdkStatus = aStatus;
[_viewController updateStatusView:self];
}
|
sd iOS推送流程iOS应用&Server&getui SDK&getui Server和Apple Push Notification Server的交互过程,如下图
|