- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 Adobe AIR 开发 iOS native 扩展,它将获取推送通知的设备 token 。不幸的是,我不是那种喜欢 objective-C 的程序员,我不确定我使用的代码是否有问题。它编译没有问题,我可以将扩展与 AIR 一起使用,但看起来注册通知不会返回正面或负面影响。所以我想做的是在从 AIR 调用 RegisterDevice 函数时注册通知,如果它确实注册,则将设备 token 存储在 deviceTokenString 中,如果它没有注册并返回错误,我将错误存储在此字符串中.当调用 GetToken 函数时,我将 deviceTokenString 返回给 AIR,因此它是 token 或错误。在 AIR 应用程序中,我首先启动 RegisterDevice 函数,然后通过单击按钮启动 GetToken 函数。不幸的是,我既没有得到 token 也没有得到错误(也没有出现请求许可的弹出窗口)。我也试图将注册部分放在 didFinishLaunchingWithOptions 中,但看起来 didFinishLaunchingWithOptions 从未启动过。如果你们能看看代码是否可以,我将非常感激。或者,也许您有任何想法还有什么可能是错误的?我在配置门户中启用了推送 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
最佳答案
好的,
在撕掉我的头发 3 天后,我弄明白了。我没有设置代表,因为那会破坏 Adobe 的所有东西。我创建了现有委托(delegate)的自定义子类,并覆盖了与 APNS 相关的委托(delegate)函数。我的代码如下。
//empty delegate functions, stubbed signature is so we can find this method in the delegate
//and override it with our custom implementation
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error{}
//custom implementations of empty signatures above
void didRegisterForRemoteNotificationsWithDeviceToken(id self, SEL _cmd, UIApplication* application, NSData* deviceToken)
{
NSLog(@"My token is: %@", deviceToken);
}
void didFailToRegisterForRemoteNotificationsWithError(id self, SEL _cmd, UIApplication* application, NSError* error)
{
NSLog(@"Failed to get token, error: %@", error);
}
// ContextInitializer()
//
// The context initializer is called when the runtime creates the extension context instance.
void PushContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx,
uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet)
{
//injects our modified delegate functions into the sharedApplication delegate
id delegate = [[UIApplication sharedApplication] delegate];
Class objectClass = object_getClass(delegate);
NSString *newClassName = [NSString stringWithFormat:@"Custom_%@", NSStringFromClass(objectClass)];
Class modDelegate = NSClassFromString(newClassName);
if (modDelegate == nil) {
// this class doesn't exist; create it
// allocate a new class
modDelegate = objc_allocateClassPair(objectClass, [newClassName UTF8String], 0);
SEL selectorToOverride1 = @selector(application:didRegisterForRemoteNotificationsWithDeviceToken:);
SEL selectorToOverride2 = @selector(application:didFailToRegisterForRemoteNotificationsWithError:);
// get the info on the method we're going to override
Method m1 = class_getInstanceMethod([jreporterNativePush class], selectorToOverride1);
Method m2 = class_getInstanceMethod([jreporterNativePush class], selectorToOverride2);
// add the method to the new class
class_addMethod(modDelegate, selectorToOverride1, (IMP)didRegisterForRemoteNotificationsWithDeviceToken, method_getTypeEncoding(m1));
class_addMethod(modDelegate, selectorToOverride2, (IMP)didFailToRegisterForRemoteNotificationsWithError, method_getTypeEncoding(m2));
// register the new class with the runtime
objc_registerClassPair(modDelegate);
}
// change the class of the object
object_setClass(delegate, modDelegate);
NSLog(@"completed crazy swap w/o bombing w00t");
///////// end of delegate injection / modification code
*numFunctionsToTest = 1;
FRENamedFunction* func = (FRENamedFunction*) malloc(sizeof(FRENamedFunction) * 1);
func[0].name = (const uint8_t*) "registerPush";
func[0].functionData = NULL;
func[0].function = ®isterPush;
*functionsToSet = func;
关于apple-push-notifications - 适用于 Adobe Air 的推送通知 iOS native 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204993/
我开发了一个 Adobe AIR 应用程序,用户可以从我的网页上安装和启动它。如果用户计算机上尚未安装 AIR 应用程序,我将使用安装标志来安装它。在我对应用程序进行签名之前,此安装仅在 AIR
是否可以让我的 AIR 应用程序能够将自己添加到启动程序列表中? (我想在多个平台上进行这项工作 - 即 Windows、Mac 和 Linux)我将如何去做? 最佳答案 if (NativeAppl
我希望能够从Adobe AIR应用程序中启动第三方进程(实际上是命令行进程)。 AIR应用程序在运行时是否存在安全上下文,可以防止这种情况发生? 最佳答案 Adobe AIR 最需要的两个功能是从 A
我希望使用 Adobe Air 来可视化来自串行端口的信息。有没有办法在 Air 中天真地做到这一点?我假设不是。 如果是这种情况,我的最佳途径是创建一个本地应用程序,通过 TCP/IP 连接使串
Adobe 应用支持多核还是仍然使用单核? 如果我使用的是 Pentium 4 处理器 (3 ghz) 与双核处理器 (2.7 ghz) 相比,速度(应用程序的性能)是否会有所不同 编辑:如 Andr
我需要为 mac 和 Windows 开发一个桌面应用程序,使用 HTML JqueryMobile 和 CSS,我只是想确认 Adobe air 是否完全免费用于开发,并且想知道任何 IDE 支
我正在尝试将网络摄像头的视频和音频录制到存储在用户本地硬盘上的 FLV 文件中。我有此代码的一个版本,它使用 NetConnection 和 NetStream 通过网络将视频流式传输到 FMS (R
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 提供事实和引用来回答它. 8年前关闭。 Improve this
我的问题是 如何防止用户关闭应用程序? .我需要出现一条警告消息,询问用户是否真的想离开应用程序。 我的应用程序是在 中开发的Adobe AIR .请帮忙,我有麻烦了。 最佳答案 是的,我也发现了这个
我一直使用自行生成的证书为我的 Adobe AIR 应用程序签名,但现在我想要看起来更正式的证书。我应该从哪里获得什么样的商业证书? 一如既往,感谢您的帮助! 最佳答案 经过一番寻找,我在 AIR
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
Adobe Air 究竟是什么?我看到很多人在谈论它,我什至看到了它的应用程序,但我仍然不完全确定它的独特之处或它与其他语言的不同之处。有人可以从程序员的角度给我简明的版本吗? 编辑: 我不熟悉 Fl
我想显示位于我的 AIR 应用程序的 app-storage 目录中的图像。此图像必须显示在 html 文本区域中,其中 html 文本来自本地嵌入式 sqlite 数据库。 当我输入以下代码时: i
我刚开始学习 Adobe AIR。我想通过引用示例应用程序我会学得很快。您能告诉我任何 Adobe AIR 开源应用程序吗? 感谢您的帮助。 最佳答案 超过 20 个示例应用程序(来自 Ado
创建 adobe air 文件后,我可以使用 winrar 或任何其他存档程序打开它,并查看所有内容,包括我的程序的代码。 有办法避免这种情况吗?某种加密或其他什么? 非常感谢。 最佳答案 没有。 “
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我们的代码签名证书最近过期了。它已更新,但现在每当我尝试使用更新的证书打包应用程序(无论我是否尝试迁移过期的证书),安装后,每当我尝试运行应用程序时都会收到以下消息: “此应用程序的此安装已损坏。请尝
我遇到了这个问题,我需要一个简单的医疗设备来将一串逗号分隔的数字输出到我的 Adobe Air 应用程序。我很高兴能与 Web 服务以外的东西交谈! 所以,我得到了一个 USB 转串口适配器,插入
是否可以在不安装的情况下运行 Adobe AIR 应用程序? AIR 运行时已经安装,我们需要一个解决方案来控制应用程序的“安装”——所以我们需要的是运行一个 adobe air 应用程序,该应用
我们有一个 Adobe Air 应用程序,可以将大量图像下载到应用程序存储中。我扫描了文档并没有发现任何迹象,但我想我会仔细检查:任何人都知道是否有可能看到用户在他们的 HD 上有多少可用存储空间
我是一名优秀的程序员,十分优秀!