Skyhook Context Accelerator (iOS)
先决条件
- XCode 9.0+
- 项目必须针对 iOS 9.0+
- 需要支持区域监控的设备:iPhone 4+、iPad (Wi-Fi 只) 3+、iPad (Wi-Fi+Cell) 2+、iPad 迷你、iPad Air、iPod Touch 5+
安装
使用 Cocoapods
- 在 Podfile 中添加以下依赖
pod 'SkyhookContext', '~> 2.1.0'
- 转到项目文件夹,并在终端窗口中执行以下命令
$ pod install
使用框架
-
克隆 Skyhook Context 的 Cocoapod 仓库。
-
将框架文件 (SkyhookContext.framework) 拖入您的 Xcode 项目中。确保选中“添加到目标”复选框。
-
在您应用程序的目标设置中,打开“
通用
”标签,并在“嵌入二进制文件
”部分下添加SkyhookContext.framework
。 -
将以下框架添加到您的项目中
- CoreLocation
- libsqlite3.0
- MapKit
- Security
- SystemConfiguration
- AddressBook
- AddressBookUI
- AdSupport(可选)
-
将以下内容添加到构建设置中的“其他链接器标志”部分
- -ObjC
- -lc++
- -all_load
-
为了使用 CoreLocation 框架功能,需要在您的应用程序的 Info.plist 中添加
NSLocationAlwaysAndWhenInUseUsageDescription
和NSLocationWhenInUseUsageDescription
键。每个条目的字符串值应描述访问位置的目的,并将显示给用户以获取权限。您还需要添加UIBackgroundModes
部分,并在其中添加location
项。如果您不需要在应用程序中执行活动监控,而只想基于位置显示场所信息,则
NSLocationWhenInUseUsageDescription
就足够了。尽管可以使用
NSLocationWhenInUseUsageDescription
仅在应用程序打开时根据位置请求角色,但此设置会显着减少生成设备角色所使用的位置样本数量。为了提高准确性和减少生成时间,建议尽可能使用NSLocationAlwaysAndWhenInUseUsageDescription
,特别是当应用程序依赖 Skyhook Personas 的时候。如果您希望位置访问请求对话框在您控制的特定时间显示,可以自己调用 CoreLocation 位置管理器的
requestWhenInUseAuthorization
或requestAlwaysAuthorization
方法,并将NO
传递给setLocationPromptAllowed:
SHXAccelerator
方法,以禁用这些请求。
初始化
导入 SDK
根据需要导入 Accelerator 库。
#import <SkyhookContext/Accelerator.h>
实例化加速器对象
SHXAccelerator *accelerator = [[SHXAccelerator alloc] initWithKey:@"your_application_key"];
处理代理事件
将你的类指定为 SHXAcceleratorDelegate,并将其作为代理分配给先前实例化的加速器实例。
// here 'self' is an instance of your class that implements SHXAcceleratorDelegate protocol.
accelerator.delegate = self;
上下文加速器 SDK 是线程安全的,因此可以从任何线程安全地调用其 API 方法,但请注意,它将始终在调用加速器的线程中调用你的代理方法,而不论你的应用程序在哪个线程中调用加速器。
位置提示
由于加速器会为其地理围栏和人口统计功能扫描显著的位置变化,因此它有可能触发面向用户的地理位置权限对话框。
如果您希望在应用程序的正常流程中触发此操作,可以阻止加速器在您这样做之前启动任何位置活动
[SHXAccelerator setLocationPromptAllowed:NO];
默认设置为 YES。请注意,如果您不允许位置提示,则地理位置围栏将无法工作,直到您自行触发位置。
Skyhook 人物
您可以通过调用 refreshPersonaWithCompletion:
请求刷新当前用户的 Skyhook 人物。
[accelerator refreshPersonaWithCompletion:^(SHXPersona *persona, NSError *error)
{
if (error)
{
// handle error
NSLog(@"error:%@", error);
return;
}
// use persona
}];
最新人物
您可以在任何时间通过代表 persona
属性的 Skyhook 人物访问当前的用户。如果没有可用的人物,则此属性将为 nil。
SHXPersona *persona = accelerator.persona;
请注意,对于使用Ad Support框架的应用,在设备上更改广告设置后,最新的个人资料可能会被删除。在这种情况下,您可能需要请求刷新个人资料。
SHXPersona对象具有以下人口统计属性
- 年龄
- 性别
- 族裔
- 收入
- 教育
这些属性中的每一个都是一个由SHXDemographic对象组成的NSArray对象,按概率递减的顺序列出。
例如,要列出当前族裔个人资料的所有值
SHXPersona *persona = accelerator.persona;
for (SHXDemographic *demographic in persona.ethnicity)
{
NSLog(@"value:%@ probability:%f variance:%f\n",
demographic.value,
demographic.probability,
demographic.variance);
}
上述代码的结果将打印出类似于以下内容
value:white probability:0.65 variance: 0.1
value:other probability:0.15 variance: 0.1
value:black probability:0.12 variance: 0.1
value:asian probability:0.08 variance: 0.1
请注意,由于值是按概率排序的,您可以简单地从列表中获取第一个元素(索引0),以获取当前用户最有可能是的值。
行为
与五个人口统计对象类似,SHXPersona还包括一个behaviors属性。
SHXPersona *persona = accelerator.persona;
for (SHXBehavior *behavior in persona.behaviors)
{
NSLog(@"ID:%@ name:%@\n",
behavior.ident,
behavior.name);
}
上述代码的结果将打印出类似于以下内容
ID:12341318394918 name:auto intenders
ID:1234131839491234 name:auto enthusiasts
通知
每当个人资料更新时,SHXAccelerator将通知其代表。
- (void)accelerator:(SHXAccelerator *)accelerator
didUpdatePersona:(SHXPersona *)persona;
Skyhook个人资料何时更新?
通常,当上下文加速器SDK收到位置变化通知时,个人资料会更新。如果您正在使用加速度计的活动监控功能,则粗略的位置更新将自动发生。您可以通过在任何时候提供由您的应用程序获取的位置来提高准确性。
如果您不使用活动监控,您必须向加速度计提供位置,以便人口统计更新才能正常工作。
活动监控
通常您以这样的方式开始监控活动
[accelerator startMonitoringForAllCampaigns];
如果需要更多控制,您可以选择监控单个活动
[accelerator startMonitoringForCampaign:@"YourCampaignName1"];
[accelerator startMonitoringForCampaign:@"YourCampaignName2"];
[accelerator startMonitoringForCampaign:@"YourCampaignName3"];
一旦您开始监控活动事件,加速度计将通过My.Skyhook上指定的各种活动事件,通过SHXAcceleratorDelegate回调通知您。
当用户进入或离开指定的场所时,代表将接收到以下回调。每个回调都包含一个SHXCampaignVenue对象,该对象的属性描述了场所。
- (void)accelerator:(SHXAccelerator *)accelerator
didEnterVenue:(SHXCampaignVenue *)venue;
- (void)accelerator:(SHXAccelerator *)accelerator
didExitVenue:(SHXCampaignVenue *)venue;
如果发生错误,代表还将通知您。
- (void)accelerator:(SHXAccelerator *)accelerator
didFailWithError:(NSError *)error;
SHXCampaignVenue对象具有以下属性
属性名称 | 属性类型 | 定义 |
---|---|---|
venueIdent | NSNumber | 场所标识符 |
campaignName | NSString | 活动名称 |
timestamp | NSDate | 检测到事件的时间 |
customData | NSString | My.Skyhook上指定的自定义数据(如果没有设置,则为nil) |
eventType | 枚举 | 事件类型 - 紧邻(SHXCampaignVenueEventTypeNear)或内部(SHXCampaignVenueEventTypeInside) |
当监控个别活动时,您可以停止不再需要的活动监控
[accelerator stopMonitoringForCampaign:@"YourCampaignName2"];
注意,如果正在监控所有活动,则调用stopMonitoringForCampaign没有效果。它不会停止指定的活动监控。
或者,您可以停止监控所有活动,无论是个别活动还是所有活动都在被监控
[accelerator stopMonitoringForAllCampaigns];
您的应用可以通过调用fetchRecentCampaignVisitsWithLimit:completion:
方法来检索最近的活动访问列表。
[accelerator fetchRecentCampaignVisitsWithLimit:100
completion:^(NSArray *visits, NSError *error)
{
if (error)
{
// handle error
NSLog(@"error:%@", error);
return;
}
// use recent campaign visits
}];
位置提示
如果您的应用包含位置信息,您可以在应用收到当前位置信息时协助Accelerator。
// this is the CLLocationManagerDelegate callback your app would typically recieve
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// extract latest location and pass it to the accelerator object
CLLocation *latestLocation = [locations lastObject];
// pass the location to Accelerator
[accelerator didUpdateToLocation:latestLocation];
}
IP位置
Contex Accelerator SDK还可以用于通过请求的远程IP提供按需IP位置。
[accelerator requestIPLocationWithCompletion:^(SHXIPLocation *location, NSError *error)
{
// use returned location or handle error
if (!error)
{
CLLocationCoordinate2D coordinate = location.coordinate;
MKPlacemark *placemark = [location createMKPlacemark];
SHXIPLocationType type = location.locationType;
SHXAccuracyIndicator accuracy = location.accuracyIndicator;
}
else
{
NSLog(@"error:%@", error);
}
}];
如果成功,该块将返回一个SHXIPLocation对象。该对象是CLLocation的子类,尽管除了coordinate以外的属性没有设置,但您仍然可以使用所有内置的CoreLocation函数来处理CLLocation对象。要获取该位置的MKPlacemark,请使用createMKPlacemark方法。
附加的SHXIPLocation属性如下
SHXIPLocation
属性名称 | 属性类型 | 定义 |
---|---|---|
coordinate | CLLocationCoordinate2D | 纬度,经度 |
accuracyIndicator | SHXAccuracyIndicator | 水平精度指示器 |
locationType | SHXIPLocationType | IP类型 |
#### SHXIPLocationType值 | 定义 -------------------------|---------- SHXIPLocationTypeFixed | 固定IP地址 SHXIPLocationTypeMobile | 移动IP地址 SHXIPLocationTypeUnknown | 无法解析IP类型
场所信息 -----------------
场景加速SDK提供了一组方法,用于获取与您的活动和位置相关的场景信息。
附近的监控场景
fetchNearbyMonitoredVenuesWithLimit:completion:
方法允许客户端获取参与积极监控活动的附近场景的唯一标识符。此方法可与其他fetchInfoForVenues:completion:
方法一起使用,以获取更详细的场景信息。
通过唯一标识符获取场景信息
fetchInfoForVenues:completion:
方法允许客户端使用从SHXCampaignVenue
和SHXNearbyCampaignVenue
对象中获取的唯一场景标识符来获取更详细的场景信息。
[accelerator fetchNearbyMonitoredVenuesWithLimit:100
completion:^(NSArray *venues, NSError *error)
{
if (error)
{
// handle error
NSLog(@"error:%@", error);
return;
}
NSMutableArray *ids = [NSMutableArray arrayWithCapacity:[venues count]];
for (SHXNearbyCampaignVenue *venue in venues)
{
[ids addObject:venue.venueIdent];
}
[accelerator fetchInfoForVenues:ids
completion:^(NSArray *venueInfo, NSError *error)
{
if (error)
{
// handle error
NSLog(@"error:%@", error);
return;
}
// use venue information
}];
}];
当前位置的场景信息
fetchVenueInfoAtLocationWithCompletion:
方法允许客户端请求当前用户位置的场景信息。
[accelerator fetchVenueInfoAtLocationWithCompletion:^(NSArray *venues, NSError *error)
{
if (error)
{
// handle error
NSLog(@"error:%@", error);
return;
}
// use venue information
}];
活动列表
fetchCampaignsWithCompletion:
方法允许客户端请求服务器上可用的活动列表。
[accelerator fetchCampaignsWithCompletion:^(NSArray<SHXCampaign *> *campaigns, NSError *error)
{
if (error)
{
// handle error
NSLog(@"error:%@", error);
return;
}
// use campaigns information
}];
隐私考虑
对于使用iOS广告支持框架的应用,场景加速SDK将收集某些使用信息,以提高Skyhook定位和上下文产品的质量。有关Skyhook场景加速SDK将收集和使用的详细数据的概述,请参阅我们的隐私政策,可在http://www.skyhookwireless.com/privacy-policy/skyhook找到。
为了利用用户角色的信息,加速器SDK需要一个匿名标识符。默认情况下将使用IDFA。您可以通过将自定义标识符分配给加速器的userID属性来覆盖标识符。
SHXAccelerator *accelerator;
...
accelerator.userID = @"some-valid-and-unique-user-id”;
除了Skyhook的默认隐私保护之外,集成上下文加速器SDK的开发者还可能允许应用程序用户选择退出使用数据收集。请注意,如果禁用数据收集,应用程序可能接收到的上下文信息将降低。要禁用使用数据收集
SHXAccelerator *accelerator;
...
accelerator.optedIn = NO;
您可以通过以下方式随时检查数据收集状态:
BOOL isOptedIn = accelerator.isOptedIn;
或重新启用它:
accelerator.optedIn = YES;
请注意,默认情况下加速器SDK遵循iOS Ad Support Framework设置:只有在Ad Support Framework存在且用户未启用“限制广告追踪”选项时才启用数据收集。
如果您的应用程序没有使用iOS Ad Support Framework,但应用程序和/或内容提供者已从用户那里得到显式同意利用唯一的设备标识符用于地理围栏日志和人格化,则开发者必须设置userID并将同意设置为是,以启用数据收集。
accelerator.userID = @"some-valid-and-unique-user-id”;
...
accelerator.optedIn = YES;
如果这些条件中的任一不满足,SDK的默认行为是将用户视为已选择退出,并在服务器上禁用数据收集。
在线文档
有关未来更新和更多信息,请参阅此处文档的在线版本