我正在为 Adobe AIR 开发 iOS 原生扩展,它将获取推送通知的设备令牌。不幸的是,我不是那种非常喜欢 Objective-C 的程序员,而且我不确定我正在使用的代码是否有问题。它编译没有问题,我可以将扩展与 AIR 一起使用,但看起来注册通知既不会返回正面效果也不会返回负面效果。因此,我要做的是在从 AIR 调用 RegisterDevice 函数时注册通知,如果它确实注册,则将设备令牌存储在 deviceTokenString 中,如果它没有注册并返回错误,我将错误存储在此字符串中. 当调用 GetToken 函数时,我将 deviceTokenString 返回给 AIR,因此它要么是令牌,要么是错误。在 AIR 应用程序中,我首先通过单击按钮启动 RegisterDevice 函数,然后启动 GetToken 函数。不幸的是,我既没有得到令牌也没有得到错误(也没有出现要求许可的弹出窗口)。我也试图将注册部分放入 didFinishLaunchingWithOptions 但看起来 didFinishLaunchingWithOptions 从未启动。如果你们可以看看代码是否可以,我将非常感激。或者,也许您有任何想法还有什么可能是错的?我在配置门户中启用了推送 SSL 证书。这是我正在使用的代码 如果你们可以看看代码是否可以,我将非常感激。或者,也许您有任何想法还有什么可能是错的?我在配置门户中启用了推送 SSL 证书。这是我正在使用的代码 如果你们可以看看代码是否可以,我将非常感激。或者,也许您有任何想法还有什么可能是错的?我在配置门户中启用了推送 SSL 证书。这是我正在使用的代码
“NativePush.m”:
#import "UIKit/UIKit.h"
#import "include/FlashRuntimeExtensions.h"
@implementation NativePush
@synthesize tokenString = _tokenString;
NSString *deviceTokenString = @"";
- (id)init
{
self = [super init];
if (self) {
// Initialization code here.
}
return self;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString *str =
[NSString stringWithFormat:@"%@",deviceToken];
deviceTokenString = str;
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
{
NSString *str = [NSString stringWithFormat: @"Error: %@", err];
deviceTokenString = str;
}
void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) {
*numFunctionsToTest = 2;
FRENamedFunction* func = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*2);
func[0].name = (const uint8_t*)"RegisterDevice";
func[0].functionData = NULL;
func[0].function = &RegisterDevice;
func[1].name = (const uint8_t*)"GetToken";
func[1].functionData = NULL;
func[1].function = &GetToken;
*functionsToSet = func;
}
void ContextFinalizer(FREContext ctx) {
return;
}
void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet) {
*extDataToSet = NULL;
*ctxInitializerToSet = &ContextInitializer;
*ctxFinalizerToSet = &ContextFinalizer;
}
void ExtFinalizer(void* extData) {
return;
}
FREObject RegisterDevice(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound)];
return NULL;
}
FREObject GetToken(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
NSString* tokenS = deviceTokenString;
char* tokenChar = [tokenS UTF8String];
FREObject tokenObject = NULL;
FRENewObjectFromUTF8( strlen(tokenChar)+1 , (const uint8_t*)tokenChar, &tokenObject);
return tokenObject;
}
@end
和头文件“NativePush.h”:
import "Foundation/Foundation.h"
import "include/FlashRuntimeExtensions.h"
@interface NativePush : NSObject
@property (nonatomic, retain) NSString* tokenString;
FREObject RegisterDevice(
FREContext ctx,
void* funcData,
uint32_t argc,
FREObject arg[]
);
FREObject GetToken(
FREContext ctx,
void* funcData,
uint32_t argc,
FREObject arg[]
);
void ContextInitializer(
void* extData,
const uint8_t* ctxType,
FREContext ctx,
uint32_t* numFunctionsToTest,
const FRENamedFunction** functionsToSet
);
void ContextFinalizer(FREContext ctx);
void ExtInitializer(
void** extDataToSet,
FREContextInitializer* ctxInitializerToSet,
FREContextFinalizer* ctxFinalizerToSet
);
void ExtFinalizer(void* extData);
@end