iOS开发经验集IOS知识积累iOS开发

ios UNNotificationServiceExtensi

2018-04-24  本文已影响240人  二斤寂寞

前言:网上一搜这个关键词【UNNotificationServiceExtension】,一片片的教程。但是每一个都特么转载自【徐不同】,窝草,毫无更改。只想淡淡吐槽一句MMP!!

本文说的一种app和extension的通信问题。
需求:需要统计推送到达率。再extension中进行数据上报处理操作。废话不多提开始操作。

1、新建target(网上一坨,这里不赘述了)
image.png image.png
2、断点调试!!!

这个问题MMP困扰了我好长时间。

1运行app
2【Xcode】——【Debug】——【Attach to Process PID or Name】添加新建的target名字 如图1.0,添加之后会出现NotificationService Waiting to Attach 如图2.0
3 点击工程,选择target运行 如图3.0
4 选择自己的宿主app 如图4.0

1.0.png 2.0.png 3.0.png 4.0.png
3、证书问题
image.png

NotificationService自动签名,但代码签名身份iPhone开发人员:xxxxx已手动指定。在build settings编辑器中为“iPhone开发人员”设置代码签名标识值,或者在项目编辑器中切换到手动签名。

方法1 点击Automatically manage siging 系统会帮你生成一个证书


image.png

方法2 app总会上架,还是自己新建证书为好。手把手教你推送证书

4、用工具进行推送测试

工具1:SmartPush

工具2:Easy APNS Provider

推送格式:

{
    "aps": {
        "alert": "This is some fancy message.",
        "badge": 1,
        "sound": "default",
        "mutable-content": "1",
        "imageAbsoluteString": "http://upload.univs.cn/2012/0104/1325645511371.jpg"

    }
}

这里我们要注意一定要有"mutable-content": "1",以及一定要有Alert的字段,否则可能会拦截通知失败。(苹果文档说的)。

打个断点,可以调试了!!!

怎么通信呢?
在app Podfile里加入target 与app同级

target 'NotificationService' do
  pod 'xxx'
end

但是我引用的库中使用了 [UIApplication sharedApplication] extexsion中是不允许这样使用的、
怎么办?只能换方式

在默认情况下,iOS的应用是存在一个沙盒里面的,不允许应用与应用直接进行数据的交互。为此,苹果提供了一项叫App Groups的服务,该服务允许开发者可以在自己的应用之间通过NSUserDefaults、NSFileManager或者CoreData来进行相互的数据传输。
下面介绍如何激活App Groups服务:

image.png image.png image.png image.png

至此,应用和扩展的App Groups服务都已经启动,现在就要进行分享内容的传输操作。下面分别介绍一下NSUserDefaults、NSFileManager以及CoreData三种方式是如何实现App Groups下的数据操作:

//初始化一个供App Groups使用的NSUserDefaults对象
NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.vimfung.ShareExtensionDemo"];

//写入数据
[userDefaults setValue:@"value" forKey:@"key"];

//读取数据
NSLog(@"%@", [userDefaults valueForKey:@"key"]);
//获取分组的共享目录
NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
NSURL *fileURL = [groupURL URLByAppendingPathComponent:@"demo.txt"];

//写入文件
[@"abc" writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:nil];

//读取文件
NSString *str = [NSString stringWithContentsOfURL:fileURL encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);
//获取分组的共享项目
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.cn.vimfung.ShareExtensionDemo"];
NSURL *storeURL = [containerURL URLByAppendingPathComponent:@"DataModel.sqlite"];

//初始化持久化存储调度器
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"DataModel" withExtension:@"momd"];

NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

[coordinator addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:storeURL
                                options:nil
                                  error:nil];

//创建受控对象上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

[context performBlockAndWait:^{
    [context setPersistentStoreCoordinator:coordinator];
}];

我使用的是NSUserDefault然后在app中- (void)applicationDidBecomeActive:(UIApplication *)application中进行数据的读取。

参考文章:
App Extension
iOS扩展开发攻略(一) - Share Extension

上一篇 下一篇

猜你喜欢

热点阅读