- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);
这是iOS10新出的API,today多了展开和折叠两种模式,当模块发生改变之后就会调用这个方法。
activeDisplayMode 为NCWidgetDisplayModeCompact 、NCWidgetDisplayModeExpanded, maxSize为today的最大支持的size。
activeDisplayMode还可以通过self.extensionContext.widgetActiveDisplayMode获得
maxSize可以通过[self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeExpanded]获得。
当然 [self.extensionContext widgetMaximumSizeForDisplayMode:NCWidgetDisplayModeCompact]获得折叠下的最小支持size。
widgetActiveDisplayMode是一个只读变量,与此还有一个widgetLargestAvailableDisplayMode属性,NCWidgetDisplayModeCompact 表示不支持折叠和展开,只能是折叠模式了,需要设置为
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
才支持折叠和展开
最小支持
iPhone5 | iPhone6 | iPhone6 P | |
---|---|---|---|
竖屏 | 304(width,就是两边为8),110(height) | 359,110 | 398,110 |
横屏 | 420,110 | 420,110 | 420,110 |
最大支持
iPhone5 | iPhone6 | iPhone6 P | |
---|---|---|---|
竖屏 | [锁屏进入](width)304,(height)528;[通知栏下拉]304,396 | [锁屏进入]359,616;[通知栏下拉]359,528 | [锁屏进入]398,660;[通知栏下拉]398,572 |
横屏 | [锁屏进入]420,高度待测试;[通知栏下拉]420,176 | [锁屏进入]420,高度待测试;[通知栏下拉]420,220 | [锁屏进入]420,352;[通知栏下拉]420,264 |
注意的是iOS10 today有三个入口就是,锁屏,iPhone home的第一个tab页面,通知栏下拉,前两个对高度的限制是一样的且会宽松一些,通知栏下拉则对高度限制严格些,一般来说不能超出当前屏幕显示范围。
today布局
today 默认是 storyboard布局的,如果想要使用代码布局。需要把today中Info.plist的
NSExtension
NSExtensionMainStoryboard
MainInterface
NSExtensionPointIdentifier
com.apple.widget-extension
修改为
NSExtension
NSExtensionPrincipalClass
TodayViewController
NSExtensionPointIdentifier
com.apple.widget-extension
调起app
[self.extensionContext openURL:[NSURL URLWithString:urlString] completionHandler:^(BOOL success) {
NSLog(@"open url result:%d",success);
}];
就可以调起app了,
然后在app端的appdelegate里面下面方法接收。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(nullable NSString *)sourceApplication annotation:(id)annotation
数据共享
app 和 today都有各自的空间,但也有共享的空间group。
通过NSUserDefaults共享数据
NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx"];
可以通过这个userdefaults读写group的数据,suiteName是需要在capabilities里面配置的,userdefaults和filemanager是共用的。
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri
tyApplicationGroupIdentifier:@"group.com.xxx"];
而NSFileManager则可以通过上面的url进行读写。
代码共享
如果一个文件需要在today和app内都用的话,则只要.m文件的targetmembership勾选两个就可以了。
如果 在你的工程里面有自己的其他 framework target。 如果你想用这个target里面文件,则可以在这个target的general里面勾选allow app extension API only。
如果对于一个类app和extension都可以调用,但是你其中的某些代码块想区分。
你可以在today target里面添加宏定义 ,Build Settings - Preprocessor Macros下面添加
使用的话就是
#ifndef TARGET_IS_EXTENSION
#endif
iOS 10 支持的设备
iPhone 7
iPhone 7 Plus
iPhone 6s
iPhone 6s Plus
iPhone 6
iPhone 6 Plus
iPhone SE
iPhone 5s
iPhone 5c
iPhone 5
iPad Pro 12.9 英寸
iPad Pro 9.7 英寸
iPad Air 2
iPad Air
iPad 第四代
iPad mini 4
iPad mini 3
iPad mini 2
iPod touch 第六代