最近做 iOS 10 Today 的适配的小总结

1,177 阅读3分钟
- (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 第六代