\n\n","xml",[237,808,809,814,819,824,829,834,839,844,849],{"__ignoreMap":116},[240,810,811],{"class":242,"line":243},[240,812,813],{"emptyLinePlaceholder":134},"\n",[240,815,816],{"class":242,"line":117},[240,817,818],{},"\u003Ckey>Type\u003C/key>\n",[240,820,821],{"class":242,"line":123},[240,822,823],{},"\u003Cstring>PSToggleSwitchSpecifier\u003C/string>\n",[240,825,826],{"class":242,"line":296},[240,827,828],{},"\u003Ckey>Title\u003C/key>\n",[240,830,831],{"class":242,"line":309},[240,832,833],{},"\u003Cstring>Sound\u003C/string>\n",[240,835,836],{"class":242,"line":315},[240,837,838],{},"\u003Ckey>Key\u003C/key>\n",[240,840,841],{"class":242,"line":332},[240,842,843],{},"\u003Cstring>sound_enabled\u003C/string>\n",[240,845,846],{"class":242,"line":344},[240,847,848],{},"\u003Ckey>DefaultValue\u003C/key>\n",[240,850,851],{"class":242,"line":361},[240,852,853],{},"\u003Ctrue/>\n",[18,855,856,857,862,863,866],{},"Unfortuntately, the default value is only applied the first time you access the Settings Application. That means your\ncode cannot rely on the default values and rather has to check manually, if the value has been set in the Settings\nApplication. In case of “I think I spider”, that meant no sound until you accessed the Settings Application. After\npoking around for a couple of minutes,\nwe ",[25,858,861],{"href":859,"rel":860},"http://stackoverflow.com/questions/510216/can-you-make-the-settings-in-settings-bundle-default-even-if-you-dont-open-the-s/510329#510329",[29],"found a workaround",",\nwhich we implemented in our AppDelegate’s ",[453,864,865],{},"didFinishLaunchingWithOptions"," method:",[231,868,870],{"className":719,"code":869,"language":721,"meta":116,"style":116},"\nid test = [[NSUserDefaults standardUserDefaults] objectForKey:@\"sound_enabled\"];\nif (test == NULL) {\n [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@\"sound_enabled\"];\n}\nreturn YES;\n",[237,871,872,876,881,886,891,895],{"__ignoreMap":116},[240,873,874],{"class":242,"line":243},[240,875,813],{"emptyLinePlaceholder":134},[240,877,878],{"class":242,"line":117},[240,879,880],{},"id test = [[NSUserDefaults standardUserDefaults] objectForKey:@\"sound_enabled\"];\n",[240,882,883],{"class":242,"line":123},[240,884,885],{},"if (test == NULL) {\n",[240,887,888],{"class":242,"line":296},[240,889,890],{}," [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@\"sound_enabled\"];\n",[240,892,893],{"class":242,"line":309},[240,894,448],{},[240,896,897],{"class":242,"line":315},[240,898,899],{},"return YES;\n",[18,901,902,903,906,907,910],{},"This checks if no value was set, which means the returned value is ",[453,904,905],{},"NULL",", and in that case sets our default value. Note\nthat we are duplicating the default value definition here. You could also access the ",[453,908,909],{},"Settings Bundle"," programmatically\nand read the default value from there.",[18,912,913],{},"This gives us an easy workaround, so that you can enjoy the awesome sound effects in “I think I spider”.",[487,915,774],{},{"title":116,"searchDepth":117,"depth":117,"links":917},[],[171,172,493],"2010-08-16T06:38:08","https://synyx.de/blog/settings-bundle-and-default-values/",{},"/blog/settings-bundle-and-default-values",{"title":791,"description":116},"blog/settings-bundle-and-default-values",[140,181],"We improved our “I think I spider” App quite a bit since Beta 1. Among other stuff we added some nice sound effects. If you want to check it out,…","2u74Bt9iJYUS2yCQZEziD6_UMO-mCCEs4rBEu1KVQJQ",{"id":929,"title":930,"author":931,"body":932,"category":943,"date":944,"description":116,"extension":131,"link":945,"meta":946,"navigation":134,"path":947,"seo":948,"slug":936,"stem":949,"tags":950,"teaser":951,"__hash__":952},"blog/blog/human-maier-we-are-in-beta.md","Human Maier! We are in Beta!",[155],{"type":11,"value":933,"toc":941},[934,937],[14,935,930],{"id":936},"human-maier-we-are-in-beta",[18,938,939],{},[164,940],{"alt":166,"src":547},{"title":116,"searchDepth":117,"depth":117,"links":942},[],[171,172],"2010-07-30T14:30:44","https://synyx.de/blog/human-maier-we-are-in-beta/",{},"/blog/human-maier-we-are-in-beta",{"title":930,"description":116},"blog/human-maier-we-are-in-beta",[139,140,181],"Our little pet project “I think I spider” is almost ready to be thrown out into the wild! That means we are running a closed beta for iOS devices for…","Tv3D01DCynO0dlp6K4oLCcEF6qiHcJkQCehI25ZSfc0",{"id":954,"title":955,"author":956,"body":958,"category":1313,"date":1314,"description":1315,"extension":131,"link":1316,"meta":1317,"navigation":134,"path":1318,"seo":1319,"slug":962,"stem":1321,"tags":1322,"teaser":1324,"__hash__":1325},"blog/blog/sending-apple-push-notifications-with-notnoops-java-apns-library.md","Sending Apple Push Notifications with notnoop's java-apns library",[957],"knell",{"type":11,"value":959,"toc":1311},[960,963,977,986,989,996,999,1306,1309],[14,961,955],{"id":962},"sending-apple-push-notifications-with-notnoops-java-apns-library",[18,964,965,966,970,971,976],{},"If you need to send apple push notifications to your users, like we do in\na ",[25,967,969],{"href":618,"rel":968},[29],"secret project"," mentioned earlier this\nweek, ",[25,972,975],{"href":973,"rel":974},"http://github.com/notnoop/java-apns",[29],"notnoop’s java-apns library"," is a good choice, because its really simple to\nuse and saves you a lot of work.",[18,978,979,980,985],{},"(I presume that you already know how to get the Tokens of your users and already have a certificate for the push\nnotifications, I only show you how easy the server part can be with this library. If you don’t know, read this\nfirst: ",[25,981,984],{"href":982,"rel":983},"http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html",[29],"Apple Push Service",")",[18,987,988],{},"First you have to download the library (or add it in your maven dependencies):",[18,990,991],{},[25,992,995],{"href":993,"rel":994},"http://github.com/notnoop/java-apns/tree/",[29],"java-apns",[18,997,998],{},"The programming part isn’t that much so here’s how you do it:",[231,1000,1004],{"className":1001,"code":1002,"language":1003,"meta":116,"style":116},"language-java shiki shiki-themes github-light github-dark","\npublic void pushMessage() {\n ApnsService service = null;\n try {\n // get the certificate\n InputStream certStream = this.getClass().getClassLoader().getResourceAsStream(\"your_certificate.p12\");\n service = APNS.newService().withCert(certStream, \"your_cert_password\").withSandboxDestination().build();\n // or\n // service = APNS.newService().withCert(certStream,\n // \"your_cert_password\").withProductionDestination().build();\n service.start();\n // You have to delete the devices from you list that no longer\n //have the app installed, see method below\n deleteInactiveDevices(service);\n // read your user list\n List\u003CUser> userList = userDao.readUsers();\n for (User user : userList) {\n try {\n // we had a daily update here, so we need to know how many\n //days the user hasn't started the app\n // so that we get the number of updates to display it as the badge.\n int days = (int) ((System.currentTimeMillis() - user.getLastUpdate()) / 1000 / 60 / 60 / 24);\n PayloadBuilder payloadBuilder = APNS.newPayload();\n payloadBuilder = payloadBuilder.badge(days).alertBody(\"some message you want to send here\");\n // check if the message is too long (it won't be sent if it is)\n //and trim it if it is.\n if (payloadBuilder.isTooLong()) {\n payloadBuilder = payloadBuilder.shrinkBody();\n }\n String payload = payloadBuilder.build();\n String token = user.getToken();\n service.push(token, payload);\n } catch (Exception ex) {\n // some logging stuff\n }\n }\n } catch (Exception ex) {\n // more logging\n } finally {\n // check if the service was successfull initialized and stop it here, if it was\n if (service != null) {\n service.stop();\n }\n }\n }\n private void deleteInactiveDevices(ApnsService service) {\n // get the list of the devices that no longer have your app installed from apple\n //ignore the =\"\" after Date here, it's a bug...\n Map\u003CString, Date> inactiveDevices = service.getInactiveDevices();\n for (String deviceToken : inactiveDevices.keySet()) {\n userDao.deleteByDeviceId(deviceToken);\n }\n }\n\n","java",[237,1005,1006,1010,1015,1020,1025,1030,1035,1040,1045,1050,1055,1060,1065,1070,1075,1081,1087,1093,1099,1105,1111,1117,1123,1129,1135,1141,1147,1153,1159,1165,1171,1177,1183,1189,1195,1201,1207,1213,1219,1225,1231,1237,1243,1248,1254,1260,1266,1272,1278,1284,1290,1296,1301],{"__ignoreMap":116},[240,1007,1008],{"class":242,"line":243},[240,1009,813],{"emptyLinePlaceholder":134},[240,1011,1012],{"class":242,"line":117},[240,1013,1014],{},"public void pushMessage() {\n",[240,1016,1017],{"class":242,"line":123},[240,1018,1019],{}," ApnsService service = null;\n",[240,1021,1022],{"class":242,"line":296},[240,1023,1024],{}," try {\n",[240,1026,1027],{"class":242,"line":309},[240,1028,1029],{}," // get the certificate\n",[240,1031,1032],{"class":242,"line":315},[240,1033,1034],{}," InputStream certStream = this.getClass().getClassLoader().getResourceAsStream(\"your_certificate.p12\");\n",[240,1036,1037],{"class":242,"line":332},[240,1038,1039],{}," service = APNS.newService().withCert(certStream, \"your_cert_password\").withSandboxDestination().build();\n",[240,1041,1042],{"class":242,"line":344},[240,1043,1044],{}," // or\n",[240,1046,1047],{"class":242,"line":361},[240,1048,1049],{}," // service = APNS.newService().withCert(certStream,\n",[240,1051,1052],{"class":242,"line":388},[240,1053,1054],{}," // \"your_cert_password\").withProductionDestination().build();\n",[240,1056,1057],{"class":242,"line":412},[240,1058,1059],{}," service.start();\n",[240,1061,1062],{"class":242,"line":423},[240,1063,1064],{}," // You have to delete the devices from you list that no longer\n",[240,1066,1067],{"class":242,"line":435},[240,1068,1069],{}," //have the app installed, see method below\n",[240,1071,1072],{"class":242,"line":445},[240,1073,1074],{}," deleteInactiveDevices(service);\n",[240,1076,1078],{"class":242,"line":1077},15,[240,1079,1080],{}," // read your user list\n",[240,1082,1084],{"class":242,"line":1083},16,[240,1085,1086],{}," List\u003CUser> userList = userDao.readUsers();\n",[240,1088,1090],{"class":242,"line":1089},17,[240,1091,1092],{}," for (User user : userList) {\n",[240,1094,1096],{"class":242,"line":1095},18,[240,1097,1098],{}," try {\n",[240,1100,1102],{"class":242,"line":1101},19,[240,1103,1104],{}," // we had a daily update here, so we need to know how many\n",[240,1106,1108],{"class":242,"line":1107},20,[240,1109,1110],{}," //days the user hasn't started the app\n",[240,1112,1114],{"class":242,"line":1113},21,[240,1115,1116],{}," // so that we get the number of updates to display it as the badge.\n",[240,1118,1120],{"class":242,"line":1119},22,[240,1121,1122],{}," int days = (int) ((System.currentTimeMillis() - user.getLastUpdate()) / 1000 / 60 / 60 / 24);\n",[240,1124,1126],{"class":242,"line":1125},23,[240,1127,1128],{}," PayloadBuilder payloadBuilder = APNS.newPayload();\n",[240,1130,1132],{"class":242,"line":1131},24,[240,1133,1134],{}," payloadBuilder = payloadBuilder.badge(days).alertBody(\"some message you want to send here\");\n",[240,1136,1138],{"class":242,"line":1137},25,[240,1139,1140],{}," // check if the message is too long (it won't be sent if it is)\n",[240,1142,1144],{"class":242,"line":1143},26,[240,1145,1146],{}," //and trim it if it is.\n",[240,1148,1150],{"class":242,"line":1149},27,[240,1151,1152],{}," if (payloadBuilder.isTooLong()) {\n",[240,1154,1156],{"class":242,"line":1155},28,[240,1157,1158],{}," payloadBuilder = payloadBuilder.shrinkBody();\n",[240,1160,1162],{"class":242,"line":1161},29,[240,1163,1164],{}," }\n",[240,1166,1168],{"class":242,"line":1167},30,[240,1169,1170],{}," String payload = payloadBuilder.build();\n",[240,1172,1174],{"class":242,"line":1173},31,[240,1175,1176],{}," String token = user.getToken();\n",[240,1178,1180],{"class":242,"line":1179},32,[240,1181,1182],{}," service.push(token, payload);\n",[240,1184,1186],{"class":242,"line":1185},33,[240,1187,1188],{}," } catch (Exception ex) {\n",[240,1190,1192],{"class":242,"line":1191},34,[240,1193,1194],{}," // some logging stuff\n",[240,1196,1198],{"class":242,"line":1197},35,[240,1199,1200],{}," }\n",[240,1202,1204],{"class":242,"line":1203},36,[240,1205,1206],{}," }\n",[240,1208,1210],{"class":242,"line":1209},37,[240,1211,1212],{}," } catch (Exception ex) {\n",[240,1214,1216],{"class":242,"line":1215},38,[240,1217,1218],{}," // more logging\n",[240,1220,1222],{"class":242,"line":1221},39,[240,1223,1224],{}," } finally {\n",[240,1226,1228],{"class":242,"line":1227},40,[240,1229,1230],{}," // check if the service was successfull initialized and stop it here, if it was\n",[240,1232,1234],{"class":242,"line":1233},41,[240,1235,1236],{}," if (service != null) {\n",[240,1238,1240],{"class":242,"line":1239},42,[240,1241,1242],{}," service.stop();\n",[240,1244,1246],{"class":242,"line":1245},43,[240,1247,1206],{},[240,1249,1251],{"class":242,"line":1250},44,[240,1252,1253],{}," }\n",[240,1255,1257],{"class":242,"line":1256},45,[240,1258,1259],{}," }\n",[240,1261,1263],{"class":242,"line":1262},46,[240,1264,1265],{}," private void deleteInactiveDevices(ApnsService service) {\n",[240,1267,1269],{"class":242,"line":1268},47,[240,1270,1271],{}," // get the list of the devices that no longer have your app installed from apple\n",[240,1273,1275],{"class":242,"line":1274},48,[240,1276,1277],{}," //ignore the =\"\" after Date here, it's a bug...\n",[240,1279,1281],{"class":242,"line":1280},49,[240,1282,1283],{}," Map\u003CString, Date> inactiveDevices = service.getInactiveDevices();\n",[240,1285,1287],{"class":242,"line":1286},50,[240,1288,1289],{}," for (String deviceToken : inactiveDevices.keySet()) {\n",[240,1291,1293],{"class":242,"line":1292},51,[240,1294,1295],{}," userDao.deleteByDeviceId(deviceToken);\n",[240,1297,1299],{"class":242,"line":1298},52,[240,1300,1253],{},[240,1302,1304],{"class":242,"line":1303},53,[240,1305,1259],{},[18,1307,1308],{},"Now wasn’t that an easy one this time?",[487,1310,774],{},{"title":116,"searchDepth":117,"depth":117,"links":1312},[],[171],"2010-07-27T07:00:38","If you need to send apple push notifications to your users, like we do in\\na secret project mentioned earlier this\\nweek, notnoop’s java-apns library is a good choice, because its really simple to\\nuse and saves you a lot of work.","https://synyx.de/blog/sending-apple-push-notifications-with-notnoops-java-apns-library/",{},"/blog/sending-apple-push-notifications-with-notnoops-java-apns-library",{"title":955,"description":1320},"If you need to send apple push notifications to your users, like we do in\na secret project mentioned earlier this\nweek, notnoop’s java-apns library is a good choice, because its really simple to\nuse and saves you a lot of work.","blog/sending-apple-push-notifications-with-notnoops-java-apns-library",[558,140,181,1323],"push-notification","If you need to send apple push notifications to your users, like we do in a secret project mentioned earlier this week, notnoop’s java-apns library is a good choice, because…","mqOSmpufU8Sqpzy9fxCtmH5D6V8CLhPDD5kkCRFFWO8",{"id":1327,"title":592,"author":1328,"body":1329,"category":1411,"date":1412,"description":1413,"extension":131,"link":1414,"meta":1415,"navigation":134,"path":1416,"seo":1417,"slug":1419,"stem":1420,"tags":1421,"teaser":1422,"__hash__":1423},"blog/blog/mobile-solutions-summary-4.md",[155],{"type":11,"value":1330,"toc":1409},[1331,1333,1347,1367,1375,1390,1395],[14,1332,592],{"id":598},[18,1334,1335,1336,1340,1341,1346],{},"There’s a lot going on over at the ",[25,1337,612],{"href":1338,"rel":1339},"http://mobile.synyx.de",[29],", so in case you are not subscribed to\nour feed, which I hope you are, you can grab it ",[25,1342,1345],{"href":1343,"rel":1344},"http://mobile.synyx.de/feed/",[29],"here",". In order to convince you to hook\nyour favorite reader up to our mobile blog, I’ll highlight a couple of blog posts for you.",[18,1348,1349,1354,1355,1360,1361,1366],{},[25,1350,1353],{"href":1351,"rel":1352},"http://mobile.synyx.de/authors/?uid=3",[29],"Tobias’","\npost ",[25,1356,1359],{"href":1357,"rel":1358},"http://mobile.synyx.de/2010/06/android-and-self-signed-ssl-certificates/",[29],"“Android and self-signed ssl certificates”","\ngained a lot of attraction over the past couple of weeks. He basically brings you up to speed on how to tweak Android’s\nversion of ",[25,1362,1365],{"href":1363,"rel":1364},"http://hc.apache.org/httpcomponents-client/httpclient/",[29],"Apache Commons Http"," to work with your own\ncertificate:",[623,1368,1369,1372],{},[18,1370,1371],{},"Dealing with self-signed ssl certificates is a real pain, because it’s not that simple to add them in your app and\nlet android accept them.",[18,1373,1374],{},"But fortunately, there’s a workaround that uses an own SSLSocketFactory and an own TrustManager. With this, only your\nadded site is beeing able to be called, so theres no security issue.",[18,1376,1377,1378,1383,1384,1389],{},"Another blog post I’d like to point out is by yours truly,\non ",[25,1379,1382],{"href":1380,"rel":1381},"http://mobile.synyx.de/2010/06/ui-prototyping-iphone-apps/",[29],"“UI Prototyping iPhone Apps”",". It covers a very simple\nconcept and provides you with a ",[25,1385,1388],{"href":1386,"rel":1387},"http://github.com/dlinsin/district9/tree/master/UIPrototyping/",[29],"framework"," to employ it\nin your App development:",[623,1391,1392],{},[18,1393,1394],{},"I watched a whole bunch of sessions from 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret\nVictor… In his session, Bret shows how to prototype an interface only by using with screenshots! … It inspired me to use\nhis framework and the whole process for our own development… Unfortunately, the code for the session isn’t available …\nAfter some digging, I found Michael Fey’s blog, who was able to successfully reverse engineer the missing parts, which\nwere not shown in the presentation.",[18,1396,1397,1398,1402,1403,1408],{},"I hope by this time you have already subscribed to our ",[25,1399,1401],{"href":1338,"rel":1400},[29],"mobile blog"," and discovered a couple\nof ",[25,1404,1407],{"href":1405,"rel":1406},"http://mobile.synyx.de/2010/07/split-nsstring-by-characters/",[29],"interesting posts",", that our team put together over\npast couple of months.",{"title":116,"searchDepth":117,"depth":117,"links":1410},[],[667],"2010-07-16T07:28:03","There’s a lot going on over at the mobile solutions blog, so in case you are not subscribed to\\nour feed, which I hope you are, you can grab it here. In order to convince you to hook\\nyour favorite reader up to our mobile blog, I’ll highlight a couple of blog posts for you.","https://synyx.de/blog/mobile-solutions-summary-4/",{},"/blog/mobile-solutions-summary-4",{"title":592,"description":1418},"There’s a lot going on over at the mobile solutions blog, so in case you are not subscribed to\nour feed, which I hope you are, you can grab it here. In order to convince you to hook\nyour favorite reader up to our mobile blog, I’ll highlight a couple of blog posts for you.","mobile-solutions-summary-4","blog/mobile-solutions-summary-4",[139,140,181,146],"There’s a lot going on over at the mobile solutions blog, so in case you are not subscribed to our feed, which I hope you are, you can grab it…","6e3hlP9lM0lmBm1BXb-OBwSJM2DFtSNp5TIpHdJ1OXE",{"id":1425,"title":1426,"author":1427,"body":1428,"category":1667,"date":1668,"description":1669,"extension":131,"link":1670,"meta":1671,"navigation":134,"path":1672,"seo":1673,"slug":1432,"stem":1675,"tags":1676,"teaser":1679,"__hash__":1680},"blog/blog/ui-prototyping-iphone-apps.md","UI Prototyping iPhone Apps",[155],{"type":11,"value":1429,"toc":1665},[1430,1433,1441,1444,1453,1464,1517,1527,1650,1653,1656,1663],[14,1431,1426],{"id":1432},"ui-prototyping-iphone-apps",[18,1434,1435,1436,1440],{},"Before ",[25,1437,1439],{"href":199,"rel":1438},[29],"flying off to WWDC"," last month, I watched a whole bunch of sessions\nfrom 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you haven’t watched it and\nyou’ve got access to the WWDC videos – stop right here and watch the video!",[18,1442,1443],{},"In his session, Bret shows how to prototype an interface only by using with screenshots! It’s amazing that a simple\nscreenshot on the device can show you so much more than by just looking at it in a document or print out. It inspired me\nto use his framework and the whole process for our own development.",[18,1445,1446,1447,1452],{},"Unfortunately, the code for the session isn’t available and neither Bret nor the frameworks evangelist mentioned in the\npresentation got back to me about the code. After some digging, I\nfound ",[25,1448,1451],{"href":1449,"rel":1450},"https://web.archive.org/web/20130723100234/http://www.fruitstandsoftware.com:80/blog/2009/07/uiview-manipulation-made-easier-with-a-category/",[29],"Michael Fey’s blog",",\nwho was able to successfully reverse engineer the missing parts, which were not shown in the presentation.",[18,1454,1455,1456,1459,1460,1463],{},"Michael’s ",[453,1457,1458],{},"UIViewAdditions"," basically allow easy access to frame properties and give you a neat init method, which adds\nthe passed ",[453,1461,1462],{},"UIView"," as a parent:",[231,1465,1467],{"className":719,"code":1466,"language":721,"meta":116,"style":116},"- (id)initWithParent:(UIView *)parent {\n self = [self initWithFrame:CGRectZero];\n if (!self)\n return nil;\n [parent addSubview:self];\n return self;\n}\n+ (id) viewWithParent:(UIView *)parent {\n return [[[self alloc] initWithParent:parent] autorelease];\n}\n",[237,1468,1469,1474,1479,1484,1489,1494,1499,1503,1508,1513],{"__ignoreMap":116},[240,1470,1471],{"class":242,"line":243},[240,1472,1473],{},"- (id)initWithParent:(UIView *)parent {\n",[240,1475,1476],{"class":242,"line":117},[240,1477,1478],{}," self = [self initWithFrame:CGRectZero];\n",[240,1480,1481],{"class":242,"line":123},[240,1482,1483],{}," if (!self)\n",[240,1485,1486],{"class":242,"line":296},[240,1487,1488],{}," return nil;\n",[240,1490,1491],{"class":242,"line":309},[240,1492,1493],{}," [parent addSubview:self];\n",[240,1495,1496],{"class":242,"line":315},[240,1497,1498],{}," return self;\n",[240,1500,1501],{"class":242,"line":332},[240,1502,448],{},[240,1504,1505],{"class":242,"line":344},[240,1506,1507],{},"+ (id) viewWithParent:(UIView *)parent {\n",[240,1509,1510],{"class":242,"line":361},[240,1511,1512],{}," return [[[self alloc] initWithParent:parent] autorelease];\n",[240,1514,1515],{"class":242,"line":388},[240,1516,448],{},[18,1518,1519,1520,1523,1524,1526],{},"There wasn’t much left to do for me. I only coded the class ",[453,1521,1522],{},"Root",", which is the parent of all ",[453,1525,455],{}," instances\nused in the prototype. It provides a couple of methods to slide images back and forth:",[231,1528,1530],{"className":719,"code":1529,"language":721,"meta":116,"style":116},"@synthesize pageIndex = _pageIndex;\n- (id) initWithParent:(UIView *)parent {\n self = [super initWithParent:parent];\n if (self == nil) {\n return nil;\n }\n self.userInteractionEnabled = YES;\n self.size = self.window.size;\n [[UIImageView viewWithParent:self] setImageWithName:@\"dailies\"];\n self.pageIndex = 0;\n return self;\n}\n- (void)setPageIndex:(int)index {\n if (index \u003C 0 || index >= [self.subviews count]) {\n return;\n }\n _pageIndex = index;\n for (int i = 0; i \u003C [self.subviews count]; i++) {\n UIImageView *page = [self.subviews objectAtIndex:i];\n page.x = (i \u003C _pageIndex) ? -self.width : (i > _pageIndex) ? self.width : 0;\n }\n}\n- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {\n self.pageIndex++;\n}\n",[237,1531,1532,1537,1542,1547,1552,1556,1561,1566,1571,1576,1581,1585,1589,1594,1599,1604,1608,1613,1618,1623,1628,1632,1636,1641,1646],{"__ignoreMap":116},[240,1533,1534],{"class":242,"line":243},[240,1535,1536],{},"@synthesize pageIndex = _pageIndex;\n",[240,1538,1539],{"class":242,"line":117},[240,1540,1541],{},"- (id) initWithParent:(UIView *)parent {\n",[240,1543,1544],{"class":242,"line":123},[240,1545,1546],{}," self = [super initWithParent:parent];\n",[240,1548,1549],{"class":242,"line":296},[240,1550,1551],{}," if (self == nil) {\n",[240,1553,1554],{"class":242,"line":309},[240,1555,1488],{},[240,1557,1558],{"class":242,"line":315},[240,1559,1560],{}," }\n",[240,1562,1563],{"class":242,"line":332},[240,1564,1565],{}," self.userInteractionEnabled = YES;\n",[240,1567,1568],{"class":242,"line":344},[240,1569,1570],{}," self.size = self.window.size;\n",[240,1572,1573],{"class":242,"line":361},[240,1574,1575],{}," [[UIImageView viewWithParent:self] setImageWithName:@\"dailies\"];\n",[240,1577,1578],{"class":242,"line":388},[240,1579,1580],{}," self.pageIndex = 0;\n",[240,1582,1583],{"class":242,"line":412},[240,1584,1498],{},[240,1586,1587],{"class":242,"line":423},[240,1588,448],{},[240,1590,1591],{"class":242,"line":435},[240,1592,1593],{},"- (void)setPageIndex:(int)index {\n",[240,1595,1596],{"class":242,"line":445},[240,1597,1598],{}," if (index \u003C 0 || index >= [self.subviews count]) {\n",[240,1600,1601],{"class":242,"line":1077},[240,1602,1603],{}," return;\n",[240,1605,1606],{"class":242,"line":1083},[240,1607,1560],{},[240,1609,1610],{"class":242,"line":1089},[240,1611,1612],{}," _pageIndex = index;\n",[240,1614,1615],{"class":242,"line":1095},[240,1616,1617],{}," for (int i = 0; i \u003C [self.subviews count]; i++) {\n",[240,1619,1620],{"class":242,"line":1101},[240,1621,1622],{}," UIImageView *page = [self.subviews objectAtIndex:i];\n",[240,1624,1625],{"class":242,"line":1107},[240,1626,1627],{}," page.x = (i \u003C _pageIndex) ? -self.width : (i > _pageIndex) ? self.width : 0;\n",[240,1629,1630],{"class":242,"line":1113},[240,1631,1560],{},[240,1633,1634],{"class":242,"line":1119},[240,1635,448],{},[240,1637,1638],{"class":242,"line":1125},[240,1639,1640],{},"- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {\n",[240,1642,1643],{"class":242,"line":1131},[240,1644,1645],{}," self.pageIndex++;\n",[240,1647,1648],{"class":242,"line":1137},[240,1649,448],{},[18,1651,1652],{},"With those two classes and a couple of screenshots, it is fairly easy to create an App that looks and feels almost real.\nI created a short demo video, which shows how easy it is to get a good feeling if your App is going to work or not:",[18,1654,1655],{},"Now don’t forget those are only screenshots and the App might need to load stuff over the network or do some animation,\nhence it might not feel exactly the same. However, this process of prototyping an UI is powerful enough to give you an\nidea, whether the workflow or the UI in general is going to “work” or needs some tweaking.",[18,1657,1658,1659,208],{},"You can download the source code for the two classes, along with a sample project\nfrom ",[25,1660,1662],{"href":1386,"rel":1661},[29],"github",[487,1664,774],{},{"title":116,"searchDepth":117,"depth":117,"links":1666},[],[171,493],"2010-06-29T06:46:00","Before flying off to WWDC last month, I watched a whole bunch of sessions\\nfrom 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you haven’t watched it and\\nyou’ve got access to the WWDC videos – stop right here and watch the video!","https://synyx.de/blog/ui-prototyping-iphone-apps/",{},"/blog/ui-prototyping-iphone-apps",{"title":1426,"description":1674},"Before flying off to WWDC last month, I watched a whole bunch of sessions\nfrom 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you haven’t watched it and\nyou’ve got access to the WWDC videos – stop right here and watch the video!","blog/ui-prototyping-iphone-apps",[140,1677,181,147,1678],"design","prototyping","Before flying off to WWDC last month, I watched a whole bunch of sessions from 2009. Among others a session on “Prototyping iPhone User Interfaces” by Bret Victor. If you…","hEZiAfMXrZSp1Im2rsk88x4HQuKpzIhV5W2xo11faBA",{"id":1682,"title":592,"author":1683,"body":1684,"category":1797,"date":1798,"description":1799,"extension":131,"link":1800,"meta":1801,"navigation":134,"path":1802,"seo":1803,"slug":1805,"stem":1806,"tags":1807,"teaser":1808,"__hash__":1809},"blog/blog/mobile-solutions-summary-3.md",[155],{"type":11,"value":1685,"toc":1795},[1686,1688,1708,1722,1762,1780,1787],[14,1687,592],{"id":598},[18,1689,1690,1691,1696,1697,1702,1703,1707],{},"In my ",[25,1692,1695],{"href":1693,"rel":1694},"http://blog.synyx.de/2010/05/mobile-solutions-%E2%80%93-summary/",[29],"last summary"," I forgot to mention, that I will be\nat ",[25,1698,1701],{"href":1699,"rel":1700},"http://developer.apple.com/wwdc",[29],"WWDC"," this year. Now WWDC is over, I just got back and if you want to know more,\ncheckout my blog post ",[25,1704,1345],{"href":1705,"rel":1706},"http://dlinsin.blogspot.com/2010/06/wwdc10.html",[29],". While I was gone, our team was busy\npublishing all sorts of good stuff!",[18,1709,1710,1711,1716,1717,1721],{},"Let’s start with the release of Android’s FroYo last\nmonth! ",[25,1712,1715],{"href":1713,"rel":1714},"http://mobile.synyx.de/2010/05/in-my-humble-opinion-froyo-rocks/",[29],"Achim"," wrote\na ",[25,1718,1720],{"href":1713,"rel":1719},[29],"nice blog post"," highlighting the noteworthy\nfeatures:",[623,1723,1724,1727,1730,1740,1743,1751,1754],{},[18,1725,1726],{},"*FroYo is like each previous version a mixture between API Changes, new Userfeatures and some new cool Apps….",[18,1728,1729],{},"New API-Features:*",[1731,1732,1733,1737],"ul",{},[1734,1735,1736],"li",{},"Data Backup API",[1734,1738,1739],{},"Possibility to save passwords secure",[18,1741,1742],{},"New User Features:",[1731,1744,1745,1748],{},[1734,1746,1747],{},"updated Exchange Features",[1734,1749,1750],{},"Remote Wipe",[18,1752,1753],{},"New Apps:",[1731,1755,1756,1759],{},[1734,1757,1758],{},"Camera and Camcorder updated (possible to enable manually the leds for usage within camcorder)",[1734,1760,1761],{},"Android Tethering and Usage as Hotspot",[18,1763,1764,1768,1769,1774,1775,621],{},[25,1765,656],{"href":1766,"rel":1767},"http://mobile.synyx.de/authors/?uid=6",[29],", our ",[25,1770,1773],{"href":1771,"rel":1772},"http://mobile.synyx.de/tag/maemo-5/",[29],"Maemo"," guy, followed our\nGoogle Maps theme and published the first part of a nice introduction\nof ",[25,1776,1779],{"href":1777,"rel":1778},"http://mobile.synyx.de/2010/06/google-maps-on-maemo-5-part-1/",[29],"Google Maps on Maemo 5",[623,1781,1782],{},[18,1783,1784],{},[453,1785,1786],{},"The idea is quite simple. Webkit will render a webpage insider your app. That webpage consists of javascript methods\nwhich use the Google Maps-API. The javascript methods can be triggered from the app. The map class acts as proxy for\nthe communication between your app and the website. Quite simple hm?",[18,1788,1789,1790,1794],{},"This is only a small sneak peak of what’s going on over at the mobile solutions blog. I suggest\nyou ",[25,1791,1793],{"href":610,"rel":1792},[29],"add it"," to your favorite feed reader and check it out regularly.",{"title":116,"searchDepth":117,"depth":117,"links":1796},[],[667],"2010-06-18T08:57:09","In my last summary I forgot to mention, that I will be\\nat WWDC this year. Now WWDC is over, I just got back and if you want to know more,\\ncheckout my blog post here. While I was gone, our team was busy\\npublishing all sorts of good stuff!","https://synyx.de/blog/mobile-solutions-summary-3/",{},"/blog/mobile-solutions-summary-3",{"title":592,"description":1804},"In my last summary I forgot to mention, that I will be\nat WWDC this year. Now WWDC is over, I just got back and if you want to know more,\ncheckout my blog post here. While I was gone, our team was busy\npublishing all sorts of good stuff!","mobile-solutions-summary-3","blog/mobile-solutions-summary-3",[140,181,146],"In my last summary I forgot to mention, that I will be at WWDC this year. Now WWDC is over, I just got back and if you want to know…","Vt3IIuwgnXxkVeplkiSoihd83Xam9gAc_bmG2yhTjts",{"id":1811,"title":201,"author":1812,"body":1813,"category":1847,"date":1848,"description":1849,"extension":131,"link":1850,"meta":1851,"navigation":134,"path":1852,"seo":1853,"slug":1817,"stem":1855,"tags":1856,"teaser":1857,"__hash__":1858},"blog/blog/wwdc-2010.md",[155],{"type":11,"value":1814,"toc":1845},[1815,1818,1827,1842],[14,1816,201],{"id":1817},"wwdc-2010",[18,1819,1820,1821,1826],{},"I’m going to ",[25,1822,1825],{"href":1823,"rel":1824},"http://developer.apple.com/wwdc/",[29],"Apple’s WWDC"," this year and I’m pretty excited to fully dive into iPhone\ndevelopment for the whole next week. That it takes place in San Francisco is a nice bonus, as well.",[18,1828,1829,1830,1835,1836,1841],{},"The conference is ",[25,1831,1834],{"href":1832,"rel":1833},"http://developer.apple.com/wwdc/sessions/",[29],"mostly covering iPhone"," related topics. There\nare ",[25,1837,1840],{"href":1838,"rel":1839},"http://www.fscklog.com/2010/05/apple-best%C3%A4tigt-wwdc-keynote-mit-steve-jobs-am-7-juni.html",[29],"rumors"," that Steven Jobs\nwill present the new iPhone on Monday’s keynote. I’ll make sure I won’t miss that. My schedule for the week is already\nplanned with topics like game development, multitasking and user interface design.",[18,1843,1844],{},"If you are going to WWDC as well and would like to meet up, let me know.",{"title":116,"searchDepth":117,"depth":117,"links":1846},[],[171],"2010-06-03T15:12:08","I’m going to Apple’s WWDC this year and I’m pretty excited to fully dive into iPhone\\ndevelopment for the whole next week. That it takes place in San Francisco is a nice bonus, as well.","https://synyx.de/blog/wwdc-2010/",{},"/blog/wwdc-2010",{"title":201,"description":1854},"I’m going to Apple’s WWDC this year and I’m pretty excited to fully dive into iPhone\ndevelopment for the whole next week. That it takes place in San Francisco is a nice bonus, as well.","blog/wwdc-2010",[140,142,181],"I’m going to Apple’s WWDC this year and I’m pretty excited to fully dive into iPhone development for the whole next week. That it takes place in San Francisco is…","0PlPIuqAd36_OiWhK21AO20tc4c6Y1ucyQYMRpnc0aQ",{"id":1860,"title":1861,"author":1862,"body":1863,"category":1938,"date":1939,"description":1940,"extension":131,"link":1941,"meta":1942,"navigation":134,"path":1943,"seo":1944,"slug":1867,"stem":1946,"tags":1947,"teaser":1948,"__hash__":1949},"blog/blog/lessons-learned-iphone-review.md","Lessons learned – iPhone Review",[155],{"type":11,"value":1864,"toc":1936},[1865,1868,1888,1933],[14,1866,1861],{"id":1867},"lessons-learned-iphone-review",[18,1869,1870,1871,1876,1877,1876,1882,1887],{},"When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple.\nAlthough ",[25,1872,1875],{"href":1873,"rel":1874},"http://apprejections.com/index.php/post/171",[29],"there are"," ",[25,1878,1881],{"href":1879,"rel":1880},"http://www.mobileorchard.com/avoiding-iphone-app-rejection-from-apple/",[29],"plenty of resources",[25,1883,1886],{"href":1884,"rel":1885},"https://web.archive.org/web/20100809102557/http://iphone.derheckser.com:80/2009/07/10/suffering-from-modus-operandi-of-reviewer-team/",[29],"out there",",\nhere’s a short rundown of what we’ve learned ourselves so far:",[1731,1889,1890,1897,1903,1909,1921],{},[1734,1891,1892,1896],{},[1893,1894,1895],"strong",{},"Marketing Apps are not allowed","\nIf the sole purpose of your App is marketing, you’ll have a hard time getting your App through. You need to add what\nApple calls “user functionality”. That could be something simple like a photo gallery or a feature to reserve a room\nor table.",[1734,1898,1899,1902],{},[1893,1900,1901],{},"You cannot tease your users with features that they have to pay for","\nIf you are offering a lite version of your App, you cannot add disabled functionality, which would be enabled in the\npaid version. A lite version usually is offered separately from a paid version, which means the user will constantly\nsee disabled menu items or buttons, since the App will never be updated. Instead add a info section about the paid\nversion in your App, which describes what the paid version offers.",[1734,1904,1905,1908],{},[1893,1906,1907],{},"Don’t ask your users to upgrade","\nYou cannot add an alert in a free/lite version of your App, which asks users to upgrade or buy the paid version.\nInstead you should add a “buy me” button or a section in your App further describing what your paid version offers.",[1734,1910,1911,1914,1915,1920],{},[1893,1912,1913],{},"Build a working App","\nYou are definitely rejected if your App is buggy! If the reviewer thinks he found a bug, he’ll reject your App. A\ncrash is the worst case scenario,\nbut ",[25,1916,1919],{"href":1917,"rel":1918},"http://dlinsin.blogspot.com/2010/05/don-forget-your-linker-flags.html",[29],"it happens",". However, don’t depend on\nApple as your QA, because the review times are too long to go back and forth this way.",[1734,1922,1923,1926,1927,1932],{},[1893,1924,1925],{},"Don’t infringe Trademarks or Copyrights","\nDon’t mention\nApple, ",[25,1928,1931],{"href":1929,"rel":1930},"http://www.geek.com/articles/mobile/apple-demands-a-developer-removes-android-references-from-iphone-app-2010024/",[29],"Android","\nor any other Trademark therefore – as long as you don’t own it. You should also resist to use iPhone like icons or\nimages.",[18,1934,1935],{},"If you respect all of these restrictions and gotchas, you should be save to get your App through the review process. I\nsay “should”, because it all appears to depend on the person who reviews your App. Let us know what you experienced,\nsubmitting your Apps, I bet there are a lot more of these gotchas.",{"title":116,"searchDepth":117,"depth":117,"links":1937},[],[171,493],"2010-05-13T12:37:53","When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple.\\nAlthough there are plenty of resources out there,\\nhere’s a short rundown of what we’ve learned ourselves so far:","https://synyx.de/blog/lessons-learned-iphone-review/",{},"/blog/lessons-learned-iphone-review",{"title":1861,"description":1945},"When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple.\nAlthough there are plenty of resources out there,\nhere’s a short rundown of what we’ve learned ourselves so far:","blog/lessons-learned-iphone-review",[140,181],"When you submit an App to the Apple App Store it has to go through a “rigorous quality check”, conducted by Apple. Although there are plenty of resources out there,…","T4mUZEpPLjFmQlCw35HyM72gG1M41S4jYsCCinauV0A",[1951,1954,1957,1960,1962,1965,1968,1971,1974,1977,1980,1983,1986,1989,1992,1995,1998,2001,2004,2007,2010,2013,2015,2018,2021,2024,2027,2029,2032,2035,2038,2041,2044,2047,2050,2053,2056,2059,2062,2065,2068,2071,2074,2077,2080,2083,2086,2089,2092,2095,2098,2101,2104,2107,2110,2113,2116,2119,2122,2125,2128,2131,2134,2136,2139,2142,2145,2148,2151,2154,2157,2160,2163,2166,2168,2171,2174,2177,2180,2183,2186,2189,2192,2195,2198,2201,2204,2207,2210,2213,2216,2219,2222,2225,2228,2231,2234,2237,2240,2242,2245,2248,2251,2254,2256,2259,2262,2265,2268,2271,2274,2277,2280,2283,2286,2289,2292,2295,2298,2301,2304,2307,2310,2313,2316,2319,2322,2325,2328,2331,2332,2335,2338,2341,2344,2347,2350,2353,2356,2359,2362,2365],{"slug":1952,"name":1953},"abel","Jennifer Abel",{"slug":1955,"name":1956},"allmendinger","Otto Allmendinger",{"slug":1958,"name":1959},"antony","Ben Antony",{"slug":9,"name":1961},"Joachim Arrasz",{"slug":1963,"name":1964},"bauer","David Bauer",{"slug":1966,"name":1967},"bechtold","Janine Bechtold",{"slug":1969,"name":1970},"boersig","Jasmin Börsig",{"slug":1972,"name":1973},"buch","Fabian Buch",{"slug":1975,"name":1976},"buchloh","Aljona Buchloh",{"slug":1978,"name":1979},"burgard","Julia Burgard",{"slug":1981,"name":1982},"caspar-schwedes","Caspar Schwedes",{"slug":1984,"name":1985},"christina-schmitt","Christina Schmitt",{"slug":1987,"name":1988},"clausen","Michael Clausen",{"slug":1990,"name":1991},"contargo_poetzsch","Thomas Pötzsch",{"slug":1993,"name":1994},"damrath","Sebastian Damrath",{"slug":1996,"name":1997},"daniel","Markus Daniel",{"slug":1999,"name":2000},"dasch","Julia Dasch",{"slug":2002,"name":2003},"denman","Joffrey Denman",{"slug":2005,"name":2006},"dfuchs","Daniel Fuchs",{"slug":2008,"name":2009},"dobler","Max Dobler",{"slug":2011,"name":2012},"dobriakov","Vladimir Dobriakov",{"slug":2014,"name":2014},"dreiqbik",{"slug":2016,"name":2017},"dschaefer","Denise Schäfer",{"slug":2019,"name":2020},"dschneider","Dominik Schneider",{"slug":2022,"name":2023},"duerlich","Isabell Duerlich",{"slug":2025,"name":2026},"dutkowski","Bernd Dutkowski",{"slug":2028,"name":2028},"eifler",{"slug":2030,"name":2031},"essig","Tim Essig",{"slug":2033,"name":2034},"ferstl","Maximilian Ferstl",{"slug":2036,"name":2037},"fey","Prisca Fey",{"slug":2039,"name":2040},"frank","Leonard Frank",{"slug":2042,"name":2043},"franke","Arnold Franke",{"slug":2045,"name":2046},"frischer","Nicolette Rudmann",{"slug":2048,"name":2049},"fuchs","Petra Fuchs",{"slug":2051,"name":2052},"gari","Sarah Gari",{"slug":2054,"name":2055},"gast","Gast",{"slug":2057,"name":2058},"graf","Johannes Graf",{"slug":2060,"name":2061},"grammlich","Daniela Grammlich",{"slug":2063,"name":2064},"guthardt","Sabrina Guthardt",{"slug":2066,"name":2067},"haeussler","Johannes Häussler",{"slug":2069,"name":2070},"hammann","Daniel Hammann",{"slug":2072,"name":2073},"heetel","Julian Heetel",{"slug":2075,"name":2076},"heft","Florian Heft",{"slug":2078,"name":2079},"heib","Sebastian Heib",{"slug":2081,"name":2082},"heisler","Ida Heisler",{"slug":2084,"name":2085},"helm","Patrick Helm",{"slug":2087,"name":2088},"herbold","Michael Herbold",{"slug":2090,"name":2091},"hofmann","Peter Hofmann",{"slug":2093,"name":2094},"hopf","Florian Hopf",{"slug":2096,"name":2097},"jaud","Alina Jaud",{"slug":2099,"name":2100},"jayasinghe","Robin De Silva Jayasinghe",{"slug":2102,"name":2103},"jbuch","Jonathan Buch",{"slug":2105,"name":2106},"junghanss","Gitta Junghanß",{"slug":2108,"name":2109},"kadyietska","Khrystyna Kadyietska",{"slug":2111,"name":2112},"kannegiesser","Marc Kannegiesser",{"slug":2114,"name":2115},"karoly","Robert Károly",{"slug":2117,"name":2118},"karrasz","Katja Arrasz-Schepanski",{"slug":2120,"name":2121},"kaufmann","Florian Kaufmann",{"slug":2123,"name":2124},"kesler","Mike Kesler",{"slug":2126,"name":2127},"kirchgaessner","Bettina Kirchgäßner",{"slug":2129,"name":2130},"klem","Yannic Klem",{"slug":2132,"name":2133},"klenk","Timo Klenk",{"slug":957,"name":2135},"Tobias Knell",{"slug":2137,"name":2138},"knoll","Anna-Lena Knoll",{"slug":2140,"name":2141},"knorre","Matthias Knorre",{"slug":2143,"name":2144},"koenig","Melanie König",{"slug":2146,"name":2147},"kraft","Thomas Kraft",{"slug":2149,"name":2150},"krupicka","Florian Krupicka",{"slug":2152,"name":2153},"kuehn","Christian Kühn",{"slug":2155,"name":2156},"lange","Christian Lange",{"slug":2158,"name":2159},"larrasz","Luca Arrasz",{"slug":2161,"name":2162},"leist","Sascha Leist",{"slug":2164,"name":2165},"lihs","Michael Lihs",{"slug":155,"name":2167},"David Linsin",{"slug":2169,"name":2170},"maniyar","Christian Maniyar",{"slug":2172,"name":2173},"martin","Björnie",{"slug":2175,"name":2176},"martin-koch","Martin Koch",{"slug":2178,"name":2179},"matt","Tobias Matt",{"slug":2181,"name":2182},"mennerich","Christian Mennerich",{"slug":2184,"name":2185},"menz","Alexander Menz",{"slug":2187,"name":2188},"meseck","Frederick Meseck",{"slug":2190,"name":2191},"messner","Oliver Messner",{"slug":2193,"name":2194},"michael-ploed","Michael Plöd",{"slug":2196,"name":2197},"mies","Marius Mies",{"slug":2199,"name":2200},"mihai","Alina Mihai",{"slug":2202,"name":2203},"moeller","Jörg Möller",{"slug":2205,"name":2206},"mohr","Rebecca Mohr",{"slug":2208,"name":2209},"moretti","David Moretti",{"slug":2211,"name":2212},"mueller","Sven Müller",{"slug":2214,"name":2215},"muessig","Alexander Müssig",{"slug":2217,"name":2218},"neupokoev","Grigory Neupokoev",{"slug":2220,"name":2221},"nussbaecher","Carmen Nussbächer",{"slug":2223,"name":2224},"ochs","Pascal Ochs",{"slug":2226,"name":2227},"oelhoff","Jan Oelhoff",{"slug":2229,"name":2230},"oengel","Yasin Öngel",{"slug":2232,"name":2233},"oezsoy","Enis Özsoy",{"slug":2235,"name":2236},"posch","Maya Posch",{"slug":2238,"name":2239},"ralfmueller","Ralf Müller",{"slug":2241,"name":2241},"redakteur",{"slug":2243,"name":2244},"reich","Michael Reich",{"slug":2246,"name":2247},"reinhard","Karl-Ludwig Reinhard",{"slug":2249,"name":2250},"rmueller","Rebecca Müller",{"slug":2252,"name":2253},"rosum","Jan Rosum",{"slug":2255,"name":2255},"rueckert",{"slug":2257,"name":2258},"ruessel","Sascha Rüssel",{"slug":2260,"name":2261},"sauter","Moritz Sauter",{"slug":2263,"name":2264},"schaefer","Julian Schäfer",{"slug":2266,"name":2267},"scherer","Petra Scherer",{"slug":2269,"name":2270},"schlicht","Anne Schlicht",{"slug":2272,"name":2273},"schmidt","Jürgen Schmidt",{"slug":2275,"name":2276},"schneider","Tobias Schneider",{"slug":2278,"name":2279},"seber","Benjamin Seber",{"slug":2281,"name":2282},"sommer","Marc Sommer",{"slug":2284,"name":2285},"speaker-fels","Jakob Fels",{"slug":2287,"name":2288},"speaker-gierke","Oliver Gierke",{"slug":2290,"name":2291},"speaker-krupa","Malte Krupa",{"slug":2293,"name":2294},"speaker-mader","Jochen Mader",{"slug":2296,"name":2297},"speaker-meusel","Tim Meusel",{"slug":2299,"name":2300},"speaker-milke","Oliver Milke",{"slug":2302,"name":2303},"speaker-paluch","Mark Paluch",{"slug":2305,"name":2306},"speaker-schad","Jörg Schad",{"slug":2308,"name":2309},"speaker-schalanda","Jochen Schalanda",{"slug":2311,"name":2312},"speaker-schauder","Jens Schauder",{"slug":2314,"name":2315},"speaker-unterstein","Johannes Unterstein",{"slug":2317,"name":2318},"speaker-wolff","Eberhard Wolff",{"slug":2320,"name":2321},"speaker-zoerner","Stefan Zörner",{"slug":2323,"name":2324},"stefan-belger","Stefan Belger",{"slug":2326,"name":2327},"steinegger","Roland Steinegger",{"slug":2329,"name":2330},"stern","sternchen synyx",{"slug":148,"name":148},{"slug":2333,"name":2334},"szulc","Mateusz Szulc",{"slug":2336,"name":2337},"tamara","Tamara Tunczinger",{"slug":2339,"name":2340},"theuer","Tobias Theuer",{"slug":2342,"name":2343},"thieme","Sandra Thieme",{"slug":2345,"name":2346},"thies-clasen","Marudor",{"slug":2348,"name":2349},"toernstroem","Olle Törnström",{"slug":2351,"name":2352},"ullinger","Max Ullinger",{"slug":2354,"name":2355},"ulrich","Stephan Ulrich",{"slug":2357,"name":2358},"wagner","Stefan Wagner",{"slug":2360,"name":2361},"weigel","Andreas Weigel",{"slug":2363,"name":2364},"werner","Fabian Werner",{"slug":2366,"name":2367},"wolke","Sören Wolke",["Reactive",2369],{"$scookieConsent":2370,"$ssite-config":2372},{"functional":2371,"analytics":2371},false,{"_priority":2373,"env":2377,"name":2378,"url":2379},{"name":2374,"env":2375,"url":2376},-10,-15,0,"production","nuxt-app","https://synyx.de",["Set"],["ShallowReactive",2382],{"category-apple":-1,"authors":-1},"/blog/tags/apple"]