按照以下说明来集成 SDK。
兼容性:iOS 4.3+
先决条件: Xcode。
测试完成后,请提交您已测试的 .ipa 文件到您 iOS 的代表那里进行 QA,并开启测试模式。您不需要将我们的 UDID 添加到您的应用配置文件中。
为了集成 Pocket Change SDK,您必须首先获取 API 密钥。要查找您应用的 API 密钥,请在仪表板中选择您的应用,然后转到设置:
如果您正在使用 CocoaPods,只需在 Podfile 中添加如下行 pod 'PocketChangeSDK', '~> 1.0'
并跳转到 第4步。否则,继续以下步骤。
您可以克隆 GitHub 仓库
git clone git://github.com/pocketchange/pocketchange-ios-sdk.git
或者从这里下载并解压文件:http://github.com/pocketchange/pocketchange-ios-sdk/zipball/master。
为了使用 SDK,您必须使其对编译器可见。
将 PocketChangeSDK
文件夹拖到您的 Xcode Project 中。
当文件导入对话框出现时,选择“将项目添加到目标组的文件夹”,“为任何添加的文件夹创建分组”,并勾选您要将 PocketChangeSDK 添加的目标。
确保libPocketChangeSDK.a
包含在链接的二进制文件中。
SDK 依赖于多个外部框架。要将这些框架纳入项目中,在“链接二进制文件与库”阶段,如果在之前未添加,则添加以下框架(以及如果之前步骤中没有包含,请添加 libPocketChangeSDK.a
)
由于 AdSupport.framework 适用于 iOS 6+,将其标记为可选项,以便您的应用能在之前的 iOS 版本上运行。SDK 会自动调整其行为,以便在不支持此框架的设备上运行。
您的库搜索路径应该有一个类似于 "$(SRCROOT)/PocketChangeSDK"
的条目,这是 XCode 自动添加的。如果没有,请添加它。
为确保链接器正确包含 SDK 的代码,在项目“构建设置”标签中搜索“other_ld”,在“链接”»“其他链接器标志”下应有一个条目。将以下标志添加到“其他链接器标志”
-ObjC
在您应用程序的 Info.plist 文件中(通常命名为 <application name>-Info.plist
),添加一个字符串类型的行,键为 com.pocketchange.pocketchange-ios-sdk.APIKey
,值为在步骤 1 中获取的 API 键。
如果您尚未为您的应用程序配置合适的显示名称,请在 plist 文件中搜索 CFBundleDisplayName
,并将突出显示行中的值更改为合适的用户界面名称。SDK 在用户界面组件引用您的应用程序时使用您应用程序的 CFBundleDisplayName
。
此外,请确保 您的应用程序 Info.plist 中列出 Portrait 是 支持的界面方向 之一。有关更多信息,请参阅已知问题 横向应用中的键盘方向。
在您的应用程序代理中导入 PocketChangeSDK.h
头文件
#import "PocketChangeSDK.h"
在您的代理的 application:didFinishLaunchingWithOptions:
方法中调用
[[PocketChangeSDK sharedInstance] applicationDidFinishLaunching];
不要在函数调用之间缓存 [PocketChangeSDK sharedInstance]
的值,因为它可能已更改。
某些奖励可能会伴随视觉通知。为了避免干扰您的应用程序,SDK 会将这些通知排队,以便您在方便的时间传递它们。您的应用程序必须定期显示这些通知,否则用户将无法意识到他们的奖励。
当 SDK 排队通知时,它会在默认通知中心发布一个 PocketChangeNotificationIsPendingNotification
。您的应用程序应观察这些通知,并调用相应的方法进行响应。
[[PocketChangeSDK sharedInstance] showNotification];
由于showNotification方法与用户界面交互,您必须在主线程上调用它。PocketChangeSDK类中的所有方法都必须在主线程上调用。 SDK从主线程发布通知,因此除非您提供自定义操作队列来更改默认调用上下文,否则您的观察者将仅在主线程上调用。
showNotification
方法返回一个BOOL
值,表明SDK是否会显示通知。在某些情况下,例如当用户没有网络连接时,通知可能会过期。因此,即使您的应用程序观察到了PocketChangeNotificationIsPendingNotification
,showNotification
也可能不会显示通知。
如果您的应用程序不能同步响应到PocketChangeNotificationIsPendingNotification
,请考虑在应用程序工作流程的自然过渡点上定期调用showNotification
方法。
显示通知后,SDK将向默认通知中心发布一个PocketChangeNotificationWasShownNotification
。您的应用程序应该通过暂停任何昂贵的任务(如动画计时器)来响应此通知。
当用户关闭通知时,SDK将发布一个PocketChangeNotificationWasDismissedNotification
。观察此通知可以让您的应用程序在显示通知时暂停的任何动画和其他昂贵的任务恢复。
从视觉上讲,通知与UIAlertView类似。为了帮助确定在显示通知时应暂停哪些任务,您可以假设通知是一个警报。
与警报不同,通知与iOS 6状态保存集成。如果系统从保存的状态恢复您的应用程序,SDK将自动恢复任何之前可见的通知,并在用户关闭通知时最终发布一个PocketChangeNotificationWasDismissedNotification
。当从保存的状态恢复通知时,SDK不会发布PocketChangeNotificationWasShownNotification
,因为它在之前的应用程序周期中已经发布过。 因此,如果您的应用程序支持状态恢复,您必须在恢复用户界面时考虑任何当前可见的通知。 因为您的应用程序的界面必须已序列化和恢复其状态以参与状态恢复,所以此SDK行为不应造成很大(如果有的话)额外负担。
以下示例应用程序代理演示了基本的SDK集成
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[PocketChangeSDK sharedInstance] applicationDidFinishLaunching];
NSArray *pocketChangeNotifications = [NSArray
arrayWithObjects:
PocketChangeNotificationIsPendingNotification,
PocketChangeNotificationWasShownNotification,
PocketChangeNotificationWasDismissedNotification,
nil];
NSNotificationCenter *defaultNotificationCenter = [NSNotificationCenter defaultCenter];
for (NSString *notification in pocketChangeNotifications) {
[defaultNotificationCenter
addObserver:self
selector:@selector(handlePocketChangeNotification:)
name:notification
object:nil];
}
// ... other startup code ...
return YES;
}
- (void)handlePocketChangeNotification:(NSNotification *)notification
{
NSString *name = [notification name];
if ([name
isEqualToString:PocketChangeNotificationIsPendingNotification]) {
[[PocketChangeSDK sharedInstance] showNotification];
} else if ([name
isEqualToString:PocketChangeNotificationWasShownNotification]) {
[self pauseInterface];
} else if ([name
isEqualToString:PocketChangeNotificationWasDismissedNotification]) {
[self resumeInterface];
}
}
- (void)pauseInterface
{
// pause timers and other expensive UI tasks
}
- (void)resumeInterface
{
// resume timers and other expensive UI tasks
}
一旦您与您的账户代表设置了基于事件的奖励,您可以使用以下方法授予奖励以响应事件
NSString *rewardId = @"a reward identifier";
[[PocketChangeSDK sharedInstance] grantReward:rewardId];
每个基于事件的奖励的rewardId都包含在您从您的账户代表那里收到的设置信息中。
您的应用程序必须处于沙盒模式才能测试基于事件的奖励。
SDK版本1.0.5增加了从您的应用程序的任何地方打开商店的能力,而无需等待通知显示。要集成,请检查PocketChangeSDK实例中的canOpenShop
属性,如果它返回YES
,则可以调用-(void)openShop
。
canOpenShop
的值可以在任何时间更改,并且最初设置为NO
,因此您应该设置您的应用程序以观察PocketChangeShopAvailabilityChangedNotification
并对其作出响应(例如,根据需要添加/删除“商店”按钮)。例如
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(setUpPocketChangeButton)
name:PocketChangeShopAvailabilityChangedNotification
object:nil];
[self setUpPocketChangeButton]; // Call initially in case [[PocketChangeSDK sharedInstance] canOpenShop] is already YES
...
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:PocketChangeShopAvailabilityChangedNotification
object:nil];
...
}
- (void)setUpPocketChangeButton
{
if ([[PocketChangeSDK sharedInstance] canOpenShop]) {
// Add shop button
}
else {
// Remove shop button
}
}
您可以在这里找到用于在您的应用程序中打开Pocket Change商店的按钮图形。
您可以使用沙盒模式来帮助验证您的集成:在沙盒模式中,SDK授予无限奖励,以便您可以在授予奖励后确认您应用程序的行为。
要启用沙箱模式,请在你应用程序的Info.plist文件中添加一行布尔值类型的数据,键名为"com.pocketchange.pocketchange-ios-sdk.sandboxMode",其值为YES。以下为示例。
要在沙箱模式下触发额外的每日礼物,您可以重新启动您的应用程序,或者执行以下操作:
[[PocketChangeSDK sharedInstance] grantReward:@"daily"];
在将您的应用程序提交到App Store之前,您必须禁用沙箱模式,否则用户将不会收到真实奖励。
如果您在使用消息“支持的旋转方向与应用程序没有共同的方向,并且shouldAutorotate返回YES”时打开Pocket Change Store时发生异常,那么您需要将“横幅(底部主屏幕按钮)”(UIInterfaceOrientationPortrait
)添加到您应用程序的Info.plist
的Supported interface orientations
中。
如果您担心这会影响您应用程序视图控制器中的方向,请确保将“横幅(底部主屏幕按钮)”添加到Supported interface orientations
数组的末尾,并将此代码添加到您希望在仅横向模式下出现的视图控制器中。
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
- (BOOL)shouldAutorotate
{
return YES;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
return ((toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight));
}
如果您的应用程序视图控制器在UINavigationController
内部,则必须将上述代码添加到UINavigationController
的子类中。这类似于使用Apple的Game Center的仅横向模式应用程序的要求(也请参阅这个Stack Overflow问题)。